2017-02-28 6 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あなたの形状は 'lat、lon'ではなく' lon、lat'ですか? – TemporalWolf

+1

ええ、それはlon、latです。私は逆をチェックし、どちらもうまくいかない。私は状態形状ファイルを使用して終了しましたが、現在はすべての状態を同じ方法でチェックしています。もしそれらのうちの1つが真であればそれは真ですが、ハッキーは今のところうまくいくようです。 – 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 
関連する問題