현재 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)