ogr 및 Python을 사용하여 다각형 내의 (선 스트링) 포인트


10

현재 shapefile에서 찾은 지오메트리 피처로 토폴로지 네트워크를 구축해야하는 프로젝트를 진행하고 있습니다. 지금까지 Ben Reilly의 오픈 소스 프로젝트를 사용하여 선 스트링을 네트워크 에지로 변환하고 가까운 피처 (다른 선 스트링이라고 함)를 감지하고 가장 가까운 경로에 추가하여 가장 짧은 경로 알고리즘을 실행할 수있었습니다.

그러나 그것은 하나의 shapefile에 좋습니다. 그러나 이제 다른 모양 파일의 기능을 큰 networkx 그래프에 연결해야합니다. 예를 들어, 점이 다각형 내에있는 경우 연결하면 다음 모양 파일의 점과 네트워크 엣지를 추가합니다-add_edge (g.GetPoint (1), g.GetPoint (2)) 다른 속성의 다각형은 좌표가 아닌 동일한 ID 만 공유하며 다각형 내에있는 점도 동일한 좌표를 공유하지 않습니다.

이 문제에 대한 나의 해결책은 다각형에있는 점을 식별하고 저장하고 동일한 ID를 가진 다각형에있는 다음 shapefile에서 점을 찾은 다음 그 사이에 네트워크 가장자리를 추가하는 것이 었습니다.

점이 다각형 내에 있는지 확인하는 방법 잘 알려진 알고리즘이 있습니다 : RayCasting 알고리즘. 알고리즘을 구현하기 위해 다각형의 좌표가 필요 하고 OGR의 Geometry에 대한 문서 를 훑어 본 후에도 지금 액세스하는 방법을 알지 못하기 때문에 이것이 실제로 붙어있는 곳입니다 . 그래서 내가 묻는 질문은 다각형 점에 액세스하는 방법 또는 좌표입니다. 또는 점이 다각형 내에 있는지 여부를 감지하는 더 쉬운 방법이 있습니까? osgeo.ogr 라이브러리와 함께 파이썬을 사용하여 다음을 코딩했습니다.

 if g.GetGeometryType() == 3: #polygon
                c = g.GetDimension()
                x = g.GetPointCount()
                y = g.GetY()
                z = g.GetZ()

내 문제를 더 잘 이해하려면 이미지를 참조하십시오. 대체 텍스트

[편집] 지금까지 모든 폴리곤 객체를 목록에 저장하려고 시도했습니다. 그런 다음 선 스트링을 첫 번째 지점과 마지막 지점과 비교합니다 . 그러나 Paolo의 예는 점 개체 참조 및 다각형 개체 참조를 사용하는 것과 관련이 있습니다. 이는 전체 라인이 다각형 내에 있지 않고 선 스트링의 첫 번째 또는 마지막 점 이기 때문에 선 개체 참조와 함께 작동하지 않습니다 .

[EDIT3] 선 스트링의 첫 번째와 마지막 점의 좌표에서 새 Geometry 점 개체를 만든 다음이 점을 사용하여 목록에 저장된 다각형 지오메트리 개체와 비교하면 제대로 작동하는 것 같습니다.

for findex in xrange(lyr.GetFeatureCount()):
    f = lyr.GetFeature(findex)
    flddata = getfieldinfo(lyr,f,fields)
    g = f.geometry()
    if g.GetGeometryType() == 2:
        for j in xrange(g.GetPointCount()):
            if j == 0 or j == g.GetPointCount():
                point = ogr.Geometry(ogr.wkbPoint)
                point.AddPoint(g.Getx(j),g.GetY(j))
                if point.Within(Network.polygons[x][0].GetGeometryRef()):
    print g.GetPoint(j)

힌트를 준 PaoloChris 에게 감사 합니다.

답변:


11

모양이 시원하고 우아하지만 공간 연산자 (OGRGeometry 클래스)와 함께 여전히 ogr을 사용하지 않는 이유는 무엇입니까?

샘플 코드 :

from osgeo import ogr
driver = ogr.GetDriverByName('ESRI Shapefile')
polyshp = driver.Open('/home/pcorti/data/shapefile/multipoly.shp')
polylyr = polyshp.GetLayer(0)
pointshp = driver.Open('/home/pcorti/data/shapefile/point.shp')
pointlyr = pointshp.GetLayer(0)
point = pointlyr.GetNextFeature()
polygon = polylyr.GetNextFeature()
point_geom = point.GetGeometryRef()
polygon_geom = polygon.GetGeometryRef()
print point_geom.Within(polygon_geom)

GEOS 지원으로 GDAL을 컴파일해야합니다.


grzie Paolo, 그러나 실제로 필요한 것은 점의 객체 참조를 다각형 중 하나와 비교하는 것이 아니라 현재 GetPoint로 액세스하는 선 스트링의 마지막 점과 첫 번째 점을 비교하는 것입니다. 내가 알아 낸 GetPointRef가 없습니다. 어떻게 구현할 수 있습니까?
user39901230

1
linestring은 반복 가능한 지오메트리 점 모음 (정점)으로, 첫 번째와 마지막에 쉽게 액세스 할 수 있습니다.
capooti

나중에 폴리곤 객체를 목록에 저장하려고했는데 나중에이 라인 스트링의 첫 번째와 마지막 점을 확인하는 데 사용합니다. 그러나 어떤 이유로 다각형 내의 점 목록에 점이 추가되지 않습니다. 여기를 살펴보십시오 : codepad.org/Cm2BV5mp
user39901230

8

나는 networkx에 익숙하지 않지만 귀하의 질문을 올바르게 이해하면 shapefile에서 다각형의 점을 찾기 위해 shapely 및 OGR lib를 사용할 수 있습니다 . 다음은 하나의 쉐이프 파일에서 하나의 점 (2000,1200)이 다각형을 사용하여 실패하는지 확인하는 방법의 예입니다. 결과적으로 해당 다각형의 좌표를 인쇄합니다.

from shapely.geometry import Point, Polygon
from shapely.wkb import loads
from osgeo import ogr

file1 = ogr.Open("d:\\fileWithData.shp")
layer1 = file1.GetLayerByName("fileWithData")

point1 = Point(2000,1200)

polygon1 = layer1.GetNextFeature()

while polygon1 is not None:
    geomPolygon = loads(polygon1.GetGeometryRef().ExportToWkb())
    if geomPolygon.contains(point1):
        xList,yList = geomPolygon.exterior.xy
        print xList
        print yList
    polygon1 = layer1.GetNextFeature()

도움이 되길 바랍니다.

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