Учитывая широту / долготу, скажите, находится ли координата в пределах континентальной части США или нет

Я хочу проверить, находится ли конкретная широта / долгота в пределах континентальной части США или нет. Я не хочу использовать онлайн API, и я использую Python.

Я скачал этот шейп- файл

from shapely.geometry import MultiPoint, Point, Polygon
import shapefile    
sf = shapefile.Reader("cb_2015_us_nation_20m")
shapes = sf.shapes()
fields = sf.fields
records = sf.records()
points = shapes[0].points
poly = Polygon(points)
lon = -112
lat = 48
point = Point(-112, 48)
poly.contains(point)
#should return True because it is in continental US but returns False

Пример lon, lat находится в пределах границы США, но poly.contains возвращает значение False. Я не уверен, в чем проблема и как решить проблему, чтобы я мог проверить, находится ли точка в пределах континентальной части США.

2 ответа

Решение

В итоге я проверил, был ли широта / долгота в каждом штате, а не в континентальной части США, если точка находится в одном из штатов, то в континентальной части США.

from shapely.geometry import MultiPoint, Point, Polygon
import shapefile
#return a polygon for each state in a dictionary
def get_us_border_polygon():

    sf = shapefile.Reader("./data/states/cb_2015_us_state_20m")
    shapes = sf.shapes()
    #shapes[i].points
    fields = sf.fields
    records = sf.records()
    state_polygons = {}
    for i, record in enumerate(records):
        state = record[5]
        points = shapes[i].points
        poly = Polygon(points)
        state_polygons[state] = poly

    return state_polygons

#us border
state_polygons = get_us_border_polygon()   
#check if in one of the states then True, else False
def in_us(lat, lon):
    p = Point(lon, lat)
    for state, poly in state_polygons.iteritems():
        if poly.contains(p):
            return state
    return None

Я запустил ваш код и построил многоугольник. Это выглядело так:

Если бы вы запустили его с этим кодом:

      import geopandas as gpd
import matplotlib.pyplot as plt

shapefile = gpd.read_file("path/to/shapes.shp")
shapefile.plot()
plt.show()
# credit to https://stackoverflow.com/a/59688817/1917407

вы бы видели это:

Итак, 1, вы не смотрите на КОНУС, и 2, ваш сюжет не работает. Однако ваш код работает и вернет True с сюжетом geopandas.

Другие вопросы по тегам