how to convert geojson to shapely polygon?
Asked Answered
G

3

15

i have a geoJSON

geo = {'type': 'Polygon',
 'coordinates': [[[23.08437310100004, 53.15448536100007],
   [23.08459767900007, 53.15448536100007],
   [23.08594514600003, 53.153587050000056],
   (...)
   [23.08437310100004, 53.15448536100007]]]}

and i want to use these coordinates as an input to shapely.geometry.Polygon. The problem is that Polygon only accepts tuple values, meaning i have to convert this geojson to a polygon. When i try to input this type of data into a Polygon there's an error ValueError: A LinearRing must have at least 3 coordinate tuples

I tried this:

[tuple(l) for l in geo['coordinates']]

but this dosen't quite work since it only returns this

[([23.08437310100004, 53.15448536100007],
  [23.08459767900007, 53.15448536100007],
  (...)
  [23.08437310100004, 53.15448536100007])]

and what i need is this (i think it's a tuple)

([(23.08437310100004, 53.15448536100007),
  (23.08459767900007, 53.15448536100007),
  (...)
  (23.08437310100004, 53.15448536100007)])

is there a function for this?

Groves answered 17/8, 2021 at 15:27 Comment(0)
A
38

A generic solution is to use the shape function:

Returns a new, independent geometry with coordinates copied from the context.

This works for all geometries not just polygons.

from shapely.geometry import shape
from shapely.geometry.polygon import Polygon

geo: dict = {'type': 'Polygon',
   'coordinates': [[[23.08437310100004, 53.15448536100007],
   [23.08459767900007, 53.15448536100007],
   [23.08594514600003, 53.153587050000056],
   [23.08437310100004, 53.15448536100007]]]}
polygon: Polygon = shape(geo)
Anomalous answered 2/12, 2021 at 12:53 Comment(4)
Really good answer here!Logan
This should be the accepted answer.Raft
it doesnt work!Caro
any details on why its not working?Anomalous
G
4

Try this,

from itertools import chain


geom = {...}
polygon = Polygon(list(chain(*geom['coordinates']))
Gesture answered 17/8, 2021 at 15:40 Comment(1)
This method should be more accurate I think, because in other answers only first polygon is taken into account, so if a polygon has an inner ring, it will not show up.Scarabaeoid
W
3
from shapely.geometry import Polygon
geo = {'type': 'Polygon',
 'coordinates': [[[23.08437310100004, 53.15448536100007],
   [23.08459767900007, 53.15448536100007],
   [23.08594514600003, 53.153587050000056],
   [23.08437310100004, 53.15448536100007]]]}
Polygon([tuple(l) for l in geo['coordinates'][0]])
Witmer answered 17/8, 2021 at 15:41 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.