Çokgen katmanından bir öznitelik seçmenin ve alan hesap makinesinde "içinde" kullanarak bir nokta katmanının sanal alanına eklemenin bir yolu var mı?
CASE
WHEN within($geometry, geometry_polygon) THEN attribute_polygon
END
Çokgen katmanından bir öznitelik seçmenin ve alan hesap makinesinde "içinde" kullanarak bir nokta katmanının sanal alanına eklemenin bir yolu var mı?
CASE
WHEN within($geometry, geometry_polygon) THEN attribute_polygon
END
Yanıtlar:
Kutudan çıkan alan hesap makinesi özellik katmanları arasındaki uzamsal birleşmeleri desteklemez. Ancak, NathanW'nin qgis ifadeleri için fonksiyon düzenleyicideki yazısına bakarsanız, kendi veri etkileşimimizi kodlayabileceğimizi ortaya çıkarabilirsiniz.
Aşağıdaki komut dosyası neyin peşinde olduğunuzu ifade etmenizi sağlayacaktır. Çokgen katmanındaki tüm özellikler boyunca yinelenerek çalışır ve uzamsal birleştirme varsa, o zaman belirtilen sütundan tablo verilerini referans alın:
from qgis.core import *
from qgis.gui import *
from qgis.utils import iface
allfeatures = None
index = QgsSpatialIndex()
indexMade = 0
refLayer = None
@qgsfunction(args="auto", group='Custom')
def spatialJoinLookup(layerName, refColumn, defaultValue, geom, feature, parent):
if geom is None:
return defaultValue
# globals so we don't create the index, refLayer more than once
global allfeatures
global index
global indexMade
global refLayer
# Get the reference layer
if refLayer is None:
for layer in iface.mapCanvas().layers():
if layerName == layer.name():
refLayer = layer
break
if refLayer is None:
raise Exception("Layer [" + layerName + "] not found")
# Create the index if not exists
if indexMade == 0:
index = QgsSpatialIndex()
allAttrs = layer.pendingAllAttributesList()
layer.select(allAttrs)
allfeatures = {feature.id(): feature for (feature) in refLayer.getFeatures()}
for f in allfeatures.values():
index.insertFeature(f)
indexMade = 1
# Use spatail index to find intersect
fid = None
ids = index.intersects(geom.boundingBox())
for id in ids:
fid = id
break # Only get the first match.
if fid is not None:
return allfeatures[fid].attribute(refColumn)
# Default
return defaultValue
Aşağıda sahip olabileceğiniz çokgen bir katman örneği verilmiştir. Ayrıca, son resimde göreceğiniz karşılık gelen bir nokta katmanı oluşturdum.
Ayrı bir sütun kullanmak istiyorsanız, ikinci argümanı çokgen veri kümesindeki sütun adıyla eşleştirmek için değiştirmeniz gerektiğini unutmayın. Örneğin, 'AreaNumber' sütununu kullanabilirsiniz, ancak alan hesap makinesi ayarlarındaki sütun türüyle eşleşmesi gerekir.
Mekansal birleşim olmadığında varsayılan sütun değerinin uygulandığını ve diğerinin doğru verileri eşleştiğini görebilirsiniz. Verdiğim komut dosyasının yalnızca ilk eşleşmeye katılacağını unutmayın . Çokgenlerinizin üst üste gelmesi durumunda başka bir işletme mantığı yaratmanız gerekir.
Fonksiyonlu Alan Hesaplayıcıda yapılabilir aggregate()
. Point katmanında şöyle bir alan hesap makinesi ifadesi ile yeni alan oluşturun:
aggregate(
layer:= 'polygon_layer_name',
aggregate:='concatenate',
expression:=joining_field_name,
concatenator:=', ',
filter:=intersects($geometry, geometry(@parent))
)
Nerede layer
poligon katman adı dizesi gibi yazılır, aggreagate
(vb özetlemek de kullanılabilir) toplama işlevi olduğunu expression
değerlerinden alan, alınacak olan concatenator
karakter dizesini katılıyor (hatta bu durumda, set olmak zorunda) ve filter
esaslı özellikler filtrelediğini ifadesinde (bu durumda katman geometrisini üst katman geometrisi ile ilişkilendirir).
Daha fazla bilgi için, Toplama QGIS belgelerine bakın .
Otomatik güncellemeler için kullanılabilecek sanal alanlar ya gibi ifadeyi ayarlayabilirsiniz Varsayılan değer içinde Öznitelikler'in Form ayarları Katman Özellikleri ( Özellik formu ayar belgelerine ).
geometry(@parent)
) yalnızca QGIS 3'ten itibaren desteklendiğine dikkat edilmelidir . Sadece bunu okuyan birinin hala 2.18 kullanıyor olması durumunda ...