선형 참조를위한 M- 값을 가진 QGIS 추출 노드


10

sqlite 데이터베이스에 MultiLineStringZM 레이어가 있고 꼭지점에서 측정 값 또는 m 값을 시각화하려고합니다. QGIS에서이 작업을 수행하는 방법에 대한 정보를 찾으려고했지만 수집 할 수 있었던 모든 것은 이것이 선 스트링 레이어에서 직접 가능하지 않으며 포인트를 별도의 레이어로 추출해야한다는 것입니다.

내가 사용했습니다 Vector> - Geometry Tools> - Extract nodes내 multlinestring 층의 정점을 대표하는 멀티 레이어를 만들 수 있지만, 프로세스는 꼭지점의 m-값을 잃는다. m 값을 포인트의 속성으로 저장하거나 다른 것으로 저장하여 m 값을 보존해야합니까?

내부적으로 우리는 라인 포인트를 각 포인트에 속성으로 저장된 m 값을 가진 포인트 셰이프 파일로 변환하는 명령 줄 도구를 가지고 있으며 정점에 할당 된 m 값이 있는지 확인하는 데 사용했습니다. 내가해야한다면 가능하다면 QGIS 내에서 직접 할 수 있다면 좋을 것입니다.

편집 -위에서 말한 것을 반복하지만 GDAL 라이브러리를 사용하여 찾고있는 결과를 얻을 수있는 명령 줄 도구가 있다는 사실을 다시 강조합니다. PyQGIS는 내가 찾고있는 대답이 아닙니다. 내장 도구, QGIS 용 플러그인, 또는 MultiLineStringZM 또는 LineStringZM 지오메트리에서 m 값을 추출 (생성 / 생성하지 않음)하고 시각화 할 수있는 완전한 스크립트를 찾고 있습니다.


LRS 플러그인을 사용하여 m 값을 얻을 수 있습니다. 노드를 추출한 다음 LRS 플러그인을 사용하거나 선 도구를 따라 거리를 사용하여 선 스트링에서 측정 값을 가져와야합니다.
jbalk 2012 년

@jbalk LRS 및 QChainage 플러그인을 사용해 보았습니다.이 플러그인은 무언가를 누락하고 플러그인을 잘못 사용하지 않는 한 기존 측정 값을 사용하지 않고 정기적으로 측정 값을 생성하도록 설정되어있는 것 같습니다 .
TJ Rockefeller

LRS 플러그인 페이지에서 :-플러그인은 캘리브레이션, 시간 및 선형 이벤트 생성 및 포인트 측정 계산을 지원합니다.-다음 웹 사이트를 참조하십시오 blazek.github.io/lrs 이 사이트의 LRS 플러그인에 대해 질문 할 수있는 경우 알아낼 수 없습니다.
jbalk

LRS 플러그인으로 교정 할 때까지 아무것도 할 수없는 것처럼 보입니다. 교정하려면 계수로 측정 값이 저장된 포인트 레이어가 필요합니다. 이것은 정확히 MultiMultiStringZM에서 가져 오려고하는 것입니다. 이 상황에서는 도움이되지 않을 것이라고 생각합니다.
TJ Rockefeller

선을 따라 1000m마다 포인트를 생성하여 교정에 사용할 수 있습니다. 또는 QGIS 내의 SAGA 및 GRASS 툴박스에서 라인 툴을 따라 거리를 확인하여 m 값을 얻습니다.
jbalk

답변:


6

내가 찾을 수있는 것에서이 정확한 상황에 대한 기존 솔루션이 아닌 것처럼 보이지만 QGIS 에서이 작업을 계속하고 싶었으므로 파이썬 스크립트에 뛰어 들었습니다.

처리 알고리즘 작성에 대한 안내서는 https://docs.qgis.org/2.18/en/docs/user_manual/processing/scripts.html 에서 찾을 수 있습니다.

이 코드를 사용하려면 처리 도구 상자를 열고 스크립트를 확장 한 다음 도구를 확장하십시오. "새 스크립트 만들기"를 선택하고 아래 코드를 스크립트 창에 복사하여 붙여 넣습니다 (공백이 구문 적으로 중요하므로 파이썬 코드를 복사하여 붙여 넣을 때주의해야합니다. 문제가 발생하면 공백을 표시하는 텍스트 편집기에 코드를 넣고 확인하십시오 올바르게 복사). 원하는 곳에 저장하고 창 상단에 스크립트 실행 버튼이 있습니다. 저장 한 후 "파일에서 스크립트 추가"를 수행하고 "사용자 스크립트"아래에 스크립트를 영구적으로 가질 수 있습니다.

처리 창이 나타나면 벡터 지오메트리가 포함 된 레이어를 선택하고 실행을 선택하십시오. 그것이라는 열을 추가하는 것을 제외 스크립트는 "추출 노드"와 같은 방식으로 동작 MValues하고 또는 ZValues입력 구조에서 가능한 것이 무엇인지에 따라 달라집니다.

##input_layer=vector
##output_layer=output vector

from qgis.core import QgsWKBTypes, QgsField, QgsVectorFileWriter, QgsFeature, QgsGeometry
from PyQt4.QtCore import QVariant

def addVertices( geometry, writer, inFeature ):
    coordinateSequence = geometry.coordinateSequence()
    for rings in coordinateSequence:
        for points in rings:
            for point in points:
                feature = QgsFeature( fields )
                feature.setGeometry( QgsGeometry( point ) )
                type = point.wkbType()
                attributes = inFeature.attributes()
                if QgsWKBTypes.hasM( type ):
                    attributes.append( point.m() )
                if QgsWKBTypes.hasZ( type ):
                    attributes.append(point.z())
                feature.setAttributes( attributes )
                writer.addFeature( feature )
    return

inlayer = processing.getObject( input_layer )
provider = inlayer.dataProvider()
fields = provider.fields()
geomType = QgsWKBTypes.Type(inlayer.wkbType())
outputGeomType = QgsWKBTypes.Point

if QgsWKBTypes.hasM( geomType ):
    outputGeomType = QgsWKBTypes.addM( outputGeomType )
    fields.append( QgsField( "MValue", QVariant.Double ) )

if QgsWKBTypes.hasZ( geomType ):
    outputGeomType = QgsWKBTypes.addZ( outputGeomType )
    fields.append( QgsField( "ZValue", QVariant.Double ) )

layer_options = 'SHPT=' + QgsWKBTypes.displayString(outputGeomType)
writer = QgsVectorFileWriter( output_layer, 'UTF-8', fields,  outputGeomType , inlayer.crs(), layerOptions=[layer_options] )

features = inlayer.getFeatures()
featureCount = inlayer.featureCount()
featureIndex = 0

for f in features:
    percent = ( featureIndex/float( featureCount ) ) * 100
    progress.setPercentage( percent )
    g = f.geometry().geometry()
    addVertices( g, writer, f )
    featureIndex +=1

del writer

4

QGIS 3.0 이상에서는이 작업이 간단합니다. "Processing Toolbox"(ctrl + alt + t로 열기 또는 Processing-> Toolbox로 열기)에서 "정점 추출"을 검색하고 해당 알고리즘을 실행하십시오.

입력 레이어로 M 또는 ZM 선 또는 다각형 지오메트리를 선택하고 실행합니다.

정점은 원래 지오메트리의 내용에 따라 M 및 Z 값으로 그대로 추출됩니다.

속성 테이블에서 M 값이 필드로 필요한 경우 필드 계산기를 다음과 같은 표현식과 함께 사용할 수 있습니다 m($geometry)

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