Khoảng cách giữa tâm và điểm xa nhất của đa giác


12

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. nhập mô tả hình ảnh ở đây

nhập mô tả hình ảnh ở đây

nhập mô tả hình ảnh ở đây


thật thú vị ... Tôi vừa mới làm thứ sáu này với postgis để tạo ra một vòng tròn xung quanh một đa giác. Tôi cần một vài phút để tìm mã tôi đã sử dụng .. i.stack.imgur.com/EKnkg.png
kttii

1
Trước tiên, chúng tôi có thể cần biết các chương trình mà bạn có theo ý của bạn. Ngoài ra, làm thế nào bạn tạo ra throid centroids và nút? (Thậm chí nếu nó có vẻ hơi rõ ràng rằng các nút trên các đa giác là những người sử dụng để thiết lập các ranh giới của hình dạng của bạn, nhưng bạn đã thêm điểm aditionnal trên đầu trang của thoses?)
Moreau Colin

Là vị trí của trung tâm quan trọng? Làm thế nào bạn tạo ra chúng?
GISGe


Nếu trọng tâm thực sự là trung tâm, thì đó là bán kính của vòng tròn nhỏ nhất tập trung vào điểm đó phù hợp với đa giác ( en.wikipedia.org/wiki/Smallest-circle_probols )
Mark Ireland

Câu trả lời:



15

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;

nhập mô tả hình ảnh ở đây


Đơn giản, nhanh chóng, hiệu quả. Cảm ơn bạn đã đăng bài này vì điều này cũng sẽ giúp tôi trong những gì tôi đang làm.
Moreau Colin

@kttii Tôi không biết cách sử dụng PostGIS. Bạn có thể cung cấp một giải pháp đơn giản hơn, trong arc hoặc mapinfo hoặc qgis
Divya

@kttii Vì vậy, tôi đã cài đặt Postgresql. Tôi đã sao chép-dán truy vấn chính xác này nhưng nó đã cho LRI: cột "the_geom" không tồn tại. Tôi làm gì?
Divya

the_geom nên được thay thế bằng tên trường hình học của bạn. Bạn cũng sẽ phải đưa dữ liệu của mình vào PostgreSQL. PostgreSQL là một cơ sở dữ liệu như MSSQL. PostGIS là một phần mở rộng để làm cho cơ sở dữ liệu nhận thức không gian và cung cấp tất cả các hàm ST_.
kttii

@kttii Tôi đã cập nhật tên trường từ the_geom thành "gid" trong cơ sở dữ liệu của mình. Sau khi chạy lại truy vấn, tôi đã nhận được LRI này: hàm st_convexhull (số nguyên) không tồn tại
Divya

3

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):

nhập mô tả hình ảnh ở đây

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:

nhập mô tả hình ảnh ở đây

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.

nhập mô tả hình ảnh ở đây


Tôi không biết cách sử dụng PyQGIS. Bạn có thể cung cấp một giải pháp đơn giản hơn, trong arc hoặc mapinfo hoặc qgis
Divya

1
Hãy thử liên kết này để được trợ giúp khi bắt đầu với PyQgis spatialgal Wax.net/2014/10/09/ trên
kttii

0

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
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.