Mapbox 10.1.0 Android Java实现GeoJSON路径绘制遇DSL参数问题
Mapbox 10.1.0 Java环境绘制GeoJSON路径解决方案
核心问题说明
你遇到的Kotlin DSL适配问题本质是Kotlin的「带接收者的lambda」语法在Java中没有直接对应写法,且官方提供的DSL属于Kotlin扩展方法,无需强制在Java中适配,直接使用Mapbox 10+原生提供的Java友好API即可完成路径绘制。
具体实现代码
你可以直接修改现有MainActivity.java的逻辑,无需反编译Kotlin代码,完整实现如下:
首先声明全局常量:
// 数据源、图层唯一标识,可自定义 private static final String GEOJSON_SOURCE_ID = "route_source"; private static final String ROUTE_LINE_LAYER_ID = "route_line_layer";
修改onCreate中的地图加载逻辑:
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); MapView mapView = findViewById(R.id.mapView); if(mapView != null){ // 加载底图,使用带加载完成回调的重载方法 mapView.getMapboxMap().loadStyleUri(Style.MAPBOX_STREETS, style -> { // 1. 替换为你自己的采样坐标数组 List<Point> routePoints = new ArrayList<>(); // 示例坐标,实际替换为你的采样点 routePoints.add(Point.fromLngLat(116.397228, 39.907557)); routePoints.add(Point.fromLngLat(116.401812, 39.914558)); routePoints.add(Point.fromLngLat(116.408819, 39.917258)); // 2. 构造GeoJSON路径数据源 LineString routeLine = LineString.fromLngLats(routePoints); GeoJsonSource routeSource = new GeoJsonSource(GEOJSON_SOURCE_ID, FeatureCollection.fromFeature(Feature.fromGeometry(routeLine))); style.addSource(routeSource); // 3. 构造线图层并设置样式 LineLayer routeLayer = new LineLayer(ROUTE_LINE_LAYER_ID, GEOJSON_SOURCE_ID); routeLayer.setProperties( lineCap(LineCap.ROUND), lineJoin(LineJoin.ROUND), lineOpacity(0.7f), lineWidth(8f), lineColor(Color.parseColor("#888888")) ); // 图层添加到样式中 style.addLayer(routeLayer); }); } }
注意事项
- 如果
lineCap、lineWidth等方法报错,可替换为全类名调用:com.mapbox.maps.extension.style.layers.properties.generated.PropertyFactory.lineCap(LineCap.ROUND) - 若需要动态更新路径,只需通过
style.getSourceAs(GEOJSON_SOURCE_ID)拿到数据源,调用setGeoJson()方法传入新的路径数据即可,无需重复创建图层 - 所有涉及的几何类都来自
com.mapbox.geojson包,不要导入其他包下的同名类
内容的提问来源于stack exchange,提问作者Nothing
相关产品推荐
相关产品推荐

