GeoPandas: return lat and long of a centroid point
Ran into this problem myself. If you want the x
and y
as separate GeoDataFrame columns, then this works nicely:
gdf["x"] = gdf.centroid.map(lambda p: p.x)
gdf["y"] = gdf.centroid.map(lambda p: p.y)
Starting with GeoPandas 0.3.0, you can use the provided x
and y
properties instead:
gdf["x"] = gdf.centroid.x
gdf["y"] = gdf.centroid.y
Leaving the rest below, but the main thing was accessing the geometry properly. If iterating over rows, e.g. for index, row in zones.iterrows():
you can simply use row.geometry.centroid.x
and row.geometry.centroid.y
. Geometry is a special column included in a GeoDataFrame, so every row has a geometry attribute.
You are accessing that attribute, which contains a shapely
object. That shapely
object will have an attribute, centroid
that, in turn contains a shapely.geometry.Point
, which has attributes x
and y
, finally giving you the properties you want.
(This part was the original effort to get to x,y with map
and shapely.geometry.Point
.)
I am going to assume you want a list of (x, y) tuples? Create a quick accessor function for the x and y attributes on a Point
and use map
.
Edit: Okay, figured out that you may be accessing the geometry in the GeoDataFrame in an incorrect way. Geometry is a column in your GeoDataFrame, which by itself produces a series. Calling centroid
on that column should give you a new GeoSeries of only those centroids. I suspect the way you were going about things was taking the centroid of every vertex in each polygon. Still cannot test this since I cannot install GeoPandas right now.
def getXY(pt):
return (pt.x, pt.y)
centroidseries = zones['geometry'].centroid
centroidlist = map(getXY, centroidseries)
or if you want two separate lists of x and y coordinates
def getXY(pt):
return (pt.x, pt.y)
centroidseries = zones['geometry'].centroid
x,y = [list(t) for t in zip(*map(getXY, centroidseries))]
Alternately, you should also be able to use zones.geometry.centroid
instead of zones['geometry'].centroid
. Either way, I think calling zones.centroid
may be returning a GeoDataFrame instead of a GeoSeries, giving you the unexpected output when you wrap it in another GeoSeries.
This has been made easier as of GeoPandas 0.3.0.
You can now access x
and y
of shapely Points
inside a geopandas GeoSeries
using your_GeoDataFrame.geometry.x
and your_GeoDataFrame.geometry.y
(Note : I'm using python 3.6.1, not sure about behavior in 2.7, sorry)
Source on github