1 package net.systemeD.potlatch2.utils {
3 import net.systemeD.halcyon.MapPaint;
4 import net.systemeD.halcyon.connection.Node;
5 import net.systemeD.halcyon.connection.Way;
6 import net.systemeD.halcyon.connection.Relation;
7 import net.systemeD.halcyon.connection.RelationMember;
8 import net.systemeD.potlatch2.tools.Simplify;
11 * Implements parsing and loading of KML files.
13 public class KmlImporter extends Importer {
15 public function KmlImporter(container:*, paint:MapPaint, filenames:Array, callback:Function=null, simplify:Boolean=false) {
16 super(container, paint, filenames, callback, simplify);
19 override protected function doImport(): void {
20 var kml:XML = new XML(files[0]);
22 for each (var ns:Namespace in kml.namespaceDeclarations()) {
24 (ns.uri.match(/^http:\/\/earth\.google\.com\/kml\/[0-9]+\.[0-9]+$/) ||
25 ns.uri.match(/^http:\/\/www\.opengis\.net\/kml\/[0-9]+\.[0-9]+$/)) {
26 default xml namespace = ns;
30 for each (var placemark:XML in kml..Placemark) {
33 if (placemark.name.length() > 0) {
34 tags["name"] = placemark.name;
37 if (placemark.description.length() > 0) {
38 tags["description"] = placemark.description;
41 for each (var point:XML in placemark.Point) {
42 importNode(point.coordinates, tags);
45 for each (var linestring:XML in placemark.LineString) {
46 importWay(linestring.coordinates, tags, false);
49 for each (var linearring:XML in placemark.LinearRing) {
50 importWay(linearring.coordinates, tags, true);
53 for each (var polygon:XML in placemark.Polygon) {
54 if (polygon.innerBoundaryIs.length() > 0) {
55 var members:Array = [];
58 way = importWay(polygon.outerBoundaryIs.LinearRing.coordinates, {}, true);
59 members.push(new RelationMember(way, "outer"));
61 for each (var inner:XML in polygon.innerBoundaryIs) {
62 way = importWay(inner.LinearRing.coordinates, {}, true);
63 members.push(new RelationMember(way, "inner"));
66 tags["type"] = "multipolygon";
68 container.createRelation(tags, members);
70 importWay(polygon.outerBoundaryIs.LinearRing.coordinates, tags, true);
74 default xml namespace = new Namespace("");
77 private function importNode(coordinates:String, tags:Object): Node {
78 var coords:Array = coordinates.split(",");
79 var lon:Number = coords[0];
80 var lat:Number = coords[1];
81 //var ele:Number = coords[2];
83 var node:Node = container.createNode(tags, lat, lon);
85 container.registerPOI(node);
90 private function importWay(coordinates:String, tags:Object, polygon:Boolean): Way {
92 var nodestring:Array = [];
95 coordinates = coordinates.slice(0, coordinates.lastIndexOf(" "));
98 for each (var tuple:String in coordinates.split(" ")) {
99 var coords:Array = tuple.split(",");
100 var lon:Number = coords[0];
101 var lat:Number = coords[1];
102 //var ele:Number = coords[2];
104 nodestring.push(container.createNode({}, lat, lon));
108 nodestring.push(nodestring[0]);
111 if (nodestring.length > 0) {
112 way = container.createWay(tags, nodestring);
113 if (simplify) { Simplify.simplify(way, paint.map, false); }