OSMDroid中的航空照片地图 - Bing?或者是什么?

时间:2012-05-29 10:17:16

标签: android bing-maps openstreetmap

我需要构建一个Android地图应用程序,我将在其上绘制考古POI(兴趣点)。要求是拥有与Google Maps Satellite视图非常相似的航拍照片。但是,当数据连接不可用时,另一个要求是离线映射功能,因此请使用Google Maps排除规则。

所以我有两个问题。

  1. OSMDroid是否可以免费访问支持Arial Photography或Satellite的磁贴源而不使用Bing?

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

  3. 在eclise中,我已经能够构建一个简单的应用程序来显示OSMDroid(Mapink)的默认映射。为了尝试使用Bing,我在项目源中添加了三个类。 BingMapTileSource.Java,ImageryMetaData.Java和ImageryMetaDataResouce.Java。我从OSMDroid SVN上的TileProvider目录的Bing子文件夹中获取了这些文件(Link here

    但是,当我在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 个答案:

答案 0 :(得分: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.add library osmdroid-third-party from here

在我们的项目中添加三个类( BingMapTileSource.java,ImageryMetaData.java,ImageryMetaDataResource.java )。 from here

3.获取Bing地图密钥。 Instructions here

4.将Bing Maps Key添加到清单。

<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);

答案 1 :(得分:1)

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

try 
{
 BingMapTileSource.initMetaData(this);
}
 catch (Exception e)
{       
 e.printStackTrace();
}

答案 2 :(得分:0)

离线卫星图像的要求意味着您必须单独许可图像。我不认为任何提供商在没有特定协议的情况下允许这样的使用。

答案 3 :(得分:0)

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

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

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