매끈한 사용 : 다각형과 다중 다각형 간 변환


12

[편집 : 이것에 대한 해결책은 단순히 OGR을 사용하여 shapefile을 읽는 것입니다. geographika의 예를 참조하십시오.]

ESRI shapefile에서 다각형과 다중 다각형은 구별되지 않습니다. 더욱이, 내부 구멍과 외부 링 (명시된 다각형의 "손잡이"외에) 사이에는 명백한 차이가 없습니다.

따라서 shapefile을 읽은 후 링을 설명하는 좌표 시퀀스 목록이 있지만 더 집중적 인 처리가 없으면 이러한 링 중 어느 것이 외부 링, 내부 구멍 또는 추가 다각형인지 구분할 수 없습니다.

을위한 것으로 보인다 매끈한 다각형 및 다중 생성자의 '외부와 내부 링 사이에 명확한 구분이 있어야한다, 그래서 어떻게 명확하게 지정된 내부 및 외부 링으로, 분리 된 다각형의 순서 세트 반지의 불분명 목록에서 이동해야합니다 ?

요약 : 다각형 링 목록이 있지만 내부에 구멍이 있거나 별도의 다각형이 무엇인지 모르는 경우 지정된 내부 구멍이있는 별도의 다각형으로 어떻게 정렬해야합니까?

파이썬으로 구현할 수있는 간단한 알고리즘 솔루션을 찾고 있으며 ~ 1 분 이내에 수백 개의 다각형을 처리하는 데 사용할 수 있으며 많은 교차를 수행하기 위해이 작업을 수행하고 있습니다.


이 질문에는 Shapefile을 읽는 데 사용하는 중요한 정보가 없습니다.
inc42

@ inc42 파이썬을 사용하여 파일을 직접 읽었습니다.
BenjaminGolder

아, 그러면 Shapely 비트가 오도됩니다. 실제 문제는 Shapefile 형식에서 링의 "종류"를 결정하는 방법을 찾는 것이 었습니다. :)
inc42

답변:


10

개별 다각형을 얻는 방법에 대한 답을 다시 찾기 위해 모든 다각형에 교차점을 만들어 구멍을 만들 수 있습니다. 데이터 세트에 다각형이 겹치는 경우 운이 좋지 않습니다.

기존 shapefile 판독기의 문제점을 다시 설명하십시오.

쉐이프 파일에서 피쳐 ID 및 M 값을 내 보낸 다음 기존 쉐이프 파일 리더를 사용한 후에 다각형에 다시 결합하는 것이 더 쉽지 않습니까?

멀티 패치의 경우 동일한 방법으로 다각형 ID를 "패치 ID"에 할당 한 다음이 속성을 피쳐에 다시 추가 할 수 있습니다.

편집 : 당신은 당신이 마음을 바꿀 경우를 대비하여 OGR을 사용하고 싶지 않다고 말하지만 ..

import ogr
# Get the driver
driver = ogr.GetDriverByName('ESRI Shapefile')
# Open a shapefile
shapefileName = "D:/temp/myshapefile.shp"
dataset = driver.Open(shapefileName, 0)

layer = dataset.GetLayer()
for index in xrange(layer.GetFeatureCount()):
    feature = layer.GetFeature(index)
    geometry = feature.GetGeometryRef()
    #geometry for polygon as WKT, inner rings, outer rings etc. 
    print geometry

형상은 다음과 같이 출력되어야합니다.

POLYGON ((79285 57742,78741 54273...),(76087 55694,78511 55088,..))

첫 번째 괄호에는 외부 링의 좌표가 포함되며, 그 뒤에 괄호 안에 내부 링의 좌표가 포함됩니다. Z 값이있는 경우 점은 79285 57742 10 형식이어야합니다 (마지막 좌표는 높이).

그렇지 않으면 Shapely Contains 및 Within 함수를 사용하여 모든 다각형을 서로 평가하고 미리 공간 인덱스 ( http://pypi.python.org/pypi/Rtree/) 를 적용하여 처리 속도를 높일 수 있습니다.


고마워, 이것은 내가 찾고있는 것이 아니지만 내 질문에 대해 더 많은 설명을 할 수있었습니다. 귀하의 질문에 대답하려면 : 1, 나는 처음에 수많은 교차로를하기 위해 정렬하기 때문에. 2, 아무것도, 나는 경량이고 파이썬에서 쉽게 사용할 수있는 것을 필요로하며 ogr을 배우지 못했습니다. 3, 아니오,이 경우에는 쉽지 않을 것입니다.
BenjaminGolder

1
와! geographika 감사합니다! 나는 지금 90 %가 ogr이 여기에 해결책이라고 확신합니다. ogr과 관련된 설치 문제가 발생했지만 문제가없는 것 같습니다. ogr은 wkt 출력에서 ​​링을 구성합니까? 그리고 3d shapefile로 괜찮습니까 (많은 3d를 사용합니다)?
BenjaminGolder

내 질문에 대한 답변이 그렇습니다. 그리고 rtree를 소개해 주셔서 감사합니다. 이번에 설치를 올바르게 구성 할 수있는 한 OGR은 문제를 완전히 해결하는 것으로 보입니다.
BenjaminGolder

OGR 다시 설치-Windows 용 바이너리 및 일치하는 Python 바인딩이 필요합니다.
geographika

9

먼저 ogr을 사용하여 shapefile을 엽니 다.

from osgeo import ogr
source = ogr.Open("mpolys.shp")
layers =  source.GetLayerByName("mpoly")
len(layers)
1

shapefile 도형을 매끈한 도형으로 변환

from shapely.wkb import loads
element=layers[0] #(because lenght of layer =1, else you need "for element in layers: ...")
geom = loads(element.GetGeometryRef().ExportToWkb())
geom.geom_type
'MultiPolygon'
print geom
MULTIPOLYGON ((..... # the geometry in shapely wkt format

다중 다각형의 다각형 :

poly=[]
for pol in geom:
    poly.append(pol)
poly[0]
<shapely.geometry.polygon.Polygon object at 0x00B82CB0>
poly[0].geom_type
'Polygon'
print(poly[1])
POLYGON ((.... # the geometry in shapely wkt format

그리고 지금, 당신은 shapey ( shapely ) 의 모든 기능을 사용할 수 있습니다


1

다각형이 실제로 모양 파일에 저장되는 방법에 익숙하지는 않지만 시작 좌표가 반복되는 경우에만 다각형 링이 닫힌 루프가되어서는 안됩니까? 따라서 각 후속 좌표를 시작 좌표와 비교하면 다각형이 닫힌 첫 번째 점을 찾을 수 있습니다. 이것이 다각형의 마지막 좌표 인 경우 단순한 다각형입니다. 그렇지 않으면 다중 다각형이므로 다른 루프를 처리해야합니다.

그것은 당신이 피하고 싶은 '보다 집중적 인 처리'일지도 모르지만, 실제로 당신이 어쨌든 읽을 때 무료로 제공되는 좌표를 통한 반복입니다.


죄송합니다. 내 질문은 약간 오도되어 편집했습니다. 다각형 링이 있고 다각형 링 목록이 두 개 이상인 시점을 알고 있지만 시계 방향 또는 시계 반대 방향의 점 순서를 제외하고 내부 또는 외부 링인지 알 수 없습니다. 그들이 내부 링이라면 위치를 측정하는 것 외에 어떤 외부 링이 속하는지 확신 할 수 없습니다.
BenjaminGolder

내가 참조. 또한 당신이 오그로가는 길을 찾게되어 기쁩니다. )
relet

-2

ESRI Shapefile의 8 페이지 에 @ inc42표시되는 기술 설명 : ESRI 백서 --1998 년 7 월 (PDF의 34/12 페이지 ) 다음은 다각형 레코드 내용에 대한 설명입니다.

다각형에는 여러 개의 외부 링이 포함될 수 있습니다. 링의 정점 또는 방향은 링의 어느 쪽이 다각형의 내부인지 나타냅니다.


p.10에는 "다각형에 여러 개의 외부 링이 포함될 수 있습니다. 링의 정점 또는 방향은 링의 어느 쪽이 다각형의 내부인지를 나타냅니다."
inc42

@ inc42는 페이지 번호가 8 (또는 34 중 12)이어야한다고 생각하지만 이에 따라 업데이트되었습니다.
PolyGeo
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.