<div dir="ltr">Hi Raymond,<div><br><div class="gmail_quote"><div dir="ltr">Le mer. 22 août 2018 à 15:30, Raymond Nijssen <<a href="mailto:r.nijssen@terglobo.nl">r.nijssen@terglobo.nl</a>> a écrit :<br></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Hopefully it is just a misconception on my side, but I really don't get <br>
the logic in the qgis geometry data model.<br>
<br>
I tried the following script (sorry, some lines are wrapped by my email <br>
client):<br>
<br>
---<br>
<br>
#points<br>
<br>
p1 = QgsGeometry().fromWkt('point(0 0)')<br>
print(p1) # <QgsGeometry: Point (0 0)><br>
print(p1.asPoint()) # <QgsPointXY: POINT(0 0)><br>
print(p1.centroid()) # <QgsGeometry: Point (0 0)><br>
print(p1.buffer(1, 1)) # <QgsGeometry: Polygon ((1 0, 0 -1, -1 0, 0 1, 1 <br>
0))><br>
<br>
p2 = QgsPoint(1,2)<br>
print(p2) # <QgsPoint: Point (1 2)><br>
p2g = QgsGeometry(p2)<br>
print(p2g) # <QgsGeometry: Point (1 2)><br>
print(p2) # <QgsPoint: Point (1 2)><br>
print(p2.centroid()) # <QgsPoint: Point (1 2)><br>
print(QgsPointXY(p2.x(), p2.y())) # <QgsPointXY: POINT(1 2)><br>
# The next line makes qgis crash after running it 2x !!<br>
#print(QgsGeometry(p2)) # <QgsGeometry: Point (1 2)><br>
<br>
p3 = QgsPointXY(2, 0)<br>
print(p3) # <QgsPointXY: POINT(2 0)><br>
print(QgsGeometry.fromPointXY(p3)) # <QgsGeometry: Point (2 0)><br>
print(QgsPoint(p3.x(), p3.y())) # <QgsPoint: Point (2 0)><br>
<br>
# lines<br>
<br>
l1 = QgsGeometry().fromWkt('linestring((0 0, 1 1, 1 2))')<br>
print(l1) # <QgsGeometry: LineString (0 0, 1 1, 1 2)><br>
print(l1.buffer(1, 1).asPolygon())<br>
print(l1.asPolyline()) # [<QgsPointXY: POINT(0 0)>, <QgsPointXY: POINT(1 <br>
1)>, <QgsPointXY: POINT(1 0)>]<br>
print(QgsLineString(l1.asPolyline())) # TypeError: index 0 has type <br>
'QgsPointXY' but 'QgsPoint' is expected<br>
<br>
<br>
---<br>
<br>
My questions are:<br>
<br>
- How is the relation between QgsGeometry, QgsPoint, QgsPoitXY, etc <br>
meant to be? Is there documentation? Maybe even a schema?<br></blockquote><div><br></div><div>QgsGeometry contains a QgsAbstractGeometry which is the base class of all geometry classes.</div><div>You can get the abstract geometry using get and constGet methods. </div><div><br></div><div>The documentation partially mentions this</div><div><a href="https://qgis.org/pyqgis/master/core/Geometry/QgsGeometry.html">https://qgis.org/pyqgis/master/core/Geometry/QgsGeometry.html</a><br></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
<br>
- Having QgsPoint and QgsPointXY etc is not handy, but I understand they <br>
are necessary for efficiency reasons. However, shouldn't they all have <br>
easy typecasting functions? For example:<br>
QgsGeometry.asPoint()<br>
QgsGeometry.asPointXY()<br>
QgsGeometry.asLineString()<br>
QgsGeometry.asLineStringXY()<br>
QgsGeometry.asPolygon()<br>
QgsGeometry.asPolygonXY()<br>
QgsGeometry.asMultiLineString()<br>
QgsGeometry.asMultiLineStringXY()<br>
etc..<br>
<br>
QgsPoint.asGeometry()<br>
QgsPoint.asPointXY()<br>
<br>
QgsLineString.asGeometry()<br>
QgsLineString.asPointXY()<br>
<br>
etc..<br></blockquote><div><br></div><div>I was also asking my self the same thing.</div><div>I am not really sure if there is a reason or not that they were not implemented.</div><div>The main issue to me is the difficulty to get the geometries as points with their Z/M values.</div><div>The workaround I am using is looping along vertices using</div><div><br></div><div>geometry.get()->nextVertex( vertexId, pt );</div><div><br></div><div>You will the list of QgsPoint with Z/M values.</div><div><br></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
<br>
- Why don't all geometry types inherit from QgsGeometry, making all the <br>
geometry operators work? For example:<br>
QgsPoint(1,2).buffer(3,5)<br></blockquote><div><br></div><div>as said before, all geometry classes inherit from QgsAbstractGeometry. You can use set method (setGeometry in 2.x) on QgsGeometry to create the geometry from the any subclass of abstract geometry. </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
<br>
<br>
<br>
<br>
Some, IMHO, really odd things are:<br>
<br>
- QgsGeometry.asPoint() returns a QgsPointXY<br></blockquote><div><br></div><div>I guess that's historical (QgsPoint in 2.x became QgsPointXY in 3, while QgsPointZ became QgsPoint). </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
<br>
- QgsGeometry.asLineString() does not exist<br>
<br>
- QgsGeometry.asPolyLine() returns an array of QgsPointXY's (besides, <br>
polyline is a strange geometry type in this model)<br>
<br>
- QgsLineString([qgsPointXY, qgsPointXY, qgsPointXY, ...]) results in an <br>
error, while the documentation states:<br>
    QgsLineString(points: Iterable[QgsPointXY]) Construct a linestring<br>
    from list of points. This constructor is more efficient then calling<br>
    setPoints() or repeatedly calling addVertex()<br></blockquote><div><br></div><div>ls = QgsLineString([QgsPoint(10, 2), QgsPoint(10, 1), QgsPoint(5, 1)])</div><div><br></div><div>this does work for me (and for Travis ;) ) </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
<br>
- QgsGeometry(QgsPoint) does work, but destroys my QgsPoint (and makes <br>
qgis instable)</blockquote><div><br></div><div>look at QgsGeometry::set method </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"> </blockquote><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
<br>
<br>
<br>
Hopefully somebody can explain, making this more sense to me. And I'd <br>
like to contribute to improving this, though I'm not a cpp programmer.<br></blockquote><div><br></div><div>This is indeed a bit obscure at first and it took me a bit of time to see the logic here.</div><div><br></div><div>The gurus might arrive with a more precise explanation but I hope it's a good start!</div><div><br></div><div>Best wishes,</div><div>Denis</div></div></div></div>-- <br><div dir="ltr" class="gmail_signature" data-smartmail="gmail_signature"><div dir="ltr">





<p class="inbox-inbox-inbox-inbox-p1"><span style="color:rgb(0,0,0);font-family:Verdana,sans-serif;font-size:10pt">Denis Rouzaud</span><br style="color:rgb(0,0,0);font-family:Times;font-size:medium"><a href="mailto:denis@opengis.ch" target="_blank" style="font-family:Times;font-size:medium"><span style="color:rgb(0,0,0);font-family:Verdana,sans-serif;font-size:8pt">denis@opengis.ch</span> </a><br style="color:rgb(0,0,0);font-family:Times;font-size:medium"><span style="color:rgb(0,0,0);font-family:Verdana,sans-serif;font-size:8pt"><a>+41 76 370 21 22</a></span></p><p class="inbox-inbox-inbox-inbox-p1"><span style="color:rgb(0,0,0);font-family:Verdana,sans-serif;font-size:8pt"><a><br></a></span></p></div></div>