How to create KML file in Android?

风流意气都作罢 提交于 2019-12-12 08:16:50

问题


At the moment, my app receives KML file from server and displays all the placemarks in the maps. But there is too much data going back and forth, so now i want to receive only a short string (lat,lang for a few points) from the server.

Is it possible to create KML file on an Android device (any API for this?


回答1:


There does not seem to be any KML libraries that will work well with Android right now. I have been using the Simple XML library for parsing KML, and is working out well.

However, since you are already receiving the data in a simplified format, you would be much better off using the Google Maps API directly yourself. This will save the effort of building up the KML, sending it to Google, and then getting back the rendered map. The tutorial here will help you get started: http://developer.android.com/resources/tutorials/views/hello-mapview.html




回答2:


You may use libkml, but it's a native library and you would need the NDK or gekmllib which is a Java library you can try to include in your Android project.




回答3:


public class CreateKmlFileActivity extends FragmentActivity {

    private GoogleMap googleMap;
    private SupportMapFragment supportMapFragment;
    private ArrayList<LatLng> latLngArrayList = new ArrayList<>();
    private ArrayList<LatLng> latLngArrayListLine = new ArrayList<>();
    private Button button, buttonLine;
    private XmlSerializer xmlSerializer;
    private boolean flag = false;
    private Handler handler;
    private Runnable runnable;
    GPSTracker gpsTracker;
    private double lat;
    private double lng;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.layout_task3);
        init();
        listener();
    }

    private void init() {
        button = (Button) findViewById(R.id.btn_find);
        buttonLine = (Button) findViewById(R.id.btn_line);
        supportMapFragment = (SupportMapFragment) getSupportFragmentManager().findFragmentById(R.id.map);
        googleMap = supportMapFragment.getMap();
        gpsTracker = new GPSTracker(this);
        lat = gpsTracker.latitude;
        lng = gpsTracker.longitude;
        handler = new Handler();
        runnable = new Runnable() {
            @Override
            public void run() {
                gpsTracker.getLocation();
                if (lat != gpsTracker.latitude || lng != gpsTracker.longitude) {
                    latLngArrayListLine.add(new LatLng(gpsTracker.latitude, gpsTracker.longitude));
                    lat = gpsTracker.latitude;
                    lng = gpsTracker.longitude;
                }
                handler.postDelayed(runnable, 1000 * 60);
            }
        };
        if (!gpsTracker.getIsGPSTrackingEnabled()) {
            gpsTracker.showSettingsAlert();
        }
        //gpsTracker.latitude
    }

    private void listener() {
        googleMap.setOnMapClickListener(new GoogleMap.OnMapClickListener() {
            @Override
            public void onMapClick(LatLng latLng) {
                if (!flag)
                    latLngArrayList.add(latLng);
                else
                    googleMap.animateCamera(CameraUpdateFactory.newLatLng(latLng));
            }
        });

        buttonLine.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                handler.removeCallbacks(runnable);
                flag = false;
                try {
                    FileOutputStream fileOutputStream = openFileOutput("testLine.kml", Context.MODE_PRIVATE);
                    xmlSerializer = XmlPullParserFactory.newInstance().newSerializer();
                    xmlSerializer.setOutput(fileOutputStream, "UTF-8");
                    xmlSerializer.startDocument(null, null);
                    xmlSerializer.setFeature("http://xmlpull.org/v1/doc/features.html#indent-output", true);
                    xmlSerializer.startTag(null, "kml");
                    xmlSerializer.startTag(null, "Document");
                    xmlSerializer.startTag(null, "name");
                    xmlSerializer.text("kmlFile");
                    xmlSerializer.endTag(null, "name");
                    xmlSerializer.startTag(null, "Style");
                    xmlSerializer.attribute(null, "id", "transGreenPoly");
                    xmlSerializer.startTag(null, "LineStyle");
                    xmlSerializer.startTag(null, "width");
                    xmlSerializer.text("1");
                    xmlSerializer.endTag(null, "width");
                    xmlSerializer.startTag(null, "color");
                    xmlSerializer.text("7dff0000");
                    xmlSerializer.endTag(null, "color");
                    xmlSerializer.startTag(null, "colorMode");
                    xmlSerializer.text("random");
                    xmlSerializer.endTag(null, "colorMode");
                    xmlSerializer.endTag(null, "LineStyle");
                    xmlSerializer.endTag(null, "Style");
                    xmlSerializer.startTag(null, "Folder");
                    xmlSerializer.startTag(null, "name");
                    xmlSerializer.text("Google Campus");
                    xmlSerializer.endTag(null, "name");
                    xmlSerializer.startTag(null, "visibility");
                    xmlSerializer.text("1");
                    xmlSerializer.endTag(null, "visibility");
                    xmlSerializer.startTag(null, "description");
                    xmlSerializer.text("Your Data");
                    xmlSerializer.endTag(null, "description");
                    xmlSerializer.startTag(null, "Placemark");
                    xmlSerializer.startTag(null, "name");
                    xmlSerializer.text("Data");
                    xmlSerializer.endTag(null, "name");
                    xmlSerializer.startTag(null, "visibility");
                    xmlSerializer.text("1");
                    xmlSerializer.endTag(null, "visibility");
                    xmlSerializer.startTag(null, "styleUrl");
                    xmlSerializer.text("#transRedPoly");
                    xmlSerializer.endTag(null, "styleUrl");
                    xmlSerializer.startTag(null, "LineString");
                    xmlSerializer.startTag(null, "extrude");
                    xmlSerializer.text("1");
                    xmlSerializer.endTag(null, "extrude");
                    xmlSerializer.startTag(null, "altitudeMode");
                    xmlSerializer.text("relativeToGround");
                    xmlSerializer.endTag(null, "altitudeMode");
                    //xmlSerializer.startTag(null, "outerBoundaryIs");
                    // xmlSerializer.startTag(null, "LinearRing");
                    xmlSerializer.startTag(null, "coordinates");
                    for (int i = 0; i < latLngArrayListLine.size(); i++) {
                        if (isPointInPolygon(latLngArrayListLine.get(i), latLngArrayList))
                            xmlSerializer.text(latLngArrayListLine.get(i).longitude + "," + latLngArrayListLine.get(i).latitude + ",17 \n");
                    }
                    xmlSerializer.endTag(null, "coordinates");
                    // xmlSerializer.endTag(null, "LinearRing");
                    //xmlSerializer.endTag(null, "outerBoundaryIs");
                    xmlSerializer.endTag(null, "LineString");
                    xmlSerializer.endTag(null, "Placemark");
                    xmlSerializer.endTag(null, "Folder");
                    xmlSerializer.endTag(null, "Document");
                    xmlSerializer.endTag(null, "kml");
                    xmlSerializer.endDocument();
                    xmlSerializer.flush();
                    fileOutputStream.close();

                } catch (IOException | XmlPullParserException e) {
                    e.printStackTrace();
                }
            }
        });



    }


}



回答4:


I know it is too late but OSMBonusPack can be used to create kml files.



来源:https://stackoverflow.com/questions/4628376/how-to-create-kml-file-in-android

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!