2017-02-28 52 views
1

我想檢查一個特定的經度/緯度是否在大陸美國或不。我不想使用在線API,我正在使用Python。給定經度/緯度說,如果座標是在大陸美國或不

我下載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 

樣品經度,緯度是在美國境內的邊界,但poly.contains返回False。 我不確定問題所在,以及如何解決問題,以便我可以測試一個點是否在美國大陸之內。

+2

的http:// gis.stackexchange.com/questions/84114/shapely-unable-to-tell-if-polygon-contains-point你確定你的形狀是'lon,lat'而不是'lat,lon'嗎? – TemporalWolf

+1

是的,它是lon,lat。我檢查了反過來,也沒有工作。我結束了使用狀態形狀文件,現在我用相同的方法檢查所有狀態,如果其中一個返回true,那麼它是真的,儘管它似乎現在工作。 – Ash

回答

0

我結束了檢查,如果經/緯度是在每一個國家,而不是在美國大陸的檢查,如果一個點是在美國的一個,那麼它是在美國大陸

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