osmdroid、地图API v2和碎片化技术

6

好的。你可能认为这很简单,但事实并非如此。

我在我的网站上使用Open Street Maps,因为数据是免费使用、编辑和更新的 - 我的项目遵循这个信条,并且由于谷歌API的使用限制/数据保存限制,谷歌地图在Web上并不适合我。

基于此,我认为我应该跟随我的Android应用程序,并设置osmdroid来利用Open Street Maps数据。

我可以在我的活动中拥有一个漂亮的地图..我还按照教程进行了操作,并且至少它似乎有效,例如我可以在tabhost/viewpager中的片段中拥有一个地图视图。然而,对于平板电脑,我真正想要的是一个左侧包含机构列表的片段,以及右侧显示这些机构位置的地图片段。

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

因此..片段(包含地图视图)在tabhost中加载和运行得非常完美..我可以从我的活动中访问片段内的方法等..但是没有办法简单地将两个片段并排放置。

现在..我知道谷歌刚刚推出了他们的API v2..我安装并尝试运行它..由于不知道osmdroid如何工作,我认为我可以更新,因此我有了MapFragment而不是SherlockFragment(我使用ABS)。。然后就会出现logcat错误,要求API密钥等..考虑到我不想使用谷歌地图数据,我认为我做错了。

那么..是否有人能够建议我如何在市场上获得一个列表片段和一个地图片段,使它们并排放置,但最好利用开源地图数据,这样就没有使用限制了。

我相信,“可用性及其运作方式的总体概述”将受到许多用户的极大欢迎..因此,如果有人能提供建议,那将是非常惊人的!


如果您不打算使用他们的数据,获取API密钥也没有什么坏处。请查看此溢出https://dev59.com/mWYr5IYBdhLWcg3waJj7 - qubz
这似乎是一个可行的方式,但我正在寻找更深入的解释。例如,如何以其最简形式实现带有开源瓷砖的地图?正如在那个问题中提到的那样- API使用限制仍然适用吗?基本上,我需要一个以那个问题为基础的更详细的解释。谢谢。 - Thomas Clowes
由于这个新API还处于早期阶段,因此几乎不可能有关于osm/osmdroid与其集成的指南/示例/教程。随着时间的推移,这种情况可能会改变。 - qubz
:) 是预料之中的。你有没有关于如何执行它的见解? - Thomas Clowes
抱歉,我不认为我能帮上忙。按照Maps API v2的入门说明 https://developers.google.com/maps/documentation/android/start ,结合我链接的线程中的答案实现,可能是您最好的选择。 - qubz
2个回答

11

在新版Google地图API推出之前,我被迫使用OSMDroid来实现我的需求。但是,在多次研究源代码以弄清它的行为原因(通常是错误的)后,我渴望有一个新的库。

幸运的是,新的Google Maps 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附加库这里找到一个更正式的代码版本。

另外,如果你针对早期的Android版本(使用ABS),而不是使用MapFragment,确保使用SupportMapFragment。


所以..我玩了4个小时-但这个可以用 :) 唯一的问题是addTileProvider应该是addTileOverlay..你能否详细说明一下你的osmdroid决策/问题吗? 另外-我有OSM覆盖层,但Google标志仍然显示在角落里。你知道需要什么样的归属于OSM/考虑到我仍在使用'google maps'。此外,我会认为我仍然受到他们的使用限制?抵消了OSM的主要好处之一无论如何,非常感谢-非常感谢!! - Thomas Clowes
1
我认为谷歌的标志是一个漏洞,并且我已经在这里提交了一个问题:http://code.google.com/p/gmaps-api-issues/issues/detail?id=4648。至于为什么不使用OSMDroid,基本上归结为性能、漏洞和缺乏文档。如果你想知道原因,可以查看源代码,看看有多少没有操作的// TODO注释。;) - cocoahero
1
我也处理过OSMdroid的问题,正在考虑使用它。现在你已经使用了一段时间,这个工具的效果如何? - Patrick Jackson
1
使用自定义TileProvider和MAP_TYPE_NONE有一个痛苦的缺点。瓷砖没有被缓存,所以在缩放时会出现令人讨厌的闪烁 - 你们中有没有人成功地创建了某种解决这个问题的方法? - scana
使用UrlTileProvider / 创建自定义UrlTileProvider,OpenStreetMap在Android 7.1.1以上版本中不显示地图类型MAP_TYPE_NONE的瓦片。是否有解决方案? - hpAndro

3

Google Maps Android API v2附带的示例代码包含了com.example.mapdemo.TileOverlayDemoActivity类。对该类进行小小的更新即可在新的v2框架中显示OpenStreetMap瓦片。很酷!不再需要使用osmdroid或sherlock-fragments。但是...这些瓦片没有被缓存 :(

无论如何,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));
}

嘿@alexx,我尝试了你的解决方案,在7.1.1版本以下运行良好,但在Oreo/Pie等更高版本中不起作用,它显示为空白。请帮忙提供任何解决方案。 - hpAndro

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接