3

I am using Google Maps API in Android development; my app locates a group of markers based on the locations.
So, every second it will locate a marker and by the end of the trip I will have group of markers.

I need to export all those markers to kmz file so I can open them later by using google earth.

Any idea?

Phantômaxx
  • 37,901
  • 21
  • 84
  • 115
Ahmed
  • 93
  • 7

1 Answers1

2

KMZ is just zipped KML format, so just format KML-formatted String with your markers data like:

<?xml version="1.0" encoding="UTF-8"?>
<kml xmlns="http://www.opengis.net/kml/2.2">
<Document>
  <name>Document.kml</name>
  <open>1</open>
  <Style id="exampleStyleDocument">
    <LabelStyle>
      <color>ff0000cc</color>
    </LabelStyle>
  </Style>
  <Placemark>
    <name>Document Feature 1</name>
    <styleUrl>#exampleStyleDocument</styleUrl>
    <Point>
      <coordinates>-122.371,37.816,0</coordinates>
    </Point>
  </Placemark>
  <Placemark>
    <name>Document Feature 2</name>
    <styleUrl>#exampleStyleDocument</styleUrl>
    <Point>
      <coordinates>-122.370,37.817,0</coordinates>
    </Point>
  </Placemark>
</Document>
</kml>

then zip it (for example like in this answer of scessor) an save to .kmz file.

UPDATE: Here is source code, which generates markers.kmz file in KMZ folder of External Storage:

public class MainActivity extends AppCompatActivity implements OnMapReadyCallback {

    public static final int REQUEST_PERMISSIONS_CODE = 1111;

    static final LatLng MAIDAN = new LatLng(50.450311, 30.523730);
    static final LatLng SOPHIA = new LatLng(50.452973, 30.514502);
    static final LatLng LAVRA = new LatLng(50.434692, 30.556931);

    private GoogleMap mGoogleMap;
    private MapFragment mMapFragment;

    private List<Marker> mMarkers = new ArrayList();

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        if (!checkPermission()) {
            requestPermission();
        }

        mMapFragment = (MapFragment) getFragmentManager()
                .findFragmentById(R.id.map_fragment);
        mMapFragment.getMapAsync(this);
    }

    @Override
    public void onRequestPermissionsResult(int requestCode, String permissions[], int[] grantResults) {
        switch (requestCode) {
            case REQUEST_PERMISSIONS_CODE:
                if (grantResults.length > 0) {
                    boolean storagePermission = grantResults[0] == PackageManager.PERMISSION_GRANTED;
                    if (storagePermission) {
                        exportMarkersToKMZfile(mMarkers);
                        Toast.makeText(MainActivity.this, "Permission Granted",
                                Toast.LENGTH_LONG).show();
                    } else {
                        Toast.makeText(MainActivity.this,"Permission Denied",Toast.LENGTH_LONG).show();
                    }
                }
                break;
        }
    }

    @Override
    public void onMapReady(GoogleMap googleMap) {
        mGoogleMap = googleMap;

        mMarkers.add(mGoogleMap.addMarker(new MarkerOptions().position(MAIDAN).title("Maidan")));
        mMarkers.add(mGoogleMap.addMarker(new MarkerOptions().position(SOPHIA).title("Sophia")));
        mMarkers.add(mGoogleMap.addMarker(new MarkerOptions().position(LAVRA).title("Lavra")));

        mGoogleMap.animateCamera(CameraUpdateFactory.newLatLngZoom(MAIDAN, 16));

        exportMarkersToKMZfile(mMarkers);
    }

    public static String exportMarkersToKML(List<Marker> markers) {
        StringBuilder kmlStringBuilder = new StringBuilder(500 * (markers.size() + 3));

        // add KML header
        kmlStringBuilder.append("<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n");
        kmlStringBuilder.append("<kml xmlns=\"http://www.opengis.net/kml/2.2\">\n");
        kmlStringBuilder.append("<Document>\n");
        kmlStringBuilder.append("<name>Document.kml</name>\n");

        // add style for marker
        kmlStringBuilder.append("<Style id=\"blueMarker\">\n");
        kmlStringBuilder.append("<LabelStyle>\n");
        kmlStringBuilder.append("<color>ff00ff00</color>\n");
        kmlStringBuilder.append("</LabelStyle>\n");
        kmlStringBuilder.append("</Style>\n");

        // add markers as KML placemarks
        for (Marker marker : markers) {
            kmlStringBuilder.append("<Placemark>\n");
            kmlStringBuilder.append(String.format("<name>%s</name>\n", marker.getTitle()));
            kmlStringBuilder.append("<styleUrl>#blueMarker</styleUrl>\n");
            kmlStringBuilder.append("<Point>\n");
            kmlStringBuilder.append(String.format("<coordinates>%8.3f,%8.3f,0</coordinates>\n",
                    marker.getPosition().longitude, marker.getPosition().latitude));
            kmlStringBuilder.append("</Point>\n");
            kmlStringBuilder.append("</Placemark>\n");
        }

        kmlStringBuilder.append("</Document>\n");
        kmlStringBuilder.append("</kml>\n");
        return kmlStringBuilder.toString();
    }

    public static void exportMarkersToKMZfile(List<Marker> markers) {
        try {

            String kmlString = exportMarkersToKML(markers);

            File kmzFolder = new File(Environment.getExternalStorageDirectory(), "KMZ");
            if (!kmzFolder.exists()) {
                kmzFolder.mkdir();
            }

            File kmzFile = new File(kmzFolder, "markers.kmz");

            ZipOutputStream zipOutputStream = new ZipOutputStream(new FileOutputStream(kmzFile));
            ZipEntry entry = new ZipEntry("markers.kml");
            zipOutputStream.putNextEntry(entry);
            zipOutputStream.write(kmlString.getBytes());
            zipOutputStream.flush();
            zipOutputStream.close();

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

    public boolean checkPermission() {
        return ContextCompat.checkSelfPermission(getApplicationContext(), WRITE_EXTERNAL_STORAGE)
                == PackageManager.PERMISSION_GRANTED;
    }

    private void requestPermission() {
        ActivityCompat.requestPermissions(MainActivity.this, new
                String[]{WRITE_EXTERNAL_STORAGE}, REQUEST_PERMISSIONS_CODE);
    }
}

And don't forget add

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>

to your AndroidManifest.xml file.

Andrii Omelchenko
  • 13,183
  • 12
  • 43
  • 79