按我的要求,我在下面的圖片中顯示谷歌地圖繪製多邊形。(使用地圖V2)確定是否點在多邊形
現在我需要顯示一個警告,當用戶輸入特定的多邊形。
如何識別我的當前位置是否在多邊形中。 (需要優化的方式,無需耗盡電池)
在此先感謝。
按我的要求,我在下面的圖片中顯示谷歌地圖繪製多邊形。(使用地圖V2)確定是否點在多邊形
現在我需要顯示一個警告,當用戶輸入特定的多邊形。
如何識別我的當前位置是否在多邊形中。 (需要優化的方式,無需耗盡電池)
在此先感謝。
剛試過光線投射算法識別多邊形點。這工作完美。
參考http://en.wikipedia.org/wiki/Point_in_polygon的光線投射
private boolean isPointInPolygon(LatLng tap, ArrayList<LatLng> vertices) {
int intersectCount = 0;
for (int j = 0; j < vertices.size() - 1; j++) {
if (rayCastIntersect(tap, vertices.get(j), vertices.get(j + 1))) {
intersectCount++;
}
}
return ((intersectCount % 2) == 1); // odd = inside, even = outside;
}
private boolean rayCastIntersect(LatLng tap, LatLng vertA, LatLng vertB) {
double aY = vertA.latitude;
double bY = vertB.latitude;
double aX = vertA.longitude;
double bX = vertB.longitude;
double pY = tap.latitude;
double pX = tap.longitude;
if ((aY > pY && bY > pY) || (aY < pY && bY < pY)
|| (aX < pX && bX < pX)) {
return false; // a and b can't both be above or below pt.y, and a or
// b must be east of pt.x
}
double m = (aY - bY)/(aX - bX); // Rise over run
double bee = (-aX) * m + aY; // y = mx + b
double x = (pY - bee)/m; // algebra is neat!
return x > pX;
}
它對我非常有幫助,謝謝!!! @supriya – Manish 2016-08-25 12:59:57
你的算法總是返回false,爲什麼? – ofskyMohsen 2018-01-07 10:58:27
請參考以下鏈接
Polygon Touch detection Google Map API V2
它的光線投射算法,它可以幫助你:)
關於算法的簡要說明:
水平線是從你的觀點吸引到如果它在奇數次與多邊形的邊相交,則該點在多邊形的內部,否則在外:)
個這些wiki鏈接會給你全面的瞭解:
的論文,我發現光線投射方法不可靠的,但我最終使用從谷歌地圖的PolyUtil
。
您需要依賴compile 'com.google.maps.android:android-maps-utils:0.5'
,然後方法看起來像這樣
PolyUtil.containsLocation(userLocation, polyPointsList, false);
編輯
這是這種方法在源代碼中發現的描述
單位計算給定點是否位於指定的多邊形內。無論最後一個點是否等於第一個,多邊形總是被視爲關閉。裏面被定義爲不包含南極 - 南極總是在外面。如果測地線爲真,則多邊形由大圓段形成,否則由多邊形(洛索酸)段形成。
爲什麼最後一個參數爲false?這個參數是什麼? – Virat18 2017-09-20 07:53:40
我已經添加了方法的描述,因爲我在源代碼中找到它 – DoruChidean 2017-09-20 08:24:39
謝謝!真棒回答! – Virat18 2017-09-20 09:57:02
你在這裏使用地理圍欄? – Ranjit 2014-09-24 10:25:13
不是。我剛剛使用PolygonOptions繪製了該多邊形。尋找一種最佳方式來識別當前位置是否在該多邊形中。 – Supriya 2014-09-24 10:28:33
您可以使用Geofence。 http://developer.android.com/training/location/geofencing.html – Ranjit 2014-09-24 10:30:02