首页 文章

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

提问于
浏览
2

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

所以我有两个问题 .

  • OSMDroid是否可以在不使用Bing的情况下免费访问支持Arial Photography或Satellite的磁贴源 .

  • 我知道OSM可以支持拥有Ariel摄影 Map 的Bing,但我无法让它工作 . 是否有任何bing特定的教程,你可以指向我,或一个简单的例子,如何获得一个bing Map 显示在OSMDroid,因为我一直在寻找几个小时,并拉我的头发 .

在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

    updated 22.07.2015

    How to add Bing maps to 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

    OR

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

    3.获取Bing Map 密钥 . Instructions here

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

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

    5.最后一步 . 添加 Map 代码

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

    好吧,我想到了使Bing Map 工作的问题 . 所需要的是在BingMapTileSouce实例化之前,使用以下静态方法实例化前面讨论的三个Meta Data对象 .

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

    离线卫星图像的要求意味着您必须单独许可图像 . 如果没有特定协议,我认为任何提供商都不允许这样的使用 .

  • 1

    天线有许多商业供应商:Digitalglobe,Geoeye等 . 从Google Earth查询,他们在 Map 底部提到了他们的供应商 .

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

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

相关问题