A RetroSearch Logo

Home - News ( United States | United Kingdom | Italy | Germany ) - Football scores

Search Query:

Showing content from https://github.com/Esri/arcgis-python-api/issues/2211 below:

`arcgis.geometry.Geometry.as_shapely` does not return expected `shapely` geometry for multipolygon · Issue #2211 · Esri/arcgis-python-api · GitHub

Describe the bug
arcgis.geometry.Geometry.as_shapely does not return expected shapely geometry for multipolygon.

To Reproduce
Steps to reproduce the behavior:

import shapely
from arcgis.features FeatureSet

# Multipolygon with hole GeoJSON
# Example from https://en.wikipedia.org/wiki/GeoJSON#Geometries
multipoly = {
    "type": "FeatureCollection",
    "features": [
        {
            "type": "Feature",
            "geometry": {
                "type": "MultiPolygon",
                "coordinates": [
                    [[[40.0, 40.0], [20.0, 45.0], [45.0, 30.0], [40.0, 40.0]]],
                    [
                        [
                            [20.0, 35.0],
                            [10.0, 30.0],
                            [10.0, 10.0],
                            [30.0, 5.0],
                            [45.0, 20.0],
                            [20.0, 35.0],
                        ],
                        [[30.0, 20.0], [20.0, 15.0], [20.0, 25.0], [30.0, 20.0]],
                    ],
                ],
            },
            "properties": {"prop0": "value0"},
        }
    ],
}

# Create FeatureSet from GeoJSON
fs = FeatureSet.from_geojson(multipoly)

# Get arcgis.geometry.Geometry
geom = fs.features[0].geometry

# Check how arcgis.geometry.Geometry looks
geom

# Check arcgis.geometry.Geometry.__geo_interface__
print(geom.__geo_interface__) # as expected

Coordinates are as expected when calling Geometry.__geo_interface__.

{'coordinates': [[[(40.0, 40.0), (20.0, 45.0), (45.0, 30.0), (40.0, 40.0)], [(20.0, 35.0), (10.0, 30.0), (10.0, 10.0), (30.0, 5.0), (45.0, 20.0), (20.0, 35.0)], [(30.0, 20.0), (20.0, 15.0), (20.0, 25.0), (30.0, 20.0)]]], 'type': 'MultiPolygon'}
# Check how shapely geometry looks when using arcgis.geometry.Geometry.as_shapely
geom.as_shapely # not expected; should be a multipolygon with hole

Not expected geometry when calling arcgis.geometry.Geometry.as_shapely. It should be a multipolygon with hole.

# Check the __geo_interface__ from the shapely geometry created by arcgis.geometry.Geometry.as_shapely
print(geom.as_shapely.__geo_interface__) # not expected; should be a multipolygon with hole but instead it is a polygon

Not expected shapely geometry when it is created by arcgis.geometry.Geometry.as_shapely. It should be a multipolygon with hole.

Geometry failed validation: Hole lies outside shell[20 35]. Repairing with `buffer(0)`.
{'type': 'Polygon', 'coordinates': (((40.0, 40.0), (45.0, 30.0), (20.0, 45.0), (40.0, 40.0)),)}

Use arcgis.geometry.Geometry.__geo_interface__ and shapely to create shapely geometry instead of using arcgis.geometry.Geometry.as_shapely.

# Use shapely directly to create shapely geometry using arcgis.geometry.Geometry.__geo_interface__, and repair any issues with it
# Convert geo interface to shapely geometry doc: https://shapely.readthedocs.io/en/2.0.1/manual.html#python-geo-interface
# Repair geometry doc: https://shapely.readthedocs.io/en/2.0.1/reference/shapely.make_valid.html
shapely.make_valid(shapely.geometry.shape(geom.__geo_interface__)) # as expected

This is the expected shapely geometry.

This matches the multipolygon with hole example geometry used.

error:

>>> geom.as_shapely == shapely.make_valid(shapely.geometry.shape(geom.__geo_interface__))
Geometry failed validation: Hole lies outside shell[20 35]. Repairing with `buffer(0)`.
False

There is no explicit error raised. The issue is unexpected behavior with arcgis.geometry.Geometry.as_shapely creating a shapely geometry that differs from creating a shapely geometry using shapely.geometry.shape.

Screenshots
See above.

Expected behavior
I expect arcgis.geometry.Geometry.as_shapely to create a shapely geometry that is equal to calling shapely.geometry.shape.

>>> geom.as_shapely == shapely.make_valid(shapely.geometry.shape(geom.__geo_interface__))
True

For reference, here are docs for how I create shapely geometry from arcgis.geometry.Geometry.__geo_interface__.
Convert geo interface to shapely geometry doc: https://shapely.readthedocs.io/en/2.0.1/manual.html#python-geo-interface
Repair geometry doc: https://shapely.readthedocs.io/en/2.0.1/reference/shapely.make_valid.html

Platform (please complete the following information):

Additional context
Add any other context about the problem here, attachments etc.


RetroSearch is an open source project built by @garambo | Open a GitHub Issue

Search and Browse the WWW like it's 1997 | Search results from DuckDuckGo

HTML: 3.2 | Encoding: UTF-8 | Version: 0.7.4