]> gitweb.michael.orlitzky.com - dead/census-tools.git/commitdiff
Merged branch 'master' with the to_kml() fix.
authorMichael Orlitzky <michael@orlitzky.com>
Sun, 25 Oct 2009 22:11:24 +0000 (18:11 -0400)
committerMichael Orlitzky <michael@orlitzky.com>
Sun, 25 Oct 2009 22:11:24 +0000 (18:11 -0400)
src/Geometry.py
src/KML.py

index 6c039a8e445a908acc290c9f06f8bf1a551bb96f..2bee60addc97ad27f6cde94d860336b1bf0d105d 100644 (file)
@@ -242,8 +242,9 @@ class Polygon:
         # Ex: POLYGON((1 1,5 1,5 5,1 5,1 1),(2 2, 3 2, 3 3, 2 3,2 2))
         if (text.lower().find('polygon') == -1):
             return None
-        
-        return shapely.wkt.loads(text)
+
+        sp = shapely.wkt.loads(text)
+        return Polygon.from_shapely(sp)
 
 
     def drag_rectangle(self, v):
index 3279c858f29d42c69f7e825529031f89b685f177..26e8e71d551437caa72617c52bdfe7ce41717774 100644 (file)
@@ -110,6 +110,69 @@ class Description(KmlObject):
 
 
 
+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>')
+            c_start = c_tag_start + len('<coordinates>')
+            c_end = ls.find('</coordinates>')
+            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>'