我在cartoDB浏览器中有一个包含三层的地图,并且无法在android App中添加我的地图中的图层。如何使用Java代码在CartoDB浏览器中将aKMZ图层(不是基本地图)添加到Android App中,以使用Java代码显示App中的所有图层?? 谁能帮我?
添加基本地图的代码
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// Register the license so that CARTO online services can be used
MapView.registerLicense(LICENSE,getApplicationContext());
// Get 'mapView' object from the application layout
mapView = (MapView) this.findViewById(R.id.mapView);
// Add basemap layer to mapView
CartoOnlineVectorTileLayer baseLayer = new CartoOnlineVectorTileLayer(CartoBaseMapStyle.CARTO_BASEMAP_STYLE_VOYAGER);
mapView.getLayers().add(baseLayer);
}
答案 0 :(得分:0)
我的项目是室内导航系统,因此我需要在cartoDB中的地图中的图层才能显示Android App中的建筑物级别
答案 1 :(得分:0)
建议的解决方案是事先使用某些工具将KMZ转换为GeoJSON。 SDK本身不这样做。然后,在SDK中,您可以使用GeoJSONGeometryReader解析GeoJSON并最终将其添加为MapLayer。我的通用函数可以完成所有这一切:
// usage: the file tpr-men.geojson is in assets folder of project
polygonGeoJSON(mapView,"tpr-men.geojson",android.graphics.Color.LTGRAY);
//helper function to read polygons from GeoJSON file, sets styles
private void polygonGeoJSON(MapView mapView, final String fileName, int color) {
final Thread thread;// Initialize a local vector data source
final LocalVectorDataSource source = new LocalVectorDataSource(baseProjection);
// Initialize a vector layer with the previous data source
VectorLayer vectorLayer = new VectorLayer(source);
vectorLayer.setVectorElementEventListener(listener);
// Add the clustered vector layer to the map
mapView.getLayers().add(vectorLayer);
LineStyleBuilder lsb = new LineStyleBuilder();
lsb.setColor(new Color(color));
lsb.setWidth(0.5f);
lsb.setLineJoinType(LineJoinType.LINE_JOIN_TYPE_NONE);
lsb.setLineEndType(LineEndType.LINE_END_TYPE_NONE);
PolygonStyleBuilder polygonBuilder = new PolygonStyleBuilder();
polygonBuilder.setColor(new Color(color & 0xbbffffff)); // a bit transparent
//polygonBuilder.setLineStyle(lsb.buildStyle());
final PolygonStyle style = polygonBuilder.buildStyle();
// As the file to load is rather large, we don't want to block our main thread
thread = new Thread(new Runnable() {
@TargetApi(Build.VERSION_CODES.JELLY_BEAN_MR1)
@Override
public void run() {
try {
// Read GeoJSON, parse it using SDK GeoJSON parser
GeoJSONGeometryReader reader = new GeoJSONGeometryReader();
// Set target projection to base (mercator)
reader.setTargetProjection(baseProjection);
Log.d("log","Starting load from .geojson");
// Read features from local asset
String json = loadJSONFromAsset(fileName);
Log.d("log","Finished load from .geojson");
FeatureCollection features = reader.readFeatureCollection(json);
Log.d("log","Finished parsing of geojson, loaded objects: "+features.getFeatureCount());
source.addFeatureCollection(features,style);
} catch (IOException e) {
e.printStackTrace();
}
Log.d("log","Finished load from geojson");
}
});
thread.start();
}
// general helper function to read file to String
private String loadJSONFromAsset(String fileName) throws IOException {
InputStream is = getAssets().open(fileName);
int size = is.available();
byte[] buffer = new byte[size];
is.read(buffer);
is.close();
return new String(buffer, "UTF-8");
}