使用Android中的Google Maps API检查点是否在多边形中

菲洛·琼基

我正在使用Android上的Google Maps API来创建拼图。此链接包含我用来绘制非洲国家的数据:世界国家坐标

当用户单击地图时,将进行测试以检查其是否在正确的国家中。

  • 在正确的国家内指向:正确的国家用绿色上色

  • 指向另一个已知国家/地区的内部:当前国家/地区以红色显示

下面的代码对非洲国家/地区列表(一个国家可能包含多个多边形)进行迭代,以查找包含点击点的国家/地区并将其与正确的国家/地区进行比较。

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()仅适用于地图上的一个多边形,因为它基于几何形状(光线相交)。就我而言,它不起作用。例如,当我在乍得内部单击时(此图中的蓝色斑点),埃及正在用红色着色(我的列表按字母顺序排序,因此埃及是单击点右侧的第一个验证射线相交的对象)健康)状况)。

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;
}

什么是从我的列表中单击单击的多边形的正确方法?

安东尼奥

您可以使用PolyUtil.containsLocation从方法谷歌地图API的Android实用工具库文档中

公共静态boolean containsLocation(LatLng点,java.util.List多边形,布尔测地线)

计算给定点是否位于指定的多边形内。无论最后一个点是否等于第一个点,多边形始终被视为封闭的。内部定义为不包含南极-南极始终位于外部。如果测地线为真,则多边形由大的圆弧段组成,否则由菱形(loxodromic)线段组成。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

mongodb检查点是否在多边形中

如何检查点是否在 MySQL 表中的多边形内?

检查点是否在python中的多边形内的最快方法是什么

角形小叶指令::检查点是否在多边形中

检查点是否在OpenLayers 3中的多边形内

检查点是否在多边形中并给出空值

使用google_maps_flutter检查坐标是否在抖动中的多边形内

检查点是否与aws athena中的多边形相交

如何使用Google Maps API V3显示多边形和多边形

react-google-maps 中带孔的多边形

Google MAPS API中的多个多边形和多个标记

如何在Google Maps API中触发开始多边形绘图?

在Google Maps API中获取以米为单位的多边形长度

如何在Google Static Maps API中创建一个带孔的多边形?

如何在Google Maps API中从多边形中排除区域

Google Maps API多边形中的fillColor不起作用

Google Maps Api将多边形更改为圆形

在多边形中添加点会在Google Maps Android中产生星形

在多边形中绘制多个孔-诺基亚Maps API v2

OSM到Google Maps多边形

如何使用“ React-google-maps”中的DrawingManager重绘多边形

如何使用react-google-maps在React.JS中获取多边形的坐标

从PHP检查Google Map Point是否在多边形中

Google Maps JS API v3 - 如何检查和显示多边形点之间的距离

检查多边形是否为Shapely中的多边形

检查点是否在矩形中

检查点是否在圆形扇区中

如何在Google Maps API中使用多边形字符串

使用Google Maps API v3相交多边形和折线