ฉันถูกถามในหลักสูตรฝึกอบรมเมื่อเร็ว ๆ นี้ว่า QGIS สามารถคำนวณหมายเลขหน้าถัดไป / ก่อนหน้าและด้านบน / ด้านล่างโดยอัตโนมัติสำหรับหนังสือแผนที่ที่สร้างโดยใช้ตัวสร้างแผนที่ ฉันจัดการกับการแสดงออกของฉลากที่สมเหตุสมผลสำหรับกริดปกติถ้าคุณทราบความกว้างและความสูงของกริด
แต่จากนั้นเราก็เริ่มนึกถึงตัวอย่างที่เป็นจริงที่เราไม่ต้องการวาดหน้าเว็บที่ไม่มีเขตที่เราสนใจเช่นหนึ่งในเขตของฉัน:
ดังนั้นบ่ายนี้ฉันได้เล่นสคริปต์ไพ ธ อนเพื่อหา 4 เพื่อนบ้านที่ฉันสนใจสำหรับแต่ละตารางเซลล์และเพิ่มค่าเหล่านั้นในตารางของฉัน (นี่ขึ้นอยู่กับการสอนของ 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()
มันใช้งานได้ดี
แต่ความจริงแล้วทั้งการสร้างจุดทดสอบไปทางเหนือแล้วการทดสอบเพื่อนบ้านที่เป็นไปได้ทั้งหมดดูเหมือนว่าผิด อย่างไรก็ตามหลังจากช่วงบ่ายของการทำลายสมองของฉันฉันไม่สามารถคิดวิธีที่ดีกว่าในการพิจารณาว่าเพื่อนบ้านทางเหนือของเซลล์กริดคืออะไร?
เป็นการดีที่ฉันต้องการสิ่งที่ง่ายพอที่จะใส่ในกล่องข้อความผู้แต่งเพลงพิมพ์ แต่ฉันคิดว่ามันเกินกว่าจะขอได้