biigle / core

:large_blue_circle: Application core of BIIGLE
https://biigle.de
GNU General Public License v3.0
12 stars 15 forks source link

Implement alternative handling of polygons with holes #700

Closed mzur closed 10 months ago

mzur commented 10 months ago

I'd like to propose an updated solution to handling non-simple polygons that does not require the "polish" function. Here is my reasoning behind this:

The polishing function was used to remove duplicate coordinates that were sometimes added. I found that these were probably "holes", because every time a polygon had such a duplicate coordinate, there was an entry in _holes when the polygon was logged with polygonizer.getGeometry() in jstsValidate() (now jstsSimplify()). The screenshot shows the geometry with a hole at the top and the OL coordinates at the bottom:

image

So in order to remove the holes, now getExteriorRing() is called for each polygon. To reproduce a polygon with a hole, draw a geometry like this:

Screencast from 17.11.2023 11:09:13.webm

For a similar reason I removed the "getInteriorRing" stuff from jstsAddPolygon(). However, holes were still present in the polygons and had to be removed as described above. Everything still worked fine without the code, though, so I left it like that.

Finally, getGreatestPolygon() also works if there is only one polygon so I removed the if.

@lehecht Could you please have a good look at this and check if this still handles all the cases that you tested? You spent much more time with this than I did so you probably know all the edge cases. It's entirely possible that my implementation does not handle some cases that your version handles correctly.

References #634

mzur commented 10 months ago

Thanks for the review!