최근 교육 과정에서 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()
이것은 잘 작동합니다.
그러나 솔직히 말해서 북한에 대한 테스트 지점을 만든 다음 가능한 모든 이웃을 테스트하는 것은 잘못된 것 같습니다. 그러나 오후 내 뇌를 깨고 난 후에 특정 그리드 셀의 북쪽 이웃이 무엇인지 결정하는 더 좋은 방법을 생각할 수 없습니까?
이상적으로는 인쇄 작곡가 텍스트 상자에 넣을만큼 간단한 것을 원하지만 너무 많이 요구하는 것 같습니다.