我已经创建了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
它看起来像是那个图书馆里的一个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方法 任何建议都将得到高度赞赏!