Hi,

Unfortunately the rings of the polygon are not guaranteed to be linear
rings, so it must also work for rings that are compound curves or circular
strings.

I have considered stroking all arcs to make linear rings, but that
introduces extra points (that have not been surveyed) and I lose
information about the connection type between points.

Another option I am considering is breaking up a curve into a list of
segments with GDAL and then do some kind of matching on the lists. That
seems incredibly complex though, since the number of segments depends on
the start point of the curve: a start point at the beginning of a line
string part gives one segment, but a start point in the middle of a line
string gives two segments.

George

On Mon, 25 Aug 2025 at 15:29, SIMON Nicolas <nicolas.si...@spw.wallonie.be>
wrote:

> Hi,
>
>   One idea, perhaps too resource-intensive, would be to transform the
> linear rings into polygons, and then take the difference (
> OGRGeometry::Difference).
>
>   If the difference gives a null area, then is no difference in input
> rings.
>
>
>
> Nicolas
>
>
>
>
>
> *De :* gdal-dev <gdal-dev-boun...@lists.osgeo.org> *De la part de* George
> Mathijssen via gdal-dev
> *Envoyé :* lundi 25 août 2025 10:14
> *À :* Rahkonen Jukka <jukka.rahko...@maanmittauslaitos.fi>
> *Cc :* gdal-dev@lists.osgeo.org
> *Objet :* Re: [gdal-dev] How to compare closed curves with different
> start points?
>
>
>
> Hi,
>
>
>
> The geometry is indeed a plate with rounded corners and 2 circular holes,
> it is an actual geometry in the port of Rotterdam though I have simplified
> it somewhat.
>
>
>
> The differences between the 2 geometries is that the exterior ring has
> different start points and the right most inner ring has different start
> points. The leftmost inner ring is identical between the two geometries. My
> intention was to also include different ring directions, but I forgot to do
> that.
>
>
>
> Visualizing the st_difference query that you ran shows differences in the
> right most ring. It is not the entire ring that is different, just parts of
> it. I think this has to do with rounding and the fact that the curve
> segments are actually different: the start point in the second geometry is
> one point over, which means that the circular strings are entirely
> different.
>
>
>
> Compare this to the exterior ring: I choose a different start point, but I
> did not actually change the curve segments. So the result is that all curve
> segments are identical, but in a different order. This might explain why
> st_difference detects the exterior rings as being identical. I wonder if
> this changes when I make the direction of the exterior rings opposite of
> each other.
>
>
>
>
>
>
>
> On Sat, 23 Aug 2025 at 19:56, Rahkonen Jukka <
> jukka.rahko...@maanmittauslaitos.fi> wrote:
>
> Hi,
>
> I thought that PostGIS would return an empty geometry with ST_Difference,
> but it does not. I do not know what that means. Maybe PostGIS is
> linearizing the curve before computing the difference. Your geometry seems
> to be like a plate with rounded corners and two holes, and I guess that the
> ring of the rightmost hole is oriented differently.
>
>  This was my query:
>
> select st_difference(
> 'CURVEPOLYGON (COMPOUNDCURVE (CIRCULARSTRING (85369.63 433446.48, 85368.99
> 433448.54, 85366.08 433449.62), (85366.08 433449.62, 85320.0 433442.34),
> CIRCULARSTRING (85320.0 433442.34, 85318.48 433441.52, 85317.85 433439.94),
> (85317.85 433439.94, 85323.26 433407.01), CIRCULARSTRING (85323.26
> 433407.01, 85324.24 433405.814, 85325.76 433405.24), (85325.76 433405.24,
> 85371.68 433412.51), CIRCULARSTRING (85371.68 433412.51, 85373.66
> 433413.74, 85374.28 433415.25), (85374.28 433415.25, 85369.63 433446.48)),
> CIRCULARSTRING (85361.39 433438.49, 85365.44 433434.44, 85361.39 433430.39,
> 85357.34 433434.44, 85361.39 433438.49), CIRCULARSTRING (85327.69 433426.1,
> 85330.18 433423.61, 85327.69 433421.12, 85325.2 433423.61, 85327.69
> 433426.1))
> ','CURVEPOLYGON (COMPOUNDCURVE (CIRCULARSTRING (85320.0 433442.34,
> 85318.48 433441.52, 85317.85 433439.94), (85317.85 433439.94, 85323.26
> 433407.01), CIRCULARSTRING (85323.26 433407.01, 85324.24 433405.814,
> 85325.76 433405.24), (85325.76 433405.24, 85371.68 433412.51),
> CIRCULARSTRING (85371.68 433412.51, 85373.66 433413.74, 85374.28
> 433415.25), (85374.28 433415.25, 85369.63 433446.48), CIRCULARSTRING
> (85369.63 433446.48, 85368.99 433448.54, 85366.08 433449.62), (85366.08
> 433449.62, 85320.0 433442.34)), CIRCULARSTRING (85357.34 433434.44,
> 85361.39 433438.49, 85365.44 433434.44, 85361.39 433430.39, 85357.34
> 433434.44), CIRCULARSTRING (85327.69 433426.1, 85330.18 433423.61, 85327.69
> 433421.12, 85325.2 433423.61, 85327.69 433426.1))');
>
> -Jukka Rahkonen-
>
>
>
>
> ________________________________________
> Lähettäjä: gdal-dev <gdal-dev-boun...@lists.osgeo.org> käyttäjän George
> Mathijssen via gdal-dev <gdal-dev@lists.osgeo.org> puolesta
> Lähetetty: Lauantai 23. elokuuta 2025 17.29
> Vastaanottaja: gdal-dev@lists.osgeo.org <gdal-dev@lists.osgeo.org>
> Aihe: [gdal-dev] How to compare closed curves with different start points?
>
> Hi,In an application that I am currently developing there is a need to
> compare geometries and I hit an obstacle when comparing
> OGRCurvePolygons.From a SQL/MM perspective I (mostly) need
> ST_OrderingEquals, meaning that the coordinates must be in the same order.
> This is implemented by OGRCurvePolygon as is stated in the
> documentation.The obstacle however is that there are 3 freedoms when
> comparing polygons:* the direction of a ring may differ* the start point of
> a ring may differ* the order of inner rings may differFor example the
> following 2 curve polygons should be considered equal in the application
> (apologies for the formatting):CURVEPOLYGON (COMPOUNDCURVE (CIRCULARSTRING
> (85369.63 433446.48, 85368.99 433448.54, 85366.08 433449.62), (85366.08
> 433449.62, 85320.0 433442.34), CIRCULARSTRING (85320.0 433442.34, 85318.48
> 433441.52, 85317.85 433439.94), (85317.85 433439.94, 85323.26 433407.01),
> CIRCULARSTRING (85323.26 433407.01, 85324.24 433405.814, 85325.76
> 433405.24), (85325.76 433405.24, 85371.68 433412.51), CIRCULARSTRING
> (85371.68 433412.51, 85373.66 433413.74, 85374.28 433415.25), (85374.28
> 433415.25, 85369.63 433446.48)), CIRCULARSTRING (85361.39 433438.49,
> 85365.44 433434.44, 85361.39 433430.39, 85357.34 433434.44, 85361.39
> 433438.49), CIRCULARSTRING (85327.69 433426.1, 85330.18 433423.61, 85327.69
> 433421.12, 85325.2 433423.61, 85327.69 433426.1))CURVEPOLYGON
> (COMPOUNDCURVE (CIRCULARSTRING (85320.0 433442.34, 85318.48 433441.52,
> 85317.85 433439.94), (85317.85 433439.94, 85323.26 433407.01),
> CIRCULARSTRING (85323.26 433407.01, 85324.24 433405.814, 85325.76
> 433405.24), (85325.76 433405.24, 85371.68 433412.51), CIRCULARSTRING
> (85371.68 433412.51, 85373.66 433413.74, 85374.28 433415.25), (85374.28
> 433415.25, 85369.63 433446.48), CIRCULARSTRING (85369.63 433446.48,
> 85368.99 433448.54, 85366.08 433449.62), (85366.08 433449.62, 85320.0
> 433442.34)), CIRCULARSTRING (85357.34 433434.44, 85361.39 433438.49,
> 85365.44 433434.44, 85361.39 433430.39, 85357.34 433434.44), CIRCULARSTRING
> (85327.69 433426.1, 85330.18 433423.61, 85327.69 433421.12, 85325.2
> 433423.61, 85327.69 433426.1))The differing directions of rings I can solve
> with OGRCompoundCurve::isClockwise and OGRCompoundCurve::reversePoints to
> ensure consistent ring directions before comparing.The differing order of
> inner rings is solvable by finding matching rings. This is O(N^2), but N is
> small enough in practice to be acceptable.This leaves me with the problem
> of comparing rings that have different start points. My first thought was
> to ask how to change the start point of a closed curve (ring), since I
> cannot find anything about this in the documentation. However that is not a
> solution, since you cannot change the start point to any other point on the
> ring. For example changing the start point to be the mid-point of an arc
> (circular string) would make the geometry invalid.I could iterate the
> points of the closed curve/ring, but I would also have to know how each
> point is connected to the previous/next point (linear, curve). I do not
> know if this information is available, searching the documentation gave me
> no result.So the question is: how can I compare closed curves (rings) that
> have different start points?Thank you for your help.
>
_______________________________________________
gdal-dev mailing list
gdal-dev@lists.osgeo.org
https://lists.osgeo.org/mailman/listinfo/gdal-dev

Reply via email to