QGIS에서 등거리 점을 작성합니까?


22

QGIS에서 도로 (기존 레이어)를 따라 특정 거리에 포인트 (새 레이어)를 만들려고합니다. ArcGIS Desktop을 사용하여 카운티 수준에서 미터마다 정규 포인트를 생성합니까? ArcGIS를위한 솔루션을 제공합니다. QGIS에서 이것을 달성하는 방법? QGIS를 사용하여 포인트 벡터 레이어에 포인트를 추가 하시겠습니까? 점을 작성하는 방법을 설명하지만 거리에 대해서는 아무 것도하지 않습니다.


@Nathans의 솔루션은 어느 정도 효과가 있었지만 ...

여기에 이미지 설명을 입력하십시오. 여기에서 이러한 등거리 점의 투영은 원래 선과 다릅니다.

@underdark의 제안으로

이 사진점들이 등거리가 아닌 것 같습니다. 나는 이해하지 못하는 두 가지 모두에 투영 문제가 있다고 생각합니다.



2
몇 가지 포인트. 첫째,이 선은 예상 CRS (위도 / 경도가 아님)에 있어야합니다. 둘째, 선이 진정한 폴리 라인입니까? 개별 줄로 구성된 줄에서 어떤 방법이 제대로 작동하지 않는다고 생각합니다. 새긴 ​​금.
nhopton

또한 내 코드를 사용하면 import locate한 번 이상 회선 을 호출 할 필요가 없습니다 . 한 번만 호출 locate.pointsAlongLine(30)하면 필요한만큼 많이 호출 할 수 있습니다.
Nathan W

또 다른 방법 (여기에서 일부 답변에서 제안한 Sextant가 QGIS <2.0 만 해당됨)도 QChainage라는 플러그인을 사용하는 것입니다.
andy

답변:


14

참고 : 이제 QGIS 플러그인이 QChainage있습니다. 이 모든 것을 더 많이합니다. 아래 코드는 QGIS 2.0 이상에서 구식입니다.

다음은 파일에 넣고 QGIS 내부에서 사용할 수있는 Python 코드입니다.

QGIS에는 라이너 참조를 수행하는 API가 있지만 올바르게 작동하지는 않지만 코드 작성자에게 연락하여 문제가 있는지 확인합니다.

지금은 매끈한 Python 라이브러리 가 필요합니다. 어쨌든 가지고 있기 때문에 어쨌든 설치해야합니다. 또한 http://toblerity.github.com/shapely/manual.html에 훌륭한 문서가 있습니다.

이것은 다음 예제 http://toblerity.github.com/shapely/manual.html#interoperation 에서 사용중인 섹션 입니다.

다음 코드의 대부분은 기능, 레이어, wkb 및 wkt에서 변환 한 후 생성하는 QGIS 상용구 코드입니다. 코어 비트는 point = line.interpolate(currentdistance)라인을 따라 거리를두고 점을 반환합니다. 우리는 라인이 다 떨어질 때까지 이것을 루프로 감 쌉니다.

import qgis
from qgis.core import *
from PyQt4.QtCore import QVariant
from shapely.wkb import loads
from shapely.wkt import dumps

vl = None
pr = None

def createPointsAt(distance, geom):
    if distance > geom.length():
        print "No Way Man!"
        return

    length = geom.length()
    currentdistance = distance
    feats = []  

    while currentdistance < length: 
        line = loads(geom.asWkb())
        point = line.interpolate(currentdistance)
        fet = QgsFeature()
        fet.setAttributeMap( { 0 : currentdistance } )
        qgsgeom = QgsGeometry.fromWkt(dumps(point))
        fet.setGeometry(qgsgeom)
        feats.append(fet)
        currentdistance = currentdistance + distance

    pr.addFeatures(feats)
    vl.updateExtents()

def pointsAlongLine(distance):
    global vl
    vl = QgsVectorLayer("Point", "distance nodes", "memory")
    global pr
    pr = vl.dataProvider()  
    pr.addAttributes( [ QgsField("distance", QVariant.Int) ] )
    layer = qgis.utils.iface.mapCanvas().currentLayer()
    for feature in layer.selectedFeatures():
        geom = feature.geometry()
        createPointsAt(distance, geom)

    QgsMapLayerRegistry.instance().addMapLayer(vl)

위의 코드를 파일에 복사하여 붙여 넣습니다 ~./qgis/python(파이썬 경로에 있기 때문에).

 import locate
 locate.pointsAlongLine(30)

그러면 선택한 선을 따라 30 미터마다 점이있는 새로운 점 레이어가 생성됩니다.

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

참고 : 코드는 매우 거칠고 정리가 필요할 수 있습니다.

편집 : 가장 최근의 QGIS dev 빌드는 이제 기본적 으로이 작업을 수행 할 수 있습니다.

while 루프를 다음 createPointsAt과 같이 변경하십시오 .

 while currentdistance < length: 
    point = geom.interpolate(distance)
    fet = QgsFeature()
    fet.setAttributeMap( { 0 : currentdistance } )
    fet.setGeometry(point)
    feats.append(fet)
    currentdistance = currentdistance + distance

그리고 당신은 제거 할 수 있습니다

from shapely.wkb import loads
from shapely.wkt import dumps

감사합니다 @Nathan. 파이썬 용 Shapely 패키지를 얻을 수 없습니다. python 2.7을 설치했지만 Shapely 설치 관리자는 python 2.7이 레지스트리에 없다고 말합니다. Shapely를 설치하는 다른 방법이 있습니까?
Stat-R

나는 stackoverflow.com/questions/3652625/…를 따르고 locate그것을 호출 하고 사용하기 위해 위의 두 줄을 입력 했지만 여전히 등거리 점을 얻지 못했습니다. 또한, 나는 파이썬의 신 생물이므로 코드 (1) qgis 디렉토리의 파이썬 또는 (2) C : \ Python27 \에서 코드를 실행할 위치를 이해하지 못했습니다.
Stat-R

어떤 OS를 사용하고 있습니까?
Nathan W

Windows 7 Professional
Stat-R

파이썬 파일을 C:\Users\{you user name}\.qgis\python만든 다음 QGIS를 다시 시작하십시오 (열린 경우 플러그인-> Python 콘솔 . Load a line layer, select a line a call 가져 오기 위치) 및locate.pointsAlongLine(30)
Nathan W

5

QGIS GRASS 플러그인 v.to.points 도구를 사용하여 일정한 간격으로 선을 따라 점을 만들 수 있습니다

# convert line to points; dmax = distance between points
v.to.points -i -v -t in=road out=road_pts type=line dmax=90

나는 dmax를 100으로 사용했고 그 결과는 다음과 같습니다. (CRS 자체가 어떻게 할당되는지 모르겠습니다.)CRS of Original Shape file, the line = EPSG:26915 - NAD83 / UTM zone 15N, CRS of Grass line vector obtained using v.in.ogr = EPSG:4269 - NAD83, CRS of Grass points vector obtained using v.to.points = EPSG:4326 - WGS 84
Stat-R

QGIS-> Sextante-> GRASS-> v.to.points
markusN

5

도로 라인을 따라 고정 간격으로 체인을 플롯하려면 '프로파일 라인'플러그인을 사용하여이를 수행 할 수 있습니다. 로드 라인 레이어 아래에 DEM이 필요하지만 절차는 빠르고 간단합니다. 새긴 ​​금.

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


이것은 매우 좋고 쉬운 방법입니다. 감사합니다!
Shepherdjo

2

Shapely (Python) / GEOS (C ++) 데이터 모델은 평면에 정의되어 있습니다. 따라서 포인트가 GPS 위치 (위도, 경도)로 구성되어 있으면이 shapely.geometry.LineString.interpolate(distance)방법을 사용 하여 유클리드 거리에서 GPS 위치를 출력합니다 LineString.

Shapely interpolate()geos::linearref::LengthIndexedLineextractPoint방법을 사용하는 GEOS 클래스를 기반으로 합니다 .

위도-평면에서 동일 간격의 보간은 비교적 작은 거리를 고려하는 응용에 충분하다고 가정합니다. 그러나 일반적으로 WGS84에 정의 된대로 GIS 응용 분야의 구면 거리를 고려해야합니다 .

Shapely 모듈을 사용하는 두 가지 해결 방법을 생각할 수 있습니다.

  • LineString속성은 모두 주어진 점과 그에 따라 선형 보간 곡선입니다. 아마도 보간 된 커브에 접근하고 유클리드 거리를 대체하는 다음 선 적분을 구현하는 멤버를 작성할 수 있습니다. 구간 별 연속 곡선을 사용하면 반경과 곡선을 따라 인접한 원의 교차점을 계산하여 원하는 점을 얻을 수 있기 때문에이 방법을 좋아합니다 r = radian_measure(arc_length) = arc_length / R. 여기서 R은 주어진 위치에서 지구의 반경과 같습니다.
  • 적절한 거리 함수 (예 : 헤르 세인 공식)를 사용하여 자신의 보간 방법 (Shapely 코드를 건드리지 않고)을 코딩하십시오.

이를 달성하기 위해 다음 StackOverflow 질문 과 특히이 답변 을 참조하고 싶습니다 .

곡선을 따라 등거리 점을 생성 할 수 있습니다. 그러나 실제 답변을 원하는 것에 대한 더 많은 정의가 있어야합니다. 죄송하지만이 작업을 위해 작성한 코드는 MATLAB에 있지만 일반적인 아이디어를 설명 할 수 있습니다. 세 가지 가능성이 있습니다.

첫째, 단순한 유클리드 거리와 관련하여 이웃과 점이 동일해야 하는가? 그렇게하려면 곡선의 어느 지점에서든 고정 반경의 원으로 교차점을 찾는 것이 필요합니다. 그런 다음 커브를 따라갑니다.

다음으로 거리가 곡선 자체를 따라 거리를 의미하도록하려는 경우, 곡선이 부분 선형 인 경우 문제를 다시 쉽게 해결할 수 있습니다. 선분의 거리는 측정하기 쉽기 때문에 곡선을 따라 밟으면됩니다.

마지막으로, 커브가 3 차 스플라인이 되려면 다시 어렵지 않지만 조금 더 많은 작업이 필요합니다. 트릭은 다음과 같습니다.

  • 곡선을 따라 점에서 점으로 선형 선형 길이를 계산합니다. 그것을 t라고 부르십시오. 입방 스플라인 쌍 x (t), y (t)를 생성합니다.

  • x와 y를 t의 함수로 미분하십시오. 이들은 입방 세그먼트이기 때문에 쉽습니다. 미분 함수는 조각
    2 차입니다.

  • 차등 아크 길이 함수를 통합하여 곡선을 따라 이동하기 위해 Oode 솔버를 사용하십시오. MATLAB에서 ODE45는 훌륭하게 작동했습니다.

따라서 하나는

sqrt((x')^2 + (y')^2)

MATLAB에서 함수가 특정 점을 교차하는 위치를 식별하도록 ODE45를 설정할 수 있습니다.

MATLAB 기술이 과제에 부합하는 경우 자세한 설명을 위해 interparc 의 코드를 볼 수 있습니다 . 적절하게 주석이 달린 코드입니다.

3 : http://www.mathworks.com/matlabcentral/fileexchange/34874-interparc


1

Sextante는 당신을 위해 일할 수있는 도구가 있습니다. Sextante는 Qgis 플러그인 저장소에서 다운로드 할 수 있습니다.

: 대한 봐
"라인 레이어 도구"
"equispaced 점 라인"


이 플러그인은 QGIS 2 또는 3에서 사용할 수없는 것 같습니다.
Martin Burch
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.