获取给定位置坐标的美国州

Get US State for given location coordinates

我想弄清楚经纬度属于哪个州。为此,我使用 US Census 和 shapely 库提供的形状文件。这是我到目前为止尝试过的:

import pandas as pd
import geopandas as gpd
from shapely.geometry import Point

df_poly = gpd.read_file("data/tl_2019_us_state.shp")
df_poly = df_poly[['GEOID', 'geometry']].set_index('GEOID')
display(df_poly.head(5))
          geometry
GEOID 
54        POLYGON ((-81.74725 39.09538, -81.74635 39.096...
12        MULTIPOLYGON (((-86.38865 30.99418, -86.38385 ...
17        POLYGON ((-91.18529 40.63780, -91.17510 40.643...
27        POLYGON ((-96.78438 46.63050, -96.78434 46.630...
24        POLYGON ((-77.45881 39.22027, -77.45866 39.220...
p1 = Point(map(float, (29.65, -95.17)))
any(df_poly['geometry'].contains(p1))
False

但是对于我尝试的任何坐标,它都会以某种方式返回 False。例如,上面的坐标来自得克萨斯州,但仍然返回 False,所以我在这里缺少什么?

以下是您应该检查的一些事项:

  1. 您使用的点顺序正确吗? Shapely 点使用 (x, y) 坐标,其顺序与 (lat, lon) 坐标相反。我会尝试翻转坐标,看看是否可行。

    例如,我看到您的一个坐标是这样的:“-81.74725 39.09538”如果您按(纬度、经度)顺序解释它,则它位于南极洲。如果按 (x, y) 顺序解释它,它在俄亥俄州。

  2. 您使用的 SRID 是否正确?人口普查数据通常使用NAD83,不过这个好查:

    print(df_poly.crs)
    
  3. 另一个很好的完整性检查是查看每个多边形的质心,并验证它是否合理:

    df.geometry.centroid
    

    以前见过有人,还得转。