使用Osmdriod在地图上显示Android设备内存中的KML文件

使用Osmdriod在地图上显示Android设备内存中的KML文件,android,kml,osmdroid,Android,Kml,Osmdroid,我看到了Osmdroid教程,我可以用它来显示地图上网址的KML文件。但是现在我想在地图上的Android设备中显示一个KML文件。我尝试了几种方法。我使用了不同的方法,比如parseKMLFile。但我没有回答。也许可以指导我写正确的代码。我使用的示例代码如下所示。 谢谢 ------------从设备显示文件的示例代码1 导入android.app.ProgressDialog; 导入android.content.Context; 导入android.os.AsyncTask; 导入and

我看到了Osmdroid教程,我可以用它来显示地图上网址的KML文件。但是现在我想在地图上的Android设备中显示一个KML文件。我尝试了几种方法。我使用了不同的方法,比如parseKMLFile。但我没有回答。也许可以指导我写正确的代码。我使用的示例代码如下所示。 谢谢

------------从设备显示文件的示例代码1
导入android.app.ProgressDialog;
导入android.content.Context;
导入android.os.AsyncTask;
导入android.os.Bundle;
导入android.support.v7.app.AppActivity;
导入org.osmdroid.api.IMapController;
导入org.osmdroid.bonuspack.kml.KmlDocument;
导入org.osmdroid.tileprovider.tilesource.TileSourceFactory;
导入org.osmdroid.util.BoundingBox;
导入org.osmdroid.util.GeoPoint;
导入org.osmdroid.views.MapView;
导入org.osmdroid.views.overlay.FolderOverlay;
导入java.io.File;
公共类KMLfile扩展了AppCompative活动{
私有地图视图;
专用IMapController映射控制器;
私人语境;
@凌驾
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.kml_文件);
上下文=这个;
mapView=(mapView)findViewById(R.id.map\u kml\u文件);
setTileSource(TileSourceFactory.MAPNIK);
mapView.SetBuilTinZoomControl(真);
mapController=mapView.getController();
mapController.setZoom(15);
地质点2=新的地质点(51496994,-134733);
mapController.setCenter(点2);
//装载机
File=new文件(this.getActivity().getFilesDir(),“earth.kml”);
KmlDocument kmlFile=新的KmlDocument();
parseKMLFile(文件文件);
FolderOverlay kmlOverlay=(FolderOverlay)kmlFile.mKmlRoot.buildOverlay(mapView,null,null,kmlFile);
mapView.getOverlays().addAll(kmlOverlay.getItems());
}
}
------------来自web的show的示例代码2
导入android.app.Activity;
导入android.os.Bundle;
导入android.os.StrictMode;
导入android.view.view;
导入org.osmdroid.api.IMapController;
导入org.osmdroid.bonuspack.kml.KmlDocument;
导入org.osmdroid.config.Configuration;
导入org.osmdroid.events.MapEventsReceiver;
导入org.osmdroid.util.BoundingBox;
导入org.osmdroid.util.GeoPoint;
导入org.osmdroid.views.MapView;
导入org.osmdroid.views.overlay.FolderOverlay;
/**
*这是OSMBonusPack教程的实现。
*根据教程中的进度,可以对代码部分进行注释/取消注释。
*
*@作者M.Kergall
*@见
*/
公共类3扩展活动实现MapEventsReceiver、MapView.OnFirstLayoutListener{
地图视图;
KmlDocument mKmlDocument;
@在创建时覆盖受保护的void(Bundle savedInstanceState){
//禁用StrictMode.ThreadPolicy以在UI线程中执行网络调用。
//是的,这不是一个好的实践,但这只是一个教程!
StrictMode.ThreadPolicy policy=新建StrictMode.ThreadPolicy.Builder().permitAll().build();
StrictMode.setThreadPolicy(策略);
//导言
super.onCreate(savedInstanceState);
Configuration.getInstance().setUserAgentValue(“OBP_Tuto/1.0”);
setContentView(右布局6);
map=(MapView)findViewById(R.id.map\u simple\u show\u routing);
map.setMultiTouchControls(真);
地质点起始点=新的地质点(48.13,-1.63);
IMapController mapController=map.getController();
mapController.setZoom(10.0);
mapController.setCenter(startPoint);
KmlDocument KmlDocument=新KmlDocument();
kmlDocument.parseKMLUrl(“http://mapsengine.google.com/map/kml?forcekml=1&mid=z6IJfj90QEd4.kUUY9FoHFRdE");
FolderOverlay KmlLovelRay=(FolderOverlay)kmlDocument.mKmlRoot.buildOverlay(映射、null、null、kmlDocument);
map.getOverlays().add(kmlOverlay);
BoundingBox bb=kmlDocument.mKmlRoot.getBoundingBox();
map.zoomToBoundingBox(bb,true);
map.invalidate();
}
@凌驾
公共布尔singleTapConfirmedHelper(地质点p){
返回false;
}
@凌驾
公共布尔值longPressHelper(地理点p){
返回false;
}
@凌驾
公共void onFirstLayout(视图v、int-left、int-top、int-right、int-bottom){
}
}

假设您提供与
APK
捆绑的
KML
文件,您可以尝试将文件存储在
src/main/assets
目录中

然后尝试此代码读取
KML
,运行时
getAssets()
方法将解析到
assets
目录的正确路径

try (InputStream fileStream = getAssets().open("earth.kml")) {
    KmlDocument kmlDocument = new KmlDocument();
    boolean isOk = kmlDocument.parseKMLStream(fileStream, null);

    if (!isOk) {
        Log.e(TAG, "onCreate: parsing Failed, is this a valid KML?");
    } else {
        FolderOverlay kmlOverlay = (FolderOverlay) kmlDocument.mKmlRoot.buildOverlay(mapView, null, null, kmlDocument);
        overlays.add(kmlOverlay);
        BoundingBox bb = kmlDocument.mKmlRoot.getBoundingBox();
        mapView.zoomToBoundingBox(bb, true);
        mapView.invalidate();
    }

} catch (IOException e) {
    Log.e(TAG, "onCreate: Error reading KMZ file", e);
}

希望能有所帮助,但如果不是这样的话,也许您的日志和更多关于如何提供(和/或存储)文件的说明可以让我们更好地了解可能存在的问题。

您好。谢谢你的留言。但是这个代码不起作用。也许给我更多的指导?抱歉耽搁了,这个代码实际上是一个个人项目的一部分,它可以工作,唯一不同的是文件名,你能提供更多关于你有错误或部分不工作的信息吗?对我来说很好
try (InputStream fileStream = getAssets().open("earth.kml")) {
    KmlDocument kmlDocument = new KmlDocument();
    boolean isOk = kmlDocument.parseKMLStream(fileStream, null);

    if (!isOk) {
        Log.e(TAG, "onCreate: parsing Failed, is this a valid KML?");
    } else {
        FolderOverlay kmlOverlay = (FolderOverlay) kmlDocument.mKmlRoot.buildOverlay(mapView, null, null, kmlDocument);
        overlays.add(kmlOverlay);
        BoundingBox bb = kmlDocument.mKmlRoot.getBoundingBox();
        mapView.zoomToBoundingBox(bb, true);
        mapView.invalidate();
    }

} catch (IOException e) {
    Log.e(TAG, "onCreate: Error reading KMZ file", e);
}