Added support for reverse=False in area.load_from_kml
authorJean-Michel Nirgal Vourgère <jmv@nirgal.com>
Mon, 10 Jan 2011 16:37:36 +0000 (16:37 +0000)
committerJean-Michel Nirgal Vourgère <jmv@nirgal.com>
Mon, 10 Jan 2011 16:37:36 +0000 (16:37 +0000)
bin/area.py

index c6ccf6f465d5ea61b4746603711de271998f1565..97ba9009f21fbf8791793c03a2301256a53e0649 100644 (file)
@@ -40,6 +40,14 @@ class Area:
         #elif point[1] > self.max[1]:
         #    self.max = (self.max[0], point[1])
 
+    def reverse(self):
+        '''
+        Invert the area
+        From clockwise to counter-clockwise
+        Or from counter-clockwise to clockwise
+        '''
+        self.points.reverse()
+
     def check(self):
         """
         Area library self-test: 
@@ -75,12 +83,13 @@ class Area:
                 return False
         return True
 
-def load_area_from_kml_polygon(filename):
+def load_area_from_kml_polygon(filename, reverse=False):
     """
     Loads a kml file into an Area structure.
     The kml must contains exacly 1 polyline structure.
     The first and last points must be the same.
     It must also be counter-clockwise and convex.
+    Actually, it may be clockwise, but then you need reverse=True.
 
     FIXME: This makes a lot of assumption about the way GoogleEarth output the
     XML file.
@@ -89,7 +98,7 @@ def load_area_from_kml_polygon(filename):
     coordinates_lines = [ line for line in kmlfile.readlines() if '</coordinates>' in line ]
     assert len(coordinates_lines) == 1, \
         'There should be exactly one line with coordinates in %s' % filename
-    coordinates = coordinates_lines[0].replace('</coordinates>', '').replace('\n', '').replace('\r', '')
+    coordinates = coordinates_lines[0].replace('</coordinates>', '').replace('\n', '').replace('\r', '').replace('\t', '')
     coordinates = [ xyz for xyz in coordinates.split(' ') if xyz ]
     assert coordinates[0] == coordinates[-1], \
         'First and last coordinates of %s should be the same: %s, %s' % \
@@ -100,6 +109,8 @@ def load_area_from_kml_polygon(filename):
     for xyz in coordinates[0:-1]:
         x, y, z = xyz.split(',')
         area.addpoint((float(y), float(x)))
+    if reverse:
+        area.reverse()
     assert area.check(), 'Polygon should be counter-clockwise and convex.'
     return area