13

I read a shapefile with GeoPandas and I get a nice table with a column "geometry". This column contains shapely.geometry.polygon.Polygon or shapely.geometry.multipolygon.MultiPolygon object.

import geopandas as gpd
gdf = gpd.GeoDataFrame.from_file("ashapefile.shp")

Now I would like to use this geoDataFrame to make such as a chloropeth plot or something else. Thus I would like to get the (x, y) coordinates, (latitude, longitude) of these polygons.

For example if I do :

for boundary in gdf.boundary:
    print(boundary.xy)

Thus boundary are shapely.geometry.linestring.LineString or MultiLineString. boundary.xy are what I am looking for. But for MultilineString I have to do a loop on all the line.

Is there the way to do that ? Or is there a more simple or straightforward way ?

EDIT : Issue with unary_union:

Issue with unary_union

nmtoken
  • 13,355
  • 5
  • 38
  • 87
Ger
  • 269
  • 1
  • 2
  • 7

1 Answers1

4

A polygons shapefile

import geopandas as gpd
gdf = gpd.read_file("polys.shp")
gdf.head(2)

enter image description here

Number of polygons

gdf.groupby('POLY_NUM_B').count()
        Pb  Zn  geometry
 POLY_NUM_B                  
 24      1   1         1
 25      1   1         1
 26      1   1         1
 27      1   1         1
 28      1   1         1

Extraction of the the nodes of the polygons exterior coordinates (Shapely: polygon)

from shapely.geometry import Point
for index, row in gdf.iterrows():
     for pt in list(row['geometry'].exterior.coords): 
        print Point(pt)
POINT (-716632.5126561673 -954202.6388434628)
POINT (-716599.344199169 -954224.8253932064)
POINT (-716538.7964301996 -954240.9772354551)
POINT (-716529.3520701742 -954273.9782994529)
POINT (-716550.9210327187 -954269.8358586552)
POINT (-716600.4004366234 -954260.3328329064)
POINT (-716627.870139441 -954255.056896301)
POINT (-716639.1558135629 -954227.2907514013)
....

With MultiPolygons, you need to adapt the script or use Shapely unary_union (conversion of a MultiPolygon to a Polygon) before as in Geopandas [Shapely] spatial difference: TopologyException: no outgoing dirEdge found

Creation of a new nodes (Points) GeoDataFrame with the columns of gdf

col = gdf.columns.tolist()[0:4]
print col
[u'POLY_NUM_B', u'Pb', u'Zn', 'geometry']
# New GeoDataFrame 
nodes = gpd.GeoDataFrame(columns=col)
# extraction of nodes and attribute values nouveau GeoDataFrame
for index, row in gdf.iterrows():
    for pt in list(row['geometry'].exterior.coords): 
        nodes = nodes.append({'POLY_NUM_B': int(row['POLY_NUM_B']), 'Pb':row['Pb'],'Zn':row['Zn'], 'geometry':Point(pt) },ignore_index=True)
nodes.head(5)

enter image description here

Number of nodes of polygons

nodes.groupby('POLY_NUM_B').count()
        Pb  Zn  geometry
POLY_NUM_B                  
24.0     9   9         9
25.0    10  10        10
26.0     7   7         7
27.0     6   6         6
28.0     6   6         6
gene
  • 54,868
  • 3
  • 110
  • 187
  • I got an issue with unary_union. If I do unary_union(MULTIPOLYGON) I obtain a Multipolygon as output. – Ger Nov 30 '16 at 20:48
  • I do not understand what happened ? I put a capture of what I did in the first post. – Ger Nov 30 '16 at 21:01