Android 使用 geojson 的 osm 地图非常慢
Android osm map using geojson is very slow
我想在 OSM 地图中显示 geoJson 对象,为此我使用了 osmdroid (version 5.4) and osmbonuspack(5.8 版)库。我的 activity 是:
public class TempMapActivity extends Activity {
MapView map;
KmlDocument mKmlGeoJson;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main_activity);
initMap();
}
private void initMap() {
map = (MapView) findViewById(R.id.map);
map.setTileSource(TileSourceFactory.DEFAULT_TILE_SOURCE);
map.setBuiltInZoomControls(true);
map.setMultiTouchControls(true);
IMapController mapController = map.getController();
map.setMinZoomLevel(18);
map.setMaxZoomLevel(22);
map.getController().setCenter(new GeoPoint(2.9691, 101.7146));
mapController.setZoom(18);
setupGeoJson();
}
private void setupGeoJson() {
String gJson = null;
try {
gJson = getGeoString();
} catch (IOException e) {
e.printStackTrace();
}
mKmlGeoJson = new KmlDocument();
mKmlGeoJson.parseGeoJSON(gJson);
FolderOverlay myOverLay = (FolderOverlay) mKmlGeoJson.mKmlRoot.
buildOverlay(map, null, null, mKmlGeoJson);
map.getOverlays().add(myOverLay);
map.getController().setZoom(16);
map.getController().setCenter(new GeoPoint(2.9691, 101.7146));
map.invalidate();
}
private String getGeoString() throws IOException {
InputStream is = getResources().openRawResource(R.raw.json_template);
Writer writer = new StringWriter();
char[] buffer = new char[1024];
try {
Reader reader = new BufferedReader(new InputStreamReader(is, "UTF-8"));
int n;
while ((n = reader.read(buffer)) != -1) {
writer.write(buffer, 0, n);
}
} finally {
is.close();
}
String jsonString = writer.toString();
return jsonString;
}
}
geoJson 中的对象正在显示,但地图在缩放时工作速度非常慢 out/in(加载时)。当我关闭以加载 geoJson 时,地图工作正常。我不知道我哪里做错了。
可能是因为您的 GeoJSON 文件包含大量对象,需要一段时间才能绘制。如果您可以分享,我们可以提供建议。
使用模拟器或物理设备速度慢吗?
Android 文档 says:
从Android 3.0(API level 11)开始,Android 2D渲染管道支持硬件加速,这意味着在视图的 canvas 使用 GPU。由于启用硬件加速所需的资源增加,您的应用程序将消耗更多 RAM。
事实证明,我忘记在 activity 中禁用硬件加速,我在其中使用了包含数百个 GeoJson 元素的 OSM 地图。现在我已经禁用了,地图的效果很好。
我想在 OSM 地图中显示 geoJson 对象,为此我使用了 osmdroid (version 5.4) and osmbonuspack(5.8 版)库。我的 activity 是:
public class TempMapActivity extends Activity {
MapView map;
KmlDocument mKmlGeoJson;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main_activity);
initMap();
}
private void initMap() {
map = (MapView) findViewById(R.id.map);
map.setTileSource(TileSourceFactory.DEFAULT_TILE_SOURCE);
map.setBuiltInZoomControls(true);
map.setMultiTouchControls(true);
IMapController mapController = map.getController();
map.setMinZoomLevel(18);
map.setMaxZoomLevel(22);
map.getController().setCenter(new GeoPoint(2.9691, 101.7146));
mapController.setZoom(18);
setupGeoJson();
}
private void setupGeoJson() {
String gJson = null;
try {
gJson = getGeoString();
} catch (IOException e) {
e.printStackTrace();
}
mKmlGeoJson = new KmlDocument();
mKmlGeoJson.parseGeoJSON(gJson);
FolderOverlay myOverLay = (FolderOverlay) mKmlGeoJson.mKmlRoot.
buildOverlay(map, null, null, mKmlGeoJson);
map.getOverlays().add(myOverLay);
map.getController().setZoom(16);
map.getController().setCenter(new GeoPoint(2.9691, 101.7146));
map.invalidate();
}
private String getGeoString() throws IOException {
InputStream is = getResources().openRawResource(R.raw.json_template);
Writer writer = new StringWriter();
char[] buffer = new char[1024];
try {
Reader reader = new BufferedReader(new InputStreamReader(is, "UTF-8"));
int n;
while ((n = reader.read(buffer)) != -1) {
writer.write(buffer, 0, n);
}
} finally {
is.close();
}
String jsonString = writer.toString();
return jsonString;
}
}
geoJson 中的对象正在显示,但地图在缩放时工作速度非常慢 out/in(加载时)。当我关闭以加载 geoJson 时,地图工作正常。我不知道我哪里做错了。
可能是因为您的 GeoJSON 文件包含大量对象,需要一段时间才能绘制。如果您可以分享,我们可以提供建议。 使用模拟器或物理设备速度慢吗?
Android 文档 says:
从Android 3.0(API level 11)开始,Android 2D渲染管道支持硬件加速,这意味着在视图的 canvas 使用 GPU。由于启用硬件加速所需的资源增加,您的应用程序将消耗更多 RAM。
事实证明,我忘记在 activity 中禁用硬件加速,我在其中使用了包含数百个 GeoJson 元素的 OSM 地图。现在我已经禁用了,地图的效果很好。