【问题标题】:How to detect a click on a polyline如何检测多段线上的点击
【发布时间】:2014-10-01 14:26:31
【问题描述】:

如果googlemap上有一条折线并且在地图上执行了点击,那么我如何检查该点击是在折线上还是在其他地方?

Polyline line = googleMap.addPolyline(new PolylineOptions()
       .add(new LatLng(51.2, 0.1), new LatLng(51.7, 0.3))
       .width(5)
       .color(Color.RED));

googleMap.setOnMapLongClickListener(new OnMapLongClickListener() {          

    }
});

【问题讨论】:

  • 你能发一些代码吗?
  • @Haresh 我正在尝试通过 mapclicklistener 检查折线点击,因为我在文档中没有发现折线点击的特定方法

标签: android google-maps polyline


【解决方案1】:

最新的 Google Maps API 现在包括折线点击监听器。您需要使用 8.4+。在 gradle 文件中:

compile 'com.google.android.gms:play-services-maps:8.4.0

设置地图折线监听器:

googleMap.setOnPolylineClickListener(new GoogleMap.OnPolylineClickListener() 
{
    @Override
    public void onPolylineClick(Polyline polyline)
    {
        //do something with polyline
    }
});

多段线需要可点击才能使侦听器工作。

PolylineOptions line = new PolylineOptions();
//add path points, set colour, etc. here
Polyline polyline = googleMap.addPolyline(line);
polyline.setClickable(true);

【讨论】:

  • 这是最好的解决方案+1。我错过了 setClickable。
  • @SK,在多条路线的情况下,如果用户单击特定的折线,我想更改路线(折线)的红色并将其也显示在顶部(例如 z -Index)和其他路线(折线)在点击的折线旁边是灰色的。
  • 因此,使用此解决方案,有时点击有效,但有时它会询问我是否要在 Google 地图中打开该点。有什么建议吗?
【解决方案2】:

上述解决方案无法正常工作。特别是如果我们在多段线的两点之间有很大的距离。

我回答了这个问题: Clickable Polylines Google Maps API Android

我们可以像这样修改上面的代码:

mMap.setOnMapClickListener(new GoogleMap.OnMapClickListener() {
@Override
public void onMapClick(LatLng clickCoords) {
        for (PolylineOptions polyline : mPolylines) {
            if (PolyUtil.isLocationOnPath(clickCoords, polyline.getPoints(), true, 100)) {
                // user clicked on polyline
            }
        }
    }
});

【讨论】:

    【解决方案3】:

    不幸的是,没有折线点击监听器这样的东西,因此您必须在地图上监听点击并检查是否在您的任何折线上注册了点击。您还必须保存对添加到地图的折线的引用。

    这是一个计算距离点击约 100 米处是否存在折线的示例。

    mMap.setOnMapClickListener(new GoogleMap.OnMapClickListener() {
        @Override
        public void onMapClick(LatLng clickCoords) {
            for (PolylineOptions polyline : mPolylines) {
                for (LatLng polyCoords : polyline.getPoints()) {
                    float[] results = new float[1];
                    Location.distanceBetween(clickCoords.latitude, clickCoords.longitude,
                            polyCoords.latitude, polyCoords.longitude, results);
    
                    if (results[0] < 100) {
                        // If distance is less than 100 meters, this is your polyline
                        Log.e(TAG, "Found @ "+clickCoords.latitude+" "+clickCoords.longitude);
                    }
                }
            }
        }
    });
    

    找到折线后,您可以将该距离保存为float minDistance;,然后遍历其他折线以检查是否有更近的折线。

    为了更精确,您可以在每次触摸时获得缩放级别并乘以所需的距离。比如100 * (22 - mMap.getCameraPosition().zoom)(你需要在较低的缩放级别下使用更大的距离)。

    祝你好运!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-11-24
      • 2018-02-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多