【问题标题】:Map: check wether a point is on polyline or not地图:检查一个点是否在折线上
【发布时间】:2018-03-27 11:44:14
【问题描述】:

问题:我们在地图上有多条折线,当用户点击折线时需要检查该点是否在折线上,并且还需要提取点击点的纬度。

已知:

可以通过在地图上设置点击侦听器来提取 LatLong 并检测折线点击,我们可以使用折线点击侦听器,但需要一个结合两者的解决方案。也就是说,每当用户点击折线时,我们都可以为该点提取合理正确的经纬度。(不适用于点击/点击不在折线上的地图)

【问题讨论】:

  • 似乎是一个合理的请求——理想情况下,它是回调的一个参数——因为这似乎不可用(我想知道你有没有两个回调(地图/折线)?)然后我会说通过使用 android 地图实用程序 PolyUtil.isLocationOnPath 在您的 mapclick 侦听器中实现折线侦听器,为其提供多条折线的联合(或者如果您需要知道哪条折线,则保持它们唯一)。这样做的一个好处是您也可以自定义折线触摸的容差。

标签: java android google-maps


【解决方案1】:

首先,你需要创建一个结构来存储创建的折线:

List<Polyline> polylines = new ArrayList<Polyline>();

并将您创建的每条折线添加到List

polylines.add(mMap.addPolyline(yourPolylineOptions));

然后您可以使用Google Maps Android API Utility Library 中的PolyUtil.isLocationOnPath 方法来了解是否已单击折线(在此示例中使用 100 米的容差。这意味着如果用户在 100 米外单击,则认为折线已被单击从折线或更少):

mMap.setOnMapClickListener(new GoogleMap.OnMapClickListener() {
    @Override
        public void onMapClick(LatLng click) {
            boolean isPolylineClicked = false;
            for (Polyline polyline : polylines) {
                if (PolyUtil.isLocationOnPath(click, polyline.getPoints(), false, 100)) {
                    isPolylineClicked = true;
                    // Polyline clicked!
                }
            }

            if (!isPolylineClicked) {
                // Other OnMapClickListener behavior
            }
        }
    }
});

【讨论】:

  • 感谢您的解决方案,它有效,但问题是点击折线会阻碍地图点击事件的任何解决方案
  • 如果没有点击折线,您可以添加自定义GoogleMap.OnMapClickListener。看看我更新的答案
猜你喜欢
  • 2011-04-18
  • 1970-01-01
  • 1970-01-01
  • 2014-01-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-08-26
相关资源
最近更新 更多