-
-
Notifications
You must be signed in to change notification settings - Fork 3k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Fix issue with vertical lines not visible in the elevation profile tool #58959
Fix issue with vertical lines not visible in the elevation profile tool #58959
Conversation
42d217c
to
2e5df52
Compare
I think this special case should be handled in the iterator (or geometry) classes then, not specifically the elevation profile code |
Thanks for you message. However, I don't understand it. Do you mean that the iterator code of the providers should be changed? Or something else? |
. Do you mean that the iterator code of the providers should be changed? I mean if the setDistanceWithin method for QgsFeatureRequest can't handle this situation, then it needs to be fixed in the iterator code. Otherwise other users of setDistanceWithin will remain broken. So maybe the fix needs to apply in QgsGeos::distance / QgsGeos::distanceWithin instead, eg by detecting a vertical line and using a GEOS point geometry there instead... |
2e5df52
to
9c5aaae
Compare
Thanks for the suggestion. I have completely rewritten the PR to handle this is in |
🪟 Windows buildsDownload Windows builds of this PR for testing. 🪟 Windows Qt6 buildsDownload Windows Qt6 builds of this PR for testing. |
Thanks @ptitjano , this approach looks much better to me! Just be aware of introducing any inefficiencies in these classes (like clones which aren't 100% required), as this is all performance critical code which needs to be as optimised as possible |
9c5aaae
to
b2f4c2e
Compare
Thanks. This should be good now. |
`GEOSPreparedDistance_r` is not able to properly handle a purely vertical line (LineString Z((X Y Z1, X Y Z2, ..., X Y Zn))). In that case, it always `inf`. However, `GEOSDistance_r` works. This issue is fixed by checking if one of the geometry is vertical 3d line by introducing `isZVerticalLine`. This function checks if a geometry is a 3d line. If that's the case, it loops through the points of the line. If two points do not have the same X Y corrdinates, it means that the line is not purely vertical. If `geom` is a vertical line, it is replaced by its first point. It the prepared geometry is a vertical line, fallback to the non prepared case.
This is similar to the change done on `QgsGeos::distance` in the previous commit.
…ines See the two previous commits
b2f4c2e
to
9245434
Compare
Description
This PR reverts commit ce96dee.
This commit was introduced to gain some performance when the
tolerance
is set by usingrequest.setDistanceWithin
instead ofrequest.setFilterRect
. However, in that case, the providers eitheruse
GEOS::distance
orGEOS::distanceWithin
which is not able tohandle the Z component of a Geometry.
For example, a purely vertical line, i.e.:
LineString(X Y Z1, X Y Z2)
will always be to an infinite distance of any geometry accordingto GEOS.
In practice, this means that a purely vertical line will never be
visible in the elevation profile when the tolerance is set. Indeed,
the provider will always discard such geometry because of the usage
of
setDistanceWithin
. This issue is fixed by always usingsetFilterRect
. This might introduce a performance penalty but thisensures that the result is always correct.
Update October 10