OSM贴图,未使用自定义瓦片源
OSM map, custom tile source is not used
我有以下代码:
public class MainActivity extends Activity {
MapView map;
XYTileSource customTileSource;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
map = (MapView) findViewById(R.id.mapView);
map.setMultiTouchControls(true);
map.setMapListener(new MyMapListener());
ITileSource tileSource = TileSourceFactory.MAPNIK;
String tileUrl[] = {"https://bla_bla_bla__don't wanna show this here"};
customTileSource = new MyXYTileSource("Point", null, 8, 18, 256, ".png", tileUrl);
map.setTileSource(customTileSource);
GeoPoint startPoint = new GeoPoint(47.021461, 28.86383);
IMapController mapController = map.getController();
mapController.setCenter(startPoint);
mapController.setZoom(10);
MapEventsOverlay eventsOverlay = new MapEventsOverlay(this, new MyMapEventsListener());
map.getOverlays().add(eventsOverlay);
}
private class MyMapListener implements MapListener {
@Override
public boolean onScroll(ScrollEvent event) {
return false;
}
@Override
public boolean onZoom(ZoomEvent event) {
Log.d("atf", "Zoom level is: " + event.getZoomLevel());
return true;
}
}
private class MyMapEventsListener implements MapEventsReceiver {
@Override
public boolean singleTapConfirmedHelper(GeoPoint p) {
Log.d("atf", "Taped on long="+p.getLongitude()+" lat="+p.getLatitude());
return true;
}
@Override
public boolean longPressHelper(GeoPoint p) {
return false;
}
}
private class MyXYTileSource extends XYTileSource {
public MyXYTileSource(String aName, ResourceProxy.string aResourceId, int aZoomMinLevel, int aZoomMaxLevel, int aTileSizePixels, String aImageFilenameEnding, String[] aBaseUrl) {
super(aName, aResourceId, aZoomMinLevel, aZoomMaxLevel, aTileSizePixels, aImageFilenameEnding, aBaseUrl);
}
@Override
public String getTileURLString(MapTile aTile) {
String tileUrl = super.getTileURLString(aTile);
Log.d("atf", "Tile url String: "+tileUrl);
return tileUrl;
}
}
}
这样做的目的是为了使用自定义图块来显示地图。
这实际上工作正常。 除了此代码在 "Samsung galaxy Ace 3" 上运行的情况外。 可能还有其他设备有同样的问题。
对于低于 17 的缩放级别,它不会加载自定义图块。当缩放超过 17 时,它开始加载它们。
有人可以解释一下为什么吗?
抱歉,我忘了说明:
当未加载新图块时,将加载旧图块(从默认图块源)。所以地图并不是完全空白。
查看logcat是否有异常,可能有很多OutOfMemoryError
。如果是这样,您需要微调您的应用程序内存使用情况。
解决方案比我想象的要简单。这仅仅是因为缓存。在问题中指定的设备上,我有另一个应用程序似乎使用相同的库 "OSM Bonus Pack"。两个应用程序都使用外部存储中的相同目录进行切片缓存。我只是删除了该目录 (/storage/emulated/0/osmdroid),新的图块开始从我的应用程序加载。
也许更好的解决方案是为我的应用程序指定另一个目录用于切片缓存。当然,我需要一些时间才能弄清楚如何做到这一点,但我认为这不会很复杂。
我有以下代码:
public class MainActivity extends Activity {
MapView map;
XYTileSource customTileSource;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
map = (MapView) findViewById(R.id.mapView);
map.setMultiTouchControls(true);
map.setMapListener(new MyMapListener());
ITileSource tileSource = TileSourceFactory.MAPNIK;
String tileUrl[] = {"https://bla_bla_bla__don't wanna show this here"};
customTileSource = new MyXYTileSource("Point", null, 8, 18, 256, ".png", tileUrl);
map.setTileSource(customTileSource);
GeoPoint startPoint = new GeoPoint(47.021461, 28.86383);
IMapController mapController = map.getController();
mapController.setCenter(startPoint);
mapController.setZoom(10);
MapEventsOverlay eventsOverlay = new MapEventsOverlay(this, new MyMapEventsListener());
map.getOverlays().add(eventsOverlay);
}
private class MyMapListener implements MapListener {
@Override
public boolean onScroll(ScrollEvent event) {
return false;
}
@Override
public boolean onZoom(ZoomEvent event) {
Log.d("atf", "Zoom level is: " + event.getZoomLevel());
return true;
}
}
private class MyMapEventsListener implements MapEventsReceiver {
@Override
public boolean singleTapConfirmedHelper(GeoPoint p) {
Log.d("atf", "Taped on long="+p.getLongitude()+" lat="+p.getLatitude());
return true;
}
@Override
public boolean longPressHelper(GeoPoint p) {
return false;
}
}
private class MyXYTileSource extends XYTileSource {
public MyXYTileSource(String aName, ResourceProxy.string aResourceId, int aZoomMinLevel, int aZoomMaxLevel, int aTileSizePixels, String aImageFilenameEnding, String[] aBaseUrl) {
super(aName, aResourceId, aZoomMinLevel, aZoomMaxLevel, aTileSizePixels, aImageFilenameEnding, aBaseUrl);
}
@Override
public String getTileURLString(MapTile aTile) {
String tileUrl = super.getTileURLString(aTile);
Log.d("atf", "Tile url String: "+tileUrl);
return tileUrl;
}
}
}
这样做的目的是为了使用自定义图块来显示地图。 这实际上工作正常。 除了此代码在 "Samsung galaxy Ace 3" 上运行的情况外。 可能还有其他设备有同样的问题。
对于低于 17 的缩放级别,它不会加载自定义图块。当缩放超过 17 时,它开始加载它们。
有人可以解释一下为什么吗?
抱歉,我忘了说明: 当未加载新图块时,将加载旧图块(从默认图块源)。所以地图并不是完全空白。
查看logcat是否有异常,可能有很多OutOfMemoryError
。如果是这样,您需要微调您的应用程序内存使用情况。
解决方案比我想象的要简单。这仅仅是因为缓存。在问题中指定的设备上,我有另一个应用程序似乎使用相同的库 "OSM Bonus Pack"。两个应用程序都使用外部存储中的相同目录进行切片缓存。我只是删除了该目录 (/storage/emulated/0/osmdroid),新的图块开始从我的应用程序加载。
也许更好的解决方案是为我的应用程序指定另一个目录用于切片缓存。当然,我需要一些时间才能弄清楚如何做到这一点,但我认为这不会很复杂。