我需要构建一个Android地图应用程序,我将在其上绘制考古POI(兴趣点)。要求是拥有与Google Maps Satellite视图非常相似的航拍照片。但是,当数据连接不可用时,另一个要求是离线映射功能,因此请使用Google Maps排除规则。
所以我有两个问题。
OSMDroid是否可以免费访问支持Arial Photography或Satellite的磁贴源而不使用Bing?
我知道OSM可以支持拥有Ariel摄影地图的Bing,但我无法让它工作。是否有任何bing特定的教程可以指向我,或者一个简单的例子,说明如何在OSMDroid中显示bing地图,因为我一直在寻找几个小时并拔掉我的头发。
在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
*/
但是,我不知道如何使用它。任何有关教程,示例或某些代码的建议或指示都将不胜感激。
答案 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中至少还有一些剩余的存档。也许他们甚至允许下载到离线,检查他们的条款。
两个警告 - 来自商业提供商的航拍图像可能非常昂贵,尤其是对于离线情况。来自任何来源的天线将占用大量空间,比光栅瓦片多几倍。因此,将它们下载到设备可能是一个挑战。