Skip to content
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

Bug - shape.JSON property rings different from shape.WKT rings #5

Open
sf-apex opened this issue Mar 18, 2025 · 0 comments
Open

Bug - shape.JSON property rings different from shape.WKT rings #5

sf-apex opened this issue Mar 18, 2025 · 0 comments

Comments

@sf-apex
Copy link

sf-apex commented Mar 18, 2025

Hello! I briefly chatted with two of you at the expo in Palm Springs last week, and thought I'd give this new repo's issues section a try...

Describe the bug
I'm sending some polygon data (as JSON) to a vendor's API, and finding some differences in the coordinate structure when using the .JSON property vs the .WKT property of the arcpy.Geometry object. I suspect this might be a bug within the .JSON property, although is also very niche and may lead to some other resolution.

The difference only occurs for polygons with a self-intersection, e.g.,:

Image

To Reproduce
Please provide steps or code to reproduce the behavior

  1. I'm on ArcGIS Pro 3.2 / Python 3.9
  2. A simple shapefile (with a self-intersection) is here: example.zip
  3. A difference can be seen by getting the geometry object, calling .JSON and .WKT, and comparing the results.
  4. The code below includes a string replacement hack I'm using (as a stand-in, getting the desired json from the wkt), and makes this difference a little clearer.
import arcpy
import json


def wkt_to_json(wkt: str):
    """
    Janky text replacement to mimic getting arcpy.Geometry.JSON from wkt

    Args:
        wkt (str): well known text

    Returns:
        str: coords as lists of lists, etc
    """
    return wkt.replace(
        "MULTIPOLYGON (((", "[[[["
    ). replace(
        ")))", "]]]]"
    ).replace(
        ")), ((", "]]],[[["
    ).replace(
        "), (", "]],[["
    ).replace(
        ", ", "],["
    ).replace(
        " ", ","
    )


if __name__ == "__main__":

    # define shp
    shp_path = r"c:\_test\example.shp"

    # get shape object in wgs 84
    shape = arcpy.da.SearchCursor(
        in_table = shp_path,
        field_names = ["shape@"],
        spatial_reference = arcpy.SpatialReference(4326)
    ).next()[0]

    # get coord rings from json
    rings_json = [json.loads(shape.JSON)["rings"]]

    # get coord rings from wkt
    rings_wkt = eval(wkt_to_json(shape.WKT))

    # print results
    print(f"\njson:\n{rings_json}\n\nwkt:\n{rings_wkt}\n")

Results in the following print message (notice the extra nesting level in the WKT):

json:
[[[[-102.63360131351193, 39.178121928426435], [-102.62342030125676, 39.17815377092889], [-102.63297793390872, 39.17073880963662], [-102.63360131351193, 39.178121928426435]], [[-102.63360131351193, 39.178121928426435], [-102.64149801399176, 39.17802302383014], [-102.63366335417479, 39.18350071170985], [-102.63360131351193, 39.178121928426435]]]]

wkt:
[[[[-102.63360131351193, 39.178121928426435], [-102.63297793390872, 39.17073880963662], [-102.62342030125676, 39.17815377092889], [-102.63360131351193, 39.178121928426435]]], [[[-102.63360131351193, 39.178121928426435], [-102.63366335417479, 39.18350071170985], [-102.64149801399176, 39.17802302383014], [-102.63360131351193, 39.178121928426435]]]]

Expected behavior

I'd like to be able to use the .JSON method, since it's more concise and seems to work fine for all other polygons (without a self-intersection).

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

1 participant