]> gitweb.michael.orlitzky.com - dead/census-tools.git/blobdiff - src/KML.py
Added a Coordinates class, and updated the LineString class to refer to Coordinates...
[dead/census-tools.git] / src / KML.py
index 3279c858f29d42c69f7e825529031f89b685f177..9b589ad582c0ac4f11c16a775222716bf7fa1d2f 100644 (file)
@@ -110,6 +110,75 @@ class Description(KmlObject):
 
 
 
+class Coordinates(KmlObject):
+
+    OPEN_TAG = '<coordinates>'
+    CLOSE_TAG = '</coordinates>'
+
+
+class LineString(KmlObject):
+
+    OPEN_TAG = '<LineString>'
+    CLOSE_TAG = '</LineString>'
+
+    @classmethod
+    def parse_linestrings(self, kml):
+        """
+        Parse each <LineString>...</LineString> block from the KML.
+        """
+        linestrings = []
+
+        search_idx = kml.find(self.OPEN_TAG, 0)
+
+        while (search_idx != -1):
+            # No reason to keep the tag around.
+            ls_start = search_idx + len(self.OPEN_TAG)
+            ls_tag_end = kml.find(self.CLOSE_TAG, ls_start)
+            ls = kml[ ls_start : ls_tag_end ]
+            linestrings.append(ls)
+            search_idx = kml.find(self.OPEN_TAG, (ls_tag_end + len(self.CLOSE_TAG)))
+
+        return linestrings
+
+
+    @classmethod
+    def parse_coordinates_from_linestrings(self, linestrings):
+        coords = []
+
+        for ls in linestrings:
+            c_tag_start = ls.find(Coordinates.OPEN_TAG)
+            c_start = c_tag_start + len(Coordinates.OPEN_TAG)
+            c_end = ls.find(Coordinates.CLOSE_TAG)
+            c = ls[ c_start : c_end ]
+            coords.append(c)
+
+        return coords
+
+
+    @classmethod
+    def tuples_from_kml(self, kml):
+        """
+        Parse one or more linestrings from a KML document.
+        Return a list of tuples.
+        """
+        ls = self.parse_linestrings(kml)
+        cs = self.parse_coordinates_from_linestrings(ls)
+
+        tuples = []
+
+        for c in cs:
+            pointstrings = c.strip().split()
+            for point in pointstrings:
+                components = point.strip().split(',')
+                if (len(components) >= 2):
+                    # Project the three-dimensional vector onto the
+                    # x-y plane. I don't think we're going to run
+                    # in to any linestrings in 3d.
+                    tuples.append( (float(components[0]), float(components[1])) )
+
+        return tuples
+
+
 class Name(KmlObject):
     
     OPEN_TAG = '<name>'