将cartoDB浏览器中的图层添加到Android应用程序

时间:2018-11-04 22:10:23

标签: java android cartodb

我在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);
}

2 个答案:

答案 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");

}