Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

GeoPandas Set CRS on Points

Given the following GeoDataFrame:

h=pd.DataFrame({'zip':[19152,19047],                'Lat':[40.058841,40.202162],                'Lon':[-75.042164,-74.924594]}) crs='none' geometry = [Point(xy) for xy in zip(h.Lon, h.Lat)] hg = GeoDataFrame(h, crs=crs, geometry=geometry) hg         Lat          Lon     zip     geometry 0   40.058841   -75.042164  19152   POINT (-75.042164 40.058841) 1   40.202162   -74.924594  19047   POINT (-74.924594 40.202162) 

I need to set the CRS as I did with another GeoDataFrame (like this):

c=c.to_crs("+init=epsg:3857 +ellps=GRS80 +datum=GGRS87 +units=mi +no_defs") 

I've tried this:

crs={'init': 'epsg:3857'} 

and this:

hg=hg.to_crs("+init=epsg:3857 +ellps=GRS80 +datum=GGRS87 +units=mi +no_defs") 

...but no luck.

Some important notes:

  1. The other GeoDataFrame for which the above .to_crs method worked was from a shape file and the geometry column was for polygons, not points. Its 'geometry' values looked like this after the .to_crs method was applied:

    POLYGON ((-5973.005380655156 3399.646267693398... and when I try the above with the hg GeoDataFrame, they still look like regular lat/long coordinates.

  2. If/when this works out, I'll then concatenate these points with the polygon GeoDataFrame in order to plot both (points on top of polygons).

  3. When I try concatenating the GeoDataFrames first before using the .to_crs method, and then I use the method on both the point and polygon rows at once, I get the following error:

    ValueError: Cannot transform naive geometries. Please set a crs on the object first.

Thanks in advance!

like image 545
Dance Party2 Avatar asked Aug 15 '16 19:08

Dance Party2


People also ask

How do I set CRS in Geopandas?

To transform the geometries to a new CRS, use the to_crs method. The value can be anything accepted by pyproj. CRS. from_user_input() , such as an authority string (eg “EPSG:4326”) or a WKT string.

What is a CRS Geopandas?

Coordinate Reference Systems CRS are important because the geometric shapes in a GeoSeries or GeoDataFrame object are simply a collection of coordinates in an arbitrary space. A CRS tells Python how those coordinates related to places on the Earth. CRS are referred to using codes called proj4 strings.

How do I change the projection on Geopandas?

Changing the projection is really easy to do in Geopandas with . to_crs() -function. As an input for the function, you should define the column containing the geometries, i.e. geometry in this case, and a epgs value of the projection that you want to use.

What is To_crs?

to_crs(crs=None, epsg=None) Returns a GeoSeries with all geometries transformed to a new coordinate reference system. Transform all geometries in a GeoSeries to a different coordinate reference system. The crs attribute on the current GeoSeries must be set. Either crs or epsg may be specified for output.


2 Answers

Geopandas API got cleaned up, and now works without surprises. Make sure to use the lastest stable version and read the docs.

Setting the CRS on a GeoDataFrame using its EPSG code is as simple as

gdf.set_crs(epsg=4326, inplace=True) 

where gdf is a geopandas.geodataframe.GeoDataFrame. Watch out for the explicit inplace!

So in the example above it would be:

import pandas as pd from shapely.geometry import Point from geopandas import GeoDataFrame  df = pd.DataFrame({'zip':[19152,19047],                'Lat':[40.058841,40.202162],                'Lon':[-75.042164,-74.924594]})  geometry = [Point(xy) for xy in zip(df.Lon, df.Lat)] gdf = GeoDataFrame(df, geometry=geometry)  gdf.set_crs(epsg=4326, inplace=True) # ^ comment out to get a "Cannot transform naive geometries" error below  # project to merkator gdf.to_crs(epsg=3395)       zip        Lat        Lon                          geometry 0  19152  40.058841 -75.042164  POINT (-8353655.485 4846992.030) 1  19047  40.202162 -74.924594  POINT (-8340567.652 4867777.107) 
like image 176
Ufos Avatar answered Oct 04 '22 00:10

Ufos


The format for Setting CRS in GeoPandas is now

gdf.crs = "EPSG:4326"

The earlier format is deprecated

ref: https://geopandas.org/projections.html

like image 33
shyam Avatar answered Oct 04 '22 00:10

shyam