【发布时间】:2017-05-03 08:40:55
【问题描述】:
我正在使用 Android 上的 Google Maps API 来创建拼图。此链接包含我用来绘制非洲国家的数据:World countries coordinates。
当用户点击地图时,会进行测试以检查它是否在正确的国家/地区。
点在正确的国家内:正确的国家是绿色的
指向另一个已知国家:当前国家以红色显示
下面的代码迭代非洲国家列表(一个国家可能包含多个多边形)以找到包含点击点的国家并将其与正确的国家进行比较。
mMap.setOnMapClickListener(new GoogleMap.OnMapClickListener() {
@Override
public void onMapClick(LatLng latLng) {
if(isPointInPolygon(latLng,answerPolygon)) {
// right answer
Toast.makeText(MapsActivity.this, "point inside the right polygon", Toast.LENGTH_SHORT).show();
Polygon p = mMap.addPolygon(new PolygonOptions().addAll(answerPolygon));
p.setStrokeWidth(p.getStrokeWidth()/5);
p.setFillColor(0x7F00FF00);
}
else {
// wrong answer
// search current polygon
// color current polygon in red
if (colorPolygonInRed(latLng)){
Polygon p = mMap.addPolygon(new PolygonOptions().addAll(answerPolygon));
p.setStrokeWidth(p.getStrokeWidth()/5);
p.setFillColor(0x7F00FF00);
Toast.makeText(MapsActivity.this, "point in known polygons", Toast.LENGTH_SHORT).show();
}
else {
Toast.makeText(MapsActivity.this, "point in unknown polygons", Toast.LENGTH_SHORT).show();
}
}
}
});
函数 isPointInPolygon() 仅适用于地图上的一个多边形,因为它基于几何(射线相交)。在我的情况下它不起作用。 例如,当我在乍得这个国家(this picture 中的蓝点)内单击时,埃及被染成红色(我的列表按字母顺序排序,因此埃及是单击点右侧的第一个验证射线相交条件)。
public 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;
}
public boolean colorPolygonInRed(LatLng point){
for (Country country:countryList){
for (ArrayList<LatLng> polygon : country.getCoordinates()){
if(isPointInPolygon(point,polygon)) {
Polygon p = mMap.addPolygon(new PolygonOptions().addAll(polygon));
p.setStrokeWidth(p.getStrokeWidth()/5);
p.setFillColor(0x7FE00808);
return true;
}
}
}
return false;
}
从我的列表中获取单击的多边形的正确方法是什么?
【问题讨论】:
标签: android google-maps google-maps-api-3 point-in-polygon