Skip to content

Commit

Permalink
KML: Use styles for surface legs and splays
Browse files Browse the repository at this point in the history
Addresses #60 for KML
  • Loading branch information
ojwb committed Aug 13, 2024
1 parent c2b9253 commit e6ef621
Show file tree
Hide file tree
Showing 4 changed files with 94 additions and 17 deletions.
43 changes: 36 additions & 7 deletions src/kml.cc
Original file line number Diff line number Diff line change
Expand Up @@ -114,15 +114,29 @@ void KML::header(const char * title, const char *, time_t,
html_escape(fh, title);
fputs("</name>\n", fh);
// Set up styles for the icons to reduce the file size.
// Note "color" code order is aabbggrr
fputs("<Style id=\"fix\"><IconStyle>"
"<Icon><href>https://maps.google.com/mapfiles/kml/paddle/red-blank.png</href></Icon>"
"<color>ff0000ff</color>"
"<hotSpot x=\"32\" y=\"1\" xunits=\"pixels\" yunits=\"pixels\"/>"
"</IconStyle></Style>\n", fh);
fputs("<Style id=\"exp\"><IconStyle>"
"<Icon><href>https://maps.google.com/mapfiles/kml/paddle/blu-blank.png</href></Icon>"
"<color>ffff0000</color>"
"<hotSpot x=\"32\" y=\"1\" xunits=\"pixels\" yunits=\"pixels\"/>"
"</IconStyle></Style>\n", fh);
fputs("<Style id=\"ent\"><IconStyle>"
"<Icon><href>https://maps.google.com/mapfiles/kml/paddle/grn-blank.png</href></Icon>"
"<color>ff00ff00</color>"
"<hotSpot x=\"32\" y=\"1\" xunits=\"pixels\" yunits=\"pixels\"/>"
"</IconStyle></Style>\n", fh);
// Set up styles for surface legs and splays.
fputs("<Style id=\"surf\"><LineStyle>"
"<color>ff00ff00</color>" // Green.
"</LineStyle></Style>\n", fh);
fputs("<Style id=\"splay\"><LineStyle>"
"<color>40ff00ff</color>" // Partly transparent magenta.
"</LineStyle></Style>\n", fh);
// FIXME: does KML allow bounds?
// NB Lat+long bounds are not necessarily the same as the bounds in survex
// coords translated to WGS84 lat+long...
Expand All @@ -131,19 +145,34 @@ void KML::header(const char * title, const char *, time_t,
void
KML::start_pass(int)
{
if (in_linestring) {
if (linestring_flags) {
fputs("</coordinates></LineString></MultiGeometry></Placemark>\n", fh);
in_linestring = false;
linestring_flags = 0;
}
}

void
KML::line(const img_point *p1, const img_point *p, unsigned /*flags*/, bool fPendingMove)
KML::line(const img_point *p1, const img_point *p, unsigned flags, bool fPendingMove)
{
if (linestring_flags && linestring_flags != (flags & (LEGS|SURF|SPLAYS))) {
fputs("</coordinates></LineString></MultiGeometry></Placemark>\n", fh);
linestring_flags = 0;
fPendingMove = true;
}
if (fPendingMove) {
if (!in_linestring) {
in_linestring = true;
fputs("<Placemark><MultiGeometry>\n", fh);
if (linestring_flags == 0) {
linestring_flags = (flags & (LEGS|SURF|SPLAYS));
if (flags & SURF) {
fputs("<Placemark>"
"<styleUrl>#surf</styleUrl>"
"<MultiGeometry>", fh);
} else if (flags & SPLAYS) {
fputs("<Placemark>"
"<styleUrl>#splay</styleUrl>"
"<MultiGeometry>", fh);
} else {
fputs("<Placemark><MultiGeometry>", fh);
}
} else {
fputs("</coordinates></LineString>\n", fh);
}
Expand Down Expand Up @@ -366,7 +395,7 @@ KML::label(const img_point *p, const wxString& str, int /*sflags*/, int type)
void
KML::footer()
{
if (in_linestring)
if (linestring_flags)
fputs("</coordinates></LineString></MultiGeometry></Placemark>\n", fh);
fputs("</Document></kml>\n", fh);
}
2 changes: 1 addition & 1 deletion src/kml.h
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,7 @@

class KML : public ExportFilter {
PJ* pj = NULL;
bool in_linestring = false;
unsigned linestring_flags = 0;
bool in_wall = false;
bool in_passage = false;
bool clamp_to_ground;
Expand Down
47 changes: 40 additions & 7 deletions tests/kmlexport.kml
Original file line number Diff line number Diff line change
@@ -1,14 +1,47 @@
<?xml version="1.0" encoding="UTF-8"?>
<kml xmlns="http://www.opengis.net/kml/2.2">
<Document><name>kmlexport</name>
<Style id="fix"><IconStyle><Icon><href>http://maps.google.com/mapfiles/kml/paddle/red-blank.png</href></Icon></IconStyle></Style>
<Style id="exp"><IconStyle><Icon><href>http://maps.google.com/mapfiles/kml/paddle/blu-blank.png</href></Icon></IconStyle></Style>
<Style id="ent"><IconStyle><Icon><href>http://maps.google.com/mapfiles/kml/paddle/grn-blank.png</href></Icon></IconStyle></Style>
<Placemark><MultiGeometry>
<LineString><altitudeMode>absolute</altitudeMode><coordinates>
<Style id="fix"><IconStyle><Icon><href>https://maps.google.com/mapfiles/kml/paddle/red-blank.png</href></Icon><color>ff0000ff</color><hotSpot x="32" y="1" xunits="pixels" yunits="pixels"/></IconStyle></Style>
<Style id="exp"><IconStyle><Icon><href>https://maps.google.com/mapfiles/kml/paddle/blu-blank.png</href></Icon><color>ffff0000</color><hotSpot x="32" y="1" xunits="pixels" yunits="pixels"/></IconStyle></Style>
<Style id="ent"><IconStyle><Icon><href>https://maps.google.com/mapfiles/kml/paddle/grn-blank.png</href></Icon><color>ff00ff00</color><hotSpot x="32" y="1" xunits="pixels" yunits="pixels"/></IconStyle></Style>
<Style id="surf"><LineStyle><color>ff00ff00</color></LineStyle></Style>
<Style id="splay"><LineStyle><color>40ff00ff</color></LineStyle></Style>
<Placemark><MultiGeometry><LineString><altitudeMode>absolute</altitudeMode><coordinates>
174.77670004,-41.27839998,30.00
174.77788868,-41.27842294,21.28
174.77785826,-41.27931962,12.57
</coordinates></LineString>
<LineString><altitudeMode>absolute</altitudeMode><coordinates>
174.77785826,-41.27931962,12.57
174.77904692,-41.27934257,3.85
</coordinates></LineString></MultiGeometry></Placemark>
<Placemark><styleUrl>#surf</styleUrl><MultiGeometry><LineString><altitudeMode>absolute</altitudeMode><coordinates>
174.77785826,-41.27931962,12.57
174.77666960,-41.27929666,3.85
</coordinates></LineString></MultiGeometry></Placemark>
<Placemark><MultiGeometry><LineString><altitudeMode>absolute</altitudeMode><coordinates>
174.77904692,-41.27934257,3.85
174.77901985,-41.28014060,-3.90
</coordinates></LineString></MultiGeometry></Placemark>
<Placemark><styleUrl>#splay</styleUrl><MultiGeometry><LineString><altitudeMode>absolute</altitudeMode><coordinates>
174.77904692,-41.27934257,3.85
174.77901954,-41.28014960,-3.99
</coordinates></LineString></MultiGeometry></Placemark>
<Placemark><styleUrl>#surf</styleUrl><MultiGeometry><LineString><altitudeMode>absolute</altitudeMode><coordinates>
174.77785826,-41.27931962,12.57
174.77783087,-41.28012665,4.72
</coordinates></LineString>
<LineString><altitudeMode>absolute</altitudeMode><coordinates>
174.77666960,-41.27929666,3.85
174.77664219,-41.28010369,-3.99
</coordinates></LineString></MultiGeometry></Placemark>
<Placemark><Point><coordinates>174.77788868,-41.27842294,21.28</coordinates></Point><name>e</name></Placemark>
<Placemark><Point><coordinates>174.77670004,-41.27839998,30.00</coordinates></Point><name>bh</name></Placemark>
<Placemark><Point><coordinates>174.77901985,-41.28014060,-3.90</coordinates></Point><name>6a</name></Placemark>
<Placemark><Point><coordinates>174.77901954,-41.28014960,-3.99</coordinates></Point><name>6</name></Placemark>
<Placemark><Point><coordinates>174.77904692,-41.27934257,3.85</coordinates></Point><name>5</name></Placemark>
<Placemark><Point><coordinates>174.77664219,-41.28010369,-3.99</coordinates></Point><name></name></Placemark>
<Placemark><Point><coordinates>174.77666960,-41.27929666,3.85</coordinates></Point><name>3</name></Placemark>
<Placemark><Point><coordinates>174.77783087,-41.28012665,4.72</coordinates></Point><name></name></Placemark>
<Placemark><Point><coordinates>174.77785826,-41.27931962,12.57</coordinates></Point><name>2</name></Placemark>
<Placemark><Point><coordinates>174.77788868,-41.27842294,21.28</coordinates></Point><name>1</name></Placemark>
<Placemark><Point><coordinates>174.77670004,-41.27839998,30.00</coordinates></Point><name>bh</name><styleUrl>#ent</styleUrl></Placemark>
</Document></kml>
19 changes: 17 additions & 2 deletions tests/kmlexport.svx
Original file line number Diff line number Diff line change
@@ -1,5 +1,20 @@
; pos=kml warn=0
; pos=kml survexportopt=--surface-legs survexportopt=--splays survexportopt=--entrances warn=0
*cs long-lat
*cs out UTM60S
*fix bh 174.7767 -41.2784 30
bh e 100 090 -5
*entrance bh
bh 1 100 090 -5
1 2 100 180 -5
*begin
*flags surface
2 3 100 270 -5
2 . 90 180 -5
3 .. 90 180 -5
*end
2 5 100 090 -5
*begin
*flags splay
5 6 90 180 -5
*end
*flags duplicate
5 6a 89 180 -5

0 comments on commit e6ef621

Please sign in to comment.