source: git/src/kml.cc @ f0784b9

RELEASE/1.2debug-cidebug-ci-sanitisersfaster-cavernloglog-selectstereostereo-2025walls-datawalls-data-hanging-as-warningwarn-only-for-hanging-survey
Last change on this file since f0784b9 was 7aed359, checked in by Olly Betts <olly@…>, 10 years ago

src/kml.cc: Put coloured "pin" icons into KML files, like we do for
GPX files.

  • Property mode set to 100644
File size: 4.9 KB
RevLine 
[1534ed9]1/* kml.cc
2 * Export from Aven as KML.
3 */
4/* Copyright (C) 2012 Olaf Kähler
[55a861a]5 * Copyright (C) 2012,2013,2014,2015 Olly Betts
[1534ed9]6 *
7 * This program is free software; you can redistribute it and/or modify
8 * it under the terms of the GNU General Public License as published by
9 * the Free Software Foundation; either version 2 of the License, or
10 * (at your option) any later version.
11 *
12 * This program is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15 * GNU General Public License for more details.
16 *
17 * You should have received a copy of the GNU General Public License
18 * along with this program; if not, write to the Free Software
19 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301 USA
20 */
21
22#ifdef HAVE_CONFIG_H
23# include <config.h>
24#endif
25
26#include "kml.h"
27
28#include "export.h" // For LABELS, etc
29
30#include <stdio.h>
31#include <string>
32#include <math.h>
33
34#include "useful.h"
35#include <proj_api.h>
36
37#include "aven.h"
38#include "message.h"
39
40using namespace std;
41
42#define WGS84_DATUM_STRING "+proj=longlat +ellps=WGS84 +datum=WGS84"
43
44static void
45html_escape(FILE *fh, const char *s)
46{
47    while (*s) {
48        switch (*s) {
49            case '<':
50                fputs("&lt;", fh);
51                break;
52            case '>':
53                fputs("&gt;", fh);
54                break;
55            case '&':
56                fputs("&amp;", fh);
57                break;
58            default:
59                PUTC(*s, fh);
60        }
61        ++s;
62    }
63}
64
65KML::KML(const char * input_datum)
66    : pj_input(NULL), pj_output(NULL), in_trkseg(false)
67{
68    if (!(pj_input = pj_init_plus(input_datum))) {
69        wxString m = wmsg(/*Failed to initialise input coordinate system “%s”*/287);
70        m = wxString::Format(m.c_str(), input_datum);
71        throw m;
72    }
73    if (!(pj_output = pj_init_plus(WGS84_DATUM_STRING))) {
74        wxString m = wmsg(/*Failed to initialise output coordinate system “%s”*/288);
75        m = wxString::Format(m.c_str(), WGS84_DATUM_STRING);
76        throw m;
77    }
78}
79
80KML::~KML()
81{
82    if (pj_input)
83        pj_free(pj_input);
84    if (pj_output)
85        pj_free(pj_output);
86}
87
88const int *
89KML::passes() const
90{
91    // static const int default_passes[] = { LABELS|ENTS|FIXES|EXPORTS, LEGS|SURF, 0 };
92    static const int default_passes[] = { LABELS|ENTS|FIXES|EXPORTS, 0 };
93    return default_passes;
94}
95
96/* Initialise KML routines. */
[55a861a]97void KML::header(const char * title, const char *, time_t,
98                 double, double, double, double, double, double)
[1534ed9]99{
100    fputs(
101"<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n"
102"<kml xmlns=\"http://www.opengis.net/kml/2.2\">\n", fh);
103    fputs("<Document><name>", fh);
104    html_escape(fh, title);
105    fputs("</name>\n", fh);
[7aed359]106    // Set up styles for the icons to reduce the file size.
107    fputs("<Style id=\"fix\"><IconStyle>"
108          "<Icon><href>http://maps.google.com/mapfiles/kml/pushpin/red-pushpin.png</href></Icon>"
109          "</IconStyle></Style>\n", fh);
110    fputs("<Style id=\"exp\"><IconStyle>"
111          "<Icon><href>http://maps.google.com/mapfiles/kml/pushpin/blue-pushpin.png</href></Icon>"
112          "</IconStyle></Style>\n", fh);
113    fputs("<Style id=\"ent\"><IconStyle>"
114          "<Icon><href>http://maps.google.com/mapfiles/kml/pushpin/grn-pushpin.png</href></Icon>"
115          "</IconStyle></Style>\n", fh);
[1534ed9]116    // FIXME: does KML allow bounds?
117    // NB Lat+long bounds are not necessarily the same as the bounds in survex
118    // coords translated to WGS84 lat+long...
119}
120
121void
122KML::line(const img_point *p1, const img_point *p, bool /*fSurface*/, bool fPendingMove)
123{
124    (void)p1;
125    (void)p;
126    (void)fPendingMove;
127#if 0
128    if (fPendingMove) {
129        if (in_trkseg) {
130            fputs("</trkseg><trkseg>\n", fh);
131        } else {
132            fputs("<trk><trkseg>\n", fh);
133            in_trkseg = true;
134        }
135        double X = p1->x, Y = p1->y, Z = p1->z;
136        pj_transform(pj_input, pj_output, 1, 1, &X, &Y, &Z);
137        X = deg(X);
138        Y = deg(Y);
139        // %.8f is at worst just over 1mm.
140        fprintf(fh, "<trkpt lon=\"%.8f\" lat=\"%.8f\"><ele>%.2f</ele></trkpt>\n", X, Y, Z);
141    }
142    double X = p->x, Y = p->y, Z = p->z;
143    pj_transform(pj_input, pj_output, 1, 1, &X, &Y, &Z);
144    X = deg(X);
145    Y = deg(Y);
146    // %.8f is at worst just over 1mm.
147    fprintf(fh, "<trkpt lon=\"%.8f\" lat=\"%.8f\"><ele>%.2f</ele></trkpt>\n", X, Y, Z);
148#endif
149}
150
151void
152KML::label(const img_point *p, const char *s, bool /*fSurface*/, int type)
153{
154    (void)type;
155    double X = p->x, Y = p->y, Z = p->z;
156    pj_transform(pj_input, pj_output, 1, 1, &X, &Y, &Z);
157    X = deg(X);
158    Y = deg(Y);
159    // %.8f is at worst just over 1mm.
160    fprintf(fh, "<Placemark><Point><coordinates>%.8f,%.8f,%.2f</coordinates></Point><name>", X, Y, Z);
161    html_escape(fh, s);
162    fputs("</name>", fh);
163    // Add a "pin" symbol with colour matching what aven shows.
164    switch (type) {
165        case FIXES:
[7aed359]166            fputs("<styleUrl>#fix</styleUrl>", fh);
[1534ed9]167            break;
168        case EXPORTS:
[7aed359]169            fputs("<styleUrl>#exp</styleUrl>", fh);
[1534ed9]170            break;
171        case ENTS:
[7aed359]172            fputs("<styleUrl>#ent</styleUrl>", fh);
[1534ed9]173            break;
174    }
175    fputs("</Placemark>\n", fh);
176}
177
178void
179KML::footer()
180{
181#if 0
182    if (in_trkseg)
183        fputs("</trkseg></trk>\n", fh);
184#endif
185    fputs("</Document></kml>\n", fh);
186}
Note: See TracBrowser for help on using the repository browser.