Skip to content

Commit

Permalink
Merge pull request #12 from gabeschine/feat_altitudeMode
Browse files Browse the repository at this point in the history
Add option to KmlWriter to specify <altitudeMode>
kb0 authored May 29, 2021
2 parents e110909 + e5fb1bf commit 83bf8ed
Showing 3 changed files with 106 additions and 3 deletions.
22 changes: 19 additions & 3 deletions lib/src/kml_writer.dart
Original file line number Diff line number Diff line change
@@ -9,8 +9,24 @@ import 'model/rte.dart';
import 'model/trk.dart';
import 'model/wpt.dart';

/// KML 2.2 AltitudeMode values
enum AltitudeMode {
absolute,
clampToGround,
relativeToGround,
}

/// Convert Gpx into KML
class KmlWriter {
final AltitudeMode altitudeMode;

KmlWriter({this.altitudeMode = AltitudeMode.absolute});

String get _altitudeModeString {
final strVal = altitudeMode.toString();
return strVal.substring(strVal.indexOf('.') + 1);
}

/// Convert Gpx into KML as String
String asString(Gpx gpx, {bool pretty = false}) =>
_build(gpx).toXmlString(pretty: pretty);
@@ -97,7 +113,7 @@ class KmlWriter {
builder.element(KmlTagV22.track, nest: () {
_writeElement(builder, KmlTagV22.extrude, 1);
_writeElement(builder, KmlTagV22.tessellate, 1);
_writeElement(builder, KmlTagV22.altitudeMode, 'absolute');
_writeElement(builder, KmlTagV22.altitudeMode, _altitudeModeString);

_writeElement(
builder,
@@ -126,7 +142,7 @@ class KmlWriter {
builder.element(KmlTagV22.track, nest: () {
_writeElement(builder, KmlTagV22.extrude, 1);
_writeElement(builder, KmlTagV22.tessellate, 1);
_writeElement(builder, KmlTagV22.altitudeMode, 'absolute');
_writeElement(builder, KmlTagV22.altitudeMode, _altitudeModeString);

_writeElement(
builder,
@@ -168,7 +184,7 @@ class KmlWriter {

builder.element(KmlTagV22.point, nest: () {
if (wpt.ele != null) {
_writeElement(builder, KmlTagV22.altitudeMode, 'absolute');
_writeElement(builder, KmlTagV22.altitudeMode, _altitudeModeString);
}

_writeElement(builder, KmlTagV22.coordinates,
76 changes: 76 additions & 0 deletions test/assets/complex_clampToGround.kml
Original file line number Diff line number Diff line change
@@ -0,0 +1,76 @@
<?xml version="1.0" encoding="UTF-8"?>
<kml xmlns="http://www.opengis.net/kml/2.2">
<Document>
<name>routes</name>
<ExtendedData>
<Data name="time">
<value>2010-01-02T03:04:05.000Z</value>
</Data>
<Data name="copyright">
<value>lib, 2019</value>
</Data>
</ExtendedData>
<Placemark>
<name>Monte Quemado</name>
<description>Argentina</description>
<ExtendedData/>
<Point>
<altitudeMode>clampToGround</altitudeMode>
<coordinates>-62.8666,-25.7996,10.2</coordinates>
</Point>
</Placemark>
<Placemark>
<name>Xining</name>
<description>China</description>
<ExtendedData/>
<Point>
<altitudeMode>clampToGround</altitudeMode>
<coordinates>101.77,36.62,10.2</coordinates>
</Point>
</Placemark>
<Placemark>
<name>route from London to Paris</name>
<ExtendedData/>
<LineString>
<extrude>1</extrude>
<tessellate>1</tessellate>
<altitudeMode>clampToGround</altitudeMode>
<coordinates>-0.1167,51.5,0.0
2.3333,48.8667,0.0</coordinates>
</LineString>
</Placemark>
<Placemark>
<name>route from Paris to Londan</name>
<ExtendedData/>
<LineString>
<extrude>1</extrude>
<tessellate>1</tessellate>
<altitudeMode>clampToGround</altitudeMode>
<coordinates>2.3333,48.8667,0.0
-0.1167,51.5,0.0</coordinates>
</LineString>
</Placemark>
<Placemark>
<name>route from London to Paris</name>
<ExtendedData/>
<LineString>
<extrude>1</extrude>
<tessellate>1</tessellate>
<altitudeMode>clampToGround</altitudeMode>
<coordinates>-0.1167,51.5,0.0
2.3333,48.8667,0.0</coordinates>
</LineString>
</Placemark>
<Placemark>
<name>route from Paris to Londan</name>
<ExtendedData/>
<LineString>
<extrude>1</extrude>
<tessellate>1</tessellate>
<altitudeMode>clampToGround</altitudeMode>
<coordinates>-0.1167,51.5,0.0
2.3333,48.8667,0.0</coordinates>
</LineString>
</Placemark>
</Document>
</kml>
11 changes: 11 additions & 0 deletions test/kml_writer_test.dart
Original file line number Diff line number Diff line change
@@ -52,6 +52,17 @@ void main() {
expectXml(KmlWriter().asString(gpx, pretty: true), xml);
});

test('write complex kml with altitudeMode', () async {
final gpx = createComplexGPX();
final xml =
await File('test/assets/complex_clampToGround.kml').readAsString();

expectXml(
KmlWriter(altitudeMode: AltitudeMode.clampToGround)
.asString(gpx, pretty: true),
xml);
});

test('write large kml', () async {
final gpx = GpxReader()
.fromString(await File('test/assets/large.gpx').readAsString());

0 comments on commit 83bf8ed

Please sign in to comment.