2017-02-28 3 views
1

Ich möchte überprüfen, ob eine bestimmte Breite/Länge innerhalb der kontinentalen USA ist oder nicht. Ich möchte keine Online-APIs verwenden und verwende Python.Gegebene Breite/Länge sagen, ob die Koordinate innerhalb der kontinentalen USA ist oder nicht

ich heruntergeladen 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 

Die Probe lon, lat innerhalb US Grenze ist aber poly.contains gibt False zurück. Ich bin nicht sicher, was das Problem ist und wie das Problem zu lösen, so dass ich testen kann, ob ein Punkt innerhalb der kontinentalen USA ist.

+2

http:. // gis.stackexchange.com/questions/84114/shapely-unable-to-tell-if-polygon-contains-point Bist du sicher, dass deine Form "lon, lat" statt "lat, lon" ist? – TemporalWolf

+1

ja, es ist lon, lat. Ich habe das Gegenteil überprüft, funktioniert auch nicht. Am Ende habe ich die State-Shape-Dateien verwendet und jetzt überprüfe ich alle Zustände mit der gleichen Methode und wenn einer von ihnen wahr zurückgibt, dann ist es wahr, obwohl Hacky es scheint, jetzt zu arbeiten. – Ash

Antwort

0

ich Überprüfung beendet, wenn lat/lon in jedem Staat statt Check-in kontinentalen USA war, wenn ein Punkt in einem der Zustände ist, dann ist es in kontinentalen USA

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 
Verwandte Themen