DixieFlatline
DixieFlatline

Reputation: 8035

How to create KML file in Android?

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?

Upvotes: 1

Views: 13448

Answers (4)

Naman Mehta
Naman Mehta

Reputation: 26

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

Upvotes: -1

Bhoomika Prajapati
Bhoomika Prajapati

Reputation: 714

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();
                }
            }
        });



    }


}

Upvotes: 0

Eric Levine
Eric Levine

Reputation: 13564

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

Upvotes: 2

Diego Torres Milano
Diego Torres Milano

Reputation: 69398

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.

Upvotes: 1

Related Questions