재미있는 질문! 원하는 것을 달성하는 다른 방법은 없지만 PyQGIS를 사용하고 있습니다.
아래 코드를 읽으십시오. 그것은 그것의 일부 텍스트를 가지고 : 'lines'
, 'length'
, 'startX'
, 'startY'
, 'endX'
, 'endY'
. 데이터에서 작업하기 위해 스크립트에서 해당 이름을 조정할 수 있습니다. 첫 번째는 레이어 이름이고 나머지는 필드 이름에 해당합니다. 선 레이어에 해당 필드가 있다고 가정합니다 (결국 거기에 값을 쓰려고합니다).
레이어 이름과 자동으로 업데이트 할 필드 이름을 조정했으면 스크립트를 복사하여 QGIS Python 콘솔에 붙여 넣습니다.
모든 것이 잘되면 필드 값이 두 가지 시나리오에서 자동으로 업데이트되는 것을 볼 수 있어야합니다. 1) 새 기능이 추가 된 경우 및 2) 지오메트리가 수정 된 경우.
# Initialize required variables
myLayer = QgsMapLayerRegistry.instance().mapLayersByName( 'lines' )[0]
lengthField = myLayer.fieldNameIndex( 'length' )
startXField = myLayer.fieldNameIndex( 'startX' )
startYField = myLayer.fieldNameIndex( 'startY' )
endXField = myLayer.fieldNameIndex( 'endX' )
endYField = myLayer.fieldNameIndex( 'endY' )
# Slot, updates field values
def updateFeatureAttrs( fId, geom=None ):
f = myLayer.getFeatures( QgsFeatureRequest( fId ) ).next()
if not geom:
geom = f.geometry()
myLayer.changeAttributeValue( fId, lengthField, geom.length() )
myLayer.changeAttributeValue( fId, startXField, geom.vertexAt( 0 )[0] )
myLayer.changeAttributeValue( fId, startYField, geom.vertexAt( 0 )[1] )
myLayer.changeAttributeValue( fId, endXField, geom.asPolyline()[-1][0] )
myLayer.changeAttributeValue( fId, endYField, geom.asPolyline()[-1][1] )
# Update feature attributes when new features are added or geometry changes
myLayer.featureAdded.connect( updateFeatureAttrs )
myLayer.geometryChanged.connect( updateFeatureAttrs )
이것이 작동하는 방식입니다.
스크립트를 실행하는 동안 문제가 발생하면이 답변 아래에 설명을 추가하십시오.
QGIS 프로젝트를 열 때이 기능을 이미 사용 가능하게하는 것이 편리 할 수 있습니다. 그런 경우에는 지시를 게시하십시오.
편집하다:
QGIS 프로젝트를 열 때마다이 기능을 사용할 수 있으려면 (예 : .qgs
라인 레이어를 포함 하는 파일) 다음 단계를 수행해야합니다.
로 이동 QGIS->Project->Project Properties->Macros
하여 Python macros
옵션을 확인하고 전체 코드를이 코드로 바꿉니다 (레이어 및 필드 이름을 나타내는 값 조정).
from qgis.core import QgsMapLayerRegistry, QgsFeatureRequest
def openProject():
# Initialize required variables
myLayer = QgsMapLayerRegistry.instance().mapLayersByName( 'lines' )[0]
# Update feature attributes when new features are added or geometry changes
myLayer.featureAdded.connect( updateFeatureAttrs )
myLayer.geometryChanged.connect( updateFeatureAttrs )
# Slot, updates field values
def updateFeatureAttrs( fId, geom=None ):
myLayer = QgsMapLayerRegistry.instance().mapLayersByName( 'lines' )[0]
lengthField = myLayer.fieldNameIndex( 'length' )
startXField = myLayer.fieldNameIndex( 'startX' )
startYField = myLayer.fieldNameIndex( 'startY' )
endXField = myLayer.fieldNameIndex( 'endX' )
endYField = myLayer.fieldNameIndex( 'endY' )
f = myLayer.getFeatures( QgsFeatureRequest( fId ) ).next()
if not geom:
geom = f.geometry()
myLayer.changeAttributeValue( fId, lengthField, geom.length() )
myLayer.changeAttributeValue( fId, startXField, geom.vertexAt( 0 )[0] )
myLayer.changeAttributeValue( fId, startYField, geom.vertexAt( 0 )[1] )
myLayer.changeAttributeValue( fId, endXField, geom.asPolyline()[-1][0] )
myLayer.changeAttributeValue( fId, endYField, geom.asPolyline()[-1][1] )
def saveProject():
pass
def closeProject():
pass
다음과 같은 방법으로 프로젝트에서 매크로를 활성화하십시오 Settings->Options->General->Enable macros: Always
.
QGIS 프로젝트를 저장하십시오.
이제 .qgs
방금 저장 한 파일 을 열 때마다 새로운 피쳐를 추가하거나 형상을 수정할 때 라인 레이어의 속성이 자동으로 업데이트됩니다 (즉, 더 이상 QGIS Python Console에 아무 것도 복사 할 필요 없음).
2 차 편집 :
방금 사람들이 이런 종류의 문제를 해결할 수 있도록 AutoFields라는 플러그인을 게시했습니다 . 나는 당신의 소란을 해결하는 방법을 보여주는 비디오를 만들었습니다.
https://vimeo.com/germap/autofields-geometric-properties
AutoFields 설명서 : http://geotux.tuxfamily.org/index.php/en/geo-blogs/item/333-autofields-plugin-for-qgis