DOLAR 40,9920 0,80%
EURO 48,0364 0,92%
ALTIN 4.459,800,94
BITCOIN 4710285-1.4801299999999999%
İstanbul
28°

AÇIK

SABAHA KALAN SÜRE

İnteraktif Filtreler ile QGIS2Web – Dijital Coğrafya

İnteraktif Filtreler ile QGIS2Web – Dijital Coğrafya

ABONE OL
Temmuz 6, 2025 16:39
İnteraktif Filtreler ile QGIS2Web – Dijital Coğrafya
0

BEĞENDİM

ABONE OL

Last Updated on Temmuz 6, 2025 by EDİTÖR

Bir süredir, en son şeyler geliştirdiğim için QGIS2Web. Dürüst olmak gerekirse: QGIS2Leaf’ı 2015 yılında OpenLayers İhracatçısı ile birleştirmeye karar verdikten sonra tüm projeye odaklandım. Tom Chadwin Ve diğerleri harika bir iş çıkardı ve QGIS içinden içerik yayınlamak söz konusu olduğunda sanat eklentisini geliştirmeyi başardı. Ama şanslı olduğum için son haftalarda QGIS2Web için bazı ilginç şeyler geliştirme şansım oldu.

QGIS2Web: Fikir

Geçmişte zaten bazı yollar gösterdim Basit JavaScript ile broşür tabanlı bir web haritasını filtreleme ve/veya materyalizecss. Statik verileriniz varsa bu oldukça basit bir yaklaşımdır: Veri modelini biliyorsanız, haritayı filtrelemek için doğru filtreler ve HTML öğeleri oluşturmak kolaydır. Bu jenerik yapmak biraz daha zor:

  • Alan tipleri QGI’lerde oldukça çeşitlidir ve 4-5 ana filtre elemanına eşlenmesi gerekir
  • Filtreler, her katmanın sahip olduğu özelliklere bağlı olarak, tüm veya tek bir katman için geçerli olabilir veya olmayabilir
  • Her filtrenin aralıkları, listeleri konsolide edilmelidir (kopyaları kaldır, min/maks.
  • Tarih/Saat/Datetime girişleri için çapraz tarayıcı işlevini unutmayın

HTML’deki Selects söz konusu olduğunda, aşağıdaki önceden tanımlanmış seçenekler kümesini kullandım:

  • Dizeler için Metin Seçimi Listesi (Çoklu Seçenekler)
  • Booleans için seçim listesi
  • tamsayı
  • çift ​​kaydırıcı
  • Kombine Tarih/Saat/Datetime Seçim

Harita iki parça halinde bölünmelidir: biri harita için, diğeri “filtre menüsü” için. Ayrıca: Regresyon testini hala mümkün kılmak için QGIS2Web’in ana koduna mümkün olduğunca çok fazla dokunulmalıdır.

QGIS2Web Filtreleri: Seçimler için yaklaşım

Ana yaklaşım:

  • Her katmanın özelliklerini alın
  • Alan türlerini bir seçme türüne eşleme
  • Seç girişlerini belirleyin
  • Seçilen her öznitelik için QGIS2Web’in ana kodundan sonra js kullanarak html öğeleri oluşturun
  • Her filtre türü için işlev ekleyin ve tüm filtrelerin filtre seçimini tüm katmanlara uygulayın

Kodlama açısından çirkin kısım şudur: Tüm HTML öğeleri JavaScript ile oluşturulur ve Python’u kullanarak dosyaya yazılır:

if filterItems[item]["type"] in ["str", "bool"]:
	endHTML += """
	document.getElementById("menu").appendChild(
	document.createElement("div")); #placeholder DIV
	var div_{nameS} = document.createElement('div'); #This is the div which holds the select
	div_{nameS}.id = "div_{name}";
	div_{nameS}.className= "filterselect";
	document.getElementById("menu").appendChild(div_{nameS});
	sel_{nameS} = document.createElement('select'); #this is the select itself
	sel_{nameS}.multiple = true;
	sel_{nameS}.id = "sel_{name}";
	var {nameS}_options_str = "<option value='' unselected></option>";
	sel_{nameS}.onchange = function(){{filterFunc()}}; #runs the same functio for all filters in the map
""".format(name=itemName, nameS=safeName(itemName)) #safename removes unwanted strings in a attribute name
	for entry in filterItems[item]["values"]: #populating the select options
		endHTML += """
{nameS}_options_str  += '<option value="{e}">{e}</option>';
			""".format(e=entry, name=itemName,
					   nameS=safeName(itemName))
	endHTML += """
	sel_{nameS}.innerHTML = {nameS}_options_str;
	div_{nameS}.appendChild(sel_{nameS});
	var lab_{nameS} = document.createElement('div');
	lab_{nameS}.innerHTML = '{name}';
	lab_{nameS}.className = 'filterLabel';
	div_{nameS}.appendChild(lab_{nameS});
	""".format(name=itemName, nameS=safeName(itemName))

HTML kullanarak aynı kod okumak ve yazmak çok daha kolay olacaktır. Ama hey: (kırık resmi düzeltin!)

QGIS2Web: Seçimlerle uğraşmak

Tüm katmanlara uygulanan işlev, bir katmanın altında yatan JSON verilerini alır, öznitiğin özelliklerin bir parçası olup olmadığını belirler ve daha sonra seçilen kriterleri (JavaScript) karşılamayan girişleri kaldırır:

map.eachLayer(function(lyr){
	if ("options" in lyr && "dataVar" in lyr["options"]){
		features = this[lyr["options"]["dataVar"]].features.slice(0);
		try{
			for (key in Filters){
				if (Filters[key] == "str" || Filters[key] == "bool"){
					var selection = [];
					for (option in Array.from(document.getElementById("sel_" + key).selectedOptions)){
						selection.push(document.getElementById("sel_"+key).selectedOptions[option].value);
					}
					try{
					    if (key in features[0].properties){
							for (i = features.length - 1;i >= 0; --i){
								if (selection.indexOf(features[i].properties[key])<0 && selection.length>0) {
									features.splice(i,1);
								}
							}
					    }
					} catch(err){
					}
				}
			} catch(err){
		}
		this[lyr["options"]["layerName"]].clearLayers();
		this[lyr["options"]["layerName"]].addData(features);
		}
	})
}

Diğer seçmeler için kod oldukça benzerdir ve aynı prensipleri izler. Yine de sonuç ilk bakışta gerçekten iyi:

QGIS2Web Filtreleri
QGIS2Web Wxport’ta bir web haritası için mümkün olan her şey mümkün

Ve burada alan ve isim filtreleri ile küçük bir örnek keşfedebilirsiniz (tam boyutlu bağlantı):

Filtre işlevi, en son deneysel sürüm 3.8.0’ın bir parçasıdır. zımpara ve senin eklenti işleyicisi Deney eklentilerini de kabul ederseniz. Veri ile işleme konusunda herhangi bir sorun görürseniz, lütfen çok nazik olun ve GitHub hakkında bir yorum bırakın.


4.5
2
oy

Makale derecesi

En az 10 karakter gerekli


HIZLI YORUM YAP