हाल ही में एक प्रशिक्षण पाठ्यक्रम में मुझसे पूछा गया था कि क्या QGIS स्वचालित रूप से एटलस जनरेटर का उपयोग करके बनाई गई एक मानचित्र पुस्तक के लिए अगले / पिछले और ऊपर / नीचे पृष्ठ संख्याओं की गणना कर सकता है। यदि आप ग्रिड की चौड़ाई और ऊंचाई जानते हैं, तो मैं एक नियमित ग्रिड के लिए काफी उचित लेबल अभिव्यक्ति का प्रबंधन करने में कामयाब रहा।
लेकिन फिर हमने यथार्थवादी उदाहरणों के बारे में सोचना शुरू किया, जहां हम उन पृष्ठों को नहीं खींचना चाहते हैं जिनमें हमारे जिले का हित नहीं है, जैसे कि यह मेरे घर का घर है:
इसलिए आज दोपहर मेरे पास एक अजगर स्क्रिप्ट पर एक नाटक था जिसमें 4 पड़ोसियों को काम करने के लिए कहा गया था जिनके लिए मैं प्रत्येक ग्रिड सेल में दिलचस्पी रखता था और उन मूल्यों को अपने ग्रिड में जोड़ दिया (यह उजावल गांधी के ट्यूटोरियल पर आधारित है ):
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()
यह ठीक काम करता है।
लेकिन पूरी ईमानदारी से उत्तर के लिए एक परीक्षण बिंदु बनाने और फिर सभी संभावित पड़ोसियों का परीक्षण करना गलत लगता है। हालाँकि, अपने मस्तिष्क को नष्ट करने की एक दोपहर के बाद, मैं यह निर्धारित करने के लिए बेहतर तरीका नहीं सोच सकता कि एक विशेष ग्रिड सेल का उत्तरी पड़ोसी क्या है?
आदर्श रूप से मुझे प्रिंट कंपोजर टेक्स्ट बॉक्स में डालने के लिए कुछ सरल चाहिए, लेकिन मुझे संदेह है कि यह पूछने के लिए बहुत अधिक है।