Created
March 13, 2017 21:06
-
-
Save rmania/8c88377a5c902dfbc134795a7af538d8 to your computer and use it in GitHub Desktop.
flatten geometry series (3D to 2D) in geopandas dataframe
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
# Often when reading in a ShapeFile from Basemap, you'll get: "ValueError: readshapefile can only handle 2D shape types" | |
# A trick can be to convert your geometry in your GeoPandas Dataframe and restoring the new flattened 2D geometry | |
# series back into a shapefile and try again. | |
# edit from http://stackoverflow.com/questions/33417764/basemap-readshapefile-valueerror | |
from shapely.geometry import Polygon, MultiPolygon, shape, Point | |
import geopandas as gp | |
def convert_3D_2D(geometry): | |
''' | |
Takes a GeoSeries of 3D Multi/Polygons (has_z) and returns a list of 2D Multi/Polygons | |
''' | |
new_geo = [] | |
for p in geometry: | |
if p.has_z: | |
if p.geom_type == 'Polygon': | |
lines = [xy[:2] for xy in list(p.exterior.coords)] | |
new_p = Polygon(lines) | |
new_geo.append(new_p) | |
elif p.geom_type == 'MultiPolygon': | |
new_multi_p = [] | |
for ap in p: | |
lines = [xy[:2] for xy in list(ap.exterior.coords)] | |
new_p = Polygon(lines) | |
new_multi_p.append(new_p) | |
new_geo.append(MultiPolygon(new_multi_p)) | |
return new_geo | |
geodf_2d = gp.GeoDataFrame.from_file(shp_file) # plug_in your shapefile | |
geodf_2d.geometry = convert_3D_2D(geodf_2d.geometry) # new geodf with 2D geometry series | |
# geodf_2d.to_file(path + shapefile.shp, driver = 'ESRI Shapefile') will sore a shapefile with 2D shape types |
Thanks! it helped me get 2D Polygons from the KML file from Google Earth.
Thanks so much! This really helped me getting 2D polygons from Google Earth pro!
Is force_2d now the best approach for this?
Thanks! works great.
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Thanks above,
output_dimensions=2
ftw!detail
convert_3D_2D
above only works for (Multi)Polygons.drop_z_convert_3D_2D
is a rewrite ofconvert_3D_2D
for all shapely geometry objects.drop_z_pygeos
requires pygeos to be installed. at least until shapely 2 is released.drop_z_shapely_for
uses a method suggested: shapely/shapely#709drop_z_shapely_transform
is to compare between the transform and for method for looping between rows/geoms. I did these to explain why I changed the suggested method. >10% improvement.