การอัปเดตสคริปต์ PyQGIS

Oct 23 2020

ที่ลิงค์นี้ https://sisteme-ig.com/questions/10129/creacion-automatizada-de-lineas-perpendiculares-entre-una-ca#232721 @Xunilk แบ่งปันสคริปต์:

mapcanvas = iface.mapCanvas()

layers = mapcanvas.layers()

p_lyr = layers[0]
l_lyr = layers[1]

epsg = p_lyr.crs().postgisSrid()

uri = "LineString?crs=epsg:" + str(epsg) + "&field=id:integer""&field=distance:double(20,2)&index=yes"

dist = QgsVectorLayer(uri, 
                      'dist', 
                      'memory')

QgsMapLayerRegistry.instance().addMapLayer(dist)

prov = dist.dataProvider()

lines_features = [ line_feature for line_feature in l_lyr.getFeatures() ] 
points_features = [ point_feature for point_feature in p_lyr.getFeatures() ]

feats = []

for p in points_features:

    minDistPoint = min([l.geometry().closestSegmentWithContext( p.geometry().asPoint() ) for l in lines_features])[1]
    feat = QgsFeature()
    feat.setGeometry(QgsGeometry.fromPolyline([p.geometry().asPoint(), minDistPoint]))
    feat.setAttributes([points_features.index(p),feat.geometry().length()])
    feats.append(feat)

prov.addFeatures(feats)

แต่จาก QGIS นั้นทำให้ฉันเกิดข้อผิดพลาดต่อไปนี้:

Traceback (most recent call last):
  File "C:\PROGRA~1\QGIS3~1.12\apps\Python37\lib\code.py", line 90, in runcode
    exec(code, self.locals)
  File "<input>", line 5, in <module>
TypeError: index 0 has type 'QgsPointXY' but 'QgsPoint' is expected

ฉันจะเปลี่ยนรหัส Python นี้ไม่ให้เกิดข้อผิดพลาดนี้ได้อย่างไร

คำตอบ

3 KadirŞahbaz Oct 23 2020 at 18:18

เปลี่ยนQgsMapLayerRegistryไปQgsProjectและจะfromPolylinefromPolylineXY

fromPolylineคาดหวังQgsPointแต่asPointวิธีการส่งคืนQgsPointXYอินสแตนซ์

ใช้แบบนี้:

layers = iface.mapCanvas().layers()

p_lyr = layers[0]
l_lyr = layers[1]

epsg = p_lyr.crs().postgisSrid()

uri = "LineString?crs=epsg:" + str(epsg) + "&field=id:integer""&field=distance:double(20,2)&index=yes"

dist = QgsVectorLayer(uri, 'dist', 'memory')
prov = dist.dataProvider()

lines_features = [ line_feature for line_feature in l_lyr.getFeatures() ] 
points_features = [ point_feature for point_feature in p_lyr.getFeatures() ]

feats = []
for p in points_features:    
    minDistPoint = min([l.geometry().closestSegmentWithContext( p.geometry().asPoint() ) for l in lines_features])[1]
    feat = QgsFeature()
    feat.setGeometry(QgsGeometry.fromPolylineXY([p.geometry().asPoint(), minDistPoint]))
    feat.setAttributes([points_features.index(p),feat.geometry().length()])
    feats.append(feat)

prov.addFeatures(feats)

QgsProject.instance().addMapLayer(dist)
1 BERA Oct 23 2020 at 17:35

QgsGeometry.fromPolyline ต้องการรายชื่อของQGSPointsคุณจะผ่านQGSPointXY's แปลงไฟล์ด้วยQGSPoints(thexypoint)

ดังนั้นเปลี่ยนบรรทัด:

feat.setGeometry(QgsGeometry.fromPolyline([p.geometry().asPoint(), minDistPoint]))

ถึง:

feat.setGeometry(QgsGeometry.fromPolyline([QgsPoint(p.geometry().asPoint()), QgsPoint(minDistPoint)]))