2017-05-10 100 views
2

我正在使用python,並且我已經定義了地圖上多邊形的緯度和經度(以度爲單位)。 我的目標是檢查座標x,y的通用點P是否屬於這樣的多邊形。因此,我希望有一個功能允許我檢查這種情況,如果點位於多邊形的內部或外部,則返回TrueFalse檢查地理點是否在Python中的多邊形內或外

enter image description here

在這個例子中,關鍵是外面那麼結果將是False

問題:是否有圖書館/包,允許達到我的目標?如果是的話,你推薦哪一個?你能否舉一個小例子來說明如何使用它?

這是迄今爲止我所編寫的代碼:

import numpy as np 

# Define vertices of polygon (lat/lon) 
v0 = [7.5, -2.5] 
v1 = [2, 3.5] 
v2 = [-2, 4] 
v3 = [-5.5, -4] 
v4 = [0, -10] 
lats_vect = np.array([v0[0],v1[0],v2[0],v3[0],v4[0]]) 
lons_vect = np.array([v0[1],v1[1],v2[1],v3[1],v4[1]]) 

# Point of interest P 
x, y = -6, 5 # x = Lat, y = Lon 

## START MODIFYING FROM HERE; DO NOT MODIFY POLYGON VERTICES AND DATA TYPE 
# Check if point of interest falls within polygon boundaries 
# If yes, return True 
# If no, return falls 

爲了繪製多邊形和我用cartopy,我寫了下面的代碼行的關注點:

import cartopy.crs as ccrs 
import matplotlib.pyplot as plt 
ax = plt.axes(projection=ccrs.PlateCarree()) 
ax.stock_img() 

# Append first vertex to end of vector to close polygon when plotting 
lats_vect = np.append(lats_vect, lats_vect[0]) 
lons_vect = np.append(lons_vect, lons_vect[0]) 
plt.plot([lons_vect[0:-1], lons_vect[1:]], [lats_vect[0:-1], lats_vect[1:]], 
     color='black', linewidth=1, 
     transform=ccrs.Geodetic(), 
     ) 

plt.plot(y, x, 
     '*',   # marker shape 
     color='blue', # marker colour 
     markersize=8 # marker size 
     ) 

plt.show() 

注意

  • 點用大詞相互連接rcles!
  • 我在internt中進行了研究,最後我發現了一些類似的問題like this one,但我沒有成功,因爲他們都使用我沒有的.shp文件。
+0

嘗試將此算法轉換爲Python https://wrf.ecse.rpi.edu//Research/Short_Notes/pnpoly。html#C代碼 – arboreal84

+0

python沒有可執行任何操作的軟件包。它有少量的預建模塊。包通常由社區提供。 – Uriel

+1

多邊形是否總是凸出的? –

回答

3

這是我的問題的一種可能的解決方案。

  1. 地理座標必須正確存儲。實施例np.array([[Lon_A, Lat_A], [Lon_B, Lat_B], [Lon_C, Lat_C]])
  2. 創建多邊形
  3. 創建待測試
  4. 使用polygon.contains(point)要測試的點,如果點是內部(True)或外(False)的多邊形。

這裏是代碼的缺失部分:

from shapely.geometry import Point 
from shapely.geometry.polygon import Polygon 

lons_lats_vect = np.column_stack((lons_vect, lats_vect)) # Reshape coordinates 
polygon = Polygon(lons_lats_vect) # create polygon 
point = Point(y,x) # create point 
print(polygon.contains(point)) # check if polygon contains point 

:多邊形不考慮大週期明顯,因此,有必要的邊緣分割成許多段從而增加頂點的數量。

+0

最好寫第一個緯度,然後是經度。這裏的邏輯沒有錯,但要安全而不是抱歉。 – Zahran

相關問題