คำถามที่น่าสนใจ! ฉันไม่ได้ตระหนักถึงวิธีอื่นในการบรรลุสิ่งที่คุณต้องการ แต่ใช้ 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