如何判断标记是不是在多边形 googleMap v2 中

Posted

技术标签:

【中文标题】如何判断标记是不是在多边形 googleMap v2 中【英文标题】:How to tell if a Marker is in a Polygon googleMap v2如何判断标记是否在多边形 googleMap v2 中 【发布时间】:2015-10-03 09:46:02 【问题描述】:

我有一个带有Polygons 的谷歌地图,除了最后一部分检测Marker 是否已经在Polygon 中之外,我已经完成了所有工作。目前的情况是当我触摸一个Polygon 它将添加Marker“这是正确的”,但如果我在不同的位置触摸Polygon,它将删除Marker 并添加一个新的。我想要发生的是,如果Marker 已经在这些点内,请不要添加新点。我的代码低于任何帮助将不胜感激。

public void onMapClick(LatLng point) 


    for (int j = 0; j < arrPolygons.size(); j++) 

        if (isPointInPolygon(point, arrPolygons.get(j).getPoints())) 

        if (marker != null) 
                marker.remove();
                marker = null;
                Log.v("Marker", "Removing Marker");
            else
                marker = googleMap.addMarker(new MarkerOptions()
                        .position(point)
                        .title("test")
                        .icon(BitmapDescriptorFactory.defaultMarker(BitmapDescriptorFactory.HUE_RED)));
                Log.v("Marker", "ADDing Marker");
            
        
    

任何帮助将不胜感激。

【问题讨论】:

看这个问题,可以很方便的转换成使用google maps***.com/questions/217578/… 【参考方案1】:

最简单的方法是使用包含PolyUtil 类的Google Maps android API Utility Library。

首先通过将当前版本添加到您的 build.gradle 来导入库,当前为0.3.4 例如:

dependencies 
    compile fileTree(dir: 'libs', include: ['*.jar'])
    compile 'com.android.support:appcompat-v7:22.1.1'
    compile 'com.google.android.gms:play-services-maps:7.3.0'
    compile 'com.google.maps.android:android-maps-utils:0.3.4'

对于这个简单的示例,我们假设 Map Activity 类定义和成员变量如下所示,并且在 polygonList 中只定义了一个 Polygon:

import com.google.maps.android.PolyUtil;
//other imports.....

public class MapsActivity extends AppCompatActivity implements OnMapReadyCallback 

    private GoogleMap mMap;
    private Marker marker;
    List<LatLng> polygonList = new ArrayList<LatLng>();
    //.............

然后您将像这样设置您的GoogleMap.OnMapClickListener,以便只在多边形内添加一个标记。:

  mMap.setOnMapClickListener(new GoogleMap.OnMapClickListener() 

        @Override
        public void onMapClick(LatLng point) 

            if (PolyUtil.containsLocation(point, polygonList, false)) 

                if (marker == null) 
                    //only add Marker if there is not one already inside the Polygon
                    marker = mMap.addMarker(new MarkerOptions()
                            .position(point)
                            .title("test")
                            .icon(BitmapDescriptorFactory.defaultMarker(BitmapDescriptorFactory.HUE_RED)));
                    Log.v("Marker", "ADDing Marker");

                

            
        
    );

多多边形、多标记解决方案:

为了使其与多个多边形一起工作,您可以使用 POJO 来存储多边形/标记对:

public class PolyMarkerObject
    Polygon polygon;
    Marker marker;

然后定义一个新的成员变量polyMarkerList

public class MapsActivity extends AppCompatActivity implements OnMapReadyCallback 

    private GoogleMap mMap;
    List<PolyMarkerObject> polyMarkerList = new ArrayList<>();
    //.............

绘制时将每个多边形添加到列表中:

    List<LatLng> newPolygon = new ArrayList<>();
    //set up the points in the Polygon.......

    Polygon p = mMap.addPolygon(new PolygonOptions()
            .addAll(newPolygon)
            .strokeColor(Color.RED)
            .fillColor(Color.BLUE));

    PolyMarkerObject newPolyMarkerObj = new PolyMarkerObject();
    newPolyMarkerObj.polygon = p;
    polyMarkerList.add(newPolyMarkerObj);

然后在每个地图点击列表中循环查看当前多边形是否已经有一个标记。如果它还没有 Marker,则删除任何已放置在不同 Polygon 中的 Marker,并在当前 Polygon 中创建一个:

 mMap.setOnMapClickListener(new GoogleMap.OnMapClickListener() 

        @Override
        public void onMapClick(LatLng point) 

            for (PolyMarkerObject pmObj : polyMarkerList) 
                //only add Marker if there is not one already inside the Polygon
                if (PolyUtil.containsLocation(point, pmObj.polygon.getPoints(), false)) 
                    if (pmObj.marker == null) 

                        //Add Marker to current Polygon
                        Marker newMarker = mMap.addMarker(new MarkerOptions()
                                .position(point)
                                .title("test")
                                .icon(BitmapDescriptorFactory.defaultMarker(BitmapDescriptorFactory.HUE_RED)));

                        pmObj.marker = newMarker;
                        Log.v("Marker", "ADDing Marker");
                        break;
                    

                
            
        
    );

多个多边形,一个标记解决方案:

在这种情况下,您只需要一个标记引用和一个多边形列表:

public class MapsActivity extends AppCompatActivity implements OnMapReadyCallback 

    private GoogleMap mMap;
    Marker marker;
    List<Polygon> polyList = new ArrayList<>();
    //................

在将多边形添加到地图时将其添加到列表中:

    List<LatLng> newPolygon = new ArrayList<>();
    //set up the points in the Polygon.......

    Polygon p = mMap.addPolygon(new PolygonOptions()
            .addAll(newPolygon)
            .strokeColor(Color.RED)
            .fillColor(Color.BLUE));

    polyList.add(p);

然后,在地图点击侦听器中,您有两种情况,一种是标记引用为空(尚未添加标记),另一种是标记位于不同的多边形中。如果 Marker 已经在当前 Polygon 中,则不会移动。

 mMap.setOnMapClickListener(new GoogleMap.OnMapClickListener() 

        @Override
        public void onMapClick(LatLng point) 

            for (Polygon pObj : polyList) 
                //find Polygon user tapped inside of
                if (PolyUtil.containsLocation(point, pObj.getPoints(), false)) 
                    //first case, no Marker
                    if (marker == null) 

                        //Add Marker to current Polygon
                        marker = mMap.addMarker(new MarkerOptions()
                                .position(point)
                                .title("test")
                                .icon(BitmapDescriptorFactory.defaultMarker(BitmapDescriptorFactory.HUE_RED)));

                        Log.v("Marker", "ADDing first Marker");
                        break;
                    
                    else if (!PolyUtil.containsLocation(marker.getPosition(), pObj.getPoints(), false)) 
                        //Marker exists already in a different Polygon
                        //remove Marker from previous Polygon
                        marker.remove();
                        //Add Marker to current Polygon
                        marker = mMap.addMarker(new MarkerOptions()
                                .position(point)
                                .title("test")
                                .icon(BitmapDescriptorFactory.defaultMarker(BitmapDescriptorFactory.HUE_RED)));

                        Log.v("Marker", "Moving Marker to new Polygon");
                        break;
                    

                
            
        
    );

【讨论】:

适用于一个多边形,但如果我有多个呢? polygonList 在哪里定义? 谢谢你!还有一件事。我有删除前一个标记的代码。我是否需要将其包装在 if 语句中以查看不为空的标记? 是的,当我点击一个新多边形时,它应该会从前一个多边形中删除标记。 @Dwill 好的,我明白了。然后,您将需要一个内部循环,以删除以前的标记。我刚刚更新了答案!

以上是关于如何判断标记是不是在多边形 googleMap v2 中的主要内容,如果未能解决你的问题,请参考以下文章

判断点是否在任意多边形内

知道标记是否包含在离子中的多边形内

求...判断一个点是不是在(不规则)四边形当中

如何在 GoogleMaps for iOS 中使用自定义标记进行标记聚类?

谷歌地图 - FusionTablesLayer 到多边形

如何判断一个指定的经纬度点是不是落在一个多边形区域内