osmdroid, Maps API v2, and fragments



好的。你可能认为这会相对简单,但没有。

我在我的网站上使用开放街道地图,因为数据可以免费使用、编辑和更新-我的项目遵循这一咒语,除了谷歌API使用限制/保存数据限制外,谷歌地图根本不适合我……至少在网络上是这样。

考虑到这一点,我想我会效仿我的android应用程序,所以我利用开放的街道地图数据设置了osmdroid。

我的活动中可以有一张漂亮的地图。。我还学习了一个教程,它似乎至少可以让我在tabhost/viewpager中的片段中拥有一个地图视图。然而,我真正想要的(对于平板电脑)是左边的一个片段中的机构列表,右边的一个地图片段显示这些机构的位置。

我本以为这很简单,但数小时的研究表明,除非你使用一些复杂的代码和一些不推荐的方法,否则这是不可能的。。

所以。。片段(包含地图视图)在tabhost中完美地加载和运行。。我可以从我的活动等访问片段中的方法。但没有什么可以简单地将两个片段并排。

现在。。我知道谷歌刚刚推出了他们的API v2。我安装了它并玩了一场。。我真的不知道osmdroid是如何工作的,我想我可以更新,所以我有MapFragment而不是SherlockFragment(我使用ABS)。。这只是抛出了要求API密钥等的logcat错误。考虑到我不想使用谷歌地图数据,我认为我错了。

所以。。有人能建议我如何使用市场上可用的任何东西来获得列表片段和地图片段,但最好使用开源地图数据,这样它们就没有使用限制了。

我相信,大量用户会非常感谢对"可用内容及其工作方式"的全面概述。。所以,如果有人能提出建议,那就太棒了!

在新的Google Maps API发布之前,我被迫使用OSMDroid。然而,在不得不多次挖掘来源以找出它为什么会这样做(通常是错误的)之后,我渴望有一个新的图书馆。

幸运的是,新的谷歌地图API符合要求。您可以在应用程序中使用Google Maps API v2,而不必使用Google的基本地图,但不幸的是,您必须首先获得API密钥。

我假设你想使用OpenStreetMap作为在线地图源,所以下面的代码将针对这一点进行定制。

GoogleMap map = <get-map-instance>;
map.setMapType(GoogleMap.MAP_TYPE_NONE);
TileOverlayOptions options = new TileOverlayOptions();
options.tileProvider(new UrlTileProvider(256, 256) {
@Override
public URL getTileUrl(int x, int y, int z) {
try {
String f = "http://tile.openstreetmap.org/%d/%d/%d.png";
return new URL(String.format(f, z, x, y));
}
catch (MalformedURLException e) {
return null;
}
}
});
map.addTileOverlay(options);

您可以在我的Google Maps API v2插件库中找到此代码的更正式的版本。

此外,如果您的目标是Fragment之前的Android版本,我相信您是基于使用ABS而不是使用MapFragment,请确保使用SupportMapFragment。

Google Maps Android API v2提供的示例代码包含com.example.mapdemo.TileOverlayDemoActivity类。该类的小更新将显示新v2框架中的OpenStreetMap瓦片。凉的不再需要使用奥斯姆德罗德或夏洛克碎片。然而瓦片未缓存:(

无论如何,TileOverlayDemoActivity类的所有添加/更新如下所示:

private static final String OPEN_STREET_MAP_URL_FORMAT =
"http://tile.openstreetmap.org/%d/%d/%d.png";
private void setUpMap() {
mMap.setMapType(GoogleMap.MAP_TYPE_NONE);
mMap.setMyLocationEnabled(true);
TileProvider tileProvider = new UrlTileProvider(256, 256) {
@Override
public synchronized URL getTileUrl(int x, int y, int zoom) {
String s = String.format(Locale.US, OPEN_STREET_MAP_URL_FORMAT, zoom, x, y);
URL url = null;
try {
url = new URL(s);
} catch (MalformedURLException e) {
throw new AssertionError(e);
}
return url;
}
};
mMap.addTileOverlay(new TileOverlayOptions().tileProvider(tileProvider));
}

最新更新