Yakın tarihli bir eğitim kursunda, QGIS'in atlas jeneratörü kullanılarak oluşturulan bir harita kitabı için sonraki / önceki ve yukarıdaki / aşağıdaki sayfa numaralarını otomatik olarak hesaplayıp hesaplayamayacağı soruldu. Izgara genişliğini ve yüksekliğini biliyorsanız, normal bir ızgara için oldukça makul bir etiket ifadesi çalışmayı başardım.
Ancak daha sonra, kendi ilçem gibi bir ilçemiz olmayan sayfalar çizmek istemediğimiz gerçekçi örnekler düşünmeye başladık:
Bu öğleden sonra, her ızgara hücresi için ilgilendiğim 4 komşuyu çalışmak için bir python senaryosunda oynadım ve bu değerleri ızgarama ekledim (bu, Ujaval Gandhi'nin eğitimine dayanıyor ):
for f in feature_dict.values():
print 'Working on %s' % f[_NAME_FIELD]
geom = f.geometry()
# Find all features that intersect the bounding box of the current feature.
# We use spatial index to find the features intersecting the bounding box
# of the current feature. This will narrow down the features that we need
# to check neighboring features.
intersecting_ids = index.intersects(geom.boundingBox())
# Initalize neighbors list and sum
neighbors = []
neighbors_sum = 0
for intersecting_id in intersecting_ids:
# Look up the feature from the dictionary
intersecting_f = feature_dict[intersecting_id]
int_geom = intersecting_f.geometry()
centroid = geom.centroid()
height = geom.boundingBox().height()
width = geom.boundingBox().width()
# For our purpose we consider a feature as 'neighbor' if it touches or
# intersects a feature. We use the 'disjoint' predicate to satisfy
# these conditions. So if a feature is not disjoint, it is a neighbor.
if (f != intersecting_f and
not int_geom.disjoint(geom)):
above_point = QgsGeometry.fromPoint(QgsPoint(centroid.asPoint().x(),
centroid.asPoint().y()+height))
below_point = QgsGeometry.fromPoint(QgsPoint(centroid.asPoint().x(),
centroid.asPoint().y()-height))
left_point = QgsGeometry.fromPoint(QgsPoint(centroid.asPoint().x()-width,
centroid.asPoint().y()))
right_point = QgsGeometry.fromPoint(QgsPoint(centroid.asPoint().x()+width,
centroid.asPoint().y()))
above = int_geom.contains(above_point)
below = int_geom.contains(below_point)
left = int_geom.contains(left_point)
right = int_geom.contains(right_point)
if above:
print "setting %d as above %d"%(intersecting_f['id'],f['id'])
f['above']=intersecting_f['id']
if below:
print "setting %d as below %d"%(intersecting_f['id'],f['id'])
f['below']=intersecting_f['id']
if left:
print "setting %d as left of %d"%(intersecting_f['id'],f['id'])
f['left']=intersecting_f['id']
if right:
print "setting %d as right of %d"%(intersecting_f['id'],f['id'])
f['right']=intersecting_f['id']
# Update the layer with new attribute values.
layer.updateFeature(f)
layer.commitChanges()
Bu gayet iyi çalışıyor.
Ama dürüst olmak gerekirse, Kuzey'e bir test noktası yaratmak ve sonra tüm olası komşuları test etmek yanlış görünüyor. Ancak bir öğleden sonra beynimi sardıktan sonra belirli bir ızgara hücresinin kuzey komşusunun ne olduğunu belirlemek için daha iyi bir yol düşünemiyorum?
İdeal olarak, bir baskı bestecisi metin kutusuna koymak için yeterince basit bir şey istiyorum, ama bunun için çok fazla şey olduğundan şüpheleniyorum.