在LineLayer上收听点击事件

时间:2017-11-03 22:14:09

标签: android mapbox mapbox-android

使用以下代码将各种线条添加到地图中以表示路线:

private LineLayer makeLineLayer(List<GeoPoint> routePoints, String title) {

    String sourceTitle = "line-layer-" + lineCount;

    List<Position> points = new ArrayList<>(routePoints.size());
    List<Feature> routes = new ArrayList<>(routePoints.size());
    for (GeoPoint point : routePoints) {
            points.add(Position.fromCoordinates(point.getLongitude(), point.getLatitude()));
    }
    LineString route = LineString.fromCoordinates(points);

    Feature routeFeature = Feature.fromGeometry(route);
    routeFeature.addStringProperty("custom-line", "0");
    routes.add(routeFeature);

    GeoJsonSource linesSource = new GeoJsonSource(
                sourceTitle,
                FeatureCollection.fromFeatures(routes));
    mapboxMap.addSource(linesSource);

    LineLayer lineLayer = new LineLayer(title, sourceTitle);
    lineLayer.setProperties(
        //Sets properties...
    );

    return lineLayer;
}

LineLayer lineLayer = makeLineLayer(getRoutePoints());
mapboxMap.addLayer(lineLayer);

我希望能够确定何时单击其中一行。目前,MapBox调用OnMapClick并传入LatLng对象。然后,我可以使用以下内容查询具有custom-line属性的渲染要素:

PointF pixel = mapboxMap.getProjection().toScreenLocation(point);
List<Feature> selectedKeys = mapboxMap.queryRenderedFeatures(pixel, Filter.has("custom-line"));

如果selectedKeys包含任何返回的Feature个对象,我可以使用.getGeometry()查询其坐标。将这些值与传入的LatLng对象的值进行比较,可以确定单击哪一行的粗略估计。但是,当订单项紧密分组时,这是非常不准确和麻烦的。

如何监听这些订单项上的点击事件?

1 个答案:

答案 0 :(得分:0)

根据MapBox的Android SDK文档。

没有方法可以在父类LineLayer中点击Layer

如果您可以将LineLayer转换为Polyline,则可以使用内置方法点击Android。

请参阅此link以了解相关信息。

这是它的方法细节。 onPolylineClick void onPolylineClick(@NonNull Polyline polyline)

**

  

当用户点击折线时调用。

**

<强>参数:

polyline - 用户点击的折线。