Android:如何加载 KML

Posted

技术标签:

【中文标题】Android:如何加载 KML【英文标题】:Android: how to load KML 【发布时间】:2011-04-28 07:49:18 【问题描述】:

有人可以告诉我是否有办法将 kml 文件加载到 android 中的谷歌地图中。

谢谢

【问题讨论】:

【参考方案1】:

请在此处找到从 google 获取 kml 数据并将其绘制到地图上的代码示例:

How to draw a path on a map using kml file?

【讨论】:

@Mathias...非常感谢!但如果我可以问你。有没有办法从手机sd卡访问kml。我使用的 kml 永远不会改变。所以每次打开应用程序时从服务器接收它是没有意义的。再次感谢 当然,你可以把它放在一个文本文件中,然后通过常规的 java.io.file 方法读取它 所以你的意思是说..我需要将kml内容复制到一个文本文件中并使用io方法解析它..(字符串标记器和类似的东西)?难道不能把kml存到手机里,用sax解析器来解析吗? 嗯,不知道你的意思。读取文件与解析文件没有直接关系。当然,您可以使用 sax 解析器,但是您需要从某个地方获取要解析的内容,以便将其传递给 sax 解析器。或者,如果您的 sax 解析器只允许将文件名作为参数传递,那么您当然不需要自己手动加载它。我认为任何输入源都可以工作,例如 xr.parse(new InputSource(aUrl.openStream())); 我将 kml 文件存储到手机中,使用 SAx 解析器对其进行解析,然后将其覆盖在谷歌地图上.. 结果很好..但由于 LineStrings 的数量很大,手机由于内存不足而崩溃..有没有办法将谷歌地图+覆盖的kml文件(作为一个对象)检索到手机?这样..手机不必做所有的计算......【参考方案2】:

几个月前,我一直在寻找类似的功能,但找不到从 SDCard 加载文件的方法 - 甚至无法使用内容提供程序。 从那以后我就没看过了。

但是我发现了一种方法,由于我已经在与网络服务器通信,因此证明它很有用

getting maps to accept a dynamically generated KML file?

这允许我将 KML 从我的应用程序发送到服务器(通信已经到位),服务器存储 KML,分配一个随机字符串,并将其返回给应用程序,然后应用程序将链接传递给服务器风格:

final Intent myIntent = new Intent(android.content.Intent.ACTION_VIEW,
Uri.parse("geo:0,0?q=http://website.com/kml_gen.php?id=1kj312"));
startActivity(myIntent);

服务器返回一个 KML 列表供地图应用使用。

下面是cmets之后的更新:

final Intent myIntent = new Intent(android.content.Intent.ACTION_VIEW,
Uri.parse("geo:0,0?q=http://code.google.com/apis/kml/documentation/KML_Samples.kml"));
startActivity(myIntent);

尝试运行上面的代码 - 当你运行它时,你会看到谷歌地图应用程序被打开,它会请求 kml 文件,在这种情况下是来自谷歌的示例文件。这是一个带有叠加层的地图,但它现在是 google 地图应用程序,不再在您的应用程序中运行。

对于此解决方案,您需要将 KML 文件存储在某处的网络服务器上 - 这有一个小问题,因为用户需要数据连接(地图无论如何都需要数据连接 - 但如果 kml 文件很大并且连接速度慢,可能会有延迟)。

你提到你有一个服务器产生一些动态数据和一些静态数据。如果每个人的静态内容都相同,并且每次服务器生成一些数据时,我都会想让 Web 服务器生成一个格式良好的 KML 文档,包括两组数据 - 据我所知,谷歌地图应用程序只会从网络服务器加载一个 KML 文件。

我使用过的另一种解决方案已在上面发布 - 如果您在手机上有静态数据(我会使用带有数据的数据库),创建一个覆盖项目,并请求来自服务器的动态结果,将它们添加到自定义叠加层。此选项意味着您必须编写任何您想要的额外功能 - 即在地图上搜索位置、卫星视图..... 确保在单独的线程而不是 UI 线程中执行操作,特别是在构建大型叠加层时,否则您可能会收到强制关闭/等待对话框。

【讨论】:

@Scobler ...谢谢你。那么如何在谷歌地图上覆盖这个 kml 文件呢? @raqz 你到底是什么意思?您是否有要在地图上叠加的 kml 文件 - 或者您是否有一组坐标并且您正在寻找一种在地图上显示它们的方法,即您正在动态创建一个 kml 文件? @Scobler... 我有一个数据不变的 kml 文件。我需要在地图上的 kml 中绘制这些几何图形,即;覆盖在谷歌地图上。另外,我还有另一个在服务器上动态生成的 kml 文件,我必须在手机上显示相同的文件。所以结构将是,首先是谷歌地图,下一个常量 kml 文件,然后最后在这两个之上..它是动态生成的 kml。有没有办法做。非常感谢您的帮助...谢谢 @raqz 我想说有几种方法可以实现 - 如果您想使用地图应用程序为您完成工作。似乎您有一个决定 - 您说动态文件是在您的服务器上制作的。您可以将静态文件从手机传输到服务器,让您的服务器包含其数据并将其放在一个动态文件中并为您提供链接,这意味着手机上的处理最少(简单)。或者,您可以使用地图活动,使用 KML 中的所有点和额外的动态数据创建自己的叠加层。第一个很简单,但依赖于数据信号。 @Scobler..谢谢你的想法......但你能否详细说明我怎样才能实现让地图应用程序为我工作的现象。我有包含所有信息的 kml 文件。我如何让地图应用程序将谷歌地图和 kml 作为一个覆盖作为一个整体组件进行检索。就像你说的,我在手机上处理了整个 kml,但是手机因为内存不足而崩溃......请帮助......【参考方案3】:

我在地图上使用了 GPX 文件(Android 1.5),但没有任何东西可以加载 KML 或 GPX。如果没有在较新版本的 Android 中添加,我想您必须自己阅读该文件。这就是我 10 个月前所做的...

【讨论】:

以上是关于Android:如何加载 KML的主要内容,如果未能解决你的问题,请参考以下文章

如何在android 动态加载插件small

Android:如何在活动上方显示透明加载层

android 开发webview如何加载p标签的html

如何在Android中处理加载图像[重复]

如何在 Android 中使位图加载更快?

Android webview如何检测何时重新加载