중심과 다각형의 가장 먼 지점 사이의 거리


12

6,00,000 개 이상의 레코드가있는 마을 다각형 레이어가 있습니다. 각 마을의 중심을 계산했습니다. 중심과 각 다각형의 가장 먼 노드 사이의 거리를 찾고 싶습니다. 아래 이미지를 참조하십시오. 검은 선은 다각형 경계입니다. 여기에 이미지 설명을 입력하십시오

여기에 이미지 설명을 입력하십시오

여기에 이미지 설명을 입력하십시오


흥미 롭습니다. 저는 오늘 금요일 postgis로 다각형 주위에 원을 만들었습니다. 내가 사용한 코드를 찾으려면 몇 분이 필요합니다. i.stack.imgur.com/EKnkg.png
kttii

1
먼저 우리는 당신이 원하는 모든 프로그램을 알아야 할 수도 있습니다. 또한 중심점과 노드를 어떻게 만들었습니까? (그것은 다각형의 노드가 당신의 형상의 경계를 설정하는 데 사용되는 것들입니다,하지만 당신은 양태에서는 위에 aditionnal 포인트를 추가 않았다 조금 명백한 것 같다하더라도?)
모로 콜린

중심의 위치가 중요합니까? 어떻게 만들었습니까?
GISGe


중심이 실제로 중심이면 다각형에 맞는 점을 중심으로 가장 작은 원의 반경입니다 ( en.wikipedia.org/wiki/Smallest-circle_problem )
Mark Ireland

답변:



15

PostGIS를 사용하여 ST_ConvexHull을 사용하여 다각형을 단순화하여 더 빠른 결과를 얻었습니다.

가장 먼 점을 얻으십시오 :

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;

그리고 중심에서 원을 만드는 데 관심이 있다면 :

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;

여기에 이미지 설명을 입력하십시오


간단하고 빠르며 효율적입니다. 이 작업을 수행하는 데 도움이되므로 이것을 게시 해 주셔서 감사합니다.
Moreau Colin

@kttii PostGIS 사용법을 모르겠습니다. arc 또는 mapinfo 또는 qgis로 더 간단한 솔루션을 제공 할 수 있습니까?
Divya

@kttii 그래서 Postgresql을 설치했습니다. 이 정확한 검색어를 복사하여 붙여 넣었지만 오류가 발생했습니다. 'the_geom'열이 없습니다. 어떻게해야합니까?
Divya

the_geom은 도형 필드 이름으로 바꿔야합니다. PostgreSQL에도 데이터를 넣어야합니다. PostgreSQL은 MSSQL과 같은 데이터베이스입니다. PostGIS는 데이터베이스를 공간적으로 인식하고 모든 ST_ 기능을 제공하기위한 확장입니다.
kttii

@kttii 데이터베이스에서 필드 이름을 the_geom에서 "gid"로 업데이트했습니다. 쿼리를 다시 실행 한 후이 오류가 발생했습니다. st_convexhull (integer) 함수가 존재하지 않습니다
Divya

4

다음 PyQGIS 코드 사용 :

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)

이 shapefile (11 개의 기능이 있음) :

여기에 이미지 설명을 입력하십시오

폴리 라인이 중심과 각 다각형의 가장 먼 지점 사이의 거리 (기능) 인 메모리 레이어가 있습니다. 다음 이미지에서 볼 수 있습니다.

여기에 이미지 설명을 입력하십시오

QGIS의 Python Console에서는 중심점으로부터의 거리가 최대이고 마지막으로 최대 거리 인 피쳐의 인덱스 인 피쳐 인덱스도 인쇄되었습니다.

여기에 이미지 설명을 입력하십시오


PyQGIS 사용 방법을 모르겠습니다. arc 또는 mapinfo 또는 qgis로 더 간단한 솔루션을 제공 할 수 있습니까?
Divya

1
PyQgis 시작하기에 도움이 링크를 시도하십시오 spatialgalaxy.net/2014/10/09/...
kttii

0

MapInfo를 사용하고있는 것처럼 여기에 내가 작업했던 사내 도구에 대해 잠시 전에 쓴 MapBasic 함수가 있습니다. 소스 노드 (중심점)와 영역 객체 (다각형)를 인수로 사용하여 소스 점에서 다각형의 가장 먼 노드에있는 포인트 객체를 반환합니다.

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
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.