Tôi có một lớp đa giác làng có hơn 6,00.000 hồ sơ. Tôi đã tính trọng tâm của từng làng. Tôi muốn tìm khoảng cách giữa centroid và nút xa nhất của mỗi đa giác. Kiểm tra hình ảnh dưới đây để tham khảo. Đường màu đen là ranh giới đa giác.
Tôi có một lớp đa giác làng có hơn 6,00.000 hồ sơ. Tôi đã tính trọng tâm của từng làng. Tôi muốn tìm khoảng cách giữa centroid và nút xa nhất của mỗi đa giác. Kiểm tra hình ảnh dưới đây để tham khảo. Đường màu đen là ranh giới đa giác.
Câu trả lời:
Có vẻ như bạn đang làm việc với MapInfo. "Máy tính khoảng cách" (tìm nó trong trình quản lý công cụ) có nhiều tùy chọn và tôi nghĩ nó cũng có thể xử lý công việc này. Có một bài viết về nó ở đây: http://web.pb.com/mapinfopro-jul-2013/Toolbox-Distance-Calculator
Sử dụng PostGIS, tôi đã sử dụng ST_ConvexHull để đơn giản hóa đa giác để có kết quả nhanh hơn:
Lấy điểm xa nhất:
SELECT Villages_v4_Trial_region.geom as FarPoint from (
SELECT ST_PointN(ST_ExteriorRing(ST_ConvexHull(Villages_v4_Trial_region.geom)),
generate_series(1, ST_NPoints(ST_ExteriorRing(ST_ConvexHull(Villages_v4_Trial_region.geom))))) as points,
geom
FROM Villages_v4_Trial_region
ORDER BY ST_MaxDistance(points,ST_Centroid(Villages_v4_Trial_region.geom)) DESC
LIMIT 1;
Và nếu bạn quan tâm đến việc tạo Vòng tròn từ trung tâm:
SELECT ST_Buffer(Center,ST_Distance(Center,FarPoint)) as Circle
FROM (
SELECT Villages_v4_Trial_region.geom as FarPoint, Center from (
SELECT ST_PointN(ST_ExteriorRing(ST_ConvexHull(Villages_v4_Trial_region.geom)),
generate_series(1, ST_NPoints(ST_ExteriorRing(ST_ConvexHull(Villages_v4_Trial_region.geom))))) as points,
ST_Centroid(Villages_v4_Trial_region.geom) as Center,
geom
FROM Villages_v4_Trial_region
) as Villages_v4_Trial_region
ORDER BY ST_MaxDistance(points,Center) DESC
LIMIT 1) as foo;
Sử dụng mã PyQGIS tiếp theo :
from math import sqrt
layer = iface.activeLayer()
feats = [ feat for feat in layer.getFeatures() ]
n = len(feats)
centroids = [ feat.geometry().centroid().asPoint() for feat in feats ]
polygons = [ feat.geometry().asPolygon()[0] for feat in feats ]
lengths = []
for i, pol in enumerate(polygons):
max_dist = 0
idx_j = 0
for j, point in enumerate(pol):
dist = sqrt(centroids[i].sqrDist(point))
if dist > max_dist:
max_dist = dist
idx_j = j
print i, idx_j, max_dist
lengths.append([centroids[i], pol[idx_j]])
crs = layer.crs()
epsg = crs.postgisSrid()
uri = "LineString?crs=epsg:" + str(epsg) + "&field=id:integer""&index=yes"
mem_layer = QgsVectorLayer(uri,
'max_distance',
'memory')
prov = mem_layer.dataProvider()
feats = [ QgsFeature() for i in range(n) ]
for i, feat in enumerate(feats):
feat.setAttributes([i])
feat.setGeometry(QgsGeometry.fromPolyline(lengths[i]))
prov.addFeatures(feats)
QgsMapLayerRegistry.instance().addMapLayer(mem_layer)
và shapefile này (với 11 tính năng):
Tôi có một lớp bộ nhớ trong đó polylines là khoảng cách giữa điểm trung tâm và điểm xa nhất của mỗi đa giác (tính năng); như nó có thể được quan sát ở hình ảnh tiếp theo:
Tại Bảng điều khiển Python của QGIS, nó cũng được in chỉ mục tính năng, chỉ mục điểm trong tính năng trong đó khoảng cách từ centroid là tối đa và cuối cùng là khoảng cách tối đa.
Vì có vẻ như bạn đang sử dụng MapInfo, đây là chức năng MapBasic tôi đã viết một lúc trước cho một công cụ nội bộ mà tôi đang làm việc. Nó lấy một nút nguồn (điểm trung tâm của bạn) và một đối tượng vùng (đa giác) làm đối số và trả về một đối tượng điểm tại nút xa nhất trong đa giác từ điểm nguồn.
Function GetFurthest(ByVal oNode1 as Object, ByVal oObj as Object) as Object
Dim sourceE,sourceN,East,North,Longest,Dist as Float,
nNodes,nPolys,i,j as SmallInt,
oNode2 as Object
sourceE = CentroidX(oNode1)
sourceN = CentroidY(oNode1)
Longest = 0
nPolys = ObjectInfo(oObj,OBJ_INFO_NPOLYGONS)
For i = 1 to nPolys
nNodes = ObjectInfo(oObj,OBJ_INFO_NPOLYGONS+nPolys)
For j = 1 to nNodes
East = ObjectNodeX(oObj,i,j)
North = ObjectNodeY(oObj,i,j)
Dist = Distance(sourceE,sourceN,East,North,"m")
If Dist > Longest then
Longest = Dist
oNode2 = CreatePoint(East,North)
End if
Next
Next
GetFurthest = oNode2
End Function