2

我需要构建一个 Android 地图应用程序,我将在该应用程序上绘制考古 POI(兴趣点)。要求是拥有类似于谷歌地图卫星视图的航拍照片。但是,另一个要求是数据连接不可用时的离线地图功能,因此排除了使用谷歌地图的可能性。

所以我有两个问题。

  1. OSMDroid 是否可以在不使用 Bing 的情况下免费访问支持 Arial 摄影或卫星的图块资源?

  2. 我知道 OSM 可以支持具有 Ariel 摄影地图的 Bing,但我无法让它工作。是否有任何您可以指向我的 bing 特定教程,或者是一个简单的示例,说明如何在 OSMDroid 中显示一个 bing 地图,因为我一直在寻找几个小时并拉出我的头发。

在 eclise 中,我已经能够构建一个简单的应用程序来显示 OSMDroid (Mapink) 的默认地图。为了尝试使用 Bing,我在项目源代码中添加了三个类。BingMapTileSource.Java、ImageryMetaData.Java 和 ImageryMetaDataResouce.Java。我从 OSMDroid SVN 上的 TileProvider 目录的 Bing 子文件夹中得到这些(链接在这里

但是,当我如下在 onCreate 中使用它时,我在 BingMapTileSource.java 类中出现空指针错误。

MapView mapView = new MapView(this, 256);
mapView.setClickable(true);
mapView.setBuiltInZoomControls(true);
String  m_locale=Locale.getDefault().getISO3Language()+"-"+Locale.getDefault().getISO3Language();
mapView.setTileSource(new BingMapTileSource("Bing",m_locale));

mapView.getController().setZoom(10);
mapView.getController().setCenter(new GeoPoint(39.461078, 2.856445));

setContentView(mapView);

我相信这个问题的原因是以下类变量在首次使用之前从未初始化过。

s_roadMetaData = null;
s_aerialMetaData = null;
s_aerialwithLabelsMetaData = null;

我唯一能看到它们被初始化的地方是一个名为 InitMetaData 的静态方法,它永远不会被调用。

public static synchronized void initMetaData(final Context aContext) 

尽管在其说明的 Javadoc 中提供了一些关于其目的的线索。

     /**
     * Initialize BingMap tile source.<br>
     * This method should be invoked before class instantiation.<br>
     * It get dynamically the REST service url to be used to get tile in each supported map view mode.
     * @param a_BingMapKey  The user's BingMap key.
     * @throws Exception
     */

但是,我不知道如何使用它。任何关于教程、示例或一些代码的建议或指针将不胜感激。

4

4 回答 4

3

2015 年 7 月 22 日更新

如何将 Bing 地图添加到 osmdroid

以下是分步说明。也许有人会节省很多时间。

1.添加对gradle的依赖

compile 'org.slf4j:slf4j-android:1.6.1-RC1'
compile 'org.osmdroid:osmdroid-android:4.3'

2.从这里添加库osmdroid-third-party

或者

在我们的项目中添加三个类(BingMapTileSource.java、ImageryMetaData.java、ImageryMetaDataResource.java)。从这里

3.获取必应地图密钥。这里的说明

4. 将 Bing 地图密钥添加到清单中。

<meta-data android:name="BING_KEY" android:value="ApEqyap8rTa4WTNCNv-3pAGQc7XUsHS6595tuDI3MHR59QlahJ5bqYGYhMYJq6Ae" />

5.最后一步。添加地图代码

        ResourceProxyImpl mResourceProxy = new ResourceProxyImpl(getContext().getApplicationContext());
        MapView mMapView = new MapView(getContext(), 256, mResourceProxy);
        mMapView.setBuiltInZoomControls(true);
        mMapView.setMultiTouchControls(true);

        try{
            BingMapTileSource.retrieveBingKey(getContext());
            String m_locale =   Locale.getDefault().getDisplayName();
            BingMapTileSource bing = new BingMapTileSource(m_locale);
            bing.setStyle(BingMapTileSource.IMAGERYSET_AERIAL);
            mMapView.setTileSource(bing);
        }
        catch(Exception e){
            e.printStackTrace();
        }
        mapContent.addView(mMapView);
于 2015-07-09T14:39:51.073 回答
0

离线卫星图像的要求意味着您必须单独许可图像。我认为任何供应商都不允许在没有具体协议的情况下进行此类使用。

于 2012-05-29T10:48:31.397 回答
0

有许多商业天线供应商:Digitalglobe、Geoeye 等。从谷歌地球查看,他们在地图底部提到了他们的供应商。

还有一些分辨率较低的免费图像,如 OpenAerialMap,它本身不再工作。但值得检查它们的原始来源(http://openaerialmap.org/Data_Sources)。MapQuest Open Tiles API 中至少还有一些剩余的存档可用。也许他们甚至允许离线下载,检查他们的条款。

通过两个警告 - 来自商业提供商的航拍图像可能非常昂贵,尤其是对于离线案例。任何来源的天线都会占用大量空间,比光栅图块多几倍。因此,仅将它们下载到设备上可能是一个挑战。

于 2012-05-30T07:37:28.460 回答
0

好吧,我发现了让 Bing 地图工作的问题。需要在 BingMapTileSouce 的实例化之前使用以下静态方法来实例化前面讨论的三个元数据对象。

try 
{
 BingMapTileSource.initMetaData(this);
}
 catch (Exception e)
{       
 e.printStackTrace();
}
于 2012-05-30T14:16:16.970 回答