Author: akv
Date: 2013-06-02 23:00:06 +0200 (Sun, 02 Jun 2013)
New Revision: 4404
Modified:
trunk/src/rs-geo-db.c
Log:
Added loading of KML files (only tested with Google Location History).
Modified: trunk/src/rs-geo-db.c
===================================================================
--- trunk/src/rs-geo-db.c 2013-06-02 17:27:59 UTC (rev 4403)
+++ trunk/src/rs-geo-db.c 2013-06-02 21:00:06 UTC (rev 4404)
@@ -253,7 +253,177 @@
gui_progress_free(progress);
}
+void load_kml(gchar *kmlfile, gint priority, sqlite3 *db, gint num, gint total)
+{
+ sqlite3_stmt *stmt;
+ gint rc;
+ if (rc); /* FIXME */
+
+ xmlDocPtr doc;
+ xmlNodePtr cur;
+ xmlNodePtr document = NULL;
+ xmlNodePtr placemark = NULL;
+ xmlNodePtr track = NULL;
+ xmlChar *val;
+
+ gdouble lon = 0.0, lat = 0.0, ele = 0.0;
+ gchar *year, *month, *day, *hour, *min, *sec, *tz;
+ GDateTime *timestamp = NULL;
+ GTimeZone *timezone = NULL;
+
+ gchar **coord_tokens = NULL;
+
+ doc = xmlParseFile(kmlfile);
+ if (!doc)
+ return;
+
+ gchar *checksum = rs_file_checksum(kmlfile);
+ gint import_id = 0;
+
+ sqlite3_prepare_v2(db, "INSERT INTO imports (checksum, priority) VALUES
(?1, ?2);", -1, &stmt, NULL);
+ rc = sqlite3_bind_text(stmt, 1, checksum, -1, SQLITE_TRANSIENT);
+ rc = sqlite3_bind_int (stmt, 2, priority);
+ rc = sqlite3_step(stmt);
+ import_id = sqlite3_last_insert_rowid(db);
+ sqlite3_finalize(stmt);
+
+ if (import_id == 0)
+ return;
+
+ cur = xmlDocGetRootElement(doc);
+ cur = cur->xmlChildrenNode;
+
+ gint count = 0;
+
+ while(cur)
+ {
+ if ((!xmlStrcmp(cur->name, BAD_CAST "Document")))
+ {
+ document = cur->xmlChildrenNode;
+ while (document)
+ {
+ if ((!xmlStrcmp(document->name, BAD_CAST
"Placemark")))
+ {
+ placemark = document->xmlChildrenNode;
+ while (placemark)
+ {
+ if
((!xmlStrcmp(placemark->name, BAD_CAST "Track")))
+ {
+ track =
placemark->xmlChildrenNode;
+ while (track)
+ {
+ if
((!xmlStrcmp(track->name, BAD_CAST "coord")))
+ {
+ count++;
+ }
+ track =
track->next;
+ }
+ }
+ placemark = placemark->next;
+ }
+ }
+ document = document->next;
+ }
+ }
+ cur = cur->next;
+ }
+
+ RS_PROGRESS *progress = NULL;
+ gchar *title = g_strdup_printf("Loading KML (%d/%d)...", num, total);
+ progress = gui_progress_new(title, count);
+ g_free(title);
+ GUI_CATCHUP();
+
+ cur = xmlDocGetRootElement(doc);
+ cur = cur->xmlChildrenNode;
+
+ while(cur)
+ {
+ if ((!xmlStrcmp(cur->name, BAD_CAST "Document")))
+ {
+ document = cur->xmlChildrenNode;
+ while (document)
+ {
+ if ((!xmlStrcmp(document->name, BAD_CAST
"Placemark")))
+ {
+ placemark = document->xmlChildrenNode;
+ while (placemark)
+ {
+ if
((!xmlStrcmp(placemark->name, BAD_CAST "Track")))
+ {
+ track =
placemark->xmlChildrenNode;
+
+ // Reset values
+ lon = 0.0;
+ lat = 0.0;
+ ele = 0.0;
+
+ while (track)
+ {
+ if
((!xmlStrcmp(track->name, BAD_CAST "when")))
+ {
+ val =
xmlNodeListGetString(doc, track->xmlChildrenNode, 1);
+ year =
g_utf8_substring((gchar *) val, 0, 4);
+ month =
g_utf8_substring((gchar *) val, 5, 7);
+ day =
g_utf8_substring((gchar *) val, 8, 10);
+ hour =
g_utf8_substring((gchar *) val, 11, 13);
+ min =
g_utf8_substring((gchar *) val, 14, 16);
+ sec =
g_utf8_substring((gchar *) val, 17, 23);
+ tz =
g_utf8_substring((gchar *) val, 23, 29);
+
xmlFree(val);
+
timezone = g_time_zone_new(tz);
+
timestamp = g_date_time_new(timezone, atoi(year), atoi(month), atoi(day),
atoi(hour), atoi(min), atof(sec));
+
g_free(year);
+
g_free(month);
+
g_free(day);
+
g_free(hour);
+
g_free(min);
+
g_free(sec);
+
g_free(tz);
+ }
+ if
((!xmlStrcmp(track->name, BAD_CAST "coord")))
+ {
+ val =
xmlNodeListGetString(doc, track->xmlChildrenNode, 1);
+
coord_tokens = g_strsplit((gchar *) val, " ", 3);
+ lon =
atof(coord_tokens[0]);
+ lat =
atof(coord_tokens[1]);
+ ele =
atof(coord_tokens[2]);
+
xmlFree(val);
+
g_strfreev(coord_tokens);
+ }
+ track =
track->next;
+ if (lon != 0.0
&& lat != 0.0 && timestamp != NULL)
+ {
+
sqlite3_prepare_v2(db, "INSERT INTO trkpts (time, lon, lat, ele, import) VALUES
(?1, ?2, ?3, ?4, ?5);", -1, &stmt, NULL);
+ rc =
sqlite3_bind_int (stmt, 1, atoi(g_date_time_format(timestamp, "%s")));
+ rc =
sqlite3_bind_double (stmt, 2, lon);
+ rc =
sqlite3_bind_double (stmt, 3, lat);
+ rc =
sqlite3_bind_double (stmt, 4, ele);
+ rc =
sqlite3_bind_int (stmt, 5, import_id);
+ rc =
sqlite3_step(stmt);
+
sqlite3_finalize(stmt);
+ lon =
0.0;
+ lat =
0.0;
+ ele =
0.0;
+
g_date_time_unref(timestamp);
+
gui_progress_advance_one(progress);
+
GUI_CATCHUP();
+ }
+ }
+ }
+ placemark = placemark->next;
+ }
+ }
+ document = document->next;
+ }
+ }
+ cur = cur->next;
+ }
+ gui_progress_free(progress);
+}
+
+
void
rs_geo_db_find_coordinate(RSGeoDb *geodb, gint timestamp, gdouble *lon,
gdouble *lat, gdouble *ele)
{
@@ -342,7 +512,7 @@
gtk_label_set_text(label, text);
}
-void import_gpx(GtkButton *button, RSGeoDb *geodb)
+void import_gps_data(GtkButton *button, RSGeoDb *geodb)
{
GtkWidget *fc = gtk_file_chooser_dialog_new ("Import GPX ...", NULL,
GTK_FILE_CHOOSER_ACTION_OPEN,
@@ -351,8 +521,9 @@
gtk_dialog_set_default_response(GTK_DIALOG(fc), GTK_RESPONSE_ACCEPT);
GtkFileFilter *filter = gtk_file_filter_new();
- gtk_file_filter_set_name(filter, "GPX");
+ gtk_file_filter_set_name(filter, "GPX & KML");
gtk_file_filter_add_pattern(filter, "*.gpx");
+ gtk_file_filter_add_pattern(filter, "*.kml");
gtk_file_chooser_add_filter(GTK_FILE_CHOOSER(fc), filter);
gtk_file_chooser_set_select_multiple(GTK_FILE_CHOOSER(fc), TRUE);
@@ -362,6 +533,7 @@
{
GSList *filenames;
gchar *filename;
+ gchar *extension;
filenames = gtk_file_chooser_get_filenames (GTK_FILE_CHOOSER
(fc));
gtk_widget_destroy(fc);
if (filenames)
@@ -371,7 +543,13 @@
for(i=0;i<g_slist_length(filenames);i++)
{
filename = g_slist_nth_data(filenames, i);
- load_gpx(filename, 1, geodb->db, (i+1),
g_slist_length(filenames));
+ extension = g_strrstr(filename, ".");
+ if (g_strcmp0(extension, ".gpx") == 0)
+ load_gpx(filename, 1, geodb->db, (i+1),
g_slist_length(filenames));
+ else if (g_strcmp0(extension, ".kml") == 0)
+ load_kml(filename, 1, geodb->db, (i+1),
g_slist_length(filenames));
+ else
+ printf("extension %s not
supported...\n", extension);
g_free(filename);
}
g_slist_free(filenames);
@@ -477,8 +655,8 @@
gtk_box_pack_start (GTK_BOX(map_source_box),
gui_confbox_get_widget(map_source), TRUE, FALSE, 5);
gtk_box_pack_start (GTK_BOX(box), map_source_box, FALSE, FALSE, 5);
- GtkWidget *button = gtk_button_new_with_label("Import GPX file");
- g_signal_connect(button, "clicked", G_CALLBACK(import_gpx), geodb);
+ GtkWidget *button = gtk_button_new_with_label("Import GPS file(s)...");
+ g_signal_connect(button, "clicked", G_CALLBACK(import_gps_data), geodb);
gtk_box_pack_start (GTK_BOX(box), button, FALSE, FALSE, 5);
return box;
_______________________________________________
Rawstudio-commit mailing list
[email protected]
http://rawstudio.org/cgi-bin/mailman/listinfo/rawstudio-commit