当前位置: 首页 > 知识库问答 >
问题:

使用osmbonuspack库在osmdroid地图上绘制路线

赫连泰宁
2023-03-14

我已经创建了osmdroid地图视图,在上面我可以显示自定义WMS,这很有效。接下来,我需要在地图上以GeoJSON格式从定制服务获得的两点之间绘制路线。GeoJSON如下所示:http://pastebin.com/GJWYNkAq

通过OkHttp客户端调用服务:

Request request = new Request.Builder()
                .url("http://xxx.xxx.xxx.x:7915/GeoService.svc/GetRoute?" + "source=" + encodedSourceAddress + "&target=" + encodedTargetAddress)
                .build();

        client.newCall(request).enqueue(new Callback() {
            @Override
            public void onFailure(Call call, IOException e) {
                e.printStackTrace();
            }

            @Override
            public void onResponse(Call call, Response response) throws IOException {
                if (!response.isSuccessful())
                    throw new IOException("Unexpected code " + response);

                String result = response.body().string();
                Log.d("RESULT", result);
                viewRoute(result); //json is received ok, I debugged it

            }

        });

我使用以下方法用于此Osmbonuspack库:

public void viewRoute(String geoJson) {
    KmlDocument kmlDocument = new KmlDocument();
    kmlDocument.parseGeoJSON(geoJson); //application is crashed here
    FolderOverlay myOverLay = (FolderOverlay) kmlDocument.mKmlRoot.buildOverlay(map, null, null, kmlDocument);
    map.getOverlays().add(myOverLay);
    map.invalidate();
}

当我运行应用程序,启动后崩溃与此错误:

03-09 13:01:51.521 3968-3992/bachelor.vsb.martin.osmdroidclientE/AndroidRuntime: FATAL EXCEPTION: OkHttp Dispatcher进程:bachelor.vsb.martin.osmdroidclient, PID: 3968java.lang.ClassCastExcture:com.google.gson.JsonNull无法强制com.google.gson.JsonObjectcom.google.gson.JsonObject.getAsJsonObject(JsonObject.java:191)在org.osmdroid.bonuspack.kml.KmlPlacemark。(KmlPlacemark.java:89)org.osmdroid.bonuspack.kml.KmlFeature.parseGeoJSON(KmlFeature.java:237)org.osmdroid.bonuspack.kml.KmlFolder。(KmlFolder.java:62)org.osmdroid.bonuspack.kml.KmlFeature.parseGeoJSON(KmlFeature.java:235)org.osmdroid.bonuspack.kml.KmlDocument.parseGeoJSON(KmlDocument. java: 1097)org. osmdroid. bonuspack. kml。KmlDocument. parseGeoJSON(KmlDocument. java: 1112),网址为Bachelor. vsb. martin. osmdroidclient。Main Activity. view Road(Main Activity. java: 137)在Bachelor. vsb. martin. osmdroidclient.Main Activity1美元。响应(Main Activity1. java: 127)在ok http p3。RealCall$AsyncCall.执行(RealCall. java: 135)at okhttp p3. interal.NamedRunnable. run(NamedRunnable. java: 32)在java. util. con电流。ThreadPoolExecutor. runWorker(ThreadPoolExecutor. java: 1133)在java. util. con当前。在java. lang上运行(ThreadPoolExecator. java: 607)。线程. run(线程. java: 761)

我使用的是osmdroid 5.6。4和osmbonuspack 6.2

共有1个答案

伍溪叠
2023-03-14

它看起来像是那个图书馆里的一个bug。主分支的当前实现是这样实现的:

89: JsonObject geometry = json.getAsJsonObject("geometry");
90: if (geometry != null) {

是的,getAsJsonObject可以为不存在的键返回null,但是如果已知给定的JSON路径值为null,Gson将JsonNull用作null值标记(这很有意义)。JSON中唯一包含null的路径是$。特征[6]。几何学,所以我假设这是唯一的原因。这里您可以做的是在他们的GitHub问题台上提出一个新问题,添加一个适当的JsonNull检查,以避免类型转换失败。模拟案例:

final JsonObject geometry = (JsonObject) geoJsonObject.getAsJsonObject()
        .get("features")
        .getAsJsonArray()
        .get(6)
        .getAsJsonObject()
        .get("geometry"); // actually JsonNull for $.features[6].geometry

到目前为止,您可以在这里做的是:

  • 或者从树中删除该路径(我没有分析该库是否可以处理空的/不完整的几何体JsonPath元素,因此可能仅仅替换该路径值是行不通的)

第一个选项的示例:

final JsonObject geoJsonObject = gson.fromJson(geoJson, JsonObject.class);
fixGeoJsonObject(geoJsonObject);
kmlDocument.parseGeoJSON(geoJsonObject); // passing the "fixed" object

其中fixGeoJsonObject如下所示:

private static void fixGeoJsonObject(final JsonObject geoJsonObject) {
    final JsonArray features = geoJsonObject
            .get("features")
            .getAsJsonArray();
    final int length = features.size();
    for ( int i = 0; i < length; i++ ) {
        final JsonObject feature = features.get(i)
                .getAsJsonObject();
        final JsonElement geometry = feature.get("geometry");
        if ( geometry.isJsonNull() ) {
            feature.remove("geometry"); // losing some data...
        }
    }
}

或者对于第二个选项:

private static void fixGeoJsonObject(final JsonObject geoJsonObject) {
    final JsonArray features = geoJsonObject
            .get("features")
            .getAsJsonArray();
    for ( int i = 0; i < features.size(); i++ ) {
        final JsonObject feature = features.get(i)
                .getAsJsonObject();
        final JsonElement geometry = feature.get("geometry");
        if ( geometry.isJsonNull() ) {
            features.remove(i); // losing even more data...
        }
    }
}

这应该可以修复您得到的ClassCastException,但我不知道它会如何影响您正在使用的库。

  • 错误报告:https://github.com/MKergall/osmbonuspack/issues/282
  • 错误修复:https://github.com/MKergall/osmbonuspack/commit/2cb85bca5f1625e9396504e2baa39decd2787d2a

 类似资料:
  • 我发现了osmbonuspack,但是wiki中的API信息和文档非常少。 http://code.google.com/p/osmbonuspack/ 我认为这个库对升级osmdroid很有意思,但我无法学会使用它。 已经被人利用了?

  • 对于android,我通过osmdroid和osmbonuspack使用mapsforge tiles。到目前为止,我使用了以下软件 OSMbonusPack Omsdroid mapsforge-map(依赖项)。 Salida软件解决方案,如http://www.salidasoftware.com/how-to-render-mapsforge-tiles-in-osmdroid所示 问题1

  • 我在我的项目中使用OsmDroid。我导入的项目使用: 现在我想使用osmbonuspack,但是我找不到这个库的编译名。如何导入osmbonuspack?用罐子?

  • 问题内容: 我可以解析kml文件以便在Android中显示路径或点吗?请你能帮我吗? 这是我想在Android Google Map中显示的kml示例代码: 当我将此文件加载到标准网络google map时,它会很好地显示它,但是当我尝试使用android google map进行相同的操作时,它不会这样做。它只是带我到某些地方,仅此而已。我当时正在考虑更改监听器类。当前看起来像这样: 请有人能告

  • 本文向大家介绍python在openstreetmap地图上绘制路线图的实现,包括了python在openstreetmap地图上绘制路线图的实现的使用技巧和注意事项,需要的朋友参考一下 利用python进行经纬度轨迹展示 嘿!各位好久不见,距离第一次发博客已经过去两年多了,本人也从本科生变成了研究生,好了书归正传,最近在做一个关于航班滑行路径轨迹的项目,目的是将航班的经纬度数据在地图上显现出来并

  • Tei正在尝试用OSM地图取代我应用程序中的谷歌地图。我一直试图通过学习他们如何使用JitPack安装和导入项目来使用这一点。工作很好。点击标记时,会显示默认信息气泡(一些浅灰色的)。如果我想修改标记气泡的背景,我应该怎么做?我没有在代码中使用任何类型的onClick方法 任何建议都将得到高度赞赏!