QGIS를 사용하여 선을 따라 지정된 거리에 점을 생성 하시겠습니까?


20

QGIS를 사용하여 선을 따라 점을 만들려고하지만 지정된 거리에 있습니다. SEXTANTE Toolbox에서 두 개의 GRASS 도구를 찾았습니다.

  • v.to.points
  • v. 세그먼트

v.to.points를 시도 하여지도 단위의 점 사이의 최대 거리를 100으로 설정하고 이것을 얻었습니다.

선을 따라 포인트

가까이 봐

두 번째 사진은 위 사진과 밀접한 관련이있었습니다. 결과는 내가 원하는 것이었지만 더 적은 포인트를 얻고 싶지만 최대 거리를 1000 또는 1000000으로 설정하더라도 결과는 동일합니다.

v.segment 사용하려고했지만 세그먼트 규칙이 포함 된 파일이 없습니다.

Underdark는 저에게 조언을 해 주었고 , 간격이 주어진 Densify 지오메트리를 시도 했습니다 . 먼저 입력 한 것과 동일한 폴리 라인 모양 파일을 얻은 다음 추출 노드 를 사용 하여 해당 점을 가져 왔습니다. 그러나 결과는 거리 간격을 어떻게 설정했는지에 관계없이 v.to.points 사용과 동일 합니다.

선을 따라 지정된 거리에 점을 어떻게 만들 수 있습니까?


4
이것 좀 봐, 우리에게 알려 nathanw.net/2012/08/05/…
Willy

이 유용한 조언을 주셔서 감사합니다! 스크립트를 사용하려면 파이썬을 설치해야합니까? 또는 새로운 버전의 QGIS 2.0에서는 이미이 기능이 내장되어 있습니까?
Heinz

5
QGIS 2.0에는 QChainage라고하는 플러그인이 있습니다. 플러그인을 가져 와서 설치하십시오.
Willy

QGIS 2.2.0+에서는 "Sextante"툴박스를 "프로세싱"이라고하고 간격이 주어진 Densify 지오메트리 "는 ProcessingToolbox / QGISGeoalgorithms / VectorGeometryTools 메뉴 아래에 있습니다. 이것은 지오메트리를 치우고 정점을 제거하지는 않습니다. 선택된 간격보다 더 가까운
Dave X

이것은 나를 위해 일했다 : plugins.qgis.org/plugins/LocatePoints
Tactopoda

답변:


20

파이썬 콘솔에서 :

1) 및 메모리 계층 클래스 (클래스 속성없이 완전한 () 생성 crea_mem_layer.py를 )

class Create_vlayer(object):
    '''creation of a virtual layer''' 
     def __init__(self,nom,type):
         self.type=type
         self.name = nom
         self.layer =  QgsVectorLayer(self.type, self.name , "memory")
         self.pr =self.layer.dataProvider() 
     def create_point(self,geometry):
         # add point to the layer
         self.seg = QgsFeature()
         self.seg.setGeometry(QgsGeometry.fromPoint(geometry))
         self.pr.addFeatures([self.seg])
         self.layer.updateExtents()
     @property
     def display_layer(self):
         #end of layer and display layer 
         QgsMapLayerRegistry.instance().addMapLayers([self.couche])

2) 벡터 대수 함수 ( algèbre_vect_PyQGIS.py )

import math 
def mag(point):
    # magnitude of a vector
    return math.sqrt(point.x()**2 + point.y()**2)
def diff(point2, point1):
    # substraction betwen two vector
    return QgsPoint(point2.x()-point1.x(), point2.y() - point1.y())
def length(point1,point2):
    # with PyQGIS: sqrDist
    return math.sqrt(point1.sqrDist(point2))

3) 방향 코사인

def dircos(point):
    cosa = point.x() / mag(point)
    cosb = point.y()/ mag(point)
    return cosa,cosb

4) 프로세스 라인 또는 라인 세그먼트

def pairs(list):
    # list pairs iteration 
    for i in range(1, len(list)):
    yield list[i-1], list[i]

layer = qgis.utils.iface.activeLayer()
# interval between points
interval = 5 m
# create virtual layer
gen_pt  = Create_vlayer("mid5", "Point")

for elem in layer():
    line = elem.geometry()
    for seg_start, seg_end in pairs(line.asPolyline()):
       line_start = QgsPoint(seg_start)
       line_end = QgsPoint(seg_end)
       # mid point = vector coordinates [x2-x1,y2-y1]
       pointm =diff(line_end, line_start)
       # direction cosines of the segment
       cosa,cosb = dircos(pointm)
       # length of the segment
       lg = length(line_end, line_start)
       # generate and add points to the virtual layer 
       for i in range(interval,lg,interval):
           gen_pt.create_point(QgsPoint(line_start.x()  + (i * cosa), line_start.y() + (i*cosb)))

# display layer
gen_pt.display_layer

결과

폴리 라인, 셰이 프리 또는 PyQGIS2와 등거리, 방향 코사인

폴리 라인매끈한vector_algebra

그런 다음 간격을 조정하십시오.


접합점을 보면 선에 기존 노드 점을 유지하는 것처럼 보이므로 이미 선의 정점보다 낮은 해상도로 얇게 할 수 없습니다. OP와 같이 복잡하고 매력적인 라인을 사용하면 이러한 절차에 큰 영향을 미치지 않을 수 있습니다.
Dave X

스크립트를 완벽하게 조정할 수 있습니다.
gene

17

QChainage라는 플러그인이 이제 정확히 원하는 기능을 수행합니다. 간격 거리를 지정하면 플러그인이 지정된 간격으로 선을 따라 점을 만듭니다.


* 이것은 라인 노드를 캡처하지 않으므로 필요한 경우 지오메트리 도구를 사용해야합니다. 노드를 추출하고 연결점에 추가하십시오.
Jason

1
GIS SE에 오신 것을 환영합니다! 여기에 주석으로 추가 한 정보는 그 아래의 편집 버튼을 사용하여 실제 답변에 더 잘 통합 될 것이라고 생각합니다. 복사 / 붙여 넣기를 수행하고 옆에있는 작은 십자 표시를 클릭하여 주석을 삭제하십시오.
PolyGeo

11

Sextante Densify 지오메트리 도구가 특정 거리를 수용하도록 변경하는 스크립트를 작성했습니다. 간격이 주어진 Densify geometry 라고 합니다 .

Densify를 실행 한 후 노드 추출 도구를 사용하여 점을 추출 할 수 있습니다 .

Github 에서 구할 수 있으며 설치 지침은 내 블로그에 있습니다.

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


이 도구는 이제 Sextante 설치없이 QGIS에서 사용할 수 있습니다 (QGIS 2.18.7). 메뉴에서는 보이지 않았지만 Processing Toolbox에서 검색하는 동안 QGIS 지리 알고리즘으로 발견되었습니다.
Nate Wanner

0

파이썬 스크립트를 사용하지 않으려면 간단히 "라인에서 프로파일"플러그인을 설치하고 사용하고 래스터 값 열을 무시 / 삭제할 수 있습니다. 연결 간격은 샘플링 간격으로 설정 한 값입니다.


QGIS 2.2.0에서 "프로파일 도구", "qProf"및 "VoGIS-ProfilTool"은 볼 수 있지만 "라인에서 프로파일"도구는 볼 수 없습니다.
Dave X

0

이것이 안정적인 릴리스인지는 확실하지 않지만 Geoalgorithims-> Vector 아래 1.9 alpha의 sextante 도구 상자에는 "행을 포인트로 변환"옵션이 있습니다. 그것은 선을 따라 거리에 대한 필드를 추가하면 훌륭합니다.

흥미롭게도 내 벡터 레이어에서 NAME 필드를 추가했습니다.

나는 Nathan Woodrow가 파이썬 스크립트를 얻으려고 노력했지만 파이썬으로 빨아 들였습니다. 그리고 일반적으로 코드가 보입니다.


0

나는이 문제로 오랜 시간을 보냈지 만 결국 QChainage를 사용하려고하는 것을 다소 얻었습니다. 내가 공유하고 싶은 것은 다른 사람들을 도울 수있는 것입니다. 라인에서 SAGA 지오 프로세싱 디졸브 도구를 사용할 때 QChainage가 잘못된 결과를 생성합니다. 다른 디졸브 도구를 사용하면 제대로 작동합니다.

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