Saya ditanya dalam kursus pelatihan baru-baru ini jika QGIS dapat secara otomatis menghitung nomor halaman berikutnya / sebelumnya dan di atas / di bawah untuk buku peta yang dibuat menggunakan generator atlas. Saya berhasil membuat ekspresi label yang cukup masuk akal untuk kisi biasa jika Anda tahu lebar dan tinggi kisi.
Tetapi kami kemudian mulai memikirkan contoh-contoh realistis di mana kami tidak ingin menggambar halaman yang tidak mengandung distrik minat kami, seperti ini salah satu daerah asal saya:
Jadi sore ini saya bermain di skrip python untuk mengetahui 4 tetangga yang saya tertarik untuk setiap sel grid dan menambahkan nilai-nilai itu ke kotak saya (ini sangat didasarkan pada tutorial Ujaval Gandhi ):
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()
Ini berfungsi dengan baik.
Tapi jujur saja, keseluruhan menciptakan titik uji ke Utara dan kemudian menguji semua tetangga yang mungkin tampak salah. Namun setelah satu sore mengacaukan otak saya, saya tidak bisa memikirkan cara yang lebih baik untuk menentukan apa tetangga utara sel grid tertentu?
Idealnya saya ingin sesuatu yang cukup sederhana untuk dimasukkan ke dalam kotak teks komposer cetak, tapi saya kira itu terlalu banyak untuk diminta.