2017-02-28 3 views
1

Je veux vérifier si une latitude/longitude particulière se trouve dans la zone continentale des États-Unis ou non. Je ne veux pas utiliser les API en ligne et j'utilise Python.Étant donné la latitude/longitude, dites si la coordonnée est dans la zone continentale des États-Unis ou non

Je téléchargé this shapefile

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 

L'échantillon lon, lat est dans les limites des États-Unis, mais poly.contains retourne Faux. Je ne suis pas sûr de savoir quel est le problème et comment résoudre le problème afin que je puisse tester si un point est dans la zone continentale des États-Unis.

+2

http: //. gis.stackexchange.com/questions/84114/shapely-unable-to-tell-if-polygon-contains-point Êtes-vous sûr que votre forme est «lon, lat» au lieu de «lat, lon»? – TemporalWolf

+1

ouais, c'est lon, lat. J'ai vérifié l'inverse, ne fonctionne pas non plus. J'ai fini par utiliser les fichiers de forme d'état et maintenant je vérifie tous les états avec la même méthode et si l'un d'entre eux retourne vrai alors c'est vrai, bien que hacky cela semble fonctionner pour l'instant. – Ash

Répondre

0

Je fini par vérifier si la latitude/longitude était dans chaque Etat au lieu de l'arrivée des États-Unis continentaux, si un point est dans l'un des états, il est continental US

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