[QGIS-Developer] Geometry data model logic?
Raymond Nijssen
r.nijssen at terglobo.nl
Wed Aug 22 05:30:16 PDT 2018
Hopefully it is just a misconception on my side, but I really don't get
the logic in the qgis geometry data model.
I tried the following script (sorry, some lines are wrapped by my email
client):
---
#points
p1 = QgsGeometry().fromWkt('point(0 0)')
print(p1) # <QgsGeometry: Point (0 0)>
print(p1.asPoint()) # <QgsPointXY: POINT(0 0)>
print(p1.centroid()) # <QgsGeometry: Point (0 0)>
print(p1.buffer(1, 1)) # <QgsGeometry: Polygon ((1 0, 0 -1, -1 0, 0 1, 1
0))>
p2 = QgsPoint(1,2)
print(p2) # <QgsPoint: Point (1 2)>
p2g = QgsGeometry(p2)
print(p2g) # <QgsGeometry: Point (1 2)>
print(p2) # <QgsPoint: Point (1 2)>
print(p2.centroid()) # <QgsPoint: Point (1 2)>
print(QgsPointXY(p2.x(), p2.y())) # <QgsPointXY: POINT(1 2)>
# The next line makes qgis crash after running it 2x !!
#print(QgsGeometry(p2)) # <QgsGeometry: Point (1 2)>
p3 = QgsPointXY(2, 0)
print(p3) # <QgsPointXY: POINT(2 0)>
print(QgsGeometry.fromPointXY(p3)) # <QgsGeometry: Point (2 0)>
print(QgsPoint(p3.x(), p3.y())) # <QgsPoint: Point (2 0)>
# lines
l1 = QgsGeometry().fromWkt('linestring((0 0, 1 1, 1 2))')
print(l1) # <QgsGeometry: LineString (0 0, 1 1, 1 2)>
print(l1.buffer(1, 1).asPolygon())
print(l1.asPolyline()) # [<QgsPointXY: POINT(0 0)>, <QgsPointXY: POINT(1
1)>, <QgsPointXY: POINT(1 0)>]
print(QgsLineString(l1.asPolyline())) # TypeError: index 0 has type
'QgsPointXY' but 'QgsPoint' is expected
---
My questions are:
- How is the relation between QgsGeometry, QgsPoint, QgsPoitXY, etc
meant to be? Is there documentation? Maybe even a schema?
- Having QgsPoint and QgsPointXY etc is not handy, but I understand they
are necessary for efficiency reasons. However, shouldn't they all have
easy typecasting functions? For example:
QgsGeometry.asPoint()
QgsGeometry.asPointXY()
QgsGeometry.asLineString()
QgsGeometry.asLineStringXY()
QgsGeometry.asPolygon()
QgsGeometry.asPolygonXY()
QgsGeometry.asMultiLineString()
QgsGeometry.asMultiLineStringXY()
etc..
QgsPoint.asGeometry()
QgsPoint.asPointXY()
QgsLineString.asGeometry()
QgsLineString.asPointXY()
etc..
- Why don't all geometry types inherit from QgsGeometry, making all the
geometry operators work? For example:
QgsPoint(1,2).buffer(3,5)
Some, IMHO, really odd things are:
- QgsGeometry.asPoint() returns a QgsPointXY
- QgsGeometry.asLineString() does not exist
- QgsGeometry.asPolyLine() returns an array of QgsPointXY's (besides,
polyline is a strange geometry type in this model)
- QgsLineString([qgsPointXY, qgsPointXY, qgsPointXY, ...]) results in an
error, while the documentation states:
QgsLineString(points: Iterable[QgsPointXY]) Construct a linestring
from list of points. This constructor is more efficient then calling
setPoints() or repeatedly calling addVertex()
- QgsGeometry(QgsPoint) does work, but destroys my QgsPoint (and makes
qgis instable)
Hopefully somebody can explain, making this more sense to me. And I'd
like to contribute to improving this, though I'm not a cpp programmer.
Regards,
Raymond
More information about the QGIS-Developer
mailing list