Reputation: 8035
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
Reputation: 26
I know it is too late but OSMBonusPack can be used to create kml files.
Upvotes: -1
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
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
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