我正在尝试找出最佳方法来做这件事,我有一个地图,在地图上绘制了一个Polygon
。由于Google Maps API V2似乎没有对多边形的触摸检测,所以我想知道是否可能检测触摸点是否在多边形内?如果可以的话,如何实现?我的主要目标是在地图上勾画出一个国家,在用户点击该国家时,将在自定义视图中显示更多详细信息。目前,我能够捕获地图的MapOnClick
,但当用户点击多边形内部时,我希望在Toast
上设置polygon.getID()
。我是新手,所以如果不够清楚请见谅。
googleMap.setOnMapClickListener(new OnMapClickListener()
{
public void onMapClick(LatLng point)
{
boolean checkPoly = true;
Toast.makeText(MainActivity.this,"The Location is outside of the Area", Toast.LENGTH_LONG).show();
}
});
}
}
catch (Exception e) {
Log.e("APP","Failed", e);
}
好的,目前为止我已经半成功地完成了这个。
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 > bY) {
aX = vertB.longitude;
aY = vertB.latitude;
bX = vertA.longitude;
bX = vertA.latitude;
}
System.out.println("aY: "+aY+" aX : "+aX);
System.out.println("bY: "+bY+" bX : "+bX);
if (pX < 0) pX += 360;
if (aX < 0) aX += 360;
if (bX < 0) bX += 360;
if (pY == aY || pY == bY) pY += 0.00000001;
if ((pY > bY || pY < aY) || (pX > Math.max(aX, bX))) return false;
if (pX < Math.min(aX, bX))
return true;
// }
double m = (aX != bX) ? ((bY - aY) / (bX - aX)) : aX;
double bee = (aX != pX) ? ((pY - aY) / (pX - aX)) : aX;
double x = (pY - bee) / m;
return x > pX;
}
我遇到的问题是在每个多边形的左侧触摸是正确的,直到它达到另一个多边形。我的算法有什么问题会导致这个问题?任何帮助都将不胜感激。