11

I have the Polygon data from the States from the USA from the website arcgis and I also have an excel file with coordinates of citys. I have converted the coordinates to geometry data (Points). Now I want to test if the Points are in the USA. Both are dtype: geometry. I thought with this I can easily compare, but when I use my code I get for every Point the answer false. Even if there are Points that are in the USA.

The code is:

import geopandas as gp
import pandas as pd
import xlsxwriter
import xlrd
from shapely.geometry import Point, Polygon

df1 = pd.read_excel('PATH')
gdf = gp.GeoDataFrame(df1, geometry= gp.points_from_xy(df1.longitude, df1.latitude))

US = gp.read_file('PATH')

print(gdf['geometry'].contains(US['geometry']))

Does anybody know what I do wrong?

abestrad
  • 898
  • 2
  • 12
  • 23
Kamel
  • 141
  • 1
  • 9
  • are your datasets in the same coordinate system? – Paul H Jun 16 '20 at 16:14
  • 2
    rather than rely on datasets that no one else can ride, mock up up a couple of points and rectangles in cartesian space and work from that. – Paul H Jun 16 '20 at 16:15

1 Answers1

12

contains in GeoPandas currently work on a pairwise basis 1-to-1, not 1-to-many. For this purpose, use sjoin.

points_within = gp.sjoin(gdf, US, predicate='within')

That will return only those points within the US. Alternatively, you can filter polygons which contain points.

polygons_contains = gp.sjoin(US, gdf, predicate='contains')
joris
  • 133,120
  • 36
  • 247
  • 202
martinfleis
  • 7,124
  • 2
  • 22
  • 30