중심을 다각형에 할당하고 이동


9

QGIS 1.8 Lisboa를 사용하고 있습니다. 다각형 셰이프 파일에서 중심을 계산 한 후 일부가 다각형 외곽선 밖에있는 경우 해당 다각형에서 가져온 다각형으로 이동하고 싶습니다. 다각형 자체의 식별 코드로 사용할 좌표를 추출하는 데 사용해야하므로 기준은 동일해야합니다. 따라서 프로시 저는 동일한 다각형에 대해 실행될 때마다 동일한 지점 위치를 출력해야합니다 ( "랜덤 포인트"기능으로 지정된 것과 같은 임의의 위치가 아님).


1
두 가지 질문처럼 들립니다. 올바르게 이해하면 (a) 다각형 안에 임의의 점을 추가하고 (b)이를 기준으로 고유 한 ID 또는 다각형을 지정하려고합니다. (a)에 가장 염두에 두어야 할 것은 QGIS의 기존 임의 포인트 기능을 사용하고 해당 포인트 클라우드를 다각형과 교차시키는 것입니다.
lynxlynxlynx

동일한 다각형으로 "무작위 점"기능을 다른 시간에 사용하면 결과가 달라집니다 (즉, 각 다각형에서 파생 된 점의 위치가 함수를 새로 사용할 때마다 다릅니다). 그리고 나는 나에게 줄 방법을 만들고 싶습니다 다각형 자체의 식별 코드로 사용하려는 좌표를 추출 할 수있는 다각형 당 항상 같은 점입니다.
umbe1987

형상 도구에서 fTools 'true centroid'도구 사용 -docs.qgis.org/html/en/docs/user_manual/plugins/…
Mapperz

그것은 단지 나에게 중심을 제공하지만, 이것은 또한 피해야 할 폴리곤 외부에있을 수 있습니다. 최소 거리와 같은 기능을 사용하여 파생 된 다각형으로 이동해야합니다 (그러나 거리에는 관심이 없으므로 이동하고 싶습니다). 다른 블로그에서 누군가 PostGIS의 ST_PointOnSurface를 사용하라고 말했지만 QGIS를 사용하고 있습니다.
umbe1987

답변:


7

Shapely python 라이브러리를 사용할 수 있습니다.이 라이브러리 representative_point()는 다각형 내에 있을 수있는 기능 을 제공합니다 .

다음은 QGIS Python 콘솔에서 실행할 수있는 Python 스크립트입니다. 속성을 만들 다각형 레이어를 선택해야합니다. 이 함수는 업데이트하려는 속성의 이름을 사용합니다. 이 속성은 레이어에 이미 존재해야하며 문자열 유형이어야하며 충분히 길어야합니다 (30 자).

다음은 알고리즘에서 찾은 포인트의 예입니다.

import shapely.wkb

def setIDPoint(attributename):
 layer = qgis.utils.iface.activeLayer()
 provider = layer.dataProvider()
 fields = provider.fields()
 provider.select(provider.attributeIndexes() )
 attributeID = provider.fieldNameIndex(attributename)
 feature = QgsFeature()
 layer.startEditing()
 while provider.nextFeature(feature):
  wkb = feature.geometry().asWkb()
  polygon = shapely.wkb.loads(wkb)
  reprPoint = ','.join([str(polygon.representative_point().x), str(polygon.representative_point().y)] )
  feature.changeAttribute(attributeID, reprPoint)
  layer.updateFeature(feature)
 layer.commitChanges()

나는 그것을 시험하려고 노력하고 있는데, 내가 찾던 것과 정확히 일치하는 것 같습니다. 내가 그것을 실행하자마자 알려 드리겠습니다!
umbe1987

내가 그것에 대해 얻지 못한 한 가지는 "문자열 유형이어야하고 충분히 길어야합니다 (30 자)"라는 의미입니다. 이 라이브러리가 다각형 shpfile에서 직접 작동합니까? 그렇다면 Att 탭에 적어도 30 개의 문자가있는 새 문자열 유형 필드를 만들어야합니까? 이것이 업데이트되어야합니까?
umbe1987

@ user9518 : 예, 테이블에 속성을 직접 작성해야하는 시점에 함수가 작성되는 방식으로 필드 이름 만 함수에 전달하십시오. 필요한 필드 자체를 작성하도록 스크립트를 쉽게 쉽게 조정할 수 있습니다.
Jake

한 가지만보고 싶을뿐입니다. 이제 "def"를 입력하여 함수 (또는 클래스)를 정의하고있는 것으로 보이지만 스크립트 작성을 마치면 아무 일도 일어나지 않습니다. 최종적으로 결과를 테이블에 표시하려면 어떻게해야합니까?
umbe1987

1
완벽하게 작동했습니다 !!! 좌표가 레이어의 좌표계에 따라 작성되었으며 점을 원한다면 해당 좌표로 shp를 만들어야한다고 생각합니까? 당신이 여기 있다면 적어도 3 맥주를 제공 할 것입니다! 노력해 주셔서 감사합니다 !!!
umbe1987

5

ftools 중심 도구는 중심이 오목한 경우 다각형 외부에 중심을 배치 할 수 있습니다.

ST_PointOnSurface확실히 당신이 원하는 것을 할 것입니다. SPIT을 사용하여 shapefile을 PostGIS로 가져온 다음 PgQuery 플러그인을 사용하여 쿼리를 실행하여 설치 한 경우 QGIS 내부에서 명령을 사용할 수 있습니다.

또는 PostGIS 설치가 일회성 용도로 사용 되는 경우 QGIS 내에서 Spatialite 를 사용할 수 있습니다 . 그런 다음 QSpatiaLite 플러그인을 사용하여 데이터를 SpatiaLite로 가져 와서 쿼리를 실행할 수 있습니다 (SpatialLite honors ST_PointOnSurface).


2

내가 당신을 올바르게 이해하면 Vector-> Research Tools_> Random Points를 사용하십시오. 이제 "Stratified Sampling Design (개별 다각형)"에서 입력 필드의 값을 사용하고 적절한 필드를 사용하여 점의 숫자 값을 제공합니다. 각 필드는 서로 다른 다각형에 대해 생성되어야합니다.


"적절한 분야"란 무엇을 의미합니까? 나는 중심을 사용하고 그것을 (예를 들어) 가장 가까운 다각형까지 그 지점의 최소 거리를 계산함으로써 그것을 참조하는 다각형의 가장 가까운 부분에 연결하려고했습니다. 그런 다음 그 점 좌표를 추출하여 다각형의 고유 한 특정 식별 코드로 사용합니다.
umbe1987

기본적으로 내가하려고하는 것은 각 중심을 상대 다각형에 할당하고 다각형 내부에 놓거나 최소한 경계선에 닿도록 이동시키는 것입니다.
umbe1987

@ user9518 : 죄송합니다, 귀하의 질문을 오해했습니다. 각 폴리 내에 특정 수의 임의의 포인트를 원한다고 생각했습니다. 예를 들어 2 포인트 fpr 폴리 1, 10 포인트 poly2 등 등 "적절한 필드"라는 용어입니다. 물론이 폴리곤에 대해 하나의 포인트 만 생성하려면 "이 포인트 수 사용"에 대해 1을 선택할 수 있습니다. 이 점은 폴리 안에 있거나 최소한 경계선에 닿습니다. 그러나이 점은 여전히 ​​무작위로 발견되므로 절차를 다시 실행할 때 다른 점이 나타납니다 :-(
Kurt

1

플러그인> 플러그인 관리 및 설치를 통해 설치할 수있는 realcentroids 플러그인 QGIS 2.2에서 나를 위해 중심점과 같은 점을 생성하여 오목한 경우 각 다각형 내부에서 강제로 점이 생성되었습니다 (점은 가장자리에 매우 가깝습니다). Kurt가 제안한 Random points 도구를 사용해 보았는데 다각형 당 1 점을 지정했지만 대신 2 점을 생성합니다. 추가 단점은 대부분의 경우 점이 임의의 중심을 나타내지 않는다는 것입니다.

http://www.agt.bme.hu/gis/qgis/realcentroid/

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