2011-11-18 100 views
3

我想弄清楚經度/緯度點是否包含在由代表地球上點的頂點定義的多邊形內(也是緯度/經度,順時針方向訂購)。這對於可以映射到2D緯度/經度空間的多邊形而言是微不足道的。確定緯度/經度是否在地球表面上的多邊形內

這變得越來越困難的是圓的(現在切換回3D),可能會從覆蓋半個地球的極點到極點。翻譯成lat/lon看起來像一個正弦波。多邊形測試中的2D點不再適用於這種情況。有沒有解決這個問題的算法?

==================對以下評論的說明:=================== 多邊形是(60,90),(60,110),( - 30,110),( - 30,90)定義爲(lon,lat)對。

我的代碼實現了光線投射算法,並且工作正常。然而,地球表面上的某些多邊形不會轉化爲2D空間中的閉合多邊形。

+0

你能不能給你如何定義你的多邊形,貴點的例子,和預期的結果?另外,你有沒有試過的代碼? (如果可以,編輯您的問題以包含此信息) – Wilduck

+0

您對順時針標記的點的定義定義了多邊形的哪一側是內部。 – Zak

+0

這個問題是語言無關的 - 刪除了python標籤。 –

回答

0

如果圓的表面上繪製了圓的中心點和半徑,則計算中心點和目標點之間的Great-circle distance。如果它小於圓的半徑,則目標點位於圓內。

這不會推廣到您的球體上繪製的任意多邊形,但您只會問到關於圓的問題,所以我不知道它對您是否重要。

+0

感謝您的回覆。是否有任何種類的多邊形的通用解決方案?我不一定會被圈定爲多邊形。 – BigBrownBear00

1

正如denniston.t所述,如果您只對圈子感興趣,並且有一個半徑,則可以簡單地檢查中心點和點之間的距離是否小於半徑。要找到大圓的距離,您通常使用Haversine Formula。以下是我在Python實現:

from math import radians, sin, cos, asin, sqrt 

def haversine(point1, point2): 
    """Gives the distance between two points on earth. 

    The haversine formula, given two sets of latitude and longitude, 
    returns the distance along the surface of the earth in miles, 
    ignoring potential changes in elevation. The points must be in 
    decimal degrees. 
    """ 
    earth_radius_miles = 3956 
    lat1, lon1 = (radians(coord) for coord in point1) 
    lat2, lon2 = (radians(coord) for coord in point2) 
    dlat, dlon = (lat2 - lat1, lon2 - lon1) 
    a = sin(dlat/2.0)**2 + cos(lat1) * cos(lat2) * sin(dlon/2.0)**2 
    great_circle_distance = 2 * asin(min(1,sqrt(a))) 
    d = earth_radius_miles * great_circle_distance 
    return d 
+0

多邊形不一定是圓形。我以此爲例來簡化問題。 – BigBrownBear00

0
containsLocation(point:LatLng, polygon:Polygon)