2014-09-24 217 views
12

按我的要求,我在下面的图片中显示谷歌地图绘制多边形。(使用地图V2)enter image description here确定是否点在多边形

现在我需要显示一个警告,当用户输入特定的多边形。

如何识别我的当前位置是否在多边形中。 (需要优化的方式,无需耗尽电池)

在此先感谢。

+0

你在这里使用地理围栏? – Ranjit 2014-09-24 10:25:13

+0

不是。我刚刚使用PolygonOptions绘制了该多边形。寻找一种最佳方式来识别当前位置是否在该多边形中。 – Supriya 2014-09-24 10:28:33

+0

您可以使用Geofence。 http://developer.android.com/training/location/geofencing.html – Ranjit 2014-09-24 10:30:02

回答

17

刚试过光线投射算法识别多边形点。这工作完美。

参考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; 
    } 
+0

它对我非常有帮助,谢谢!!! @supriya – Manish 2016-08-25 12:59:57

+0

你的算法总是返回false,为什么? – ofskyMohsen 2018-01-07 10:58:27

2

请参考以下链接

Polygon Touch detection Google Map API V2

它的光线投射算法,它可以帮助你:)

关于算法的简要说明:

水平线是从你的观点吸引到如果它在奇数次与多边形的边相交,则该点在多边形的内部,否则在外:)

这些wiki链接会给你全面的了解:

http://en.wikipedia.org/wiki/Point_in_polygon

http://rosettacode.org/wiki/Ray-casting_algorithm

+0

试试这个。谢谢:) – Supriya 2014-09-24 11:14:06

+0

为我的少数测试工作。检查论文。 :)谢谢 – Supriya 2014-09-24 11:33:38

9

的论文,我发现光线投射方法不可靠的,但我最终使用从谷歌地图的PolyUtil

您需要依赖compile 'com.google.maps.android:android-maps-utils:0.5'

,然后方法看起来像这样

PolyUtil.containsLocation(userLocation, polyPointsList, false); 

编辑

这是这种方法在源代码中发现的描述

单位计算给定点是否位于指定的多边形内。无论最后一个点是否等于第一个,多边形总是被视为关闭。里面被定义为不包含南极 - 南极总是在外面。如果测地线为真,则多边形由大圆段形成,否则由多边形(洛索酸)段形成。

+0

为什么最后一个参数为false?这个参数是什么? – Virat18 2017-09-20 07:53:40

+0

我已经添加了方法的描述,因为我在源代码中找到它 – DoruChidean 2017-09-20 08:24:39

+0

谢谢!真棒回答! – Virat18 2017-09-20 09:57:02

相关问题