summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJustin Bronn <jbronn@gmail.com>2008-08-05 18:13:06 +0000
committerJustin Bronn <jbronn@gmail.com>2008-08-05 18:13:06 +0000
commit79e68c225b926302ebb29c808dda8afa49856f5c (patch)
tree56aca3de7ec557a3cfd519e84df812e3405b4eb2
parentd0f57e7c7385a112cb9e19d314352fc5ed5b0747 (diff)
Merged the gis branch into trunk.
git-svn-id: http://code.djangoproject.com/svn/django/trunk@8219 bcc190cf-cafb-0310-a4f2-bffc1f526a37
-rw-r--r--django/contrib/admin/media/img/gis/move_vertex_off.pngbin0 -> 711 bytes
-rw-r--r--django/contrib/admin/media/img/gis/move_vertex_on.pngbin0 -> 506 bytes
-rw-r--r--django/contrib/gis/__init__.py0
-rw-r--r--django/contrib/gis/admin/__init__.py12
-rw-r--r--django/contrib/gis/admin/options.py128
-rw-r--r--django/contrib/gis/admin/widgets.py92
-rw-r--r--django/contrib/gis/db/__init__.py0
-rw-r--r--django/contrib/gis/db/backend/__init__.py18
-rw-r--r--django/contrib/gis/db/backend/adaptor.py14
-rw-r--r--django/contrib/gis/db/backend/base.py29
-rw-r--r--django/contrib/gis/db/backend/mysql/__init__.py13
-rw-r--r--django/contrib/gis/db/backend/mysql/creation.py5
-rw-r--r--django/contrib/gis/db/backend/mysql/field.py53
-rw-r--r--django/contrib/gis/db/backend/mysql/query.py59
-rw-r--r--django/contrib/gis/db/backend/oracle/__init__.py31
-rw-r--r--django/contrib/gis/db/backend/oracle/adaptor.py5
-rw-r--r--django/contrib/gis/db/backend/oracle/creation.py8
-rw-r--r--django/contrib/gis/db/backend/oracle/field.py103
-rw-r--r--django/contrib/gis/db/backend/oracle/models.py49
-rw-r--r--django/contrib/gis/db/backend/oracle/query.py154
-rw-r--r--django/contrib/gis/db/backend/postgis/__init__.py42
-rw-r--r--django/contrib/gis/db/backend/postgis/adaptor.py33
-rw-r--r--django/contrib/gis/db/backend/postgis/creation.py224
-rw-r--r--django/contrib/gis/db/backend/postgis/field.py95
-rw-r--r--django/contrib/gis/db/backend/postgis/management.py54
-rw-r--r--django/contrib/gis/db/backend/postgis/models.py58
-rw-r--r--django/contrib/gis/db/backend/postgis/query.py287
-rw-r--r--django/contrib/gis/db/backend/util.py52
-rw-r--r--django/contrib/gis/db/models/__init__.py17
-rw-r--r--django/contrib/gis/db/models/fields/__init__.py214
-rw-r--r--django/contrib/gis/db/models/manager.py82
-rw-r--r--django/contrib/gis/db/models/mixin.py11
-rw-r--r--django/contrib/gis/db/models/proxy.py62
-rw-r--r--django/contrib/gis/db/models/query.py617
-rw-r--r--django/contrib/gis/db/models/sql/__init__.py2
-rw-r--r--django/contrib/gis/db/models/sql/query.py327
-rw-r--r--django/contrib/gis/db/models/sql/where.py64
-rw-r--r--django/contrib/gis/forms/__init__.py1
-rw-r--r--django/contrib/gis/forms/fields.py37
-rw-r--r--django/contrib/gis/gdal/LICENSE28
-rw-r--r--django/contrib/gis/gdal/__init__.py51
-rw-r--r--django/contrib/gis/gdal/datasource.py138
-rw-r--r--django/contrib/gis/gdal/driver.py66
-rw-r--r--django/contrib/gis/gdal/envelope.py134
-rw-r--r--django/contrib/gis/gdal/error.py41
-rw-r--r--django/contrib/gis/gdal/feature.py115
-rw-r--r--django/contrib/gis/gdal/field.py179
-rw-r--r--django/contrib/gis/gdal/geometries.py643
-rw-r--r--django/contrib/gis/gdal/geomtype.py73
-rw-r--r--django/contrib/gis/gdal/layer.py187
-rw-r--r--django/contrib/gis/gdal/libgdal.py83
-rw-r--r--django/contrib/gis/gdal/prototypes/__init__.py0
-rw-r--r--django/contrib/gis/gdal/prototypes/ds.py68
-rw-r--r--django/contrib/gis/gdal/prototypes/errcheck.py125
-rw-r--r--django/contrib/gis/gdal/prototypes/generation.py116
-rw-r--r--django/contrib/gis/gdal/prototypes/geom.py109
-rw-r--r--django/contrib/gis/gdal/prototypes/srs.py71
-rw-r--r--django/contrib/gis/gdal/srs.py360
-rw-r--r--django/contrib/gis/geos/LICENSE27
-rw-r--r--django/contrib/gis/geos/__init__.py69
-rw-r--r--django/contrib/gis/geos/base.py608
-rw-r--r--django/contrib/gis/geos/collections.py105
-rw-r--r--django/contrib/gis/geos/coordseq.py164
-rw-r--r--django/contrib/gis/geos/error.py20
-rw-r--r--django/contrib/gis/geos/geometries.py391
-rw-r--r--django/contrib/gis/geos/libgeos.py126
-rw-r--r--django/contrib/gis/geos/prototypes/__init__.py33
-rw-r--r--django/contrib/gis/geos/prototypes/coordseq.py82
-rw-r--r--django/contrib/gis/geos/prototypes/errcheck.py76
-rw-r--r--django/contrib/gis/geos/prototypes/geom.py111
-rw-r--r--django/contrib/gis/geos/prototypes/misc.py27
-rw-r--r--django/contrib/gis/geos/prototypes/predicates.py43
-rw-r--r--django/contrib/gis/geos/prototypes/topology.py35
-rw-r--r--django/contrib/gis/management/__init__.py0
-rw-r--r--django/contrib/gis/management/base.py15
-rw-r--r--django/contrib/gis/management/commands/__init__.py0
-rw-r--r--django/contrib/gis/management/commands/inspectdb.py190
-rw-r--r--django/contrib/gis/management/commands/ogrinspect.py119
-rw-r--r--django/contrib/gis/maps/__init__.py0
-rw-r--r--django/contrib/gis/maps/google/__init__.py61
-rw-r--r--django/contrib/gis/maps/google/gmap.py138
-rw-r--r--django/contrib/gis/maps/google/overlays.py220
-rw-r--r--django/contrib/gis/maps/google/zoom.py164
-rw-r--r--django/contrib/gis/maps/openlayers/__init__.py0
-rw-r--r--django/contrib/gis/measure.py329
-rw-r--r--django/contrib/gis/models.py284
-rw-r--r--django/contrib/gis/oldforms/__init__.py29
-rw-r--r--django/contrib/gis/shortcuts.py12
-rw-r--r--django/contrib/gis/sitemaps.py55
-rw-r--r--django/contrib/gis/templates/gis/admin/openlayers.html37
-rw-r--r--django/contrib/gis/templates/gis/admin/openlayers.js157
-rw-r--r--django/contrib/gis/templates/gis/admin/osm.html2
-rw-r--r--django/contrib/gis/templates/gis/admin/osm.js2
-rw-r--r--django/contrib/gis/templates/gis/google/js/google-map.js34
-rw-r--r--django/contrib/gis/templates/gis/kml/base.kml6
-rw-r--r--django/contrib/gis/templates/gis/kml/placemarks.kml8
-rw-r--r--django/contrib/gis/tests/__init__.py148
-rw-r--r--django/contrib/gis/tests/data/test_point/test_point.dbfbin0 -> 749 bytes
-rw-r--r--django/contrib/gis/tests/data/test_point/test_point.prj1
-rw-r--r--django/contrib/gis/tests/data/test_point/test_point.shpbin0 -> 240 bytes
-rw-r--r--django/contrib/gis/tests/data/test_point/test_point.shxbin0 -> 140 bytes
-rw-r--r--django/contrib/gis/tests/data/test_poly/test_poly.dbfbin0 -> 501 bytes
-rw-r--r--django/contrib/gis/tests/data/test_poly/test_poly.prj1
-rw-r--r--django/contrib/gis/tests/data/test_poly/test_poly.shpbin0 -> 620 bytes
-rw-r--r--django/contrib/gis/tests/data/test_poly/test_poly.shxbin0 -> 124 bytes
-rw-r--r--django/contrib/gis/tests/data/test_vrt/test_vrt.csv4
-rw-r--r--django/contrib/gis/tests/data/test_vrt/test_vrt.vrt7
-rw-r--r--django/contrib/gis/tests/distapp/__init__.py0
-rw-r--r--django/contrib/gis/tests/distapp/data.py33
-rw-r--r--django/contrib/gis/tests/distapp/models.py42
-rw-r--r--django/contrib/gis/tests/distapp/tests.py296
-rw-r--r--django/contrib/gis/tests/geoapp/__init__.py0
-rw-r--r--django/contrib/gis/tests/geoapp/models.py33
-rw-r--r--django/contrib/gis/tests/geoapp/sql/city.mysql.sql8
-rw-r--r--django/contrib/gis/tests/geoapp/sql/city.oracle.sql8
-rw-r--r--django/contrib/gis/tests/geoapp/sql/city.postgresql_psycopg2.sql8
-rw-r--r--django/contrib/gis/tests/geoapp/sql/co.wkt1
-rw-r--r--django/contrib/gis/tests/geoapp/sql/country.mysql.sql4
-rw-r--r--django/contrib/gis/tests/geoapp/sql/country.postgresql_psycopg2.sql4
-rw-r--r--django/contrib/gis/tests/geoapp/sql/ks.wkt1
-rw-r--r--django/contrib/gis/tests/geoapp/sql/nz.wkt1
-rw-r--r--django/contrib/gis/tests/geoapp/sql/state.mysql.sql5
-rw-r--r--django/contrib/gis/tests/geoapp/sql/state.postgresql_psycopg2.sql5
-rw-r--r--django/contrib/gis/tests/geoapp/sql/tx.wkt1
-rw-r--r--django/contrib/gis/tests/geoapp/tests.py564
-rw-r--r--django/contrib/gis/tests/geoapp/tests_mysql.py179
-rw-r--r--django/contrib/gis/tests/geometries.py157
-rw-r--r--django/contrib/gis/tests/layermap/__init__.py0
-rw-r--r--django/contrib/gis/tests/layermap/cities/cities.dbfbin0 -> 533 bytes
-rw-r--r--django/contrib/gis/tests/layermap/cities/cities.prj1
-rw-r--r--django/contrib/gis/tests/layermap/cities/cities.shpbin0 -> 184 bytes
-rw-r--r--django/contrib/gis/tests/layermap/cities/cities.shxbin0 -> 124 bytes
-rw-r--r--django/contrib/gis/tests/layermap/counties/counties.dbfbin0 -> 3961 bytes
-rw-r--r--django/contrib/gis/tests/layermap/counties/counties.shpbin0 -> 37364 bytes
-rw-r--r--django/contrib/gis/tests/layermap/counties/counties.shxbin0 -> 292 bytes
-rw-r--r--django/contrib/gis/tests/layermap/interstates/interstates.dbfbin0 -> 412 bytes
-rw-r--r--django/contrib/gis/tests/layermap/interstates/interstates.prj1
-rw-r--r--django/contrib/gis/tests/layermap/interstates/interstates.shpbin0 -> 892 bytes
-rw-r--r--django/contrib/gis/tests/layermap/interstates/interstates.shxbin0 -> 124 bytes
-rw-r--r--django/contrib/gis/tests/layermap/models.py52
-rw-r--r--django/contrib/gis/tests/layermap/tests.py249
-rw-r--r--django/contrib/gis/tests/relatedapp/__init__.py0
-rw-r--r--django/contrib/gis/tests/relatedapp/models.py12
-rw-r--r--django/contrib/gis/tests/relatedapp/tests.py98
-rw-r--r--django/contrib/gis/tests/relatedapp/tests_mysql.py1
-rw-r--r--django/contrib/gis/tests/test_gdal.py28
-rw-r--r--django/contrib/gis/tests/test_gdal_driver.py40
-rw-r--r--django/contrib/gis/tests/test_gdal_ds.py181
-rw-r--r--django/contrib/gis/tests/test_gdal_envelope.py45
-rw-r--r--django/contrib/gis/tests/test_gdal_geom.py403
-rw-r--r--django/contrib/gis/tests/test_gdal_srs.py169
-rw-r--r--django/contrib/gis/tests/test_geoip.py104
-rw-r--r--django/contrib/gis/tests/test_geos.py775
-rw-r--r--django/contrib/gis/tests/test_measure.py333
-rw-r--r--django/contrib/gis/tests/test_spatialrefsys.py90
-rw-r--r--django/contrib/gis/tests/utils.py22
-rw-r--r--django/contrib/gis/utils/__init__.py25
-rw-r--r--django/contrib/gis/utils/geoip.py344
-rw-r--r--django/contrib/gis/utils/layermapping.py677
-rw-r--r--django/contrib/gis/utils/ogrinfo.py53
-rw-r--r--django/contrib/gis/utils/ogrinspect.py225
-rw-r--r--django/contrib/gis/utils/srs.py27
-rw-r--r--django/contrib/gis/utils/wkt.py55
163 files changed, 14939 insertions, 0 deletions
diff --git a/django/contrib/admin/media/img/gis/move_vertex_off.png b/django/contrib/admin/media/img/gis/move_vertex_off.png
new file mode 100644
index 0000000000..296b2e29c9
--- /dev/null
+++ b/django/contrib/admin/media/img/gis/move_vertex_off.png
Binary files differ
diff --git a/django/contrib/admin/media/img/gis/move_vertex_on.png b/django/contrib/admin/media/img/gis/move_vertex_on.png
new file mode 100644
index 0000000000..21f4758d9c
--- /dev/null
+++ b/django/contrib/admin/media/img/gis/move_vertex_on.png
Binary files differ
diff --git a/django/contrib/gis/__init__.py b/django/contrib/gis/__init__.py
new file mode 100644
index 0000000000..e69de29bb2
--- /dev/null
+++ b/django/contrib/gis/__init__.py
diff --git a/django/contrib/gis/admin/__init__.py b/django/contrib/gis/admin/__init__.py
new file mode 100644
index 0000000000..20315c5c79
--- /dev/null
+++ b/django/contrib/gis/admin/__init__.py
@@ -0,0 +1,12 @@
+# Getting the normal admin routines, classes, and `site` instance.
+from django.contrib.admin import autodiscover, site, StackedInline, TabularInline, HORIZONTAL, VERTICAL
+
+# Geographic admin options classes and widgets.
+from django.contrib.gis.admin.options import GeoModelAdmin
+from django.contrib.gis.admin.widgets import OpenLayersWidget
+
+try:
+ from django.contrib.gis.admin.options import OSMGeoAdmin
+ HAS_OSM = True
+except ImportError:
+ HAS_OSM = False
diff --git a/django/contrib/gis/admin/options.py b/django/contrib/gis/admin/options.py
new file mode 100644
index 0000000000..71fb87bf09
--- /dev/null
+++ b/django/contrib/gis/admin/options.py
@@ -0,0 +1,128 @@
+from django.conf import settings
+from django.contrib.admin import ModelAdmin
+from django.contrib.gis.admin.widgets import OpenLayersWidget
+from django.contrib.gis.gdal import OGRGeomType
+from django.contrib.gis.db import models
+
+class GeoModelAdmin(ModelAdmin):
+ """
+ The administration options class for Geographic models. Map settings
+ may be overloaded from their defaults to create custom maps.
+ """
+ # The default map settings that may be overloaded -- still subject
+ # to API changes.
+ default_lon = 0
+ default_lat = 0
+ default_zoom = 4
+ display_wkt = False
+ display_srid = False
+ extra_js = []
+ num_zoom = 18
+ max_zoom = False
+ min_zoom = False
+ units = False
+ max_resolution = False
+ max_extent = False
+ modifiable = True
+ mouse_position = True
+ scale_text = True
+ layerswitcher = True
+ scrollable = True
+ admin_media_prefix = settings.ADMIN_MEDIA_PREFIX
+ map_width = 600
+ map_height = 400
+ map_srid = 4326
+ map_template = 'gis/admin/openlayers.html'
+ openlayers_url = 'http://openlayers.org/api/2.6/OpenLayers.js'
+ wms_url = 'http://labs.metacarta.com/wms/vmap0'
+ wms_layer = 'basic'
+ wms_name = 'OpenLayers WMS'
+ debug = False
+ widget = OpenLayersWidget
+
+ def _media(self):
+ "Injects OpenLayers JavaScript into the admin."
+ media = super(GeoModelAdmin, self)._media()
+ media.add_js([self.openlayers_url])
+ media.add_js(self.extra_js)
+ return media
+ media = property(_media)
+
+ def formfield_for_dbfield(self, db_field, **kwargs):
+ """
+ Overloaded from ModelAdmin so that an OpenLayersWidget is used
+ for viewing/editing GeometryFields.
+ """
+ if isinstance(db_field, models.GeometryField):
+ # Setting the widget with the newly defined widget.
+ kwargs['widget'] = self.get_map_widget(db_field)
+ return db_field.formfield(**kwargs)
+ else:
+ return super(GeoModelAdmin, self).formfield_for_dbfield(db_field, **kwargs)
+
+ def get_map_widget(self, db_field):
+ """
+ Returns a subclass of the OpenLayersWidget (or whatever was specified
+ in the `widget` attribute) using the settings from the attributes set
+ in this class.
+ """
+ is_collection = db_field._geom in ('MULTIPOINT', 'MULTILINESTRING', 'MULTIPOLYGON', 'GEOMETRYCOLLECTION')
+ if is_collection:
+ if db_field._geom == 'GEOMETRYCOLLECTION': collection_type = 'Any'
+ else: collection_type = OGRGeomType(db_field._geom.replace('MULTI', ''))
+ else:
+ collection_type = 'None'
+
+ class OLMap(self.widget):
+ template = self.map_template
+ geom_type = db_field._geom
+ params = {'admin_media_prefix' : self.admin_media_prefix,
+ 'default_lon' : self.default_lon,
+ 'default_lat' : self.default_lat,
+ 'default_zoom' : self.default_zoom,
+ 'display_wkt' : self.debug or self.display_wkt,
+ 'geom_type' : OGRGeomType(db_field._geom),
+ 'field_name' : db_field.name,
+ 'is_collection' : is_collection,
+ 'scrollable' : self.scrollable,
+ 'layerswitcher' : self.layerswitcher,
+ 'collection_type' : collection_type,
+ 'is_linestring' : db_field._geom in ('LINESTRING', 'MULTILINESTRING'),
+ 'is_polygon' : db_field._geom in ('POLYGON', 'MULTIPOLYGON'),
+ 'is_point' : db_field._geom in ('POINT', 'MULTIPOINT'),
+ 'num_zoom' : self.num_zoom,
+ 'max_zoom' : self.max_zoom,
+ 'min_zoom' : self.min_zoom,
+ 'units' : self.units, #likely shoud get from object
+ 'max_resolution' : self.max_resolution,
+ 'max_extent' : self.max_extent,
+ 'modifiable' : self.modifiable,
+ 'mouse_position' : self.mouse_position,
+ 'scale_text' : self.scale_text,
+ 'map_width' : self.map_width,
+ 'map_height' : self.map_height,
+ 'srid' : self.map_srid,
+ 'display_srid' : self.display_srid,
+ 'wms_url' : self.wms_url,
+ 'wms_layer' : self.wms_layer,
+ 'wms_name' : self.wms_name,
+ 'debug' : self.debug,
+ }
+ return OLMap
+
+# Using the Beta OSM in the admin requires the following:
+# (1) The Google Maps Mercator projection needs to be added
+# to your `spatial_ref_sys` table. You'll need at least GDAL 1.5:
+# >>> from django.contrib.gis.gdal import SpatialReference
+# >>> from django.contrib.gis.utils import add_postgis_srs
+# >>> add_postgis_srs(SpatialReference(900913)) # Adding the Google Projection
+from django.contrib.gis import gdal
+if gdal.HAS_GDAL:
+ class OSMGeoAdmin(GeoModelAdmin):
+ map_template = 'gis/admin/osm.html'
+ extra_js = ['http://openstreetmap.org/openlayers/OpenStreetMap.js']
+ num_zoom = 20
+ map_srid = 900913
+ max_extent = '-20037508,-20037508,20037508,20037508'
+ max_resolution = 156543.0339
+ units = 'm'
diff --git a/django/contrib/gis/admin/widgets.py b/django/contrib/gis/admin/widgets.py
new file mode 100644
index 0000000000..27abc8f59b
--- /dev/null
+++ b/django/contrib/gis/admin/widgets.py
@@ -0,0 +1,92 @@
+from django.contrib.gis.gdal import OGRException
+from django.contrib.gis.geos import GEOSGeometry, GEOSException
+from django.forms.widgets import Textarea
+from django.template.loader import render_to_string
+
+class OpenLayersWidget(Textarea):
+ """
+ Renders an OpenLayers map using the WKT of the geometry.
+ """
+ def render(self, name, value, attrs=None):
+ # Update the template parameters with any attributes passed in.
+ if attrs: self.params.update(attrs)
+
+ # Defaulting the WKT value to a blank string -- this
+ # will be tested in the JavaScript and the appropriate
+ # interfaace will be constructed.
+ self.params['wkt'] = ''
+
+ # If a string reaches here (via a validation error on another
+ # field) then just reconstruct the Geometry.
+ if isinstance(value, basestring):
+ try:
+ value = GEOSGeometry(value)
+ except (GEOSException, ValueError):
+ value = None
+
+ if value and value.geom_type.upper() != self.geom_type:
+ value = None
+
+ # Constructing the dictionary of the map options.
+ self.params['map_options'] = self.map_options()
+
+ # Constructing the JavaScript module name using the ID of
+ # the GeometryField (passed in via the `attrs` keyword).
+ self.params['module'] = 'geodjango_%s' % self.params['field_name']
+
+ if value:
+ # Transforming the geometry to the projection used on the
+ # OpenLayers map.
+ srid = self.params['srid']
+ if value.srid != srid:
+ try:
+ value.transform(srid)
+ wkt = value.wkt
+ except OGRException:
+ wkt = ''
+ else:
+ wkt = value.wkt
+
+ # Setting the parameter WKT with that of the transformed
+ # geometry.
+ self.params['wkt'] = wkt
+
+ return render_to_string(self.template, self.params)
+
+ def map_options(self):
+ "Builds the map options hash for the OpenLayers template."
+
+ # JavaScript construction utilities for the Bounds and Projection.
+ def ol_bounds(extent):
+ return 'new OpenLayers.Bounds(%s)' % str(extent)
+ def ol_projection(srid):
+ return 'new OpenLayers.Projection("EPSG:%s")' % srid
+
+ # An array of the parameter name, the name of their OpenLayers
+ # counterpart, and the type of variable they are.
+ map_types = [('srid', 'projection', 'srid'),
+ ('display_srid', 'displayProjection', 'srid'),
+ ('units', 'units', str),
+ ('max_resolution', 'maxResolution', float),
+ ('max_extent', 'maxExtent', 'bounds'),
+ ('num_zoom', 'numZoomLevels', int),
+ ('max_zoom', 'maxZoomLevels', int),
+ ('min_zoom', 'minZoomLevel', int),
+ ]
+
+ # Building the map options hash.
+ map_options = {}
+ for param_name, js_name, option_type in map_types:
+ if self.params.get(param_name, False):
+ if option_type == 'srid':
+ value = ol_projection(self.params[param_name])
+ elif option_type == 'bounds':
+ value = ol_bounds(self.params[param_name])
+ elif option_type in (float, int):
+ value = self.params[param_name]
+ elif option_type in (str,):
+ value = '"%s"' % self.params[param_name]
+ else:
+ raise TypeError
+ map_options[js_name] = value
+ return map_options
diff --git a/django/contrib/gis/db/__init__.py b/django/contrib/gis/db/__init__.py
new file mode 100644
index 0000000000..e69de29bb2
--- /dev/null
+++ b/django/contrib/gis/db/__init__.py
diff --git a/django/contrib/gis/db/backend/__init__.py b/django/contrib/gis/db/backend/__init__.py
new file mode 100644
index 0000000000..172c1268a7
--- /dev/null
+++ b/django/contrib/gis/db/backend/__init__.py
@@ -0,0 +1,18 @@
+"""
+ This module provides the backend for spatial SQL construction with Django.
+
+ Specifically, this module will import the correct routines and modules
+ needed for GeoDjango to interface with the spatial database.
+"""
+from django.conf import settings
+from django.contrib.gis.db.backend.util import gqn
+
+# Retrieving the necessary settings from the backend.
+if settings.DATABASE_ENGINE == 'postgresql_psycopg2':
+ from django.contrib.gis.db.backend.postgis import create_spatial_db, get_geo_where_clause, SpatialBackend
+elif settings.DATABASE_ENGINE == 'oracle':
+ from django.contrib.gis.db.backend.oracle import create_spatial_db, get_geo_where_clause, SpatialBackend
+elif settings.DATABASE_ENGINE == 'mysql':
+ from django.contrib.gis.db.backend.mysql import create_spatial_db, get_geo_where_clause, SpatialBackend
+else:
+ raise NotImplementedError('No Geographic Backend exists for %s' % settings.DATABASE_ENGINE)
diff --git a/django/contrib/gis/db/backend/adaptor.py b/django/contrib/gis/db/backend/adaptor.py
new file mode 100644
index 0000000000..b2397e61dd
--- /dev/null
+++ b/django/contrib/gis/db/backend/adaptor.py
@@ -0,0 +1,14 @@
+class WKTAdaptor(object):
+ """
+ This provides an adaptor for Geometries sent to the
+ MySQL and Oracle database backends.
+ """
+ def __init__(self, geom):
+ self.wkt = geom.wkt
+ self.srid = geom.srid
+
+ def __eq__(self, other):
+ return self.wkt == other.wkt and self.srid == other.srid
+
+ def __str__(self):
+ return self.wkt
diff --git a/django/contrib/gis/db/backend/base.py b/django/contrib/gis/db/backend/base.py
new file mode 100644
index 0000000000..d45ac7b6f1
--- /dev/null
+++ b/django/contrib/gis/db/backend/base.py
@@ -0,0 +1,29 @@
+"""
+ This module holds the base `SpatialBackend` object, which is
+ instantiated by each spatial backend with the features it has.
+"""
+# TODO: Create a `Geometry` protocol and allow user to use
+# different Geometry objects -- for now we just use GEOSGeometry.
+from django.contrib.gis.geos import GEOSGeometry, GEOSException
+
+class BaseSpatialBackend(object):
+ Geometry = GEOSGeometry
+ GeometryException = GEOSException
+
+ def __init__(self, **kwargs):
+ kwargs.setdefault('distance_functions', {})
+ kwargs.setdefault('limited_where', {})
+ for k, v in kwargs.iteritems(): setattr(self, k, v)
+
+ def __getattr__(self, name):
+ """
+ All attributes of the spatial backend return False by default.
+ """
+ try:
+ return self.__dict__[name]
+ except KeyError:
+ return False
+
+
+
+
diff --git a/django/contrib/gis/db/backend/mysql/__init__.py b/django/contrib/gis/db/backend/mysql/__init__.py
new file mode 100644
index 0000000000..0484e5f9b2
--- /dev/null
+++ b/django/contrib/gis/db/backend/mysql/__init__.py
@@ -0,0 +1,13 @@
+__all__ = ['create_spatial_db', 'get_geo_where_clause', 'SpatialBackend']
+
+from django.contrib.gis.db.backend.base import BaseSpatialBackend
+from django.contrib.gis.db.backend.adaptor import WKTAdaptor
+from django.contrib.gis.db.backend.mysql.creation import create_spatial_db
+from django.contrib.gis.db.backend.mysql.field import MySQLGeoField
+from django.contrib.gis.db.backend.mysql.query import *
+
+SpatialBackend = BaseSpatialBackend(name='mysql', mysql=True,
+ gis_terms=MYSQL_GIS_TERMS,
+ select=GEOM_SELECT,
+ Adaptor=WKTAdaptor,
+ Field=MySQLGeoField)
diff --git a/django/contrib/gis/db/backend/mysql/creation.py b/django/contrib/gis/db/backend/mysql/creation.py
new file mode 100644
index 0000000000..e8f471df81
--- /dev/null
+++ b/django/contrib/gis/db/backend/mysql/creation.py
@@ -0,0 +1,5 @@
+from django.test.utils import create_test_db
+
+def create_spatial_db(test=True, verbosity=1, autoclobber=False):
+ if not test: raise NotImplementedError('This uses `create_test_db` from test/utils.py')
+ create_test_db(verbosity, autoclobber)
diff --git a/django/contrib/gis/db/backend/mysql/field.py b/django/contrib/gis/db/backend/mysql/field.py
new file mode 100644
index 0000000000..f3151f93ff
--- /dev/null
+++ b/django/contrib/gis/db/backend/mysql/field.py
@@ -0,0 +1,53 @@
+from django.db import connection
+from django.db.models.fields import Field # Django base Field class
+from django.contrib.gis.db.backend.mysql.query import GEOM_FROM_TEXT
+
+# Quotename & geographic quotename, respectively.
+qn = connection.ops.quote_name
+
+class MySQLGeoField(Field):
+ """
+ The backend-specific geographic field for MySQL.
+ """
+
+ def _geom_index(self, style, db_table):
+ """
+ Creates a spatial index for the geometry column. If MyISAM tables are
+ used an R-Tree index is created, otherwise a B-Tree index is created.
+ Thus, for best spatial performance, you should use MyISAM tables
+ (which do not support transactions). For more information, see Ch.
+ 16.6.1 of the MySQL 5.0 documentation.
+ """
+
+ # Getting the index name.
+ idx_name = '%s_%s_id' % (db_table, self.column)
+
+ sql = style.SQL_KEYWORD('CREATE SPATIAL INDEX ') + \
+ style.SQL_TABLE(qn(idx_name)) + \
+ style.SQL_KEYWORD(' ON ') + \
+ style.SQL_TABLE(qn(db_table)) + '(' + \
+ style.SQL_FIELD(qn(self.column)) + ');'
+ return sql
+
+ def _post_create_sql(self, style, db_table):
+ """
+ Returns SQL that will be executed after the model has been
+ created.
+ """
+ # Getting the geometric index for this Geometry column.
+ if self._index:
+ return (self._geom_index(style, db_table),)
+ else:
+ return ()
+
+ def db_type(self):
+ "The OpenGIS name is returned for the MySQL database column type."
+ return self._geom
+
+ def get_placeholder(self, value):
+ """
+ The placeholder here has to include MySQL's WKT constructor. Because
+ MySQL does not support spatial transformations, there is no need to
+ modify the placeholder based on the contents of the given value.
+ """
+ return '%s(%%s)' % GEOM_FROM_TEXT
diff --git a/django/contrib/gis/db/backend/mysql/query.py b/django/contrib/gis/db/backend/mysql/query.py
new file mode 100644
index 0000000000..6522235135
--- /dev/null
+++ b/django/contrib/gis/db/backend/mysql/query.py
@@ -0,0 +1,59 @@
+"""
+ This module contains the spatial lookup types, and the `get_geo_where_clause`
+ routine for MySQL.
+
+ Please note that MySQL only supports bounding box queries, also
+ known as MBRs (Minimum Bounding Rectangles). Moreover, spatial
+ indices may only be used on MyISAM tables -- if you need
+ transactions, take a look at PostGIS.
+"""
+from django.db import connection
+qn = connection.ops.quote_name
+
+# To ease implementation, WKT is passed to/from MySQL.
+GEOM_FROM_TEXT = 'GeomFromText'
+GEOM_FROM_WKB = 'GeomFromWKB'
+GEOM_SELECT = 'AsText(%s)'
+
+# WARNING: MySQL is NOT compliant w/the OpenGIS specification and
+# _every_ one of these lookup types is on the _bounding box_ only.
+MYSQL_GIS_FUNCTIONS = {
+ 'bbcontains' : 'MBRContains', # For consistency w/PostGIS API
+ 'bboverlaps' : 'MBROverlaps', # .. ..
+ 'contained' : 'MBRWithin', # .. ..
+ 'contains' : 'MBRContains',
+ 'disjoint' : 'MBRDisjoint',
+ 'equals' : 'MBREqual',
+ 'exact' : 'MBREqual',
+ 'intersects' : 'MBRIntersects',
+ 'overlaps' : 'MBROverlaps',
+ 'same_as' : 'MBREqual',
+ 'touches' : 'MBRTouches',
+ 'within' : 'MBRWithin',
+ }
+
+# This lookup type does not require a mapping.
+MISC_TERMS = ['isnull']
+
+# Assacceptable lookup types for Oracle spatial.
+MYSQL_GIS_TERMS = MYSQL_GIS_FUNCTIONS.keys()
+MYSQL_GIS_TERMS += MISC_TERMS
+MYSQL_GIS_TERMS = dict((term, None) for term in MYSQL_GIS_TERMS) # Making dictionary
+
+def get_geo_where_clause(table_alias, name, lookup_type, geo_annot):
+ "Returns the SQL WHERE clause for use in MySQL spatial SQL construction."
+ # Getting the quoted field as `geo_col`.
+ geo_col = '%s.%s' % (qn(table_alias), qn(name))
+
+ # See if a MySQL Geometry function matches the lookup type next
+ lookup_info = MYSQL_GIS_FUNCTIONS.get(lookup_type, False)
+ if lookup_info:
+ return "%s(%s, %%s)" % (lookup_info, geo_col)
+
+ # Handling 'isnull' lookup type
+ # TODO: Is this needed because MySQL cannot handle NULL
+ # geometries in its spatial indices.
+ if lookup_type == 'isnull':
+ return "%s IS %sNULL" % (geo_col, (not geo_annot.value and 'NOT ' or ''))
+
+ raise TypeError("Got invalid lookup_type: %s" % repr(lookup_type))
diff --git a/django/contrib/gis/db/backend/oracle/__init__.py b/django/contrib/gis/db/backend/oracle/__init__.py
new file mode 100644
index 0000000000..3eee56ea23
--- /dev/null
+++ b/django/contrib/gis/db/backend/oracle/__init__.py
@@ -0,0 +1,31 @@
+__all__ = ['create_spatial_db', 'get_geo_where_clause', 'SpatialBackend']
+
+from django.contrib.gis.db.backend.base import BaseSpatialBackend
+from django.contrib.gis.db.backend.oracle.adaptor import OracleSpatialAdaptor
+from django.contrib.gis.db.backend.oracle.creation import create_spatial_db
+from django.contrib.gis.db.backend.oracle.field import OracleSpatialField
+from django.contrib.gis.db.backend.oracle.query import *
+
+SpatialBackend = BaseSpatialBackend(name='oracle', oracle=True,
+ area=AREA,
+ centroid=CENTROID,
+ difference=DIFFERENCE,
+ distance=DISTANCE,
+ distance_functions=DISTANCE_FUNCTIONS,
+ gis_terms=ORACLE_SPATIAL_TERMS,
+ gml=ASGML,
+ intersection=INTERSECTION,
+ length=LENGTH,
+ limited_where = {'relate' : None},
+ num_geom=NUM_GEOM,
+ num_points=NUM_POINTS,
+ perimeter=LENGTH,
+ point_on_surface=POINT_ON_SURFACE,
+ select=GEOM_SELECT,
+ sym_difference=SYM_DIFFERENCE,
+ transform=TRANSFORM,
+ unionagg=UNIONAGG,
+ union=UNION,
+ Adaptor=OracleSpatialAdaptor,
+ Field=OracleSpatialField,
+ )
diff --git a/django/contrib/gis/db/backend/oracle/adaptor.py b/django/contrib/gis/db/backend/oracle/adaptor.py
new file mode 100644
index 0000000000..95dc265795
--- /dev/null
+++ b/django/contrib/gis/db/backend/oracle/adaptor.py
@@ -0,0 +1,5 @@
+from cx_Oracle import CLOB
+from django.contrib.gis.db.backend.adaptor import WKTAdaptor
+
+class OracleSpatialAdaptor(WKTAdaptor):
+ input_size = CLOB
diff --git a/django/contrib/gis/db/backend/oracle/creation.py b/django/contrib/gis/db/backend/oracle/creation.py
new file mode 100644
index 0000000000..4a05da7ec1
--- /dev/null
+++ b/django/contrib/gis/db/backend/oracle/creation.py
@@ -0,0 +1,8 @@
+from django.db.backends.oracle.creation import create_test_db
+
+def create_spatial_db(test=True, verbosity=1, autoclobber=False):
+ "A wrapper over the Oracle `create_test_db` routine."
+ if not test: raise NotImplementedError('This uses `create_test_db` from db/backends/oracle/creation.py')
+ from django.conf import settings
+ from django.db import connection
+ create_test_db(settings, connection, verbosity, autoclobber)
diff --git a/django/contrib/gis/db/backend/oracle/field.py b/django/contrib/gis/db/backend/oracle/field.py
new file mode 100644
index 0000000000..22625f5e10
--- /dev/null
+++ b/django/contrib/gis/db/backend/oracle/field.py
@@ -0,0 +1,103 @@
+from django.db import connection
+from django.db.backends.util import truncate_name
+from django.db.models.fields import Field # Django base Field class
+from django.contrib.gis.db.backend.util import gqn
+from django.contrib.gis.db.backend.oracle.query import TRANSFORM
+
+# Quotename & geographic quotename, respectively.
+qn = connection.ops.quote_name
+
+class OracleSpatialField(Field):
+ """
+ The backend-specific geographic field for Oracle Spatial.
+ """
+
+ empty_strings_allowed = False
+
+ def __init__(self, extent=(-180.0, -90.0, 180.0, 90.0), tolerance=0.05, **kwargs):
+ """
+ Oracle Spatial backend needs to have the extent -- for projected coordinate
+ systems _you must define the extent manually_, since the coordinates are
+ for geodetic systems. The `tolerance` keyword specifies the tolerance
+ for error (in meters), and defaults to 0.05 (5 centimeters).
+ """
+ # Oracle Spatial specific keyword arguments.
+ self._extent = extent
+ self._tolerance = tolerance
+ # Calling the Django field initialization.
+ super(OracleSpatialField, self).__init__(**kwargs)
+
+ def _add_geom(self, style, db_table):
+ """
+ Adds this geometry column into the Oracle USER_SDO_GEOM_METADATA
+ table.
+ """
+
+ # Checking the dimensions.
+ # TODO: Add support for 3D geometries.
+ if self._dim != 2:
+ raise Exception('3D geometries not yet supported on Oracle Spatial backend.')
+
+ # Constructing the SQL that will be used to insert information about
+ # the geometry column into the USER_GSDO_GEOM_METADATA table.
+ meta_sql = style.SQL_KEYWORD('INSERT INTO ') + \
+ style.SQL_TABLE('USER_SDO_GEOM_METADATA') + \
+ ' (%s, %s, %s, %s)\n ' % tuple(map(qn, ['TABLE_NAME', 'COLUMN_NAME', 'DIMINFO', 'SRID'])) + \
+ style.SQL_KEYWORD(' VALUES ') + '(\n ' + \
+ style.SQL_TABLE(gqn(db_table)) + ',\n ' + \
+ style.SQL_FIELD(gqn(self.column)) + ',\n ' + \
+ style.SQL_KEYWORD("MDSYS.SDO_DIM_ARRAY") + '(\n ' + \
+ style.SQL_KEYWORD("MDSYS.SDO_DIM_ELEMENT") + \
+ ("('LONG', %s, %s, %s),\n " % (self._extent[0], self._extent[2], self._tolerance)) + \
+ style.SQL_KEYWORD("MDSYS.SDO_DIM_ELEMENT") + \
+ ("('LAT', %s, %s, %s)\n ),\n" % (self._extent[1], self._extent[3], self._tolerance)) + \
+ ' %s\n );' % self._srid
+ return meta_sql
+
+ def _geom_index(self, style, db_table):
+ "Creates an Oracle Geometry index (R-tree) for this geometry field."
+
+ # Getting the index name, Oracle doesn't allow object
+ # names > 30 characters.
+ idx_name = truncate_name('%s_%s_id' % (db_table, self.column), 30)
+
+ sql = style.SQL_KEYWORD('CREATE INDEX ') + \
+ style.SQL_TABLE(qn(idx_name)) + \
+ style.SQL_KEYWORD(' ON ') + \
+ style.SQL_TABLE(qn(db_table)) + '(' + \
+ style.SQL_FIELD(qn(self.column)) + ') ' + \
+ style.SQL_KEYWORD('INDEXTYPE IS ') + \
+ style.SQL_TABLE('MDSYS.SPATIAL_INDEX') + ';'
+ return sql
+
+ def post_create_sql(self, style, db_table):
+ """
+ Returns SQL that will be executed after the model has been
+ created.
+ """
+ # Getting the meta geometry information.
+ post_sql = self._add_geom(style, db_table)
+
+ # Getting the geometric index for this Geometry column.
+ if self._index:
+ return (post_sql, self._geom_index(style, db_table))
+ else:
+ return (post_sql,)
+
+ def db_type(self):
+ "The Oracle geometric data type is MDSYS.SDO_GEOMETRY."
+ return 'MDSYS.SDO_GEOMETRY'
+
+ def get_placeholder(self, value):
+ """
+ Provides a proper substitution value for Geometries that are not in the
+ SRID of the field. Specifically, this routine will substitute in the
+ SDO_CS.TRANSFORM() function call.
+ """
+ if value is None:
+ return '%s'
+ elif value.srid != self._srid:
+ # Adding Transform() to the SQL placeholder.
+ return '%s(SDO_GEOMETRY(%%s, %s), %s)' % (TRANSFORM, value.srid, self._srid)
+ else:
+ return 'SDO_GEOMETRY(%%s, %s)' % self._srid
diff --git a/django/contrib/gis/db/backend/oracle/models.py b/django/contrib/gis/db/backend/oracle/models.py
new file mode 100644
index 0000000000..c740b48efe
--- /dev/null
+++ b/django/contrib/gis/db/backend/oracle/models.py
@@ -0,0 +1,49 @@
+"""
+ The GeometryColumns and SpatialRefSys models for the Oracle spatial
+ backend.
+
+ It should be noted that Oracle Spatial does not have database tables
+ named according to the OGC standard, so the closest analogs are used.
+ For example, the `USER_SDO_GEOM_METADATA` is used for the GeometryColumns
+ model and the `SDO_COORD_REF_SYS` is used for the SpatialRefSys model.
+"""
+from django.db import models
+from django.contrib.gis.models import SpatialRefSysMixin
+
+class GeometryColumns(models.Model):
+ "Maps to the Oracle USER_SDO_GEOM_METADATA table."
+ table_name = models.CharField(max_length=32)
+ column_name = models.CharField(max_length=1024)
+ srid = models.IntegerField(primary_key=True)
+ # TODO: Add support for `diminfo` column (type MDSYS.SDO_DIM_ARRAY).
+ class Meta:
+ db_table = 'USER_SDO_GEOM_METADATA'
+
+ @classmethod
+ def table_name_col(cls):
+ return 'table_name'
+
+ def __unicode__(self):
+ return '%s - %s (SRID: %s)' % (self.table_name, self.column_name, self.srid)
+
+class SpatialRefSys(models.Model, SpatialRefSysMixin):
+ "Maps to the Oracle MDSYS.CS_SRS table."
+ cs_name = models.CharField(max_length=68)
+ srid = models.IntegerField(primary_key=True)
+ auth_srid = models.IntegerField()
+ auth_name = models.CharField(max_length=256)
+ wktext = models.CharField(max_length=2046)
+ #cs_bounds = models.GeometryField()
+
+ class Meta:
+ # TODO: Figure out way to have this be MDSYS.CS_SRS without
+ # having django's quoting mess up the SQL.
+ db_table = 'CS_SRS'
+
+ @property
+ def wkt(self):
+ return self.wktext
+
+ @classmethod
+ def wkt_col(cls):
+ return 'wktext'
diff --git a/django/contrib/gis/db/backend/oracle/query.py b/django/contrib/gis/db/backend/oracle/query.py
new file mode 100644
index 0000000000..35e30d40eb
--- /dev/null
+++ b/django/contrib/gis/db/backend/oracle/query.py
@@ -0,0 +1,154 @@
+"""
+ This module contains the spatial lookup types, and the `get_geo_where_clause`
+ routine for Oracle Spatial.
+
+ Please note that WKT support is broken on the XE version, and thus
+ this backend will not work on such platforms. Specifically, XE lacks
+ support for an internal JVM, and Java libraries are required to use
+ the WKT constructors.
+"""
+import re
+from decimal import Decimal
+from django.db import connection
+from django.contrib.gis.db.backend.util import SpatialFunction
+from django.contrib.gis.measure import Distance
+qn = connection.ops.quote_name
+
+# The GML, distance, transform, and union procedures.
+AREA = 'SDO_GEOM.SDO_AREA'
+ASGML = 'SDO_UTIL.TO_GMLGEOMETRY'
+CENTROID = 'SDO_GEOM.SDO_CENTROID'
+DIFFERENCE = 'SDO_GEOM.SDO_DIFFERENCE'
+DISTANCE = 'SDO_GEOM.SDO_DISTANCE'
+EXTENT = 'SDO_AGGR_MBR'
+INTERSECTION = 'SDO_GEOM.SDO_INTERSECTION'
+LENGTH = 'SDO_GEOM.SDO_LENGTH'
+NUM_GEOM = 'SDO_UTIL.GETNUMELEM'
+NUM_POINTS = 'SDO_UTIL.GETNUMVERTICES'
+POINT_ON_SURFACE = 'SDO_GEOM.SDO_POINTONSURFACE'
+SYM_DIFFERENCE = 'SDO_GEOM.SDO_XOR'
+TRANSFORM = 'SDO_CS.TRANSFORM'
+UNION = 'SDO_GEOM.SDO_UNION'
+UNIONAGG = 'SDO_AGGR_UNION'
+
+# We want to get SDO Geometries as WKT because it is much easier to
+# instantiate GEOS proxies from WKT than SDO_GEOMETRY(...) strings.
+# However, this adversely affects performance (i.e., Java is called
+# to convert to WKT on every query). If someone wishes to write a
+# SDO_GEOMETRY(...) parser in Python, let me know =)
+GEOM_SELECT = 'SDO_UTIL.TO_WKTGEOMETRY(%s)'
+
+#### Classes used in constructing Oracle spatial SQL ####
+class SDOOperation(SpatialFunction):
+ "Base class for SDO* Oracle operations."
+ def __init__(self, func, **kwargs):
+ kwargs.setdefault('operator', '=')
+ kwargs.setdefault('result', 'TRUE')
+ kwargs.setdefault('end_subst', ") %s '%s'")
+ super(SDOOperation, self).__init__(func, **kwargs)
+
+class SDODistance(SpatialFunction):
+ "Class for Distance queries."
+ def __init__(self, op, tolerance=0.05):
+ super(SDODistance, self).__init__(DISTANCE, end_subst=', %s) %%s %%s' % tolerance,
+ operator=op, result='%%s')
+
+class SDOGeomRelate(SpatialFunction):
+ "Class for using SDO_GEOM.RELATE."
+ def __init__(self, mask, tolerance=0.05):
+ # SDO_GEOM.RELATE(...) has a peculiar argument order: column, mask, geom, tolerance.
+ # Moreover, the runction result is the mask (e.g., 'DISJOINT' instead of 'TRUE').
+ end_subst = "%s%s) %s '%s'" % (', %%s, ', tolerance, '=', mask)
+ beg_subst = "%%s(%%s, '%s'" % mask
+ super(SDOGeomRelate, self).__init__('SDO_GEOM.RELATE', beg_subst=beg_subst, end_subst=end_subst)
+
+class SDORelate(SpatialFunction):
+ "Class for using SDO_RELATE."
+ masks = 'TOUCH|OVERLAPBDYDISJOINT|OVERLAPBDYINTERSECT|EQUAL|INSIDE|COVEREDBY|CONTAINS|COVERS|ANYINTERACT|ON'
+ mask_regex = re.compile(r'^(%s)(\+(%s))*$' % (masks, masks), re.I)
+ def __init__(self, mask):
+ func = 'SDO_RELATE'
+ if not self.mask_regex.match(mask):
+ raise ValueError('Invalid %s mask: "%s"' % (func, mask))
+ super(SDORelate, self).__init__(func, end_subst=", 'mask=%s') = 'TRUE'" % mask)
+
+#### Lookup type mapping dictionaries of Oracle spatial operations ####
+
+# Valid distance types and substitutions
+dtypes = (Decimal, Distance, float, int, long)
+DISTANCE_FUNCTIONS = {
+ 'distance_gt' : (SDODistance('>'), dtypes),
+ 'distance_gte' : (SDODistance('>='), dtypes),
+ 'distance_lt' : (SDODistance('<'), dtypes),
+ 'distance_lte' : (SDODistance('<='), dtypes),
+ 'dwithin' : (SDOOperation('SDO_WITHIN_DISTANCE',
+ beg_subst="%s(%s, %%s, 'distance=%%s'"), dtypes),
+ }
+
+ORACLE_GEOMETRY_FUNCTIONS = {
+ 'contains' : SDOOperation('SDO_CONTAINS'),
+ 'coveredby' : SDOOperation('SDO_COVEREDBY'),
+ 'covers' : SDOOperation('SDO_COVERS'),
+ 'disjoint' : SDOGeomRelate('DISJOINT'),
+ 'intersects' : SDOOperation('SDO_OVERLAPBDYINTERSECT'), # TODO: Is this really the same as ST_Intersects()?
+ 'equals' : SDOOperation('SDO_EQUAL'),
+ 'exact' : SDOOperation('SDO_EQUAL'),
+ 'overlaps' : SDOOperation('SDO_OVERLAPS'),
+ 'same_as' : SDOOperation('SDO_EQUAL'),
+ 'relate' : (SDORelate, basestring), # Oracle uses a different syntax, e.g., 'mask=inside+touch'
+ 'touches' : SDOOperation('SDO_TOUCH'),
+ 'within' : SDOOperation('SDO_INSIDE'),
+ }
+ORACLE_GEOMETRY_FUNCTIONS.update(DISTANCE_FUNCTIONS)
+
+# This lookup type does not require a mapping.
+MISC_TERMS = ['isnull']
+
+# Acceptable lookup types for Oracle spatial.
+ORACLE_SPATIAL_TERMS = ORACLE_GEOMETRY_FUNCTIONS.keys()
+ORACLE_SPATIAL_TERMS += MISC_TERMS
+ORACLE_SPATIAL_TERMS = dict((term, None) for term in ORACLE_SPATIAL_TERMS) # Making dictionary for fast lookups
+
+#### The `get_geo_where_clause` function for Oracle ####
+def get_geo_where_clause(table_alias, name, lookup_type, geo_annot):
+ "Returns the SQL WHERE clause for use in Oracle spatial SQL construction."
+ # Getting the quoted table name as `geo_col`.
+ geo_col = '%s.%s' % (qn(table_alias), qn(name))
+
+ # See if a Oracle Geometry function matches the lookup type next
+ lookup_info = ORACLE_GEOMETRY_FUNCTIONS.get(lookup_type, False)
+ if lookup_info:
+ # Lookup types that are tuples take tuple arguments, e.g., 'relate' and
+ # 'dwithin' lookup types.
+ if isinstance(lookup_info, tuple):
+ # First element of tuple is lookup type, second element is the type
+ # of the expected argument (e.g., str, float)
+ sdo_op, arg_type = lookup_info
+
+ # Ensuring that a tuple _value_ was passed in from the user
+ if not isinstance(geo_annot.value, tuple):
+ raise TypeError('Tuple required for `%s` lookup type.' % lookup_type)
+ if len(geo_annot.value) != 2:
+ raise ValueError('2-element tuple required for %s lookup type.' % lookup_type)
+
+ # Ensuring the argument type matches what we expect.
+ if not isinstance(geo_annot.value[1], arg_type):
+ raise TypeError('Argument type should be %s, got %s instead.' % (arg_type, type(geo_annot.value[1])))
+
+ if lookup_type == 'relate':
+ # The SDORelate class handles construction for these queries,
+ # and verifies the mask argument.
+ return sdo_op(geo_annot.value[1]).as_sql(geo_col)
+ else:
+ # Otherwise, just call the `as_sql` method on the SDOOperation instance.
+ return sdo_op.as_sql(geo_col)
+ else:
+ # Lookup info is a SDOOperation instance, whose `as_sql` method returns
+ # the SQL necessary for the geometry function call. For example:
+ # SDO_CONTAINS("geoapp_country"."poly", SDO_GEOMTRY('POINT(5 23)', 4326)) = 'TRUE'
+ return lookup_info.as_sql(geo_col)
+ elif lookup_type == 'isnull':
+ # Handling 'isnull' lookup type
+ return "%s IS %sNULL" % (geo_col, (not geo_annot.value and 'NOT ' or ''))
+
+ raise TypeError("Got invalid lookup_type: %s" % repr(lookup_type))
diff --git a/django/contrib/gis/db/backend/postgis/__init__.py b/django/contrib/gis/db/backend/postgis/__init__.py
new file mode 100644
index 0000000000..8a4d09e0d5
--- /dev/null
+++ b/django/contrib/gis/db/backend/postgis/__init__.py
@@ -0,0 +1,42 @@
+__all__ = ['create_spatial_db', 'get_geo_where_clause', 'SpatialBackend']
+
+from django.contrib.gis.db.backend.base import BaseSpatialBackend
+from django.contrib.gis.db.backend.postgis.adaptor import PostGISAdaptor
+from django.contrib.gis.db.backend.postgis.creation import create_spatial_db
+from django.contrib.gis.db.backend.postgis.field import PostGISField
+from django.contrib.gis.db.backend.postgis.query import *
+
+SpatialBackend = BaseSpatialBackend(name='postgis', postgis=True,
+ area=AREA,
+ centroid=CENTROID,
+ difference=DIFFERENCE,
+ distance=DISTANCE,
+ distance_functions=DISTANCE_FUNCTIONS,
+ distance_sphere=DISTANCE_SPHERE,
+ distance_spheroid=DISTANCE_SPHEROID,
+ envelope=ENVELOPE,
+ extent=EXTENT,
+ gis_terms=POSTGIS_TERMS,
+ gml=ASGML,
+ intersection=INTERSECTION,
+ kml=ASKML,
+ length=LENGTH,
+ length_spheroid=LENGTH_SPHEROID,
+ make_line=MAKE_LINE,
+ mem_size=MEM_SIZE,
+ num_geom=NUM_GEOM,
+ num_points=NUM_POINTS,
+ perimeter=PERIMETER,
+ point_on_surface=POINT_ON_SURFACE,
+ scale=SCALE,
+ select=GEOM_SELECT,
+ svg=ASSVG,
+ sym_difference=SYM_DIFFERENCE,
+ transform=TRANSFORM,
+ translate=TRANSLATE,
+ union=UNION,
+ unionagg=UNIONAGG,
+ version=(MAJOR_VERSION, MINOR_VERSION1, MINOR_VERSION2),
+ Adaptor=PostGISAdaptor,
+ Field=PostGISField,
+ )
diff --git a/django/contrib/gis/db/backend/postgis/adaptor.py b/django/contrib/gis/db/backend/postgis/adaptor.py
new file mode 100644
index 0000000000..c094a9825a
--- /dev/null
+++ b/django/contrib/gis/db/backend/postgis/adaptor.py
@@ -0,0 +1,33 @@
+"""
+ This object provides quoting for GEOS geometries into PostgreSQL/PostGIS.
+"""
+
+from django.contrib.gis.db.backend.postgis.query import GEOM_FROM_WKB
+from psycopg2 import Binary
+from psycopg2.extensions import ISQLQuote
+
+class PostGISAdaptor(object):
+ def __init__(self, geom):
+ "Initializes on the geometry."
+ # Getting the WKB (in string form, to allow easy pickling of
+ # the adaptor) and the SRID from the geometry.
+ self.wkb = str(geom.wkb)
+ self.srid = geom.srid
+
+ def __conform__(self, proto):
+ # Does the given protocol conform to what Psycopg2 expects?
+ if proto == ISQLQuote:
+ return self
+ else:
+ raise Exception('Error implementing psycopg2 protocol. Is psycopg2 installed?')
+
+ def __eq__(self, other):
+ return (self.wkb == other.wkb) and (self.srid == other.srid)
+
+ def __str__(self):
+ return self.getquoted()
+
+ def getquoted(self):
+ "Returns a properly quoted string for use in PostgreSQL/PostGIS."
+ # Want to use WKB, so wrap with psycopg2 Binary() to quote properly.
+ return "%s(%s, %s)" % (GEOM_FROM_WKB, Binary(self.wkb), self.srid or -1)
diff --git a/django/contrib/gis/db/backend/postgis/creation.py b/django/contrib/gis/db/backend/postgis/creation.py
new file mode 100644
index 0000000000..a3884db187
--- /dev/null
+++ b/django/contrib/gis/db/backend/postgis/creation.py
@@ -0,0 +1,224 @@
+from django.conf import settings
+from django.core.management import call_command
+from django.db import connection
+from django.test.utils import _set_autocommit, TEST_DATABASE_PREFIX
+import os, re, sys
+
+def getstatusoutput(cmd):
+ "A simpler version of getstatusoutput that works on win32 platforms."
+ stdin, stdout, stderr = os.popen3(cmd)
+ output = stdout.read()
+ if output.endswith('\n'): output = output[:-1]
+ status = stdin.close()
+ return status, output
+
+def create_lang(db_name, verbosity=1):
+ "Sets up the pl/pgsql language on the given database."
+
+ # Getting the command-line options for the shell command
+ options = get_cmd_options(db_name)
+
+ # Constructing the 'createlang' command.
+ createlang_cmd = 'createlang %splpgsql' % options
+ if verbosity >= 1: print createlang_cmd
+
+ # Must have database super-user privileges to execute createlang -- it must
+ # also be in your path.
+ status, output = getstatusoutput(createlang_cmd)
+
+ # Checking the status of the command, 0 => execution successful
+ if status:
+ raise Exception("Error executing 'plpgsql' command: %s\n" % output)
+
+def _create_with_cursor(db_name, verbosity=1, autoclobber=False):
+ "Creates database with psycopg2 cursor."
+
+ # Constructing the necessary SQL to create the database (the DATABASE_USER
+ # must possess the privileges to create a database)
+ create_sql = 'CREATE DATABASE %s' % connection.ops.quote_name(db_name)
+ if settings.DATABASE_USER:
+ create_sql += ' OWNER %s' % settings.DATABASE_USER
+
+ cursor = connection.cursor()
+ _set_autocommit(connection)
+
+ try:
+ # Trying to create the database first.
+ cursor.execute(create_sql)
+ #print create_sql
+ except Exception, e:
+ # Drop and recreate, if necessary.
+ if not autoclobber:
+ confirm = raw_input("\nIt appears the database, %s, already exists. Type 'yes' to delete it, or 'no' to cancel: " % db_name)
+ if autoclobber or confirm == 'yes':
+ if verbosity >= 1: print 'Destroying old spatial database...'
+ drop_db(db_name)
+ if verbosity >= 1: print 'Creating new spatial database...'
+ cursor.execute(create_sql)
+ else:
+ raise Exception('Spatial Database Creation canceled.')
+foo = _create_with_cursor
+
+created_regex = re.compile(r'^createdb: database creation failed: ERROR: database ".+" already exists')
+def _create_with_shell(db_name, verbosity=1, autoclobber=False):
+ """
+ If no spatial database already exists, then using a cursor will not work.
+ Thus, a `createdb` command will be issued through the shell to bootstrap
+ creation of the spatial database.
+ """
+
+ # Getting the command-line options for the shell command
+ options = get_cmd_options(False)
+ create_cmd = 'createdb -O %s %s%s' % (settings.DATABASE_USER, options, db_name)
+ if verbosity >= 1: print create_cmd
+
+ # Attempting to create the database.
+ status, output = getstatusoutput(create_cmd)
+
+ if status:
+ if created_regex.match(output):
+ if not autoclobber:
+ confirm = raw_input("\nIt appears the database, %s, already exists. Type 'yes' to delete it, or 'no' to cancel: " % db_name)
+ if autoclobber or confirm == 'yes':
+ if verbosity >= 1: print 'Destroying old spatial database...'
+ drop_cmd = 'dropdb %s%s' % (options, db_name)
+ status, output = getstatusoutput(drop_cmd)
+ if status != 0:
+ raise Exception('Could not drop database %s: %s' % (db_name, output))
+ if verbosity >= 1: print 'Creating new spatial database...'
+ status, output = getstatusoutput(create_cmd)
+ if status != 0:
+ raise Exception('Could not create database after dropping: %s' % output)
+ else:
+ raise Exception('Spatial Database Creation canceled.')
+ else:
+ raise Exception('Unknown error occurred in creating database: %s' % output)
+
+def create_spatial_db(test=False, verbosity=1, autoclobber=False, interactive=False):
+ "Creates a spatial database based on the settings."
+
+ # Making sure we're using PostgreSQL and psycopg2
+ if settings.DATABASE_ENGINE != 'postgresql_psycopg2':
+ raise Exception('Spatial database creation only supported postgresql_psycopg2 platform.')
+
+ # Getting the spatial database name
+ if test:
+ db_name = get_spatial_db(test=True)
+ _create_with_cursor(db_name, verbosity=verbosity, autoclobber=autoclobber)
+ else:
+ db_name = get_spatial_db()
+ _create_with_shell(db_name, verbosity=verbosity, autoclobber=autoclobber)
+
+ # Creating the db language, does not need to be done on NT platforms
+ # since the PostGIS installer enables this capability.
+ if os.name != 'nt':
+ create_lang(db_name, verbosity=verbosity)
+
+ # Now adding in the PostGIS routines.
+ load_postgis_sql(db_name, verbosity=verbosity)
+
+ if verbosity >= 1: print 'Creation of spatial database %s successful.' % db_name
+
+ # Closing the connection
+ connection.close()
+ settings.DATABASE_NAME = db_name
+
+ # Syncing the database
+ call_command('syncdb', verbosity=verbosity, interactive=interactive)
+
+def drop_db(db_name=False, test=False):
+ """
+ Drops the given database (defaults to what is returned from
+ get_spatial_db()). All exceptions are propagated up to the caller.
+ """
+ if not db_name: db_name = get_spatial_db(test=test)
+ cursor = connection.cursor()
+ cursor.execute('DROP DATABASE %s' % connection.ops.quote_name(db_name))
+
+def get_cmd_options(db_name):
+ "Obtains the command-line PostgreSQL connection options for shell commands."
+ # The db_name parameter is optional
+ options = ''
+ if db_name:
+ options += '-d %s ' % db_name
+ if settings.DATABASE_USER:
+ options += '-U %s ' % settings.DATABASE_USER
+ if settings.DATABASE_HOST:
+ options += '-h %s ' % settings.DATABASE_HOST
+ if settings.DATABASE_PORT:
+ options += '-p %s ' % settings.DATABASE_PORT
+ return options
+
+def get_spatial_db(test=False):
+ """
+ Returns the name of the spatial database. The 'test' keyword may be set
+ to return the test spatial database name.
+ """
+ if test:
+ if settings.TEST_DATABASE_NAME:
+ test_db_name = settings.TEST_DATABASE_NAME
+ else:
+ test_db_name = TEST_DATABASE_PREFIX + settings.DATABASE_NAME
+ return test_db_name
+ else:
+ if not settings.DATABASE_NAME:
+ raise Exception('must configure DATABASE_NAME in settings.py')
+ return settings.DATABASE_NAME
+
+def load_postgis_sql(db_name, verbosity=1):
+ """
+ This routine loads up the PostGIS SQL files lwpostgis.sql and
+ spatial_ref_sys.sql.
+ """
+
+ # Getting the path to the PostGIS SQL
+ try:
+ # POSTGIS_SQL_PATH may be placed in settings to tell GeoDjango where the
+ # PostGIS SQL files are located. This is especially useful on Win32
+ # platforms since the output of pg_config looks like "C:/PROGRA~1/..".
+ sql_path = settings.POSTGIS_SQL_PATH
+ except AttributeError:
+ status, sql_path = getstatusoutput('pg_config --sharedir')
+ if status:
+ sql_path = '/usr/local/share'
+
+ # The PostGIS SQL post-creation files.
+ lwpostgis_file = os.path.join(sql_path, 'lwpostgis.sql')
+ srefsys_file = os.path.join(sql_path, 'spatial_ref_sys.sql')
+ if not os.path.isfile(lwpostgis_file):
+ raise Exception('Could not find PostGIS function definitions in %s' % lwpostgis_file)
+ if not os.path.isfile(srefsys_file):
+ raise Exception('Could not find PostGIS spatial reference system definitions in %s' % srefsys_file)
+
+ # Getting the psql command-line options, and command format.
+ options = get_cmd_options(db_name)
+ cmd_fmt = 'psql %s-f "%%s"' % options
+
+ # Now trying to load up the PostGIS functions
+ cmd = cmd_fmt % lwpostgis_file
+ if verbosity >= 1: print cmd
+ status, output = getstatusoutput(cmd)
+ if status:
+ raise Exception('Error in loading PostGIS lwgeometry routines.')
+
+ # Now trying to load up the Spatial Reference System table
+ cmd = cmd_fmt % srefsys_file
+ if verbosity >= 1: print cmd
+ status, output = getstatusoutput(cmd)
+ if status:
+ raise Exception('Error in loading PostGIS spatial_ref_sys table.')
+
+ # Setting the permissions because on Windows platforms the owner
+ # of the spatial_ref_sys and geometry_columns tables is always
+ # the postgres user, regardless of how the db is created.
+ if os.name == 'nt': set_permissions(db_name)
+
+def set_permissions(db_name):
+ """
+ Sets the permissions on the given database to that of the user specified
+ in the settings. Needed specifically for PostGIS on Win32 platforms.
+ """
+ cursor = connection.cursor()
+ user = settings.DATABASE_USER
+ cursor.execute('ALTER TABLE geometry_columns OWNER TO %s' % user)
+ cursor.execute('ALTER TABLE spatial_ref_sys OWNER TO %s' % user)
diff --git a/django/contrib/gis/db/backend/postgis/field.py b/django/contrib/gis/db/backend/postgis/field.py
new file mode 100644
index 0000000000..9d6c0fad24
--- /dev/null
+++ b/django/contrib/gis/db/backend/postgis/field.py
@@ -0,0 +1,95 @@
+from django.db import connection
+from django.db.models.fields import Field # Django base Field class
+from django.contrib.gis.db.backend.util import gqn
+from django.contrib.gis.db.backend.postgis.query import TRANSFORM
+
+# Quotename & geographic quotename, respectively
+qn = connection.ops.quote_name
+
+class PostGISField(Field):
+ """
+ The backend-specific geographic field for PostGIS.
+ """
+
+ def _add_geom(self, style, db_table):
+ """
+ Constructs the addition of the geometry to the table using the
+ AddGeometryColumn(...) PostGIS (and OGC standard) stored procedure.
+
+ Takes the style object (provides syntax highlighting) and the
+ database table as parameters.
+ """
+ sql = style.SQL_KEYWORD('SELECT ') + \
+ style.SQL_TABLE('AddGeometryColumn') + '(' + \
+ style.SQL_TABLE(gqn(db_table)) + ', ' + \
+ style.SQL_FIELD(gqn(self.column)) + ', ' + \
+ style.SQL_FIELD(str(self._srid)) + ', ' + \
+ style.SQL_COLTYPE(gqn(self._geom)) + ', ' + \
+ style.SQL_KEYWORD(str(self._dim)) + ');'
+
+ if not self.null:
+ # Add a NOT NULL constraint to the field
+ sql += '\n' + \
+ style.SQL_KEYWORD('ALTER TABLE ') + \
+ style.SQL_TABLE(qn(db_table)) + \
+ style.SQL_KEYWORD(' ALTER ') + \
+ style.SQL_FIELD(qn(self.column)) + \
+ style.SQL_KEYWORD(' SET NOT NULL') + ';'
+ return sql
+
+ def _geom_index(self, style, db_table,
+ index_type='GIST', index_opts='GIST_GEOMETRY_OPS'):
+ "Creates a GiST index for this geometry field."
+ sql = style.SQL_KEYWORD('CREATE INDEX ') + \
+ style.SQL_TABLE(qn('%s_%s_id' % (db_table, self.column))) + \
+ style.SQL_KEYWORD(' ON ') + \
+ style.SQL_TABLE(qn(db_table)) + \
+ style.SQL_KEYWORD(' USING ') + \
+ style.SQL_COLTYPE(index_type) + ' ( ' + \
+ style.SQL_FIELD(qn(self.column)) + ' ' + \
+ style.SQL_KEYWORD(index_opts) + ' );'
+ return sql
+
+ def post_create_sql(self, style, db_table):
+ """
+ Returns SQL that will be executed after the model has been
+ created. Geometry columns must be added after creation with the
+ PostGIS AddGeometryColumn() function.
+ """
+
+ # Getting the AddGeometryColumn() SQL necessary to create a PostGIS
+ # geometry field.
+ post_sql = self._add_geom(style, db_table)
+
+ # If the user wants to index this data, then get the indexing SQL as well.
+ if self._index:
+ return (post_sql, self._geom_index(style, db_table))
+ else:
+ return (post_sql,)
+
+ def _post_delete_sql(self, style, db_table):
+ "Drops the geometry column."
+ sql = style.SQL_KEYWORD('SELECT ') + \
+ style.SQL_KEYWORD('DropGeometryColumn') + '(' + \
+ style.SQL_TABLE(gqn(db_table)) + ', ' + \
+ style.SQL_FIELD(gqn(self.column)) + ');'
+ return sql
+
+ def db_type(self):
+ """
+ PostGIS geometry columns are added by stored procedures, should be
+ None.
+ """
+ return None
+
+ def get_placeholder(self, value):
+ """
+ Provides a proper substitution value for Geometries that are not in the
+ SRID of the field. Specifically, this routine will substitute in the
+ ST_Transform() function call.
+ """
+ if value is None or value.srid == self._srid:
+ return '%s'
+ else:
+ # Adding Transform() to the SQL placeholder.
+ return '%s(%%s, %s)' % (TRANSFORM, self._srid)
diff --git a/django/contrib/gis/db/backend/postgis/management.py b/django/contrib/gis/db/backend/postgis/management.py
new file mode 100644
index 0000000000..c1cb32a04f
--- /dev/null
+++ b/django/contrib/gis/db/backend/postgis/management.py
@@ -0,0 +1,54 @@
+"""
+ This utility module is for obtaining information about the PostGIS
+ installation.
+
+ See PostGIS docs at Ch. 6.2.1 for more information on these functions.
+"""
+import re
+
+def _get_postgis_func(func):
+ "Helper routine for calling PostGIS functions and returning their result."
+ from django.db import connection
+ cursor = connection.cursor()
+ cursor.execute('SELECT %s()' % func)
+ row = cursor.fetchone()
+ cursor.close()
+ return row[0]
+
+### PostGIS management functions ###
+def postgis_geos_version():
+ "Returns the version of the GEOS library used with PostGIS."
+ return _get_postgis_func('postgis_geos_version')
+
+def postgis_lib_version():
+ "Returns the version number of the PostGIS library used with PostgreSQL."
+ return _get_postgis_func('postgis_lib_version')
+
+def postgis_proj_version():
+ "Returns the version of the PROJ.4 library used with PostGIS."
+ return _get_postgis_func('postgis_proj_version')
+
+def postgis_version():
+ "Returns PostGIS version number and compile-time options."
+ return _get_postgis_func('postgis_version')
+
+def postgis_full_version():
+ "Returns PostGIS version number and compile-time options."
+ return _get_postgis_func('postgis_full_version')
+
+### Routines for parsing output of management functions. ###
+version_regex = re.compile('^(?P<major>\d)\.(?P<minor1>\d)\.(?P<minor2>\d+)')
+def postgis_version_tuple():
+ "Returns the PostGIS version as a tuple."
+
+ # Getting the PostGIS version
+ version = postgis_lib_version()
+ m = version_regex.match(version)
+ if m:
+ major = int(m.group('major'))
+ minor1 = int(m.group('minor1'))
+ minor2 = int(m.group('minor2'))
+ else:
+ raise Exception('Could not parse PostGIS version string: %s' % version)
+
+ return (version, major, minor1, minor2)
diff --git a/django/contrib/gis/db/backend/postgis/models.py b/django/contrib/gis/db/backend/postgis/models.py
new file mode 100644
index 0000000000..e032da4d89
--- /dev/null
+++ b/django/contrib/gis/db/backend/postgis/models.py
@@ -0,0 +1,58 @@
+"""
+ The GeometryColumns and SpatialRefSys models for the PostGIS backend.
+"""
+from django.db import models
+from django.contrib.gis.models import SpatialRefSysMixin
+
+# Checking for the presence of GDAL (needed for the SpatialReference object)
+from django.contrib.gis.gdal import HAS_GDAL
+if HAS_GDAL:
+ from django.contrib.gis.gdal import SpatialReference
+
+class GeometryColumns(models.Model):
+ """
+ The 'geometry_columns' table from the PostGIS. See the PostGIS
+ documentation at Ch. 4.2.2.
+ """
+ f_table_catalog = models.CharField(max_length=256)
+ f_table_schema = models.CharField(max_length=256)
+ f_table_name = models.CharField(max_length=256)
+ f_geometry_column = models.CharField(max_length=256)
+ coord_dimension = models.IntegerField()
+ srid = models.IntegerField(primary_key=True)
+ type = models.CharField(max_length=30)
+
+ class Meta:
+ db_table = 'geometry_columns'
+
+ @classmethod
+ def table_name_col(cls):
+ "Class method for returning the table name column for this model."
+ return 'f_table_name'
+
+ def __unicode__(self):
+ return "%s.%s - %dD %s field (SRID: %d)" % \
+ (self.f_table_name, self.f_geometry_column,
+ self.coord_dimension, self.type, self.srid)
+
+class SpatialRefSys(models.Model, SpatialRefSysMixin):
+ """
+ The 'spatial_ref_sys' table from PostGIS. See the PostGIS
+ documentaiton at Ch. 4.2.1.
+ """
+ srid = models.IntegerField(primary_key=True)
+ auth_name = models.CharField(max_length=256)
+ auth_srid = models.IntegerField()
+ srtext = models.CharField(max_length=2048)
+ proj4text = models.CharField(max_length=2048)
+
+ class Meta:
+ db_table = 'spatial_ref_sys'
+
+ @property
+ def wkt(self):
+ return self.srtext
+
+ @classmethod
+ def wkt_col(cls):
+ return 'srtext'
diff --git a/django/contrib/gis/db/backend/postgis/query.py b/django/contrib/gis/db/backend/postgis/query.py
new file mode 100644
index 0000000000..8780780402
--- /dev/null
+++ b/django/contrib/gis/db/backend/postgis/query.py
@@ -0,0 +1,287 @@
+"""
+ This module contains the spatial lookup types, and the get_geo_where_clause()
+ routine for PostGIS.
+"""
+import re
+from decimal import Decimal
+from django.db import connection
+from django.contrib.gis.measure import Distance
+from django.contrib.gis.db.backend.postgis.management import postgis_version_tuple
+from django.contrib.gis.db.backend.util import SpatialOperation, SpatialFunction
+qn = connection.ops.quote_name
+
+# Getting the PostGIS version information
+POSTGIS_VERSION, MAJOR_VERSION, MINOR_VERSION1, MINOR_VERSION2 = postgis_version_tuple()
+
+# The supported PostGIS versions.
+# TODO: Confirm tests with PostGIS versions 1.1.x -- should work.
+# Versions <= 1.0.x do not use GEOS C API, and will not be supported.
+if MAJOR_VERSION != 1 or (MAJOR_VERSION == 1 and MINOR_VERSION1 < 1):
+ raise Exception('PostGIS version %s not supported.' % POSTGIS_VERSION)
+
+# Versions of PostGIS >= 1.2.2 changed their naming convention to be
+# 'SQL-MM-centric' to conform with the ISO standard. Practically, this
+# means that 'ST_' prefixes geometry function names.
+GEOM_FUNC_PREFIX = ''
+if MAJOR_VERSION >= 1:
+ if (MINOR_VERSION1 > 2 or
+ (MINOR_VERSION1 == 2 and MINOR_VERSION2 >= 2)):
+ GEOM_FUNC_PREFIX = 'ST_'
+
+ def get_func(func): return '%s%s' % (GEOM_FUNC_PREFIX, func)
+
+ # Custom selection not needed for PostGIS because GEOS geometries are
+ # instantiated directly from the HEXEWKB returned by default. If
+ # WKT is needed for some reason in the future, this value may be changed,
+ # e.g,, 'AsText(%s)'.
+ GEOM_SELECT = None
+
+ # Functions used by the GeoManager & GeoQuerySet
+ AREA = get_func('Area')
+ ASKML = get_func('AsKML')
+ ASGML = get_func('AsGML')
+ ASSVG = get_func('AsSVG')
+ CENTROID = get_func('Centroid')
+ DIFFERENCE = get_func('Difference')
+ DISTANCE = get_func('Distance')
+ DISTANCE_SPHERE = get_func('distance_sphere')
+ DISTANCE_SPHEROID = get_func('distance_spheroid')
+ ENVELOPE = get_func('Envelope')
+ EXTENT = get_func('extent')
+ GEOM_FROM_TEXT = get_func('GeomFromText')
+ GEOM_FROM_WKB = get_func('GeomFromWKB')
+ INTERSECTION = get_func('Intersection')
+ LENGTH = get_func('Length')
+ LENGTH_SPHEROID = get_func('length_spheroid')
+ MAKE_LINE = get_func('MakeLine')
+ MEM_SIZE = get_func('mem_size')
+ NUM_GEOM = get_func('NumGeometries')
+ NUM_POINTS = get_func('npoints')
+ PERIMETER = get_func('Perimeter')
+ POINT_ON_SURFACE = get_func('PointOnSurface')
+ SCALE = get_func('Scale')
+ SYM_DIFFERENCE = get_func('SymDifference')
+ TRANSFORM = get_func('Transform')
+ TRANSLATE = get_func('Translate')
+
+ # Special cases for union and KML methods.
+ if MINOR_VERSION1 < 3:
+ UNIONAGG = 'GeomUnion'
+ UNION = 'Union'
+ else:
+ UNIONAGG = 'ST_Union'
+ UNION = 'ST_Union'
+
+ if MINOR_VERSION1 == 1:
+ ASKML = False
+else:
+ raise NotImplementedError('PostGIS versions < 1.0 are not supported.')
+
+#### Classes used in constructing PostGIS spatial SQL ####
+class PostGISOperator(SpatialOperation):
+ "For PostGIS operators (e.g. `&&`, `~`)."
+ def __init__(self, operator):
+ super(PostGISOperator, self).__init__(operator=operator, beg_subst='%s %s %%s')
+
+class PostGISFunction(SpatialFunction):
+ "For PostGIS function calls (e.g., `ST_Contains(table, geom)`)."
+ def __init__(self, function, **kwargs):
+ super(PostGISFunction, self).__init__(get_func(function), **kwargs)
+
+class PostGISFunctionParam(PostGISFunction):
+ "For PostGIS functions that take another parameter (e.g. DWithin, Relate)."
+ def __init__(self, func):
+ super(PostGISFunctionParam, self).__init__(func, end_subst=', %%s)')
+
+class PostGISDistance(PostGISFunction):
+ "For PostGIS distance operations."
+ dist_func = 'Distance'
+ def __init__(self, operator):
+ super(PostGISDistance, self).__init__(self.dist_func, end_subst=') %s %s',
+ operator=operator, result='%%s')
+
+class PostGISSpheroidDistance(PostGISFunction):
+ "For PostGIS spherical distance operations (using the spheroid)."
+ dist_func = 'distance_spheroid'
+ def __init__(self, operator):
+ # An extra parameter in `end_subst` is needed for the spheroid string.
+ super(PostGISSpheroidDistance, self).__init__(self.dist_func,
+ beg_subst='%s(%s, %%s, %%s',
+ end_subst=') %s %s',
+ operator=operator, result='%%s')
+
+class PostGISSphereDistance(PostGISFunction):
+ "For PostGIS spherical distance operations."
+ dist_func = 'distance_sphere'
+ def __init__(self, operator):
+ super(PostGISSphereDistance, self).__init__(self.dist_func, end_subst=') %s %s',
+ operator=operator, result='%%s')
+
+class PostGISRelate(PostGISFunctionParam):
+ "For PostGIS Relate(<geom>, <pattern>) calls."
+ pattern_regex = re.compile(r'^[012TF\*]{9}$')
+ def __init__(self, pattern):
+ if not self.pattern_regex.match(pattern):
+ raise ValueError('Invalid intersection matrix pattern "%s".' % pattern)
+ super(PostGISRelate, self).__init__('Relate')
+
+#### Lookup type mapping dictionaries of PostGIS operations. ####
+
+# PostGIS-specific operators. The commented descriptions of these
+# operators come from Section 6.2.2 of the official PostGIS documentation.
+POSTGIS_OPERATORS = {
+ # The "&<" operator returns true if A's bounding box overlaps or
+ # is to the left of B's bounding box.
+ 'overlaps_left' : PostGISOperator('&<'),
+ # The "&>" operator returns true if A's bounding box overlaps or
+ # is to the right of B's bounding box.
+ 'overlaps_right' : PostGISOperator('&>'),
+ # The "<<" operator returns true if A's bounding box is strictly
+ # to the left of B's bounding box.
+ 'left' : PostGISOperator('<<'),
+ # The ">>" operator returns true if A's bounding box is strictly
+ # to the right of B's bounding box.
+ 'right' : PostGISOperator('>>'),
+ # The "&<|" operator returns true if A's bounding box overlaps or
+ # is below B's bounding box.
+ 'overlaps_below' : PostGISOperator('&<|'),
+ # The "|&>" operator returns true if A's bounding box overlaps or
+ # is above B's bounding box.
+ 'overlaps_above' : PostGISOperator('|&>'),
+ # The "<<|" operator returns true if A's bounding box is strictly
+ # below B's bounding box.
+ 'strictly_below' : PostGISOperator('<<|'),
+ # The "|>>" operator returns true if A's bounding box is strictly
+ # above B's bounding box.
+ 'strictly_above' : PostGISOperator('|>>'),
+ # The "~=" operator is the "same as" operator. It tests actual
+ # geometric equality of two features. So if A and B are the same feature,
+ # vertex-by-vertex, the operator returns true.
+ 'same_as' : PostGISOperator('~='),
+ 'exact' : PostGISOperator('~='),
+ # The "@" operator returns true if A's bounding box is completely contained
+ # by B's bounding box.
+ 'contained' : PostGISOperator('@'),
+ # The "~" operator returns true if A's bounding box completely contains
+ # by B's bounding box.
+ 'bbcontains' : PostGISOperator('~'),
+ # The "&&" operator returns true if A's bounding box overlaps
+ # B's bounding box.
+ 'bboverlaps' : PostGISOperator('&&'),
+ }
+
+# For PostGIS >= 1.2.2 the following lookup types will do a bounding box query
+# first before calling the more computationally expensive GEOS routines (called
+# "inline index magic"):
+# 'touches', 'crosses', 'contains', 'intersects', 'within', 'overlaps', and
+# 'covers'.
+POSTGIS_GEOMETRY_FUNCTIONS = {
+ 'equals' : PostGISFunction('Equals'),
+ 'disjoint' : PostGISFunction('Disjoint'),
+ 'touches' : PostGISFunction('Touches'),
+ 'crosses' : PostGISFunction('Crosses'),
+ 'within' : PostGISFunction('Within'),
+ 'overlaps' : PostGISFunction('Overlaps'),
+ 'contains' : PostGISFunction('Contains'),
+ 'intersects' : PostGISFunction('Intersects'),
+ 'relate' : (PostGISRelate, basestring),
+ }
+
+# Valid distance types and substitutions
+dtypes = (Decimal, Distance, float, int, long)
+def get_dist_ops(operator):
+ "Returns operations for both regular and spherical distances."
+ return (PostGISDistance(operator), PostGISSphereDistance(operator), PostGISSpheroidDistance(operator))
+DISTANCE_FUNCTIONS = {
+ 'distance_gt' : (get_dist_ops('>'), dtypes),
+ 'distance_gte' : (get_dist_ops('>='), dtypes),
+ 'distance_lt' : (get_dist_ops('<'), dtypes),
+ 'distance_lte' : (get_dist_ops('<='), dtypes),
+ }
+
+if GEOM_FUNC_PREFIX == 'ST_':
+ # The ST_DWithin, ST_CoveredBy, and ST_Covers routines become available in 1.2.2+
+ POSTGIS_GEOMETRY_FUNCTIONS.update(
+ {'coveredby' : PostGISFunction('CoveredBy'),
+ 'covers' : PostGISFunction('Covers'),
+ })
+ DISTANCE_FUNCTIONS['dwithin'] = (PostGISFunctionParam('DWithin'), dtypes)
+
+# Distance functions are a part of PostGIS geometry functions.
+POSTGIS_GEOMETRY_FUNCTIONS.update(DISTANCE_FUNCTIONS)
+
+# Any other lookup types that do not require a mapping.
+MISC_TERMS = ['isnull']
+
+# These are the PostGIS-customized QUERY_TERMS -- a list of the lookup types
+# allowed for geographic queries.
+POSTGIS_TERMS = POSTGIS_OPERATORS.keys() # Getting the operators first
+POSTGIS_TERMS += POSTGIS_GEOMETRY_FUNCTIONS.keys() # Adding on the Geometry Functions
+POSTGIS_TERMS += MISC_TERMS # Adding any other miscellaneous terms (e.g., 'isnull')
+POSTGIS_TERMS = dict((term, None) for term in POSTGIS_TERMS) # Making a dictionary for fast lookups
+
+# For checking tuple parameters -- not very pretty but gets job done.
+def exactly_two(val): return val == 2
+def two_to_three(val): return val >= 2 and val <=3
+def num_params(lookup_type, val):
+ if lookup_type in DISTANCE_FUNCTIONS and lookup_type != 'dwithin': return two_to_three(val)
+ else: return exactly_two(val)
+
+#### The `get_geo_where_clause` function for PostGIS. ####
+def get_geo_where_clause(table_alias, name, lookup_type, geo_annot):
+ "Returns the SQL WHERE clause for use in PostGIS SQL construction."
+ # Getting the quoted field as `geo_col`.
+ geo_col = '%s.%s' % (qn(table_alias), qn(name))
+ if lookup_type in POSTGIS_OPERATORS:
+ # See if a PostGIS operator matches the lookup type.
+ return POSTGIS_OPERATORS[lookup_type].as_sql(geo_col)
+ elif lookup_type in POSTGIS_GEOMETRY_FUNCTIONS:
+ # See if a PostGIS geometry function matches the lookup type.
+ tmp = POSTGIS_GEOMETRY_FUNCTIONS[lookup_type]
+
+ # Lookup types that are tuples take tuple arguments, e.g., 'relate' and
+ # distance lookups.
+ if isinstance(tmp, tuple):
+ # First element of tuple is the PostGISOperation instance, and the
+ # second element is either the type or a tuple of acceptable types
+ # that may passed in as further parameters for the lookup type.
+ op, arg_type = tmp
+
+ # Ensuring that a tuple _value_ was passed in from the user
+ if not isinstance(geo_annot.value, (tuple, list)):
+ raise TypeError('Tuple required for `%s` lookup type.' % lookup_type)
+
+ # Number of valid tuple parameters depends on the lookup type.
+ nparams = len(geo_annot.value)
+ if not num_params(lookup_type, nparams):
+ raise ValueError('Incorrect number of parameters given for `%s` lookup type.' % lookup_type)
+
+ # Ensuring the argument type matches what we expect.
+ if not isinstance(geo_annot.value[1], arg_type):
+ raise TypeError('Argument type should be %s, got %s instead.' % (arg_type, type(geo_annot.value[1])))
+
+ # For lookup type `relate`, the op instance is not yet created (has
+ # to be instantiated here to check the pattern parameter).
+ if lookup_type == 'relate':
+ op = op(geo_annot.value[1])
+ elif lookup_type in DISTANCE_FUNCTIONS and lookup_type != 'dwithin':
+ if geo_annot.geodetic:
+ # Geodetic distances are only availble from Points to PointFields.
+ if geo_annot.geom_type != 'POINT':
+ raise TypeError('PostGIS spherical operations are only valid on PointFields.')
+ if geo_annot.value[0].geom_typeid != 0:
+ raise TypeError('PostGIS geometry distance parameter is required to be of type Point.')
+ # Setting up the geodetic operation appropriately.
+ if nparams == 3 and geo_annot.value[2] == 'spheroid': op = op[2]
+ else: op = op[1]
+ else:
+ op = op[0]
+ else:
+ op = tmp
+ # Calling the `as_sql` function on the operation instance.
+ return op.as_sql(geo_col)
+ elif lookup_type == 'isnull':
+ # Handling 'isnull' lookup type
+ return "%s IS %sNULL" % (geo_col, (not geo_annot.value and 'NOT ' or ''))
+
+ raise TypeError("Got invalid lookup_type: %s" % repr(lookup_type))
diff --git a/django/contrib/gis/db/backend/util.py b/django/contrib/gis/db/backend/util.py
new file mode 100644
index 0000000000..a19dd975c1
--- /dev/null
+++ b/django/contrib/gis/db/backend/util.py
@@ -0,0 +1,52 @@
+from types import UnicodeType
+
+def gqn(val):
+ """
+ The geographic quote name function; used for quoting tables and
+ geometries (they use single rather than the double quotes of the
+ backend quotename function).
+ """
+ if isinstance(val, basestring):
+ if isinstance(val, UnicodeType): val = val.encode('ascii')
+ return "'%s'" % val
+ else:
+ return str(val)
+
+class SpatialOperation(object):
+ """
+ Base class for generating spatial SQL.
+ """
+ def __init__(self, function='', operator='', result='', beg_subst='', end_subst=''):
+ self.function = function
+ self.operator = operator
+ self.result = result
+ self.beg_subst = beg_subst
+ try:
+ # Try and put the operator and result into to the
+ # end substitution.
+ self.end_subst = end_subst % (operator, result)
+ except TypeError:
+ self.end_subst = end_subst
+
+ @property
+ def sql_subst(self):
+ return ''.join([self.beg_subst, self.end_subst])
+
+ def as_sql(self, geo_col):
+ return self.sql_subst % self.params(geo_col)
+
+ def params(self, geo_col):
+ return (geo_col, self.operator)
+
+class SpatialFunction(SpatialOperation):
+ """
+ Base class for generating spatial SQL related to a function.
+ """
+ def __init__(self, func, beg_subst='%s(%s, %%s', end_subst=')', result='', operator=''):
+ # Getting the function prefix.
+ kwargs = {'function' : func, 'operator' : operator, 'result' : result,
+ 'beg_subst' : beg_subst, 'end_subst' : end_subst,}
+ super(SpatialFunction, self).__init__(**kwargs)
+
+ def params(self, geo_col):
+ return (self.function, geo_col)
diff --git a/django/contrib/gis/db/models/__init__.py b/django/contrib/gis/db/models/__init__.py
new file mode 100644
index 0000000000..02a2c5318e
--- /dev/null
+++ b/django/contrib/gis/db/models/__init__.py
@@ -0,0 +1,17 @@
+# Want to get everything from the 'normal' models package.
+from django.db.models import *
+
+# The GeoManager
+from django.contrib.gis.db.models.manager import GeoManager
+
+# The GeoQ object
+from django.contrib.gis.db.models.query import GeoQ
+
+# The geographic-enabled fields.
+from django.contrib.gis.db.models.fields import \
+ GeometryField, PointField, LineStringField, PolygonField, \
+ MultiPointField, MultiLineStringField, MultiPolygonField, \
+ GeometryCollectionField
+
+# The geographic mixin class.
+from mixin import GeoMixin
diff --git a/django/contrib/gis/db/models/fields/__init__.py b/django/contrib/gis/db/models/fields/__init__.py
new file mode 100644
index 0000000000..d32f1b118e
--- /dev/null
+++ b/django/contrib/gis/db/models/fields/__init__.py
@@ -0,0 +1,214 @@
+from django.contrib.gis import forms
+from django.db import connection
+# Getting the SpatialBackend container and the geographic quoting method.
+from django.contrib.gis.db.backend import SpatialBackend, gqn
+# GeometryProxy, GEOS, Distance, and oldforms imports.
+from django.contrib.gis.db.models.proxy import GeometryProxy
+from django.contrib.gis.measure import Distance
+from django.contrib.gis.oldforms import WKTField
+
+# The `get_srid_info` function gets SRID information from the spatial
+# reference system table w/o using the ORM.
+from django.contrib.gis.models import get_srid_info
+
+#TODO: Flesh out widgets; consider adding support for OGR Geometry proxies.
+class GeometryField(SpatialBackend.Field):
+ "The base GIS field -- maps to the OpenGIS Specification Geometry type."
+
+ # The OpenGIS Geometry name.
+ _geom = 'GEOMETRY'
+
+ # Geodetic units.
+ geodetic_units = ('Decimal Degree', 'degree')
+
+ def __init__(self, srid=4326, spatial_index=True, dim=2, **kwargs):
+ """
+ The initialization function for geometry fields. Takes the following
+ as keyword arguments:
+
+ srid:
+ The spatial reference system identifier, an OGC standard.
+ Defaults to 4326 (WGS84).
+
+ spatial_index:
+ Indicates whether to create a spatial index. Defaults to True.
+ Set this instead of 'db_index' for geographic fields since index
+ creation is different for geometry columns.
+
+ dim:
+ The number of dimensions for this geometry. Defaults to 2.
+ """
+
+ # Setting the index flag with the value of the `spatial_index` keyword.
+ self._index = spatial_index
+
+ # Setting the SRID and getting the units. Unit information must be
+ # easily available in the field instance for distance queries.
+ self._srid = srid
+ self._unit, self._unit_name, self._spheroid = get_srid_info(srid)
+
+ # Setting the dimension of the geometry field.
+ self._dim = dim
+
+ super(GeometryField, self).__init__(**kwargs) # Calling the parent initializtion function
+
+ ### Routines specific to GeometryField ###
+ @property
+ def geodetic(self):
+ """
+ Returns true if this field's SRID corresponds with a coordinate
+ system that uses non-projected units (e.g., latitude/longitude).
+ """
+ return self._unit_name in self.geodetic_units
+
+ def get_distance(self, dist_val, lookup_type):
+ """
+ Returns a distance number in units of the field. For example, if
+ `D(km=1)` was passed in and the units of the field were in meters,
+ then 1000 would be returned.
+ """
+ # Getting the distance parameter and any options.
+ if len(dist_val) == 1: dist, option = dist_val[0], None
+ else: dist, option = dist_val
+
+ if isinstance(dist, Distance):
+ if self.geodetic:
+ # Won't allow Distance objects w/DWithin lookups on PostGIS.
+ if SpatialBackend.postgis and lookup_type == 'dwithin':
+ raise TypeError('Only numeric values of degree units are allowed on geographic DWithin queries.')
+ # Spherical distance calculation parameter should be in meters.
+ dist_param = dist.m
+ else:
+ dist_param = getattr(dist, Distance.unit_attname(self._unit_name))
+ else:
+ # Assuming the distance is in the units of the field.
+ dist_param = dist
+
+ if SpatialBackend.postgis and self.geodetic and lookup_type != 'dwithin' and option == 'spheroid':
+ # On PostGIS, by default `ST_distance_sphere` is used; but if the
+ # accuracy of `ST_distance_spheroid` is needed than the spheroid
+ # needs to be passed to the SQL stored procedure.
+ return [gqn(self._spheroid), dist_param]
+ else:
+ return [dist_param]
+
+ def get_geometry(self, value):
+ """
+ Retrieves the geometry, setting the default SRID from the given
+ lookup parameters.
+ """
+ if isinstance(value, (tuple, list)):
+ geom = value[0]
+ else:
+ geom = value
+
+ # When the input is not a GEOS geometry, attempt to construct one
+ # from the given string input.
+ if isinstance(geom, SpatialBackend.Geometry):
+ pass
+ elif isinstance(geom, basestring):
+ try:
+ geom = SpatialBackend.Geometry(geom)
+ except SpatialBackend.GeometryException:
+ raise ValueError('Could not create geometry from lookup value: %s' % str(value))
+ else:
+ raise TypeError('Cannot use parameter of `%s` type as lookup parameter.' % type(value))
+
+ # Assigning the SRID value.
+ geom.srid = self.get_srid(geom)
+
+ return geom
+
+ def get_srid(self, geom):
+ """
+ Returns the default SRID for the given geometry, taking into account
+ the SRID set for the field. For example, if the input geometry
+ has no SRID, then that of the field will be returned.
+ """
+ gsrid = geom.srid # SRID of given geometry.
+ if gsrid is None or self._srid == -1 or (gsrid == -1 and self._srid != -1):
+ return self._srid
+ else:
+ return gsrid
+
+ ### Routines overloaded from Field ###
+ def contribute_to_class(self, cls, name):
+ super(GeometryField, self).contribute_to_class(cls, name)
+
+ # Setup for lazy-instantiated Geometry object.
+ setattr(cls, self.attname, GeometryProxy(SpatialBackend.Geometry, self))
+
+ def formfield(self, **kwargs):
+ defaults = {'form_class' : forms.GeometryField,
+ 'geom_type' : self._geom,
+ 'null' : self.null,
+ }
+ defaults.update(kwargs)
+ return super(GeometryField, self).formfield(**defaults)
+
+ def get_db_prep_lookup(self, lookup_type, value):
+ """
+ Returns the spatial WHERE clause and associated parameters for the
+ given lookup type and value. The value will be prepared for database
+ lookup (e.g., spatial transformation SQL will be added if necessary).
+ """
+ if lookup_type in SpatialBackend.gis_terms:
+ # special case for isnull lookup
+ if lookup_type == 'isnull': return [], []
+
+ # Get the geometry with SRID; defaults SRID to that of the field
+ # if it is None.
+ geom = self.get_geometry(value)
+
+ # Getting the WHERE clause list and the associated params list. The params
+ # list is populated with the Adaptor wrapping the Geometry for the
+ # backend. The WHERE clause list contains the placeholder for the adaptor
+ # (e.g. any transformation SQL).
+ where = [self.get_placeholder(geom)]
+ params = [SpatialBackend.Adaptor(geom)]
+
+ if isinstance(value, (tuple, list)):
+ if lookup_type in SpatialBackend.distance_functions:
+ # Getting the distance parameter in the units of the field.
+ where += self.get_distance(value[1:], lookup_type)
+ elif lookup_type in SpatialBackend.limited_where:
+ pass
+ else:
+ # Otherwise, making sure any other parameters are properly quoted.
+ where += map(gqn, value[1:])
+ return where, params
+ else:
+ raise TypeError("Field has invalid lookup: %s" % lookup_type)
+
+ def get_db_prep_save(self, value):
+ "Prepares the value for saving in the database."
+ if value is None:
+ return None
+ else:
+ return SpatialBackend.Adaptor(self.get_geometry(value))
+
+ def get_manipulator_field_objs(self):
+ "Using the WKTField (oldforms) to be our manipulator."
+ return [WKTField]
+
+# The OpenGIS Geometry Type Fields
+class PointField(GeometryField):
+ _geom = 'POINT'
+
+class LineStringField(GeometryField):
+ _geom = 'LINESTRING'
+
+class PolygonField(GeometryField):
+ _geom = 'POLYGON'
+
+class MultiPointField(GeometryField):
+ _geom = 'MULTIPOINT'
+
+class MultiLineStringField(GeometryField):
+ _geom = 'MULTILINESTRING'
+
+class MultiPolygonField(GeometryField):
+ _geom = 'MULTIPOLYGON'
+
+class GeometryCollectionField(GeometryField):
+ _geom = 'GEOMETRYCOLLECTION'
diff --git a/django/contrib/gis/db/models/manager.py b/django/contrib/gis/db/models/manager.py
new file mode 100644
index 0000000000..602d11251a
--- /dev/null
+++ b/django/contrib/gis/db/models/manager.py
@@ -0,0 +1,82 @@
+from django.db.models.manager import Manager
+from django.contrib.gis.db.models.query import GeoQuerySet
+
+class GeoManager(Manager):
+ "Overrides Manager to return Geographic QuerySets."
+
+ # This manager should be used for queries on related fields
+ # so that geometry columns on Oracle and MySQL are selected
+ # properly.
+ use_for_related_fields = True
+
+ def get_query_set(self):
+ return GeoQuerySet(model=self.model)
+
+ def area(self, *args, **kwargs):
+ return self.get_query_set().area(*args, **kwargs)
+
+ def centroid(self, *args, **kwargs):
+ return self.get_query_set().centroid(*args, **kwargs)
+
+ def difference(self, *args, **kwargs):
+ return self.get_query_set().difference(*args, **kwargs)
+
+ def distance(self, *args, **kwargs):
+ return self.get_query_set().distance(*args, **kwargs)
+
+ def envelope(self, *args, **kwargs):
+ return self.get_query_set().envelope(*args, **kwargs)
+
+ def extent(self, *args, **kwargs):
+ return self.get_query_set().extent(*args, **kwargs)
+
+ def gml(self, *args, **kwargs):
+ return self.get_query_set().gml(*args, **kwargs)
+
+ def intersection(self, *args, **kwargs):
+ return self.get_query_set().intersection(*args, **kwargs)
+
+ def kml(self, *args, **kwargs):
+ return self.get_query_set().kml(*args, **kwargs)
+
+ def length(self, *args, **kwargs):
+ return self.get_query_set().length(*args, **kwargs)
+
+ def make_line(self, *args, **kwargs):
+ return self.get_query_set().make_line(*args, **kwargs)
+
+ def mem_size(self, *args, **kwargs):
+ return self.get_query_set().mem_size(*args, **kwargs)
+
+ def num_geom(self, *args, **kwargs):
+ return self.get_query_set().num_geom(*args, **kwargs)
+
+ def num_points(self, *args, **kwargs):
+ return self.get_query_set().num_points(*args, **kwargs)
+
+ def perimeter(self, *args, **kwargs):
+ return self.get_query_set().perimeter(*args, **kwargs)
+
+ def point_on_surface(self, *args, **kwargs):
+ return self.get_query_set().point_on_surface(*args, **kwargs)
+
+ def scale(self, *args, **kwargs):
+ return self.get_query_set().scale(*args, **kwargs)
+
+ def svg(self, *args, **kwargs):
+ return self.get_query_set().svg(*args, **kwargs)
+
+ def sym_difference(self, *args, **kwargs):
+ return self.get_query_set().sym_difference(*args, **kwargs)
+
+ def transform(self, *args, **kwargs):
+ return self.get_query_set().transform(*args, **kwargs)
+
+ def translate(self, *args, **kwargs):
+ return self.get_query_set().translate(*args, **kwargs)
+
+ def union(self, *args, **kwargs):
+ return self.get_query_set().union(*args, **kwargs)
+
+ def unionagg(self, *args, **kwargs):
+ return self.get_query_set().unionagg(*args, **kwargs)
diff --git a/django/contrib/gis/db/models/mixin.py b/django/contrib/gis/db/models/mixin.py
new file mode 100644
index 0000000000..475a053b8f
--- /dev/null
+++ b/django/contrib/gis/db/models/mixin.py
@@ -0,0 +1,11 @@
+# Until model subclassing is a possibility, a mixin class is used to add
+# the necessary functions that may be contributed for geographic objects.
+class GeoMixin:
+ """
+ The Geographic Mixin class provides routines for geographic objects,
+ however, it is no longer necessary, since all of its previous functions
+ may now be accessed via the GeometryProxy. This mixin is only provided
+ for backwards-compatibility purposes, and will be eventually removed
+ (unless the need arises again).
+ """
+ pass
diff --git a/django/contrib/gis/db/models/proxy.py b/django/contrib/gis/db/models/proxy.py
new file mode 100644
index 0000000000..34276a6d63
--- /dev/null
+++ b/django/contrib/gis/db/models/proxy.py
@@ -0,0 +1,62 @@
+"""
+ The GeometryProxy object, allows for lazy-geometries. The proxy uses
+ Python descriptors for instantiating and setting Geometry objects
+ corresponding to geographic model fields.
+
+ Thanks to Robert Coup for providing this functionality (see #4322).
+"""
+
+from types import NoneType, StringType, UnicodeType
+
+class GeometryProxy(object):
+ def __init__(self, klass, field):
+ """
+ Proxy initializes on the given Geometry class (not an instance) and
+ the GeometryField.
+ """
+ self._field = field
+ self._klass = klass
+
+ def __get__(self, obj, type=None):
+ """
+ This accessor retrieves the geometry, initializing it using the geometry
+ class specified during initialization and the HEXEWKB value of the field.
+ Currently, only GEOS or OGR geometries are supported.
+ """
+ # Getting the value of the field.
+ geom_value = obj.__dict__[self._field.attname]
+
+ if isinstance(geom_value, self._klass):
+ geom = geom_value
+ elif (geom_value is None) or (geom_value==''):
+ geom = None
+ else:
+ # Otherwise, a Geometry object is built using the field's contents,
+ # and the model's corresponding attribute is set.
+ geom = self._klass(geom_value)
+ setattr(obj, self._field.attname, geom)
+ return geom
+
+ def __set__(self, obj, value):
+ """
+ This accessor sets the proxied geometry with the geometry class
+ specified during initialization. Values of None, HEXEWKB, or WKT may
+ be used to set the geometry as well.
+ """
+ # The OGC Geometry type of the field.
+ gtype = self._field._geom
+
+ # The geometry type must match that of the field -- unless the
+ # general GeometryField is used.
+ if isinstance(value, self._klass) and (str(value.geom_type).upper() == gtype or gtype == 'GEOMETRY'):
+ # Assigning the SRID to the geometry.
+ if value.srid is None: value.srid = self._field._srid
+ elif isinstance(value, (NoneType, StringType, UnicodeType)):
+ # Set with None, WKT, or HEX
+ pass
+ else:
+ raise TypeError('cannot set %s GeometryProxy with value of type: %s' % (obj.__class__.__name__, type(value)))
+
+ # Setting the objects dictionary with the value, and returning.
+ obj.__dict__[self._field.attname] = value
+ return value
diff --git a/django/contrib/gis/db/models/query.py b/django/contrib/gis/db/models/query.py
new file mode 100644
index 0000000000..8efc720333
--- /dev/null
+++ b/django/contrib/gis/db/models/query.py
@@ -0,0 +1,617 @@
+from django.core.exceptions import ImproperlyConfigured
+from django.db import connection
+from django.db.models.query import sql, QuerySet, Q
+
+from django.contrib.gis.db.backend import SpatialBackend
+from django.contrib.gis.db.models.fields import GeometryField, PointField
+from django.contrib.gis.db.models.sql import AreaField, DistanceField, GeomField, GeoQuery, GeoWhereNode
+from django.contrib.gis.measure import Area, Distance
+from django.contrib.gis.models import get_srid_info
+qn = connection.ops.quote_name
+
+# For backwards-compatibility; Q object should work just fine
+# after queryset-refactor.
+class GeoQ(Q): pass
+
+class GeomSQL(object):
+ "Simple wrapper object for geometric SQL."
+ def __init__(self, geo_sql):
+ self.sql = geo_sql
+
+ def as_sql(self, *args, **kwargs):
+ return self.sql
+
+class GeoQuerySet(QuerySet):
+ "The Geographic QuerySet."
+
+ def __init__(self, model=None, query=None):
+ super(GeoQuerySet, self).__init__(model=model, query=query)
+ self.query = query or GeoQuery(self.model, connection)
+
+ def area(self, tolerance=0.05, **kwargs):
+ """
+ Returns the area of the geographic field in an `area` attribute on
+ each element of this GeoQuerySet.
+ """
+ # Peforming setup here rather than in `_spatial_attribute` so that
+ # we can get the units for `AreaField`.
+ procedure_args, geo_field = self._spatial_setup('area', field_name=kwargs.get('field_name', None))
+ s = {'procedure_args' : procedure_args,
+ 'geo_field' : geo_field,
+ 'setup' : False,
+ }
+ if SpatialBackend.oracle:
+ s['procedure_fmt'] = '%(geo_col)s,%(tolerance)s'
+ s['procedure_args']['tolerance'] = tolerance
+ s['select_field'] = AreaField('sq_m') # Oracle returns area in units of meters.
+ elif SpatialBackend.postgis:
+ if not geo_field.geodetic:
+ # Getting the area units of the geographic field.
+ s['select_field'] = AreaField(Area.unit_attname(geo_field._unit_name))
+ else:
+ # TODO: Do we want to support raw number areas for geodetic fields?
+ raise Exception('Area on geodetic coordinate systems not supported.')
+ return self._spatial_attribute('area', s, **kwargs)
+
+ def centroid(self, **kwargs):
+ """
+ Returns the centroid of the geographic field in a `centroid`
+ attribute on each element of this GeoQuerySet.
+ """
+ return self._geom_attribute('centroid', **kwargs)
+
+ def difference(self, geom, **kwargs):
+ """
+ Returns the spatial difference of the geographic field in a `difference`
+ attribute on each element of this GeoQuerySet.
+ """
+ return self._geomset_attribute('difference', geom, **kwargs)
+
+ def distance(self, geom, **kwargs):
+ """
+ Returns the distance from the given geographic field name to the
+ given geometry in a `distance` attribute on each element of the
+ GeoQuerySet.
+
+ Keyword Arguments:
+ `spheroid` => If the geometry field is geodetic and PostGIS is
+ the spatial database, then the more accurate
+ spheroid calculation will be used instead of the
+ quicker sphere calculation.
+
+ `tolerance` => Used only for Oracle. The tolerance is
+ in meters -- a default of 5 centimeters (0.05)
+ is used.
+ """
+ return self._distance_attribute('distance', geom, **kwargs)
+
+ def envelope(self, **kwargs):
+ """
+ Returns a Geometry representing the bounding box of the
+ Geometry field in an `envelope` attribute on each element of
+ the GeoQuerySet.
+ """
+ return self._geom_attribute('envelope', **kwargs)
+
+ def extent(self, **kwargs):
+ """
+ Returns the extent (aggregate) of the features in the GeoQuerySet. The
+ extent will be returned as a 4-tuple, consisting of (xmin, ymin, xmax, ymax).
+ """
+ convert_extent = None
+ if SpatialBackend.postgis:
+ def convert_extent(box, geo_field):
+ # TODO: Parsing of BOX3D, Oracle support (patches welcome!)
+ # Box text will be something like "BOX(-90.0 30.0, -85.0 40.0)";
+ # parsing out and returning as a 4-tuple.
+ ll, ur = box[4:-1].split(',')
+ xmin, ymin = map(float, ll.split())
+ xmax, ymax = map(float, ur.split())
+ return (xmin, ymin, xmax, ymax)
+ elif SpatialBackend.oracle:
+ def convert_extent(wkt, geo_field):
+ raise NotImplementedError
+ return self._spatial_aggregate('extent', convert_func=convert_extent, **kwargs)
+
+ def gml(self, precision=8, version=2, **kwargs):
+ """
+ Returns GML representation of the given field in a `gml` attribute
+ on each element of the GeoQuerySet.
+ """
+ s = {'desc' : 'GML', 'procedure_args' : {'precision' : precision}}
+ if SpatialBackend.postgis:
+ # PostGIS AsGML() aggregate function parameter order depends on the
+ # version -- uggh.
+ major, minor1, minor2 = SpatialBackend.version
+ if major >= 1 and (minor1 > 3 or (minor1 == 3 and minor2 > 1)):
+ procedure_fmt = '%(version)s,%(geo_col)s,%(precision)s'
+ else:
+ procedure_fmt = '%(geo_col)s,%(precision)s,%(version)s'
+ s['procedure_args'] = {'precision' : precision, 'version' : version}
+
+ return self._spatial_attribute('gml', s, **kwargs)
+
+ def intersection(self, geom, **kwargs):
+ """
+ Returns the spatial intersection of the Geometry field in
+ an `intersection` attribute on each element of this
+ GeoQuerySet.
+ """
+ return self._geomset_attribute('intersection', geom, **kwargs)
+
+ def kml(self, **kwargs):
+ """
+ Returns KML representation of the geometry field in a `kml`
+ attribute on each element of this GeoQuerySet.
+ """
+ s = {'desc' : 'KML',
+ 'procedure_fmt' : '%(geo_col)s,%(precision)s',
+ 'procedure_args' : {'precision' : kwargs.pop('precision', 8)},
+ }
+ return self._spatial_attribute('kml', s, **kwargs)
+
+ def length(self, **kwargs):
+ """
+ Returns the length of the geometry field as a `Distance` object
+ stored in a `length` attribute on each element of this GeoQuerySet.
+ """
+ return self._distance_attribute('length', None, **kwargs)
+
+ def make_line(self, **kwargs):
+ """
+ Creates a linestring from all of the PointField geometries in the
+ this GeoQuerySet and returns it. This is a spatial aggregate
+ method, and thus returns a geometry rather than a GeoQuerySet.
+ """
+ kwargs['geo_field_type'] = PointField
+ kwargs['agg_field'] = GeometryField
+ return self._spatial_aggregate('make_line', **kwargs)
+
+ def mem_size(self, **kwargs):
+ """
+ Returns the memory size (number of bytes) that the geometry field takes
+ in a `mem_size` attribute on each element of this GeoQuerySet.
+ """
+ return self._spatial_attribute('mem_size', {}, **kwargs)
+
+ def num_geom(self, **kwargs):
+ """
+ Returns the number of geometries if the field is a
+ GeometryCollection or Multi* Field in a `num_geom`
+ attribute on each element of this GeoQuerySet; otherwise
+ the sets with None.
+ """
+ return self._spatial_attribute('num_geom', {}, **kwargs)
+
+ def num_points(self, **kwargs):
+ """
+ Returns the number of points in the first linestring in the
+ Geometry field in a `num_points` attribute on each element of
+ this GeoQuerySet; otherwise sets with None.
+ """
+ return self._spatial_attribute('num_points', {}, **kwargs)
+
+ def perimeter(self, **kwargs):
+ """
+ Returns the perimeter of the geometry field as a `Distance` object
+ stored in a `perimeter` attribute on each element of this GeoQuerySet.
+ """
+ return self._distance_attribute('perimeter', None, **kwargs)
+
+ def point_on_surface(self, **kwargs):
+ """
+ Returns a Point geometry guaranteed to lie on the surface of the
+ Geometry field in a `point_on_surface` attribute on each element
+ of this GeoQuerySet; otherwise sets with None.
+ """
+ return self._geom_attribute('point_on_surface', **kwargs)
+
+ def scale(self, x, y, z=0.0, **kwargs):
+ """
+ Scales the geometry to a new size by multiplying the ordinates
+ with the given x,y,z scale factors.
+ """
+ s = {'procedure_fmt' : '%(geo_col)s,%(x)s,%(y)s,%(z)s',
+ 'procedure_args' : {'x' : x, 'y' : y, 'z' : z},
+ 'select_field' : GeomField(),
+ }
+ return self._spatial_attribute('scale', s, **kwargs)
+
+ def svg(self, **kwargs):
+ """
+ Returns SVG representation of the geographic field in a `svg`
+ attribute on each element of this GeoQuerySet.
+ """
+ s = {'desc' : 'SVG',
+ 'procedure_fmt' : '%(geo_col)s,%(rel)s,%(precision)s',
+ 'procedure_args' : {'rel' : int(kwargs.pop('relative', 0)),
+ 'precision' : kwargs.pop('precision', 8)},
+ }
+ return self._spatial_attribute('svg', s, **kwargs)
+
+ def sym_difference(self, geom, **kwargs):
+ """
+ Returns the symmetric difference of the geographic field in a
+ `sym_difference` attribute on each element of this GeoQuerySet.
+ """
+ return self._geomset_attribute('sym_difference', geom, **kwargs)
+
+ def translate(self, x, y, z=0.0, **kwargs):
+ """
+ Translates the geometry to a new location using the given numeric
+ parameters as offsets.
+ """
+ s = {'procedure_fmt' : '%(geo_col)s,%(x)s,%(y)s,%(z)s',
+ 'procedure_args' : {'x' : x, 'y' : y, 'z' : z},
+ 'select_field' : GeomField(),
+ }
+ return self._spatial_attribute('translate', s, **kwargs)
+
+ def transform(self, srid=4326, **kwargs):
+ """
+ Transforms the given geometry field to the given SRID. If no SRID is
+ provided, the transformation will default to using 4326 (WGS84).
+ """
+ if not isinstance(srid, (int, long)):
+ raise TypeError('An integer SRID must be provided.')
+ field_name = kwargs.get('field_name', None)
+ tmp, geo_field = self._spatial_setup('transform', field_name=field_name)
+
+ # Getting the selection SQL for the given geographic field.
+ field_col = self._geocol_select(geo_field, field_name)
+
+ # Why cascading substitutions? Because spatial backends like
+ # Oracle and MySQL already require a function call to convert to text, thus
+ # when there's also a transformation we need to cascade the substitutions.
+ # For example, 'SDO_UTIL.TO_WKTGEOMETRY(SDO_CS.TRANSFORM( ... )'
+ geo_col = self.query.custom_select.get(geo_field, field_col)
+
+ # Setting the key for the field's column with the custom SELECT SQL to
+ # override the geometry column returned from the database.
+ custom_sel = '%s(%s, %s)' % (SpatialBackend.transform, geo_col, srid)
+ # TODO: Should we have this as an alias?
+ # custom_sel = '(%s(%s, %s)) AS %s' % (SpatialBackend.transform, geo_col, srid, qn(geo_field.name))
+ self.query.transformed_srid = srid # So other GeoQuerySet methods
+ self.query.custom_select[geo_field] = custom_sel
+ return self._clone()
+
+ def union(self, geom, **kwargs):
+ """
+ Returns the union of the geographic field with the given
+ Geometry in a `union` attribute on each element of this GeoQuerySet.
+ """
+ return self._geomset_attribute('union', geom, **kwargs)
+
+ def unionagg(self, **kwargs):
+ """
+ Performs an aggregate union on the given geometry field. Returns
+ None if the GeoQuerySet is empty. The `tolerance` keyword is for
+ Oracle backends only.
+ """
+ kwargs['agg_field'] = GeometryField
+ return self._spatial_aggregate('unionagg', **kwargs)
+
+ ### Private API -- Abstracted DRY routines. ###
+ def _spatial_setup(self, att, aggregate=False, desc=None, field_name=None, geo_field_type=None):
+ """
+ Performs set up for executing the spatial function.
+ """
+ # Does the spatial backend support this?
+ func = getattr(SpatialBackend, att, False)
+ if desc is None: desc = att
+ if not func: raise ImproperlyConfigured('%s stored procedure not available.' % desc)
+
+ # Initializing the procedure arguments.
+ procedure_args = {'function' : func}
+
+ # Is there a geographic field in the model to perform this
+ # operation on?
+ geo_field = self.query._geo_field(field_name)
+ if not geo_field:
+ raise TypeError('%s output only available on GeometryFields.' % func)
+
+ # If the `geo_field_type` keyword was used, then enforce that
+ # type limitation.
+ if not geo_field_type is None and not isinstance(geo_field, geo_field_type):
+ raise TypeError('"%s" stored procedures may only be called on %ss.' % (func, geo_field_type.__name__))
+
+ # Setting the procedure args.
+ procedure_args['geo_col'] = self._geocol_select(geo_field, field_name, aggregate)
+
+ return procedure_args, geo_field
+
+ def _spatial_aggregate(self, att, field_name=None,
+ agg_field=None, convert_func=None,
+ geo_field_type=None, tolerance=0.0005):
+ """
+ DRY routine for calling aggregate spatial stored procedures and
+ returning their result to the caller of the function.
+ """
+ # Constructing the setup keyword arguments.
+ setup_kwargs = {'aggregate' : True,
+ 'field_name' : field_name,
+ 'geo_field_type' : geo_field_type,
+ }
+ procedure_args, geo_field = self._spatial_setup(att, **setup_kwargs)
+
+ if SpatialBackend.oracle:
+ procedure_args['tolerance'] = tolerance
+ # Adding in selection SQL for Oracle geometry columns.
+ if agg_field is GeometryField:
+ agg_sql = '%s' % SpatialBackend.select
+ else:
+ agg_sql = '%s'
+ agg_sql = agg_sql % ('%(function)s(SDOAGGRTYPE(%(geo_col)s,%(tolerance)s))' % procedure_args)
+ else:
+ agg_sql = '%(function)s(%(geo_col)s)' % procedure_args
+
+ # Wrapping our selection SQL in `GeomSQL` to bypass quoting, and
+ # specifying the type of the aggregate field.
+ self.query.select = [GeomSQL(agg_sql)]
+ self.query.select_fields = [agg_field]
+
+ try:
+ # `asql` => not overriding `sql` module.
+ asql, params = self.query.as_sql()
+ except sql.datastructures.EmptyResultSet:
+ return None
+
+ # Getting a cursor, executing the query, and extracting the returned
+ # value from the aggregate function.
+ cursor = connection.cursor()
+ cursor.execute(asql, params)
+ result = cursor.fetchone()[0]
+
+ # If the `agg_field` is specified as a GeometryField, then autmatically
+ # set up the conversion function.
+ if agg_field is GeometryField and not callable(convert_func):
+ if SpatialBackend.postgis:
+ def convert_geom(hex, geo_field):
+ if hex: return SpatialBackend.Geometry(hex)
+ else: return None
+ elif SpatialBackend.oracle:
+ def convert_geom(clob, geo_field):
+ if clob: return SpatialBackend.Geometry(clob.read(), geo_field._srid)
+ else: return None
+ convert_func = convert_geom
+
+ # Returning the callback function evaluated on the result culled
+ # from the executed cursor.
+ if callable(convert_func):
+ return convert_func(result, geo_field)
+ else:
+ return result
+
+ def _spatial_attribute(self, att, settings, field_name=None, model_att=None):
+ """
+ DRY routine for calling a spatial stored procedure on a geometry column
+ and attaching its output as an attribute of the model.
+
+ Arguments:
+ att:
+ The name of the spatial attribute that holds the spatial
+ SQL function to call.
+
+ settings:
+ Dictonary of internal settings to customize for the spatial procedure.
+
+ Public Keyword Arguments:
+
+ field_name:
+ The name of the geographic field to call the spatial
+ function on. May also be a lookup to a geometry field
+ as part of a foreign key relation.
+
+ model_att:
+ The name of the model attribute to attach the output of
+ the spatial function to.
+ """
+ # Default settings.
+ settings.setdefault('desc', None)
+ settings.setdefault('geom_args', ())
+ settings.setdefault('geom_field', None)
+ settings.setdefault('procedure_args', {})
+ settings.setdefault('procedure_fmt', '%(geo_col)s')
+ settings.setdefault('select_params', [])
+
+ # Performing setup for the spatial column, unless told not to.
+ if settings.get('setup', True):
+ default_args, geo_field = self._spatial_setup(att, desc=settings['desc'], field_name=field_name)
+ for k, v in default_args.iteritems(): settings['procedure_args'].setdefault(k, v)
+ else:
+ geo_field = settings['geo_field']
+
+ # The attribute to attach to the model.
+ if not isinstance(model_att, basestring): model_att = att
+
+ # Special handling for any argument that is a geometry.
+ for name in settings['geom_args']:
+ # Using the field's get_db_prep_lookup() to get any needed
+ # transformation SQL -- we pass in a 'dummy' `contains` lookup.
+ where, params = geo_field.get_db_prep_lookup('contains', settings['procedure_args'][name])
+ # Replacing the procedure format with that of any needed
+ # transformation SQL.
+ old_fmt = '%%(%s)s' % name
+ new_fmt = where[0] % '%%s'
+ settings['procedure_fmt'] = settings['procedure_fmt'].replace(old_fmt, new_fmt)
+ settings['select_params'].extend(params)
+
+ # Getting the format for the stored procedure.
+ fmt = '%%(function)s(%s)' % settings['procedure_fmt']
+
+ # If the result of this function needs to be converted.
+ if settings.get('select_field', False):
+ sel_fld = settings['select_field']
+ if isinstance(sel_fld, GeomField) and SpatialBackend.select:
+ self.query.custom_select[model_att] = SpatialBackend.select
+ self.query.extra_select_fields[model_att] = sel_fld
+
+ # Finally, setting the extra selection attribute with
+ # the format string expanded with the stored procedure
+ # arguments.
+ return self.extra(select={model_att : fmt % settings['procedure_args']},
+ select_params=settings['select_params'])
+
+ def _distance_attribute(self, func, geom=None, tolerance=0.05, spheroid=False, **kwargs):
+ """
+ DRY routine for GeoQuerySet distance attribute routines.
+ """
+ # Setting up the distance procedure arguments.
+ procedure_args, geo_field = self._spatial_setup(func, field_name=kwargs.get('field_name', None))
+
+ # If geodetic defaulting distance attribute to meters (Oracle and
+ # PostGIS spherical distances return meters). Otherwise, use the
+ # units of the geometry field.
+ if geo_field.geodetic:
+ dist_att = 'm'
+ else:
+ dist_att = Distance.unit_attname(geo_field._unit_name)
+
+ # Shortcut booleans for what distance function we're using.
+ distance = func == 'distance'
+ length = func == 'length'
+ perimeter = func == 'perimeter'
+ if not (distance or length or perimeter):
+ raise ValueError('Unknown distance function: %s' % func)
+
+ # The field's get_db_prep_lookup() is used to get any
+ # extra distance parameters. Here we set up the
+ # parameters that will be passed in to field's function.
+ lookup_params = [geom or 'POINT (0 0)', 0]
+
+ # If the spheroid calculation is desired, either by the `spheroid`
+ # keyword or wehn calculating the length of geodetic field, make
+ # sure the 'spheroid' distance setting string is passed in so we
+ # get the correct spatial stored procedure.
+ if spheroid or (SpatialBackend.postgis and geo_field.geodetic and length):
+ lookup_params.append('spheroid')
+ where, params = geo_field.get_db_prep_lookup('distance_lte', lookup_params)
+
+ # The `geom_args` flag is set to true if a geometry parameter was
+ # passed in.
+ geom_args = bool(geom)
+
+ if SpatialBackend.oracle:
+ if distance:
+ procedure_fmt = '%(geo_col)s,%(geom)s,%(tolerance)s'
+ elif length or perimeter:
+ procedure_fmt = '%(geo_col)s,%(tolerance)s'
+ procedure_args['tolerance'] = tolerance
+ else:
+ # Getting whether this field is in units of degrees since the field may have
+ # been transformed via the `transform` GeoQuerySet method.
+ if self.query.transformed_srid:
+ u, unit_name, s = get_srid_info(self.query.transformed_srid)
+ geodetic = unit_name in geo_field.geodetic_units
+ else:
+ geodetic = geo_field.geodetic
+
+ if distance:
+ if self.query.transformed_srid:
+ # Setting the `geom_args` flag to false because we want to handle
+ # transformation SQL here, rather than the way done by default
+ # (which will transform to the original SRID of the field rather
+ # than to what was transformed to).
+ geom_args = False
+ procedure_fmt = '%s(%%(geo_col)s, %s)' % (SpatialBackend.transform, self.query.transformed_srid)
+ if geom.srid is None or geom.srid == self.query.transformed_srid:
+ # If the geom parameter srid is None, it is assumed the coordinates
+ # are in the transformed units. A placeholder is used for the
+ # geometry parameter.
+ procedure_fmt += ', %%s'
+ else:
+ # We need to transform the geom to the srid specified in `transform()`,
+ # so wrapping the geometry placeholder in transformation SQL.
+ procedure_fmt += ', %s(%%%%s, %s)' % (SpatialBackend.transform, self.query.transformed_srid)
+ else:
+ # `transform()` was not used on this GeoQuerySet.
+ procedure_fmt = '%(geo_col)s,%(geom)s'
+
+ if geodetic:
+ # Spherical distance calculation is needed (because the geographic
+ # field is geodetic). However, the PostGIS ST_distance_sphere/spheroid()
+ # procedures may only do queries from point columns to point geometries
+ # some error checking is required.
+ if not isinstance(geo_field, PointField):
+ raise TypeError('Spherical distance calculation only supported on PointFields.')
+ if not str(SpatialBackend.Geometry(buffer(params[0].wkb)).geom_type) == 'Point':
+ raise TypeError('Spherical distance calculation only supported with Point Geometry parameters')
+ # The `function` procedure argument needs to be set differently for
+ # geodetic distance calculations.
+ if spheroid:
+ # Call to distance_spheroid() requires spheroid param as well.
+ procedure_fmt += ',%(spheroid)s'
+ procedure_args.update({'function' : SpatialBackend.distance_spheroid, 'spheroid' : where[1]})
+ else:
+ procedure_args.update({'function' : SpatialBackend.distance_sphere})
+ elif length or perimeter:
+ procedure_fmt = '%(geo_col)s'
+ if geodetic and length:
+ # There's no `length_sphere`
+ procedure_fmt += ',%(spheroid)s'
+ procedure_args.update({'function' : SpatialBackend.length_spheroid, 'spheroid' : where[1]})
+
+ # Setting up the settings for `_spatial_attribute`.
+ s = {'select_field' : DistanceField(dist_att),
+ 'setup' : False,
+ 'geo_field' : geo_field,
+ 'procedure_args' : procedure_args,
+ 'procedure_fmt' : procedure_fmt,
+ }
+ if geom_args:
+ s['geom_args'] = ('geom',)
+ s['procedure_args']['geom'] = geom
+ elif geom:
+ # The geometry is passed in as a parameter because we handled
+ # transformation conditions in this routine.
+ s['select_params'] = [SpatialBackend.Adaptor(geom)]
+ return self._spatial_attribute(func, s, **kwargs)
+
+ def _geom_attribute(self, func, tolerance=0.05, **kwargs):
+ """
+ DRY routine for setting up a GeoQuerySet method that attaches a
+ Geometry attribute (e.g., `centroid`, `point_on_surface`).
+ """
+ s = {'select_field' : GeomField(),}
+ if SpatialBackend.oracle:
+ s['procedure_fmt'] = '%(geo_col)s,%(tolerance)s'
+ s['procedure_args'] = {'tolerance' : tolerance}
+ return self._spatial_attribute(func, s, **kwargs)
+
+ def _geomset_attribute(self, func, geom, tolerance=0.05, **kwargs):
+ """
+ DRY routine for setting up a GeoQuerySet method that attaches a
+ Geometry attribute and takes a Geoemtry parameter. This is used
+ for geometry set-like operations (e.g., intersection, difference,
+ union, sym_difference).
+ """
+ s = {'geom_args' : ('geom',),
+ 'select_field' : GeomField(),
+ 'procedure_fmt' : '%(geo_col)s,%(geom)s',
+ 'procedure_args' : {'geom' : geom},
+ }
+ if SpatialBackend.oracle:
+ s['procedure_fmt'] += ',%(tolerance)s'
+ s['procedure_args']['tolerance'] = tolerance
+ return self._spatial_attribute(func, s, **kwargs)
+
+ def _geocol_select(self, geo_field, field_name, aggregate=False):
+ """
+ Helper routine for constructing the SQL to select the geographic
+ column. Takes into account if the geographic field is in a
+ ForeignKey relation to the current model.
+ """
+ # If this is an aggregate spatial query, the flag needs to be
+ # set on the `GeoQuery` object of this queryset.
+ if aggregate: self.query.aggregate = True
+
+ # Is this operation going to be on a related geographic field?
+ if not geo_field in self.model._meta.fields:
+ # If so, it'll have to be added to the select related information
+ # (e.g., if 'location__point' was given as the field name).
+ self.query.add_select_related([field_name])
+ self.query.pre_sql_setup()
+ rel_table, rel_col = self.query.related_select_cols[self.query.related_select_fields.index(geo_field)]
+ return self.query._field_column(geo_field, rel_table)
+ else:
+ return self.query._field_column(geo_field)
diff --git a/django/contrib/gis/db/models/sql/__init__.py b/django/contrib/gis/db/models/sql/__init__.py
new file mode 100644
index 0000000000..4a66b41664
--- /dev/null
+++ b/django/contrib/gis/db/models/sql/__init__.py
@@ -0,0 +1,2 @@
+from django.contrib.gis.db.models.sql.query import AreaField, DistanceField, GeomField, GeoQuery
+from django.contrib.gis.db.models.sql.where import GeoWhereNode
diff --git a/django/contrib/gis/db/models/sql/query.py b/django/contrib/gis/db/models/sql/query.py
new file mode 100644
index 0000000000..b4892e3c15
--- /dev/null
+++ b/django/contrib/gis/db/models/sql/query.py
@@ -0,0 +1,327 @@
+from itertools import izip
+from django.db.models.query import sql
+from django.db.models.fields import FieldDoesNotExist
+from django.db.models.fields.related import ForeignKey
+
+from django.contrib.gis.db.backend import SpatialBackend
+from django.contrib.gis.db.models.fields import GeometryField
+from django.contrib.gis.db.models.sql.where import GeoWhereNode
+from django.contrib.gis.measure import Area, Distance
+
+# Valid GIS query types.
+ALL_TERMS = sql.constants.QUERY_TERMS.copy()
+ALL_TERMS.update(SpatialBackend.gis_terms)
+
+class GeoQuery(sql.Query):
+ """
+ A single spatial SQL query.
+ """
+ # Overridding the valid query terms.
+ query_terms = ALL_TERMS
+
+ #### Methods overridden from the base Query class ####
+ def __init__(self, model, conn):
+ super(GeoQuery, self).__init__(model, conn, where=GeoWhereNode)
+ # The following attributes are customized for the GeoQuerySet.
+ # The GeoWhereNode and SpatialBackend classes contain backend-specific
+ # routines and functions.
+ self.aggregate = False
+ self.custom_select = {}
+ self.transformed_srid = None
+ self.extra_select_fields = {}
+
+ def clone(self, *args, **kwargs):
+ obj = super(GeoQuery, self).clone(*args, **kwargs)
+ # Customized selection dictionary and transformed srid flag have
+ # to also be added to obj.
+ obj.aggregate = self.aggregate
+ obj.custom_select = self.custom_select.copy()
+ obj.transformed_srid = self.transformed_srid
+ obj.extra_select_fields = self.extra_select_fields.copy()
+ return obj
+
+ def get_columns(self, with_aliases=False):
+ """
+ Return the list of columns to use in the select statement. If no
+ columns have been specified, returns all columns relating to fields in
+ the model.
+
+ If 'with_aliases' is true, any column names that are duplicated
+ (without the table names) are given unique aliases. This is needed in
+ some cases to avoid ambiguitity with nested queries.
+
+ This routine is overridden from Query to handle customized selection of
+ geometry columns.
+ """
+ qn = self.quote_name_unless_alias
+ qn2 = self.connection.ops.quote_name
+ result = ['(%s) AS %s' % (self.get_extra_select_format(alias) % col, qn2(alias))
+ for alias, col in self.extra_select.iteritems()]
+ aliases = set(self.extra_select.keys())
+ if with_aliases:
+ col_aliases = aliases.copy()
+ else:
+ col_aliases = set()
+ if self.select:
+ # This loop customized for GeoQuery.
+ for col, field in izip(self.select, self.select_fields):
+ if isinstance(col, (list, tuple)):
+ r = self.get_field_select(field, col[0])
+ if with_aliases and col[1] in col_aliases:
+ c_alias = 'Col%d' % len(col_aliases)
+ result.append('%s AS %s' % (r, c_alias))
+ aliases.add(c_alias)
+ col_aliases.add(c_alias)
+ else:
+ result.append(r)
+ aliases.add(r)
+ col_aliases.add(col[1])
+ else:
+ result.append(col.as_sql(quote_func=qn))
+ if hasattr(col, 'alias'):
+ aliases.add(col.alias)
+ col_aliases.add(col.alias)
+ elif self.default_cols:
+ cols, new_aliases = self.get_default_columns(with_aliases,
+ col_aliases)
+ result.extend(cols)
+ aliases.update(new_aliases)
+ # This loop customized for GeoQuery.
+ if not self.aggregate:
+ for (table, col), field in izip(self.related_select_cols, self.related_select_fields):
+ r = self.get_field_select(field, table)
+ if with_aliases and col in col_aliases:
+ c_alias = 'Col%d' % len(col_aliases)
+ result.append('%s AS %s' % (r, c_alias))
+ aliases.add(c_alias)
+ col_aliases.add(c_alias)
+ else:
+ result.append(r)
+ aliases.add(r)
+ col_aliases.add(col)
+
+ self._select_aliases = aliases
+ return result
+
+ def get_default_columns(self, with_aliases=False, col_aliases=None,
+ start_alias=None, opts=None, as_pairs=False):
+ """
+ Computes the default columns for selecting every field in the base
+ model.
+
+ Returns a list of strings, quoted appropriately for use in SQL
+ directly, as well as a set of aliases used in the select statement.
+
+ This routine is overridden from Query to handle customized selection of
+ geometry columns.
+ """
+ result = []
+ if opts is None:
+ opts = self.model._meta
+ if start_alias:
+ table_alias = start_alias
+ else:
+ table_alias = self.tables[0]
+ root_pk = self.model._meta.pk.column
+ seen = {None: table_alias}
+ aliases = set()
+ for field, model in opts.get_fields_with_model():
+ try:
+ alias = seen[model]
+ except KeyError:
+ alias = self.join((table_alias, model._meta.db_table,
+ root_pk, model._meta.pk.column))
+ seen[model] = alias
+ if as_pairs:
+ result.append((alias, field.column))
+ continue
+ # This part of the function is customized for GeoQuery. We
+ # see if there was any custom selection specified in the
+ # dictionary, and set up the selection format appropriately.
+ field_sel = self.get_field_select(field, alias)
+ if with_aliases and field.column in col_aliases:
+ c_alias = 'Col%d' % len(col_aliases)
+ result.append('%s AS %s' % (field_sel, c_alias))
+ col_aliases.add(c_alias)
+ aliases.add(c_alias)
+ else:
+ r = field_sel
+ result.append(r)
+ aliases.add(r)
+ if with_aliases:
+ col_aliases.add(field.column)
+ if as_pairs:
+ return result, None
+ return result, aliases
+
+ def get_ordering(self):
+ """
+ This routine is overridden to disable ordering for aggregate
+ spatial queries.
+ """
+ if not self.aggregate:
+ return super(GeoQuery, self).get_ordering()
+ else:
+ return ()
+
+ def resolve_columns(self, row, fields=()):
+ """
+ This routine is necessary so that distances and geometries returned
+ from extra selection SQL get resolved appropriately into Python
+ objects.
+ """
+ values = []
+ aliases = self.extra_select.keys()
+ index_start = len(aliases)
+ values = [self.convert_values(v, self.extra_select_fields.get(a, None))
+ for v, a in izip(row[:index_start], aliases)]
+ if SpatialBackend.oracle:
+ # This is what happens normally in Oracle's `resolve_columns`.
+ for value, field in izip(row[index_start:], fields):
+ values.append(self.convert_values(value, field))
+ else:
+ values.extend(row[index_start:])
+ return values
+
+ def convert_values(self, value, field):
+ """
+ Using the same routines that Oracle does we can convert our
+ extra selection objects into Geometry and Distance objects.
+ TODO: Laziness.
+ """
+ if SpatialBackend.oracle:
+ # Running through Oracle's first.
+ value = super(GeoQuery, self).convert_values(value, field)
+ if isinstance(field, DistanceField):
+ # Using the field's distance attribute, can instantiate
+ # `Distance` with the right context.
+ value = Distance(**{field.distance_att : value})
+ elif isinstance(field, AreaField):
+ value = Area(**{field.area_att : value})
+ elif isinstance(field, GeomField):
+ value = SpatialBackend.Geometry(value)
+ return value
+
+ #### Routines unique to GeoQuery ####
+ def get_extra_select_format(self, alias):
+ sel_fmt = '%s'
+ if alias in self.custom_select:
+ sel_fmt = sel_fmt % self.custom_select[alias]
+ return sel_fmt
+
+ def get_field_select(self, fld, alias=None):
+ """
+ Returns the SELECT SQL string for the given field. Figures out
+ if any custom selection SQL is needed for the column The `alias`
+ keyword may be used to manually specify the database table where
+ the column exists, if not in the model associated with this
+ `GeoQuery`.
+ """
+ sel_fmt = self.get_select_format(fld)
+ if fld in self.custom_select:
+ field_sel = sel_fmt % self.custom_select[fld]
+ else:
+ field_sel = sel_fmt % self._field_column(fld, alias)
+ return field_sel
+
+ def get_select_format(self, fld):
+ """
+ Returns the selection format string, depending on the requirements
+ of the spatial backend. For example, Oracle and MySQL require custom
+ selection formats in order to retrieve geometries in OGC WKT. For all
+ other fields a simple '%s' format string is returned.
+ """
+ if SpatialBackend.select and hasattr(fld, '_geom'):
+ # This allows operations to be done on fields in the SELECT,
+ # overriding their values -- used by the Oracle and MySQL
+ # spatial backends to get database values as WKT, and by the
+ # `transform` method.
+ sel_fmt = SpatialBackend.select
+
+ # Because WKT doesn't contain spatial reference information,
+ # the SRID is prefixed to the returned WKT to ensure that the
+ # transformed geometries have an SRID different than that of the
+ # field -- this is only used by `transform` for Oracle backends.
+ if self.transformed_srid and SpatialBackend.oracle:
+ sel_fmt = "'SRID=%d;'||%s" % (self.transformed_srid, sel_fmt)
+ else:
+ sel_fmt = '%s'
+ return sel_fmt
+
+ # Private API utilities, subject to change.
+ def _check_geo_field(self, model, name_param):
+ """
+ Recursive utility routine for checking the given name parameter
+ on the given model. Initially, the name parameter is a string,
+ of the field on the given model e.g., 'point', 'the_geom'.
+ Related model field strings like 'address__point', may also be
+ used.
+
+ If a GeometryField exists according to the given name parameter
+ it will be returned, otherwise returns False.
+ """
+ if isinstance(name_param, basestring):
+ # This takes into account the situation where the name is a
+ # lookup to a related geographic field, e.g., 'address__point'.
+ name_param = name_param.split(sql.constants.LOOKUP_SEP)
+ name_param.reverse() # Reversing so list operates like a queue of related lookups.
+ elif not isinstance(name_param, list):
+ raise TypeError
+ try:
+ # Getting the name of the field for the model (by popping the first
+ # name from the `name_param` list created above).
+ fld, mod, direct, m2m = model._meta.get_field_by_name(name_param.pop())
+ except (FieldDoesNotExist, IndexError):
+ return False
+ # TODO: ManyToManyField?
+ if isinstance(fld, GeometryField):
+ return fld # A-OK.
+ elif isinstance(fld, ForeignKey):
+ # ForeignKey encountered, return the output of this utility called
+ # on the _related_ model with the remaining name parameters.
+ return self._check_geo_field(fld.rel.to, name_param) # Recurse to check ForeignKey relation.
+ else:
+ return False
+
+ def _field_column(self, field, table_alias=None):
+ """
+ Helper function that returns the database column for the given field.
+ The table and column are returned (quoted) in the proper format, e.g.,
+ `"geoapp_city"."point"`. If `table_alias` is not specified, the
+ database table associated with the model of this `GeoQuery` will be
+ used.
+ """
+ if table_alias is None: table_alias = self.model._meta.db_table
+ return "%s.%s" % (self.quote_name_unless_alias(table_alias),
+ self.connection.ops.quote_name(field.column))
+
+ def _geo_field(self, field_name=None):
+ """
+ Returns the first Geometry field encountered; or specified via the
+ `field_name` keyword. The `field_name` may be a string specifying
+ the geometry field on this GeoQuery's model, or a lookup string
+ to a geometry field via a ForeignKey relation.
+ """
+ if field_name is None:
+ # Incrementing until the first geographic field is found.
+ for fld in self.model._meta.fields:
+ if isinstance(fld, GeometryField): return fld
+ return False
+ else:
+ # Otherwise, check by the given field name -- which may be
+ # a lookup to a _related_ geographic field.
+ return self._check_geo_field(self.model, field_name)
+
+### Field Classes for `convert_values` ####
+class AreaField(object):
+ def __init__(self, area_att):
+ self.area_att = area_att
+
+class DistanceField(object):
+ def __init__(self, distance_att):
+ self.distance_att = distance_att
+
+# Rather than use GeometryField (which requires a SQL query
+# upon instantiation), use this lighter weight class.
+class GeomField(object):
+ pass
diff --git a/django/contrib/gis/db/models/sql/where.py b/django/contrib/gis/db/models/sql/where.py
new file mode 100644
index 0000000000..a1a28d9511
--- /dev/null
+++ b/django/contrib/gis/db/models/sql/where.py
@@ -0,0 +1,64 @@
+import datetime
+from django.db.models.fields import Field
+from django.db.models.sql.where import WhereNode
+from django.contrib.gis.db.backend import get_geo_where_clause, SpatialBackend
+
+class GeoAnnotation(object):
+ """
+ The annotation used for GeometryFields; basically a placeholder
+ for metadata needed by the `get_geo_where_clause` of the spatial
+ backend.
+ """
+ def __init__(self, field, value, where):
+ self.geodetic = field.geodetic
+ self.geom_type = field._geom
+ self.value = value
+ self.where = tuple(where)
+
+class GeoWhereNode(WhereNode):
+ """
+ Used to represent the SQL where-clause for spatial databases --
+ these are tied to the GeoQuery class that created it.
+ """
+ def add(self, data, connector):
+ """
+ This is overridden from the regular WhereNode to handle the
+ peculiarties of GeometryFields, because they need a special
+ annotation object that contains the spatial metadata from the
+ field to generate the spatial SQL.
+ """
+ if not isinstance(data, (list, tuple)):
+ return super(WhereNode, self).add(data, connector)
+ alias, col, field, lookup_type, value = data
+ if not hasattr(field, "_geom"):
+ # Not a geographic field, so call `WhereNode.add`.
+ return super(GeoWhereNode, self).add(data, connector)
+ else:
+ # `GeometryField.get_db_prep_lookup` returns a where clause
+ # substitution array in addition to the parameters.
+ where, params = field.get_db_prep_lookup(lookup_type, value)
+
+ # The annotation will be a `GeoAnnotation` object that
+ # will contain the necessary geometry field metadata for
+ # the `get_geo_where_clause` to construct the appropriate
+ # spatial SQL when `make_atom` is called.
+ annotation = GeoAnnotation(field, value, where)
+ return super(WhereNode, self).add((alias, col, field.db_type(), lookup_type,
+ annotation, params), connector)
+
+ def make_atom(self, child, qn):
+ table_alias, name, db_type, lookup_type, value_annot, params = child
+
+ if isinstance(value_annot, GeoAnnotation):
+ if lookup_type in SpatialBackend.gis_terms:
+ # Getting the geographic where clause; substitution parameters
+ # will be populated in the GeoFieldSQL object returned by the
+ # GeometryField.
+ gwc = get_geo_where_clause(table_alias, name, lookup_type, value_annot)
+ return gwc % value_annot.where, params
+ else:
+ raise TypeError('Invalid lookup type: %r' % lookup_type)
+ else:
+ # If not a GeometryField, call the `make_atom` from the
+ # base class.
+ return super(GeoWhereNode, self).make_atom(child, qn)
diff --git a/django/contrib/gis/forms/__init__.py b/django/contrib/gis/forms/__init__.py
new file mode 100644
index 0000000000..5441e6078d
--- /dev/null
+++ b/django/contrib/gis/forms/__init__.py
@@ -0,0 +1 @@
+from django.contrib.gis.forms.fields import GeometryField
diff --git a/django/contrib/gis/forms/fields.py b/django/contrib/gis/forms/fields.py
new file mode 100644
index 0000000000..a65e76d5d4
--- /dev/null
+++ b/django/contrib/gis/forms/fields.py
@@ -0,0 +1,37 @@
+from django import forms
+from django.contrib.gis.geos import GEOSGeometry, GEOSException
+from django.utils.translation import ugettext_lazy as _
+
+class GeometryField(forms.Field):
+ # By default a Textarea widget is used.
+ widget = forms.Textarea
+
+ default_error_messages = {
+ 'no_geom' : _(u'No geometry value provided.'),
+ 'invalid_geom' : _(u'Invalid Geometry value.'),
+ 'invalid_geom_type' : _(u'Invalid Geometry type.'),
+ }
+ def __init__(self, **kwargs):
+ self.null = kwargs.pop('null')
+ self.geom_type = kwargs.pop('geom_type')
+ super(GeometryField, self).__init__(**kwargs)
+
+ def clean(self, value):
+ """
+ Validates that the input value can be converted to a Geometry
+ object (which is returned). A ValidationError is raised if
+ the value cannot be instantiated as a Geometry.
+ """
+ if not value:
+ if self.null:
+ # The geometry column allows NULL, return None.
+ return None
+ else:
+ raise forms.ValidationError(self.error_messages['no_geom'])
+ try:
+ geom = GEOSGeometry(value)
+ if geom.geom_type.upper() != self.geom_type:
+ raise forms.ValidationError(self.error_messages['invalid_geom_type'])
+ return geom
+ except GEOSException:
+ raise forms.ValidationError(self.error_messages['invalid_geom'])
diff --git a/django/contrib/gis/gdal/LICENSE b/django/contrib/gis/gdal/LICENSE
new file mode 100644
index 0000000000..4bd0bed44b
--- /dev/null
+++ b/django/contrib/gis/gdal/LICENSE
@@ -0,0 +1,28 @@
+Copyright (c) 2007, Justin Bronn
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without modification,
+are permitted provided that the following conditions are met:
+
+ 1. Redistributions of source code must retain the above copyright notice,
+ this list of conditions and the following disclaimer.
+
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+ 3. Neither the name of OGRGeometry nor the names of its contributors may be used
+ to endorse or promote products derived from this software without
+ specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
+ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
+ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
diff --git a/django/contrib/gis/gdal/__init__.py b/django/contrib/gis/gdal/__init__.py
new file mode 100644
index 0000000000..cedf165ef1
--- /dev/null
+++ b/django/contrib/gis/gdal/__init__.py
@@ -0,0 +1,51 @@
+"""
+ This module houses ctypes interfaces for GDAL objects. The following GDAL
+ objects are supported:
+
+ CoordTransform: Used for coordinate transformations from one spatial
+ reference system to another.
+
+ Driver: Wraps an OGR data source driver.
+
+ DataSource: Wrapper for the OGR data source object, supports
+ OGR-supported data sources.
+
+ Envelope: A ctypes structure for bounding boxes (GDAL library
+ not required).
+
+ OGRGeometry: Layer for accessing OGR Geometry objects.
+
+ OGRGeomType: A class for representing the different OGR Geometry
+ types (GDAL library not required).
+
+ SpatialReference: Represents OSR Spatial Reference objects.
+
+ The GDAL library will be imported from the system path using the default
+ library name for the current OS. The default library path may be overridden
+ by setting `GDAL_LIBRARY_PATH` in your settings with the path to the GDAL C
+ library on your system.
+
+ GDAL links to a large number of external libraries that consume RAM when
+ loaded. Thus, it may desirable to disable GDAL on systems with limited
+ RAM resources -- this may be accomplished by setting `GDAL_LIBRARY_PATH`
+ to a non-existant file location (e.g., `GDAL_LIBRARY_PATH='/null/path'`;
+ setting to None/False/'' will not work as a string must be given).
+"""
+# Attempting to import objects that depend on the GDAL library. The
+# HAS_GDAL flag will be set to True if the library is present on
+# the system.
+try:
+ from django.contrib.gis.gdal.driver import Driver
+ from django.contrib.gis.gdal.datasource import DataSource
+ from django.contrib.gis.gdal.libgdal import gdal_version, gdal_full_version, gdal_release_date
+ from django.contrib.gis.gdal.srs import SpatialReference, CoordTransform
+ from django.contrib.gis.gdal.geometries import OGRGeometry, GEOJSON
+ HAS_GDAL = True
+except:
+ HAS_GDAL, GEOJSON = False, False
+
+# The envelope, error, and geomtype modules do not actually require the
+# GDAL library.
+from django.contrib.gis.gdal.envelope import Envelope
+from django.contrib.gis.gdal.error import check_err, OGRException, OGRIndexError, SRSException
+from django.contrib.gis.gdal.geomtype import OGRGeomType
diff --git a/django/contrib/gis/gdal/datasource.py b/django/contrib/gis/gdal/datasource.py
new file mode 100644
index 0000000000..02363a075b
--- /dev/null
+++ b/django/contrib/gis/gdal/datasource.py
@@ -0,0 +1,138 @@
+"""
+ DataSource is a wrapper for the OGR Data Source object, which provides
+ an interface for reading vector geometry data from many different file
+ formats (including ESRI shapefiles).
+
+ When instantiating a DataSource object, use the filename of a
+ GDAL-supported data source. For example, a SHP file or a
+ TIGER/Line file from the government.
+
+ The ds_driver keyword is used internally when a ctypes pointer
+ is passed in directly.
+
+ Example:
+ ds = DataSource('/home/foo/bar.shp')
+ for layer in ds:
+ for feature in layer:
+ # Getting the geometry for the feature.
+ g = feature.geom
+
+ # Getting the 'description' field for the feature.
+ desc = feature['description']
+
+ # We can also increment through all of the fields
+ # attached to this feature.
+ for field in feature:
+ # Get the name of the field (e.g. 'description')
+ nm = field.name
+
+ # Get the type (integer) of the field, e.g. 0 => OFTInteger
+ t = field.type
+
+ # Returns the value the field; OFTIntegers return ints,
+ # OFTReal returns floats, all else returns string.
+ val = field.value
+"""
+# ctypes prerequisites.
+from ctypes import byref, c_void_p
+
+# The GDAL C library, OGR exceptions, and the Layer object.
+from django.contrib.gis.gdal.driver import Driver
+from django.contrib.gis.gdal.error import OGRException, OGRIndexError
+from django.contrib.gis.gdal.layer import Layer
+
+# Getting the ctypes prototypes for the DataSource.
+from django.contrib.gis.gdal.prototypes.ds import \
+ destroy_ds, get_driver_count, register_all, open_ds, release_ds, \
+ get_ds_name, get_layer, get_layer_count, get_layer_by_name
+
+# For more information, see the OGR C API source code:
+# http://www.gdal.org/ogr/ogr__api_8h.html
+#
+# The OGR_DS_* routines are relevant here.
+class DataSource(object):
+ "Wraps an OGR Data Source object."
+
+ #### Python 'magic' routines ####
+ def __init__(self, ds_input, ds_driver=False, write=False):
+
+ # DataSource pointer is initially NULL.
+ self._ptr = None
+
+ # The write flag.
+ if write:
+ self._write = 1
+ else:
+ self._write = 0
+
+ # Registering all the drivers, this needs to be done
+ # _before_ we try to open up a data source.
+ if not get_driver_count(): register_all()
+
+ if isinstance(ds_input, basestring):
+ # The data source driver is a void pointer.
+ ds_driver = c_void_p()
+ try:
+ # OGROpen will auto-detect the data source type.
+ ds = open_ds(ds_input, self._write, byref(ds_driver))
+ except OGRException:
+ # Making the error message more clear rather than something
+ # like "Invalid pointer returned from OGROpen".
+ raise OGRException('Could not open the datasource at "%s"' % ds_input)
+ elif isinstance(ds_input, c_void_p) and isinstance(ds_driver, c_void_p):
+ ds = ds_input
+ else:
+ raise OGRException('Invalid data source input type: %s' % type(ds_input))
+
+ if bool(ds):
+ self._ptr = ds
+ self._driver = Driver(ds_driver)
+ else:
+ # Raise an exception if the returned pointer is NULL
+ raise OGRException('Invalid data source file "%s"' % ds_input)
+
+ def __del__(self):
+ "Destroys this DataStructure object."
+ if self._ptr: destroy_ds(self._ptr)
+
+ def __iter__(self):
+ "Allows for iteration over the layers in a data source."
+ for i in xrange(self.layer_count):
+ yield self[i]
+
+ def __getitem__(self, index):
+ "Allows use of the index [] operator to get a layer at the index."
+ if isinstance(index, basestring):
+ l = get_layer_by_name(self._ptr, index)
+ if not l: raise OGRIndexError('invalid OGR Layer name given: "%s"' % index)
+ elif isinstance(index, int):
+ if index < 0 or index >= self.layer_count:
+ raise OGRIndexError('index out of range')
+ l = get_layer(self._ptr, index)
+ else:
+ raise TypeError('Invalid index type: %s' % type(index))
+ return Layer(l)
+
+ def __len__(self):
+ "Returns the number of layers within the data source."
+ return self.layer_count
+
+ def __str__(self):
+ "Returns OGR GetName and Driver for the Data Source."
+ return '%s (%s)' % (self.name, str(self.driver))
+
+ #### DataSource Properties ####
+ @property
+ def driver(self):
+ "Returns the Driver object for this Data Source."
+ return self._driver
+
+ @property
+ def layer_count(self):
+ "Returns the number of layers in the data source."
+ return get_layer_count(self._ptr)
+
+ @property
+ def name(self):
+ "Returns the name of the data source."
+ return get_ds_name(self._ptr)
diff --git a/django/contrib/gis/gdal/driver.py b/django/contrib/gis/gdal/driver.py
new file mode 100644
index 0000000000..2d5b3df807
--- /dev/null
+++ b/django/contrib/gis/gdal/driver.py
@@ -0,0 +1,66 @@
+# prerequisites imports
+from ctypes import c_void_p
+from django.contrib.gis.gdal.error import OGRException
+from django.contrib.gis.gdal.prototypes.ds import \
+ get_driver, get_driver_by_name, get_driver_count, get_driver_name, register_all
+
+# For more information, see the OGR C API source code:
+# http://www.gdal.org/ogr/ogr__api_8h.html
+#
+# The OGR_Dr_* routines are relevant here.
+class Driver(object):
+ "Wraps an OGR Data Source Driver."
+
+ # Case-insensitive aliases for OGR Drivers.
+ _alias = {'esri' : 'ESRI Shapefile',
+ 'shp' : 'ESRI Shapefile',
+ 'shape' : 'ESRI Shapefile',
+ 'tiger' : 'TIGER',
+ 'tiger/line' : 'TIGER',
+ }
+
+ def __init__(self, dr_input):
+ "Initializes an OGR driver on either a string or integer input."
+
+ if isinstance(dr_input, basestring):
+ # If a string name of the driver was passed in
+ self._ptr = None # Initially NULL
+ self._register()
+
+ # Checking the alias dictionary (case-insensitive) to see if an alias
+ # exists for the given driver.
+ if dr_input.lower() in self._alias:
+ name = self._alias[dr_input.lower()]
+ else:
+ name = dr_input
+
+ # Attempting to get the OGR driver by the string name.
+ dr = get_driver_by_name(name)
+ elif isinstance(dr_input, int):
+ self._register()
+ dr = get_driver(dr_input)
+ elif isinstance(dr_input, c_void_p):
+ dr = dr_input
+ else:
+ raise OGRException('Unrecognized input type for OGR Driver: %s' % str(type(dr_input)))
+
+ # Making sure we get a valid pointer to the OGR Driver
+ if not dr:
+ raise OGRException('Could not initialize OGR Driver on input: %s' % str(dr_input))
+ self._ptr = dr
+
+ def __str__(self):
+ "Returns the string name of the OGR Driver."
+ return get_driver_name(self._ptr)
+
+ def _register(self):
+ "Attempts to register all the data source drivers."
+ # Only register all if the driver count is 0 (or else all drivers
+ # will be registered over and over again)
+ if not self.driver_count: register_all()
+
+ # Driver properties
+ @property
+ def driver_count(self):
+ "Returns the number of OGR data source drivers registered."
+ return get_driver_count()
diff --git a/django/contrib/gis/gdal/envelope.py b/django/contrib/gis/gdal/envelope.py
new file mode 100644
index 0000000000..971f06da90
--- /dev/null
+++ b/django/contrib/gis/gdal/envelope.py
@@ -0,0 +1,134 @@
+"""
+ The GDAL/OGR library uses an Envelope structure to hold the bounding
+ box information for a geometry. The envelope (bounding box) contains
+ two pairs of coordinates, one for the lower left coordinate and one
+ for the upper right coordinate:
+
+ +----------o Upper right; (max_x, max_y)
+ | |
+ | |
+ | |
+ Lower left (min_x, min_y) o----------+
+"""
+from ctypes import Structure, c_double
+from types import TupleType, ListType
+from django.contrib.gis.gdal.error import OGRException
+
+# The OGR definition of an Envelope is a C structure containing four doubles.
+# See the 'ogr_core.h' source file for more information:
+# http://www.gdal.org/ogr/ogr__core_8h-source.html
+class OGREnvelope(Structure):
+ "Represents the OGREnvelope C Structure."
+ _fields_ = [("MinX", c_double),
+ ("MaxX", c_double),
+ ("MinY", c_double),
+ ("MaxY", c_double),
+ ]
+
+class Envelope(object):
+ """
+ The Envelope object is a C structure that contains the minimum and
+ maximum X, Y coordinates for a rectangle bounding box. The naming
+ of the variables is compatible with the OGR Envelope structure.
+ """
+
+ def __init__(self, *args):
+ """
+ The initialization function may take an OGREnvelope structure, 4-element
+ tuple or list, or 4 individual arguments.
+ """
+
+ if len(args) == 1:
+ if isinstance(args[0], OGREnvelope):
+ # OGREnvelope (a ctypes Structure) was passed in.
+ self._envelope = args[0]
+ elif isinstance(args[0], (TupleType, ListType)):
+ # A tuple was passed in.
+ if len(args[0]) != 4:
+ raise OGRException('Incorrect number of tuple elements (%d).' % len(args[0]))
+ else:
+ self._from_sequence(args[0])
+ else:
+ raise TypeError('Incorrect type of argument: %s' % str(type(args[0])))
+ elif len(args) == 4:
+ # Individiual parameters passed in.
+ # Thanks to ww for the help
+ self._from_sequence(map(float, args))
+ else:
+ raise OGRException('Incorrect number (%d) of arguments.' % len(args))
+
+ # Checking the x,y coordinates
+ if self.min_x >= self.max_x:
+ raise OGRException('Envelope minimum X >= maximum X.')
+ if self.min_y >= self.max_y:
+ raise OGRException('Envelope minimum Y >= maximum Y.')
+
+ def __eq__(self, other):
+ """
+ Returns True if the envelopes are equivalent; can compare against
+ other Envelopes and 4-tuples.
+ """
+ if isinstance(other, Envelope):
+ return (self.min_x == other.min_x) and (self.min_y == other.min_y) and \
+ (self.max_x == other.max_x) and (self.max_y == other.max_y)
+ elif isinstance(other, TupleType) and len(other) == 4:
+ return (self.min_x == other[0]) and (self.min_y == other[1]) and \
+ (self.max_x == other[2]) and (self.max_y == other[3])
+ else:
+ raise OGRException('Equivalence testing only works with other Envelopes.')
+
+ def __str__(self):
+ "Returns a string representation of the tuple."
+ return str(self.tuple)
+
+ def _from_sequence(self, seq):
+ "Initializes the C OGR Envelope structure from the given sequence."
+ self._envelope = OGREnvelope()
+ self._envelope.MinX = seq[0]
+ self._envelope.MinY = seq[1]
+ self._envelope.MaxX = seq[2]
+ self._envelope.MaxY = seq[3]
+
+ @property
+ def min_x(self):
+ "Returns the value of the minimum X coordinate."
+ return self._envelope.MinX
+
+ @property
+ def min_y(self):
+ "Returns the value of the minimum Y coordinate."
+ return self._envelope.MinY
+
+ @property
+ def max_x(self):
+ "Returns the value of the maximum X coordinate."
+ return self._envelope.MaxX
+
+ @property
+ def max_y(self):
+ "Returns the value of the maximum Y coordinate."
+ return self._envelope.MaxY
+
+ @property
+ def ur(self):
+ "Returns the upper-right coordinate."
+ return (self.max_x, self.max_y)
+
+ @property
+ def ll(self):
+ "Returns the lower-left coordinate."
+ return (self.min_x, self.min_y)
+
+ @property
+ def tuple(self):
+ "Returns a tuple representing the envelope."
+ return (self.min_x, self.min_y, self.max_x, self.max_y)
+
+ @property
+ def wkt(self):
+ "Returns WKT representing a Polygon for this envelope."
+ # TODO: Fix significant figures.
+ return 'POLYGON((%s %s,%s %s,%s %s,%s %s,%s %s))' % \
+ (self.min_x, self.min_y, self.min_x, self.max_y,
+ self.max_x, self.max_y, self.max_x, self.min_y,
+ self.min_x, self.min_y)
diff --git a/django/contrib/gis/gdal/error.py b/django/contrib/gis/gdal/error.py
new file mode 100644
index 0000000000..4ec3f7e735
--- /dev/null
+++ b/django/contrib/gis/gdal/error.py
@@ -0,0 +1,41 @@
+"""
+ This module houses the OGR & SRS Exception objects, and the
+ check_err() routine which checks the status code returned by
+ OGR methods.
+"""
+#### OGR & SRS Exceptions ####
+class OGRException(Exception): pass
+class SRSException(Exception): pass
+class OGRIndexError(OGRException, KeyError):
+ """
+ This exception is raised when an invalid index is encountered, and has
+ the 'silent_variable_feature' attribute set to true. This ensures that
+ django's templates proceed to use the next lookup type gracefully when
+ an Exception is raised. Fixes ticket #4740.
+ """
+ silent_variable_failure = True
+
+#### OGR error checking codes and routine ####
+
+# OGR Error Codes
+OGRERR_DICT = { 1 : (OGRException, 'Not enough data.'),
+ 2 : (OGRException, 'Not enough memory.'),
+ 3 : (OGRException, 'Unsupported geometry type.'),
+ 4 : (OGRException, 'Unsupported operation.'),
+ 5 : (OGRException, 'Corrupt data.'),
+ 6 : (OGRException, 'OGR failure.'),
+ 7 : (SRSException, 'Unsupported SRS.'),
+ 8 : (OGRException, 'Invalid handle.'),
+ }
+OGRERR_NONE = 0
+
+def check_err(code):
+ "Checks the given OGRERR, and raises an exception where appropriate."
+
+ if code == OGRERR_NONE:
+ return
+ elif code in OGRERR_DICT:
+ e, msg = OGRERR_DICT[code]
+ raise e, msg
+ else:
+ raise OGRException('Unknown error code: "%s"' % code)
diff --git a/django/contrib/gis/gdal/feature.py b/django/contrib/gis/gdal/feature.py
new file mode 100644
index 0000000000..bc3857f606
--- /dev/null
+++ b/django/contrib/gis/gdal/feature.py
@@ -0,0 +1,115 @@
+# The GDAL C library, OGR exception, and the Field object
+from django.contrib.gis.gdal.error import OGRException, OGRIndexError
+from django.contrib.gis.gdal.field import Field
+from django.contrib.gis.gdal.geometries import OGRGeometry, OGRGeomType
+from django.contrib.gis.gdal.srs import SpatialReference
+
+# ctypes function prototypes
+from django.contrib.gis.gdal.prototypes.ds import \
+ destroy_feature, feature_equal, get_fd_geom_type, get_feat_geom_ref, \
+ get_feat_name, get_feat_field_count, get_fid, get_field_defn, \
+ get_field_index, get_field_name
+from django.contrib.gis.gdal.prototypes.geom import clone_geom, get_geom_srs
+from django.contrib.gis.gdal.prototypes.srs import clone_srs
+
+# For more information, see the OGR C API source code:
+# http://www.gdal.org/ogr/ogr__api_8h.html
+#
+# The OGR_F_* routines are relevant here.
+class Feature(object):
+ "A class that wraps an OGR Feature, needs to be instantiated from a Layer object."
+
+ #### Python 'magic' routines ####
+ def __init__(self, feat, fdefn):
+ "Initializes on the pointers for the feature and the layer definition."
+ self._ptr = None # Initially NULL
+ if not feat or not fdefn:
+ raise OGRException('Cannot create OGR Feature, invalid pointer given.')
+ self._ptr = feat
+ self._fdefn = fdefn
+
+ def __del__(self):
+ "Releases a reference to this object."
+ if self._ptr: destroy_feature(self._ptr)
+
+ def __getitem__(self, index):
+ """
+ Gets the Field object at the specified index, which may be either
+ an integer or the Field's string label. Note that the Field object
+ is not the field's _value_ -- use the `get` method instead to
+ retrieve the value (e.g. an integer) instead of a Field instance.
+ """
+ if isinstance(index, basestring):
+ i = self.index(index)
+ else:
+ if index < 0 or index > self.num_fields:
+ raise OGRIndexError('index out of range')
+ i = index
+ return Field(self._ptr, i)
+
+ def __iter__(self):
+ "Iterates over each field in the Feature."
+ for i in xrange(self.num_fields):
+ yield self[i]
+
+ def __len__(self):
+ "Returns the count of fields in this feature."
+ return self.num_fields
+
+ def __str__(self):
+ "The string name of the feature."
+ return 'Feature FID %d in Layer<%s>' % (self.fid, self.layer_name)
+
+ def __eq__(self, other):
+ "Does equivalence testing on the features."
+ return bool(feature_equal(self._ptr, other._ptr))
+
+ #### Feature Properties ####
+ @property
+ def fid(self):
+ "Returns the feature identifier."
+ return get_fid(self._ptr)
+
+ @property
+ def layer_name(self):
+ "Returns the name of the layer for the feature."
+ return get_feat_name(self._fdefn)
+
+ @property
+ def num_fields(self):
+ "Returns the number of fields in the Feature."
+ return get_feat_field_count(self._ptr)
+
+ @property
+ def fields(self):
+ "Returns a list of fields in the Feature."
+ return [get_field_name(get_field_defn(self._fdefn, i))
+ for i in xrange(self.num_fields)]
+
+ @property
+ def geom(self):
+ "Returns the OGR Geometry for this Feature."
+ # Retrieving the geometry pointer for the feature.
+ geom_ptr = get_feat_geom_ref(self._ptr)
+ return OGRGeometry(clone_geom(geom_ptr))
+
+ @property
+ def geom_type(self):
+ "Returns the OGR Geometry Type for this Feture."
+ return OGRGeomType(get_fd_geom_type(self._fdefn))
+
+ #### Feature Methods ####
+ def get(self, field):
+ """
+ Returns the value of the field, instead of an instance of the Field
+ object. May take a string of the field name or a Field object as
+ parameters.
+ """
+ field_name = getattr(field, 'name', field)
+ return self[field_name].value
+
+ def index(self, field_name):
+ "Returns the index of the given field name."
+ i = get_field_index(self._ptr, field_name)
+ if i < 0: raise OGRIndexError('invalid OFT field name given: "%s"' % field_name)
+ return i
diff --git a/django/contrib/gis/gdal/field.py b/django/contrib/gis/gdal/field.py
new file mode 100644
index 0000000000..ad1feb3d22
--- /dev/null
+++ b/django/contrib/gis/gdal/field.py
@@ -0,0 +1,179 @@
+from ctypes import byref, c_int
+from datetime import date, datetime, time
+from django.contrib.gis.gdal.error import OGRException
+from django.contrib.gis.gdal.prototypes.ds import \
+ get_feat_field_defn, get_field_as_datetime, get_field_as_double, \
+ get_field_as_integer, get_field_as_string, get_field_name, get_field_precision, \
+ get_field_type, get_field_type_name, get_field_width
+
+# For more information, see the OGR C API source code:
+# http://www.gdal.org/ogr/ogr__api_8h.html
+#
+# The OGR_Fld_* routines are relevant here.
+class Field(object):
+ "A class that wraps an OGR Field, needs to be instantiated from a Feature object."
+
+ #### Python 'magic' routines ####
+ def __init__(self, feat, index):
+ """
+ Initializes on the feature pointer and the integer index of
+ the field within the feature.
+ """
+ # Setting the feature pointer and index.
+ self._feat = feat
+ self._index = index
+
+ # Getting the pointer for this field.
+ fld = get_feat_field_defn(feat, index)
+ if not fld:
+ raise OGRException('Cannot create OGR Field, invalid pointer given.')
+ self._ptr = fld
+
+ # Setting the class depending upon the OGR Field Type (OFT)
+ self.__class__ = FIELD_CLASSES[self.type]
+
+ # OFTReal with no precision should be an OFTInteger.
+ if isinstance(self, OFTReal) and self.precision == 0:
+ self.__class__ = OFTInteger
+
+ def __str__(self):
+ "Returns the string representation of the Field."
+ return str(self.value).strip()
+
+ #### Field Methods ####
+ def as_double(self):
+ "Retrieves the Field's value as a double (float)."
+ return get_field_as_double(self._feat, self._index)
+
+ def as_int(self):
+ "Retrieves the Field's value as an integer."
+ return get_field_as_integer(self._feat, self._index)
+
+ def as_string(self):
+ "Retrieves the Field's value as a string."
+ return get_field_as_string(self._feat, self._index)
+
+ def as_datetime(self):
+ "Retrieves the Field's value as a tuple of date & time components."
+ yy, mm, dd, hh, mn, ss, tz = [c_int() for i in range(7)]
+ status = get_field_as_datetime(self._feat, self._index, byref(yy), byref(mm), byref(dd),
+ byref(hh), byref(mn), byref(ss), byref(tz))
+ if status:
+ return (yy, mm, dd, hh, mn, ss, tz)
+ else:
+ raise OGRException('Unable to retrieve date & time information from the field.')
+
+ #### Field Properties ####
+ @property
+ def name(self):
+ "Returns the name of this Field."
+ return get_field_name(self._ptr)
+
+ @property
+ def precision(self):
+ "Returns the precision of this Field."
+ return get_field_precision(self._ptr)
+
+ @property
+ def type(self):
+ "Returns the OGR type of this Field."
+ return get_field_type(self._ptr)
+
+ @property
+ def type_name(self):
+ "Return the OGR field type name for this Field."
+ return get_field_type_name(self.type)
+
+ @property
+ def value(self):
+ "Returns the value of this Field."
+ # Default is to get the field as a string.
+ return self.as_string()
+
+ @property
+ def width(self):
+ "Returns the width of this Field."
+ return get_field_width(self._ptr)
+
+### The Field sub-classes for each OGR Field type. ###
+class OFTInteger(Field):
+ @property
+ def value(self):
+ "Returns an integer contained in this field."
+ return self.as_int()
+
+ @property
+ def type(self):
+ """
+ GDAL uses OFTReals to represent OFTIntegers in created
+ shapefiles -- forcing the type here since the underlying field
+ type may actually be OFTReal.
+ """
+ return 0
+
+class OFTReal(Field):
+ @property
+ def value(self):
+ "Returns a float contained in this field."
+ return self.as_double()
+
+# String & Binary fields, just subclasses
+class OFTString(Field): pass
+class OFTWideString(Field): pass
+class OFTBinary(Field): pass
+
+# OFTDate, OFTTime, OFTDateTime fields.
+class OFTDate(Field):
+ @property
+ def value(self):
+ "Returns a Python `date` object for the OFTDate field."
+ yy, mm, dd, hh, mn, ss, tz = self.as_datetime()
+ try:
+ return date(yy.value, mm.value, dd.value)
+ except ValueError:
+ return None
+
+class OFTDateTime(Field):
+ @property
+ def value(self):
+ "Returns a Python `datetime` object for this OFTDateTime field."
+ yy, mm, dd, hh, mn, ss, tz = self.as_datetime()
+ # TODO: Adapt timezone information.
+ # See http://lists.maptools.org/pipermail/gdal-dev/2006-February/007990.html
+ # The `tz` variable has values of: 0=unknown, 1=localtime (ambiguous),
+ # 100=GMT, 104=GMT+1, 80=GMT-5, etc.
+ try:
+ return datetime(yy.value, mm.value, dd.value, hh.value, mn.value, ss.value)
+ except ValueError:
+ return None
+
+class OFTTime(Field):
+ @property
+ def value(self):
+ "Returns a Python `time` object for this OFTTime field."
+ yy, mm, dd, hh, mn, ss, tz = self.as_datetime()
+ try:
+ return time(hh.value, mn.value, ss.value)
+ except ValueError:
+ return None
+
+# List fields are also just subclasses
+class OFTIntegerList(Field): pass
+class OFTRealList(Field): pass
+class OFTStringList(Field): pass
+class OFTWideStringList(Field): pass
+
+# Class mapping dictionary for OFT Types
+FIELD_CLASSES = { 0 : OFTInteger,
+ 1 : OFTIntegerList,
+ 2 : OFTReal,
+ 3 : OFTRealList,
+ 4 : OFTString,
+ 5 : OFTStringList,
+ 6 : OFTWideString,
+ 7 : OFTWideStringList,
+ 8 : OFTBinary,
+ 9 : OFTDate,
+ 10 : OFTTime,
+ 11 : OFTDateTime,
+ }
diff --git a/django/contrib/gis/gdal/geometries.py b/django/contrib/gis/gdal/geometries.py
new file mode 100644
index 0000000000..ee0ec17559
--- /dev/null
+++ b/django/contrib/gis/gdal/geometries.py
@@ -0,0 +1,643 @@
+"""
+ The OGRGeometry is a wrapper for using the OGR Geometry class
+ (see http://www.gdal.org/ogr/classOGRGeometry.html). OGRGeometry
+ may be instantiated when reading geometries from OGR Data Sources
+ (e.g. SHP files), or when given OGC WKT (a string).
+
+ While the 'full' API is not present yet, the API is "pythonic" unlike
+ the traditional and "next-generation" OGR Python bindings. One major
+ advantage OGR Geometries have over their GEOS counterparts is support
+ for spatial reference systems and their transformation.
+
+ Example:
+ >>> from django.contrib.gis.gdal import OGRGeometry, OGRGeomType, SpatialReference
+ >>> wkt1, wkt2 = 'POINT(-90 30)', 'POLYGON((0 0, 5 0, 5 5, 0 5)'
+ >>> pnt = OGRGeometry(wkt1)
+ >>> print pnt
+ POINT (-90 30)
+ >>> mpnt = OGRGeometry(OGRGeomType('MultiPoint'), SpatialReference('WGS84'))
+ >>> mpnt.add(wkt1)
+ >>> mpnt.add(wkt1)
+ >>> print mpnt
+ MULTIPOINT (-90 30,-90 30)
+ >>> print mpnt.srs.name
+ WGS 84
+ >>> print mpnt.srs.proj
+ +proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs
+ >>> mpnt.transform_to(SpatialReference('NAD27'))
+ >>> print mpnt.proj
+ +proj=longlat +ellps=clrk66 +datum=NAD27 +no_defs
+ >>> print mpnt
+ MULTIPOINT (-89.999930378602485 29.999797886557641,-89.999930378602485 29.999797886557641)
+
+ The OGRGeomType class is to make it easy to specify an OGR geometry type:
+ >>> from django.contrib.gis.gdal import OGRGeomType
+ >>> gt1 = OGRGeomType(3) # Using an integer for the type
+ >>> gt2 = OGRGeomType('Polygon') # Using a string
+ >>> gt3 = OGRGeomType('POLYGON') # It's case-insensitive
+ >>> print gt1 == 3, gt1 == 'Polygon' # Equivalence works w/non-OGRGeomType objects
+ True
+"""
+# Python library requisites.
+import re, sys
+from binascii import a2b_hex
+from ctypes import byref, string_at, c_char_p, c_double, c_ubyte, c_void_p
+from types import UnicodeType
+
+# Getting GDAL prerequisites
+from django.contrib.gis.gdal.envelope import Envelope, OGREnvelope
+from django.contrib.gis.gdal.error import OGRException, OGRIndexError, SRSException
+from django.contrib.gis.gdal.geomtype import OGRGeomType
+from django.contrib.gis.gdal.srs import SpatialReference, CoordTransform
+
+# Getting the ctypes prototype functions that interface w/the GDAL C library.
+from django.contrib.gis.gdal.prototypes.geom import *
+from django.contrib.gis.gdal.prototypes.srs import clone_srs
+
+# For more information, see the OGR C API source code:
+# http://www.gdal.org/ogr/ogr__api_8h.html
+#
+# The OGR_G_* routines are relevant here.
+
+# Regular expressions for recognizing HEXEWKB and WKT.
+hex_regex = re.compile(r'^[0-9A-F]+$', re.I)
+wkt_regex = re.compile(r'^(?P<type>POINT|LINESTRING|LINEARRING|POLYGON|MULTIPOINT|MULTILINESTRING|MULTIPOLYGON|GEOMETRYCOLLECTION)[ACEGIMLONPSRUTY\d,\.\-\(\) ]+$', re.I)
+json_regex = re.compile(r'^\{[\s\w,\-\.\"\'\:\[\]]+\}$')
+
+#### OGRGeometry Class ####
+class OGRGeometry(object):
+ "Generally encapsulates an OGR geometry."
+
+ def __init__(self, geom_input, srs=None):
+ "Initializes Geometry on either WKT or an OGR pointer as input."
+
+ self._ptr = c_void_p(None) # Initially NULL
+ str_instance = isinstance(geom_input, basestring)
+
+ # If HEX, unpack input to to a binary buffer.
+ if str_instance and hex_regex.match(geom_input):
+ geom_input = buffer(a2b_hex(geom_input.upper()))
+ str_instance = False
+
+ # Constructing the geometry,
+ if str_instance:
+ # Checking if unicode
+ if isinstance(geom_input, UnicodeType):
+ # Encoding to ASCII, WKT or HEX doesn't need any more.
+ geo_input = geo_input.encode('ascii')
+
+ wkt_m = wkt_regex.match(geom_input)
+ json_m = json_regex.match(geom_input)
+ if wkt_m:
+ if wkt_m.group('type').upper() == 'LINEARRING':
+ # OGR_G_CreateFromWkt doesn't work with LINEARRING WKT.
+ # See http://trac.osgeo.org/gdal/ticket/1992.
+ g = create_geom(OGRGeomType(wkt_m.group('type')).num)
+ import_wkt(g, byref(c_char_p(geom_input)))
+ else:
+ g = from_wkt(byref(c_char_p(geom_input)), None, byref(c_void_p()))
+ elif json_m:
+ if GEOJSON:
+ g = from_json(geom_input)
+ else:
+ raise NotImplementedError('GeoJSON input only supported on GDAL 1.5+.')
+ else:
+ # Seeing if the input is a valid short-hand string
+ # (e.g., 'Point', 'POLYGON').
+ ogr_t = OGRGeomType(geom_input)
+ g = create_geom(OGRGeomType(geom_input).num)
+ elif isinstance(geom_input, buffer):
+ # WKB was passed in
+ g = from_wkb(str(geom_input), None, byref(c_void_p()), len(geom_input))
+ elif isinstance(geom_input, OGRGeomType):
+ # OGRGeomType was passed in, an empty geometry will be created.
+ g = create_geom(geom_input.num)
+ elif isinstance(geom_input, c_void_p):
+ # OGR pointer (c_void_p) was the input.
+ g = geom_input
+ else:
+ raise OGRException('Invalid input type for OGR Geometry construction: %s' % type(geom_input))
+
+ # Now checking the Geometry pointer before finishing initialization
+ # by setting the pointer for the object.
+ if not g:
+ raise OGRException('Cannot create OGR Geometry from input: %s' % str(geom_input))
+ self._ptr = g
+
+ # Assigning the SpatialReference object to the geometry, if valid.
+ if bool(srs): self.srs = srs
+
+ # Setting the class depending upon the OGR Geometry Type
+ self.__class__ = GEO_CLASSES[self.geom_type.num]
+
+ def __del__(self):
+ "Deletes this Geometry."
+ if self._ptr: destroy_geom(self._ptr)
+
+ ### Geometry set-like operations ###
+ # g = g1 | g2
+ def __or__(self, other):
+ "Returns the union of the two geometries."
+ return self.union(other)
+
+ # g = g1 & g2
+ def __and__(self, other):
+ "Returns the intersection of this Geometry and the other."
+ return self.intersection(other)
+
+ # g = g1 - g2
+ def __sub__(self, other):
+ "Return the difference this Geometry and the other."
+ return self.difference(other)
+
+ # g = g1 ^ g2
+ def __xor__(self, other):
+ "Return the symmetric difference of this Geometry and the other."
+ return self.sym_difference(other)
+
+ def __eq__(self, other):
+ "Is this Geometry equal to the other?"
+ return self.equals(other)
+
+ def __ne__(self, other):
+ "Tests for inequality."
+ return not self.equals(other)
+
+ def __str__(self):
+ "WKT is used for the string representation."
+ return self.wkt
+
+ #### Geometry Properties ####
+ @property
+ def dimension(self):
+ "Returns 0 for points, 1 for lines, and 2 for surfaces."
+ return get_dims(self._ptr)
+
+ @property
+ def coord_dim(self):
+ "Returns the coordinate dimension of the Geometry."
+ return get_coord_dims(self._ptr)
+
+ @property
+ def geom_count(self):
+ "The number of elements in this Geometry."
+ return get_geom_count(self._ptr)
+
+ @property
+ def point_count(self):
+ "Returns the number of Points in this Geometry."
+ return get_point_count(self._ptr)
+
+ @property
+ def num_points(self):
+ "Alias for `point_count` (same name method in GEOS API.)"
+ return self.point_count
+
+ @property
+ def num_coords(self):
+ "Alais for `point_count`."
+ return self.point_count
+
+ @property
+ def geom_type(self):
+ "Returns the Type for this Geometry."
+ try:
+ return OGRGeomType(get_geom_type(self._ptr))
+ except OGRException:
+ # VRT datasources return an invalid geometry type
+ # number, but a valid name -- we'll try that instead.
+ # See: http://trac.osgeo.org/gdal/ticket/2491
+ return OGRGeomType(get_geom_name(self._ptr))
+
+ @property
+ def geom_name(self):
+ "Returns the Name of this Geometry."
+ return get_geom_name(self._ptr)
+
+ @property
+ def area(self):
+ "Returns the area for a LinearRing, Polygon, or MultiPolygon; 0 otherwise."
+ return get_area(self._ptr)
+
+ @property
+ def envelope(self):
+ "Returns the envelope for this Geometry."
+ # TODO: Fix Envelope() for Point geometries.
+ return Envelope(get_envelope(self._ptr, byref(OGREnvelope())))
+
+ @property
+ def extent(self):
+ "Returns the envelope as a 4-tuple, instead of as an Envelope object."
+ return self.envelope.tuple
+
+ #### SpatialReference-related Properties ####
+
+ # The SRS property
+ def get_srs(self):
+ "Returns the Spatial Reference for this Geometry."
+ try:
+ srs_ptr = get_geom_srs(self._ptr)
+ return SpatialReference(clone_srs(srs_ptr))
+ except SRSException:
+ return None
+
+ def set_srs(self, srs):
+ "Sets the SpatialReference for this geometry."
+ if isinstance(srs, SpatialReference):
+ srs_ptr = clone_srs(srs._ptr)
+ elif isinstance(srs, (int, long, basestring)):
+ sr = SpatialReference(srs)
+ srs_ptr = clone_srs(sr._ptr)
+ else:
+ raise TypeError('Cannot assign spatial reference with object of type: %s' % type(srs))
+ assign_srs(self._ptr, srs_ptr)
+
+ srs = property(get_srs, set_srs)
+
+ # The SRID property
+ def get_srid(self):
+ if self.srs: return self.srs.srid
+ else: return None
+
+ def set_srid(self, srid):
+ if isinstance(srid, (int, long)):
+ self.srs = srid
+ else:
+ raise TypeError('SRID must be set with an integer.')
+
+ srid = property(get_srid, set_srid)
+
+ #### Output Methods ####
+ @property
+ def geos(self):
+ "Returns a GEOSGeometry object from this OGRGeometry."
+ from django.contrib.gis.geos import GEOSGeometry
+ return GEOSGeometry(self.wkb, self.srid)
+
+ @property
+ def gml(self):
+ "Returns the GML representation of the Geometry."
+ return to_gml(self._ptr)
+
+ @property
+ def hex(self):
+ "Returns the hexadecimal representation of the WKB (a string)."
+ return str(self.wkb).encode('hex').upper()
+ #return b2a_hex(self.wkb).upper()
+
+ @property
+ def json(self):
+ if GEOJSON:
+ return to_json(self._ptr)
+ else:
+ raise NotImplementedError('GeoJSON output only supported on GDAL 1.5+.')
+ geojson = json
+
+ @property
+ def wkb_size(self):
+ "Returns the size of the WKB buffer."
+ return get_wkbsize(self._ptr)
+
+ @property
+ def wkb(self):
+ "Returns the WKB representation of the Geometry."
+ if sys.byteorder == 'little':
+ byteorder = 1 # wkbNDR (from ogr_core.h)
+ else:
+ byteorder = 0 # wkbXDR
+ sz = self.wkb_size
+ # Creating the unsigned character buffer, and passing it in by reference.
+ buf = (c_ubyte * sz)()
+ wkb = to_wkb(self._ptr, byteorder, byref(buf))
+ # Returning a buffer of the string at the pointer.
+ return buffer(string_at(buf, sz))
+
+ @property
+ def wkt(self):
+ "Returns the WKT representation of the Geometry."
+ return to_wkt(self._ptr, byref(c_char_p()))
+
+ #### Geometry Methods ####
+ def clone(self):
+ "Clones this OGR Geometry."
+ return OGRGeometry(clone_geom(self._ptr), self.srs)
+
+ def close_rings(self):
+ """
+ If there are any rings within this geometry that have not been
+ closed, this routine will do so by adding the starting point at the
+ end.
+ """
+ # Closing the open rings.
+ geom_close_rings(self._ptr)
+
+ def transform(self, coord_trans, clone=False):
+ """
+ Transforms this geometry to a different spatial reference system.
+ May take a CoordTransform object, a SpatialReference object, string
+ WKT or PROJ.4, and/or an integer SRID. By default nothing is returned
+ and the geometry is transformed in-place. However, if the `clone`
+ keyword is set, then a transformed clone of this geometry will be
+ returned.
+ """
+ if clone:
+ klone = self.clone()
+ klone.transform(coord_trans)
+ return klone
+ if isinstance(coord_trans, CoordTransform):
+ geom_transform(self._ptr, coord_trans._ptr)
+ elif isinstance(coord_trans, SpatialReference):
+ geom_transform_to(self._ptr, coord_trans._ptr)
+ elif isinstance(coord_trans, (int, long, basestring)):
+ sr = SpatialReference(coord_trans)
+ geom_transform_to(self._ptr, sr._ptr)
+ else:
+ raise TypeError('Transform only accepts CoordTransform, SpatialReference, string, and integer objects.')
+
+ def transform_to(self, srs):
+ "For backwards-compatibility."
+ self.transform(srs)
+
+ #### Topology Methods ####
+ def _topology(self, func, other):
+ """A generalized function for topology operations, takes a GDAL function and
+ the other geometry to perform the operation on."""
+ if not isinstance(other, OGRGeometry):
+ raise TypeError('Must use another OGRGeometry object for topology operations!')
+
+ # Returning the output of the given function with the other geometry's
+ # pointer.
+ return func(self._ptr, other._ptr)
+
+ def intersects(self, other):
+ "Returns True if this geometry intersects with the other."
+ return self._topology(ogr_intersects, other)
+
+ def equals(self, other):
+ "Returns True if this geometry is equivalent to the other."
+ return self._topology(ogr_equals, other)
+
+ def disjoint(self, other):
+ "Returns True if this geometry and the other are spatially disjoint."
+ return self._topology(ogr_disjoint, other)
+
+ def touches(self, other):
+ "Returns True if this geometry touches the other."
+ return self._topology(ogr_touches, other)
+
+ def crosses(self, other):
+ "Returns True if this geometry crosses the other."
+ return self._topology(ogr_crosses, other)
+
+ def within(self, other):
+ "Returns True if this geometry is within the other."
+ return self._topology(ogr_within, other)
+
+ def contains(self, other):
+ "Returns True if this geometry contains the other."
+ return self._topology(ogr_contains, other)
+
+ def overlaps(self, other):
+ "Returns True if this geometry overlaps the other."
+ return self._topology(ogr_overlaps, other)
+
+ #### Geometry-generation Methods ####
+ def _geomgen(self, gen_func, other=None):
+ "A helper routine for the OGR routines that generate geometries."
+ if isinstance(other, OGRGeometry):
+ return OGRGeometry(gen_func(self._ptr, other._ptr), self.srs)
+ else:
+ return OGRGeometry(gen_func(self._ptr), self.srs)
+
+ @property
+ def boundary(self):
+ "Returns the boundary of this geometry."
+ return self._geomgen(get_boundary)
+
+ @property
+ def convex_hull(self):
+ """
+ Returns the smallest convex Polygon that contains all the points in
+ this Geometry.
+ """
+ return self._geomgen(geom_convex_hull)
+
+ def difference(self, other):
+ """
+ Returns a new geometry consisting of the region which is the difference
+ of this geometry and the other.
+ """
+ return self._geomgen(geom_diff, other)
+
+ def intersection(self, other):
+ """
+ Returns a new geometry consisting of the region of intersection of this
+ geometry and the other.
+ """
+ return self._geomgen(geom_intersection, other)
+
+ def sym_difference(self, other):
+ """
+ Returns a new geometry which is the symmetric difference of this
+ geometry and the other.
+ """
+ return self._geomgen(geom_sym_diff, other)
+
+ def union(self, other):
+ """
+ Returns a new geometry consisting of the region which is the union of
+ this geometry and the other.
+ """
+ return self._geomgen(geom_union, other)
+
+# The subclasses for OGR Geometry.
+class Point(OGRGeometry):
+
+ @property
+ def x(self):
+ "Returns the X coordinate for this Point."
+ return getx(self._ptr, 0)
+
+ @property
+ def y(self):
+ "Returns the Y coordinate for this Point."
+ return gety(self._ptr, 0)
+
+ @property
+ def z(self):
+ "Returns the Z coordinate for this Point."
+ if self.coord_dim == 3:
+ return getz(self._ptr, 0)
+
+ @property
+ def tuple(self):
+ "Returns the tuple of this point."
+ if self.coord_dim == 2:
+ return (self.x, self.y)
+ elif self.coord_dim == 3:
+ return (self.x, self.y, self.z)
+ coords = tuple
+
+class LineString(OGRGeometry):
+
+ def __getitem__(self, index):
+ "Returns the Point at the given index."
+ if index >= 0 and index < self.point_count:
+ x, y, z = c_double(), c_double(), c_double()
+ get_point(self._ptr, index, byref(x), byref(y), byref(z))
+ dim = self.coord_dim
+ if dim == 1:
+ return (x.value,)
+ elif dim == 2:
+ return (x.value, y.value)
+ elif dim == 3:
+ return (x.value, y.value, z.value)
+ else:
+ raise OGRIndexError('index out of range: %s' % str(index))
+
+ def __iter__(self):
+ "Iterates over each point in the LineString."
+ for i in xrange(self.point_count):
+ yield self[i]
+
+ def __len__(self):
+ "The length returns the number of points in the LineString."
+ return self.point_count
+
+ @property
+ def tuple(self):
+ "Returns the tuple representation of this LineString."
+ return tuple([self[i] for i in xrange(len(self))])
+ coords = tuple
+
+ def _listarr(self, func):
+ """
+ Internal routine that returns a sequence (list) corresponding with
+ the given function.
+ """
+ return [func(self._ptr, i) for i in xrange(len(self))]
+
+ @property
+ def x(self):
+ "Returns the X coordinates in a list."
+ return self._listarr(getx)
+
+ @property
+ def y(self):
+ "Returns the Y coordinates in a list."
+ return self._listarr(gety)
+
+ @property
+ def z(self):
+ "Returns the Z coordinates in a list."
+ if self.coord_dim == 3:
+ return self._listarr(getz)
+
+# LinearRings are used in Polygons.
+class LinearRing(LineString): pass
+
+class Polygon(OGRGeometry):
+
+ def __len__(self):
+ "The number of interior rings in this Polygon."
+ return self.geom_count
+
+ def __iter__(self):
+ "Iterates through each ring in the Polygon."
+ for i in xrange(self.geom_count):
+ yield self[i]
+
+ def __getitem__(self, index):
+ "Gets the ring at the specified index."
+ if index < 0 or index >= self.geom_count:
+ raise OGRIndexError('index out of range: %s' % index)
+ else:
+ return OGRGeometry(clone_geom(get_geom_ref(self._ptr, index)), self.srs)
+
+ # Polygon Properties
+ @property
+ def shell(self):
+ "Returns the shell of this Polygon."
+ return self[0] # First ring is the shell
+ exterior_ring = shell
+
+ @property
+ def tuple(self):
+ "Returns a tuple of LinearRing coordinate tuples."
+ return tuple([self[i].tuple for i in xrange(self.geom_count)])
+ coords = tuple
+
+ @property
+ def point_count(self):
+ "The number of Points in this Polygon."
+ # Summing up the number of points in each ring of the Polygon.
+ return sum([self[i].point_count for i in xrange(self.geom_count)])
+
+ @property
+ def centroid(self):
+ "Returns the centroid (a Point) of this Polygon."
+ # The centroid is a Point, create a geometry for this.
+ p = OGRGeometry(OGRGeomType('Point'))
+ get_centroid(self._ptr, p._ptr)
+ return p
+
+# Geometry Collection base class.
+class GeometryCollection(OGRGeometry):
+ "The Geometry Collection class."
+
+ def __getitem__(self, index):
+ "Gets the Geometry at the specified index."
+ if index < 0 or index >= self.geom_count:
+ raise OGRIndexError('index out of range: %s' % index)
+ else:
+ return OGRGeometry(clone_geom(get_geom_ref(self._ptr, index)), self.srs)
+
+ def __iter__(self):
+ "Iterates over each Geometry."
+ for i in xrange(self.geom_count):
+ yield self[i]
+
+ def __len__(self):
+ "The number of geometries in this Geometry Collection."
+ return self.geom_count
+
+ def add(self, geom):
+ "Add the geometry to this Geometry Collection."
+ if isinstance(geom, OGRGeometry):
+ if isinstance(geom, self.__class__):
+ for g in geom: add_geom(self._ptr, g._ptr)
+ else:
+ add_geom(self._ptr, geom._ptr)
+ elif isinstance(geom, basestring):
+ tmp = OGRGeometry(geom)
+ add_geom(self._ptr, tmp._ptr)
+ else:
+ raise OGRException('Must add an OGRGeometry.')
+
+ @property
+ def point_count(self):
+ "The number of Points in this Geometry Collection."
+ # Summing up the number of points in each geometry in this collection
+ return sum([self[i].point_count for i in xrange(self.geom_count)])
+
+ @property
+ def tuple(self):
+ "Returns a tuple representation of this Geometry Collection."
+ return tuple([self[i].tuple for i in xrange(self.geom_count)])
+ coords = tuple
+
+# Multiple Geometry types.
+class MultiPoint(GeometryCollection): pass
+class MultiLineString(GeometryCollection): pass
+class MultiPolygon(GeometryCollection): pass
+
+# Class mapping dictionary (using the OGRwkbGeometryType as the key)
+GEO_CLASSES = {1 : Point,
+ 2 : LineString,
+ 3 : Polygon,
+ 4 : MultiPoint,
+ 5 : MultiLineString,
+ 6 : MultiPolygon,
+ 7 : GeometryCollection,
+ 101: LinearRing,
+ }
diff --git a/django/contrib/gis/gdal/geomtype.py b/django/contrib/gis/gdal/geomtype.py
new file mode 100644
index 0000000000..565326f5a8
--- /dev/null
+++ b/django/contrib/gis/gdal/geomtype.py
@@ -0,0 +1,73 @@
+from django.contrib.gis.gdal.error import OGRException
+
+#### OGRGeomType ####
+class OGRGeomType(object):
+ "Encapulates OGR Geometry Types."
+
+ # Dictionary of acceptable OGRwkbGeometryType s and their string names.
+ _types = {0 : 'Unknown',
+ 1 : 'Point',
+ 2 : 'LineString',
+ 3 : 'Polygon',
+ 4 : 'MultiPoint',
+ 5 : 'MultiLineString',
+ 6 : 'MultiPolygon',
+ 7 : 'GeometryCollection',
+ 100 : 'None',
+ 101 : 'LinearRing',
+ }
+ # Reverse type dictionary, keyed by lower-case of the name.
+ _str_types = dict([(v.lower(), k) for k, v in _types.items()])
+
+ def __init__(self, type_input):
+ "Figures out the correct OGR Type based upon the input."
+ if isinstance(type_input, OGRGeomType):
+ num = type_input.num
+ elif isinstance(type_input, basestring):
+ num = self._str_types.get(type_input.lower(), None)
+ if num is None:
+ raise OGRException('Invalid OGR String Type "%s"' % type_input)
+ elif isinstance(type_input, int):
+ if not type_input in self._types:
+ raise OGRException('Invalid OGR Integer Type: %d' % type_input)
+ num = type_input
+ else:
+ raise TypeError('Invalid OGR input type given.')
+
+ # Setting the OGR geometry type number.
+ self.num = num
+
+ def __str__(self):
+ "Returns the value of the name property."
+ return self.name
+
+ def __eq__(self, other):
+ """
+ Does an equivalence test on the OGR type with the given
+ other OGRGeomType, the short-hand string, or the integer.
+ """
+ if isinstance(other, OGRGeomType):
+ return self.num == other.num
+ elif isinstance(other, basestring):
+ return self.name.lower() == other.lower()
+ elif isinstance(other, int):
+ return self.num == other
+ else:
+ return False
+
+ def __ne__(self, other):
+ return not (self == other)
+
+ @property
+ def name(self):
+ "Returns a short-hand string form of the OGR Geometry type."
+ return self._types[self.num]
+
+ @property
+ def django(self):
+ "Returns the Django GeometryField for this OGR Type."
+ s = self.name
+ if s in ('Unknown', 'LinearRing', 'None'):
+ return None
+ else:
+ return s + 'Field'
diff --git a/django/contrib/gis/gdal/layer.py b/django/contrib/gis/gdal/layer.py
new file mode 100644
index 0000000000..d60e2cb7f6
--- /dev/null
+++ b/django/contrib/gis/gdal/layer.py
@@ -0,0 +1,187 @@
+# Needed ctypes routines
+from ctypes import byref
+
+# Other GDAL imports.
+from django.contrib.gis.gdal.envelope import Envelope, OGREnvelope
+from django.contrib.gis.gdal.error import OGRException, OGRIndexError, SRSException
+from django.contrib.gis.gdal.feature import Feature
+from django.contrib.gis.gdal.field import FIELD_CLASSES
+from django.contrib.gis.gdal.geometries import OGRGeomType
+from django.contrib.gis.gdal.srs import SpatialReference
+
+# GDAL ctypes function prototypes.
+from django.contrib.gis.gdal.prototypes.ds import \
+ get_extent, get_fd_geom_type, get_fd_name, get_feature, get_feature_count, \
+ get_field_count, get_field_defn, get_field_name, get_field_precision, \
+ get_field_width, get_field_type, get_layer_defn, get_layer_srs, \
+ get_next_feature, reset_reading, test_capability
+from django.contrib.gis.gdal.prototypes.srs import clone_srs
+
+# For more information, see the OGR C API source code:
+# http://www.gdal.org/ogr/ogr__api_8h.html
+#
+# The OGR_L_* routines are relevant here.
+class Layer(object):
+ "A class that wraps an OGR Layer, needs to be instantiated from a DataSource object."
+
+ #### Python 'magic' routines ####
+ def __init__(self, layer_ptr):
+ "Needs a C pointer (Python/ctypes integer) in order to initialize."
+ self._ptr = None # Initially NULL
+ if not layer_ptr:
+ raise OGRException('Cannot create Layer, invalid pointer given')
+ self._ptr = layer_ptr
+ self._ldefn = get_layer_defn(self._ptr)
+ # Does the Layer support random reading?
+ self._random_read = self.test_capability('RandomRead')
+
+ def __getitem__(self, index):
+ "Gets the Feature at the specified index."
+ if isinstance(index, (int, long)):
+ # An integer index was given -- we cannot do a check based on the
+ # number of features because the beginning and ending feature IDs
+ # are not guaranteed to be 0 and len(layer)-1, respectively.
+ if index < 0: raise OGRIndexError('Negative indices are not allowed on OGR Layers.')
+ return self._make_feature(index)
+ elif isinstance(index, slice):
+ # A slice was given
+ start, stop, stride = index.indices(self.num_feat)
+ return [self._make_feature(fid) for fid in xrange(start, stop, stride)]
+ else:
+ raise TypeError('Integers and slices may only be used when indexing OGR Layers.')
+
+ def __iter__(self):
+ "Iterates over each Feature in the Layer."
+ # ResetReading() must be called before iteration is to begin.
+ reset_reading(self._ptr)
+ for i in xrange(self.num_feat):
+ yield Feature(get_next_feature(self._ptr), self._ldefn)
+
+ def __len__(self):
+ "The length is the number of features."
+ return self.num_feat
+
+ def __str__(self):
+ "The string name of the layer."
+ return self.name
+
+ def _make_feature(self, feat_id):
+ """
+ Helper routine for __getitem__ that constructs a Feature from the given
+ Feature ID. If the OGR Layer does not support random-access reading,
+ then each feature of the layer will be incremented through until the
+ a Feature is found matching the given feature ID.
+ """
+ if self._random_read:
+ # If the Layer supports random reading, return.
+ try:
+ return Feature(get_feature(self._ptr, feat_id), self._ldefn)
+ except OGRException:
+ pass
+ else:
+ # Random access isn't supported, have to increment through
+ # each feature until the given feature ID is encountered.
+ for feat in self:
+ if feat.fid == feat_id: return feat
+ # Should have returned a Feature, raise an OGRIndexError.
+ raise OGRIndexError('Invalid feature id: %s.' % feat_id)
+
+ #### Layer properties ####
+ @property
+ def extent(self):
+ "Returns the extent (an Envelope) of this layer."
+ env = OGREnvelope()
+ get_extent(self._ptr, byref(env), 1)
+ return Envelope(env)
+
+ @property
+ def name(self):
+ "Returns the name of this layer in the Data Source."
+ return get_fd_name(self._ldefn)
+
+ @property
+ def num_feat(self, force=1):
+ "Returns the number of features in the Layer."
+ return get_feature_count(self._ptr, force)
+
+ @property
+ def num_fields(self):
+ "Returns the number of fields in the Layer."
+ return get_field_count(self._ldefn)
+
+ @property
+ def geom_type(self):
+ "Returns the geometry type (OGRGeomType) of the Layer."
+ return OGRGeomType(get_fd_geom_type(self._ldefn))
+
+ @property
+ def srs(self):
+ "Returns the Spatial Reference used in this Layer."
+ try:
+ ptr = get_layer_srs(self._ptr)
+ return SpatialReference(clone_srs(ptr))
+ except SRSException:
+ return None
+
+ @property
+ def fields(self):
+ """
+ Returns a list of string names corresponding to each of the Fields
+ available in this Layer.
+ """
+ return [get_field_name(get_field_defn(self._ldefn, i))
+ for i in xrange(self.num_fields) ]
+
+ @property
+ def field_types(self):
+ """
+ Returns a list of the types of fields in this Layer. For example,
+ the list [OFTInteger, OFTReal, OFTString] would be returned for
+ an OGR layer that had an integer, a floating-point, and string
+ fields.
+ """
+ return [FIELD_CLASSES[get_field_type(get_field_defn(self._ldefn, i))]
+ for i in xrange(self.num_fields)]
+
+ @property
+ def field_widths(self):
+ "Returns a list of the maximum field widths for the features."
+ return [get_field_width(get_field_defn(self._ldefn, i))
+ for i in xrange(self.num_fields)]
+
+ @property
+ def field_precisions(self):
+ "Returns the field precisions for the features."
+ return [get_field_precision(get_field_defn(self._ldefn, i))
+ for i in xrange(self.num_fields)]
+
+ #### Layer Methods ####
+ def get_fields(self, field_name):
+ """
+ Returns a list containing the given field name for every Feature
+ in the Layer.
+ """
+ if not field_name in self.fields:
+ raise OGRException('invalid field name: %s' % field_name)
+ return [feat.get(field_name) for feat in self]
+
+ def get_geoms(self, geos=False):
+ """
+ Returns a list containing the OGRGeometry for every Feature in
+ the Layer.
+ """
+ if geos:
+ from django.contrib.gis.geos import GEOSGeometry
+ return [GEOSGeometry(feat.geom.wkb) for feat in self]
+ else:
+ return [feat.geom for feat in self]
+
+ def test_capability(self, capability):
+ """
+ Returns a bool indicating whether the this Layer supports the given
+ capability (a string). Valid capability strings include:
+ 'RandomRead', 'SequentialWrite', 'RandomWrite', 'FastSpatialFilter',
+ 'FastFeatureCount', 'FastGetExtent', 'CreateField', 'Transactions',
+ 'DeleteFeature', and 'FastSetNextByIndex'.
+ """
+ return bool(test_capability(self._ptr, capability))
diff --git a/django/contrib/gis/gdal/libgdal.py b/django/contrib/gis/gdal/libgdal.py
new file mode 100644
index 0000000000..bf8933dffb
--- /dev/null
+++ b/django/contrib/gis/gdal/libgdal.py
@@ -0,0 +1,83 @@
+import os, sys
+from ctypes import c_char_p, CDLL
+from ctypes.util import find_library
+from django.contrib.gis.gdal.error import OGRException
+
+# Custom library path set?
+try:
+ from django.conf import settings
+ lib_path = settings.GDAL_LIBRARY_PATH
+except (AttributeError, EnvironmentError, ImportError):
+ lib_path = None
+
+if lib_path:
+ lib_names = None
+elif os.name == 'nt':
+ # Windows NT shared library
+ lib_names = ['gdal15']
+elif os.name == 'posix':
+ # *NIX library names.
+ lib_names = ['gdal', 'gdal1.5.0']
+else:
+ raise OGRException('Unsupported OS "%s"' % os.name)
+
+# Using the ctypes `find_library` utility to find the
+# path to the GDAL library from the list of library names.
+if lib_names:
+ for lib_name in lib_names:
+ lib_path = find_library(lib_name)
+ if not lib_path is None: break
+
+if lib_path is None:
+ raise OGRException('Could not find the GDAL library (tried "%s"). '
+ 'Try setting GDAL_LIBRARY_PATH in your settings.' %
+ '", "'.join(lib_names))
+
+# This loads the GDAL/OGR C library
+lgdal = CDLL(lib_path)
+
+# On Windows, the GDAL binaries have some OSR routines exported with
+# STDCALL, while others are not. Thus, the library will also need to
+# be loaded up as WinDLL for said OSR functions that require the
+# different calling convention.
+if os.name == 'nt':
+ from ctypes import WinDLL
+ lwingdal = WinDLL(lib_name)
+
+def std_call(func):
+ """
+ Returns the correct STDCALL function for certain OSR routines on Win32
+ platforms.
+ """
+ if os.name == 'nt':
+ return lwingdal[func]
+ else:
+ return lgdal[func]
+
+#### Version-information functions. ####
+
+# Returns GDAL library version information with the given key.
+_version_info = std_call('GDALVersionInfo')
+_version_info.argtypes = [c_char_p]
+_version_info.restype = c_char_p
+
+def gdal_version():
+ "Returns only the GDAL version number information."
+ return _version_info('RELEASE_NAME')
+
+def gdal_full_version():
+ "Returns the full GDAL version information."
+ return _version_info('')
+
+def gdal_release_date(date=False):
+ """
+ Returns the release date in a string format, e.g, "2007/06/27".
+ If the date keyword argument is set to True, a Python datetime object
+ will be returned instead.
+ """
+ from datetime import date as date_type
+ rel = _version_info('RELEASE_DATE')
+ yy, mm, dd = map(int, (rel[0:4], rel[4:6], rel[6:8]))
+ d = date_type(yy, mm, dd)
+ if date: return d
+ else: return d.strftime('%Y/%m/%d')
diff --git a/django/contrib/gis/gdal/prototypes/__init__.py b/django/contrib/gis/gdal/prototypes/__init__.py
new file mode 100644
index 0000000000..e69de29bb2
--- /dev/null
+++ b/django/contrib/gis/gdal/prototypes/__init__.py
diff --git a/django/contrib/gis/gdal/prototypes/ds.py b/django/contrib/gis/gdal/prototypes/ds.py
new file mode 100644
index 0000000000..b64183eeb3
--- /dev/null
+++ b/django/contrib/gis/gdal/prototypes/ds.py
@@ -0,0 +1,68 @@
+"""
+ This module houses the ctypes function prototypes for OGR DataSource
+ related data structures. OGR_Dr_*, OGR_DS_*, OGR_L_*, OGR_F_*,
+ OGR_Fld_* routines are relevant here.
+"""
+from ctypes import c_char_p, c_int, c_long, c_void_p, POINTER
+from django.contrib.gis.gdal.envelope import OGREnvelope
+from django.contrib.gis.gdal.libgdal import lgdal
+from django.contrib.gis.gdal.prototypes.generation import \
+ const_string_output, double_output, geom_output, int_output, \
+ srs_output, void_output, voidptr_output
+
+c_int_p = POINTER(c_int) # shortcut type
+
+### Driver Routines ###
+register_all = void_output(lgdal.OGRRegisterAll, [], errcheck=False)
+cleanup_all = void_output(lgdal.OGRCleanupAll, [], errcheck=False)
+get_driver = voidptr_output(lgdal.OGRGetDriver, [c_int])
+get_driver_by_name = voidptr_output(lgdal.OGRGetDriverByName, [c_char_p])
+get_driver_count = int_output(lgdal.OGRGetDriverCount, [])
+get_driver_name = const_string_output(lgdal.OGR_Dr_GetName, [c_void_p])
+
+### DataSource ###
+open_ds = voidptr_output(lgdal.OGROpen, [c_char_p, c_int, POINTER(c_void_p)])
+destroy_ds = void_output(lgdal.OGR_DS_Destroy, [c_void_p], errcheck=False)
+release_ds = void_output(lgdal.OGRReleaseDataSource, [c_void_p])
+get_ds_name = const_string_output(lgdal.OGR_DS_GetName, [c_void_p])
+get_layer = voidptr_output(lgdal.OGR_DS_GetLayer, [c_void_p, c_int])
+get_layer_by_name = voidptr_output(lgdal.OGR_DS_GetLayerByName, [c_void_p, c_char_p])
+get_layer_count = int_output(lgdal.OGR_DS_GetLayerCount, [c_void_p])
+
+### Layer Routines ###
+get_extent = void_output(lgdal.OGR_L_GetExtent, [c_void_p, POINTER(OGREnvelope), c_int])
+get_feature = voidptr_output(lgdal.OGR_L_GetFeature, [c_void_p, c_long])
+get_feature_count = int_output(lgdal.OGR_L_GetFeatureCount, [c_void_p, c_int])
+get_layer_defn = voidptr_output(lgdal.OGR_L_GetLayerDefn, [c_void_p])
+get_layer_srs = srs_output(lgdal.OGR_L_GetSpatialRef, [c_void_p])
+get_next_feature = voidptr_output(lgdal.OGR_L_GetNextFeature, [c_void_p])
+reset_reading = void_output(lgdal.OGR_L_ResetReading, [c_void_p], errcheck=False)
+test_capability = int_output(lgdal.OGR_L_TestCapability, [c_void_p, c_char_p])
+
+### Feature Definition Routines ###
+get_fd_geom_type = int_output(lgdal.OGR_FD_GetGeomType, [c_void_p])
+get_fd_name = const_string_output(lgdal.OGR_FD_GetName, [c_void_p])
+get_feat_name = const_string_output(lgdal.OGR_FD_GetName, [c_void_p])
+get_field_count = int_output(lgdal.OGR_FD_GetFieldCount, [c_void_p])
+get_field_defn = voidptr_output(lgdal.OGR_FD_GetFieldDefn, [c_void_p, c_int])
+
+### Feature Routines ###
+clone_feature = voidptr_output(lgdal.OGR_F_Clone, [c_void_p])
+destroy_feature = void_output(lgdal.OGR_F_Destroy, [c_void_p], errcheck=False)
+feature_equal = int_output(lgdal.OGR_F_Equal, [c_void_p, c_void_p])
+get_feat_geom_ref = geom_output(lgdal.OGR_F_GetGeometryRef, [c_void_p])
+get_feat_field_count = int_output(lgdal.OGR_F_GetFieldCount, [c_void_p])
+get_feat_field_defn = voidptr_output(lgdal.OGR_F_GetFieldDefnRef, [c_void_p, c_int])
+get_fid = int_output(lgdal.OGR_F_GetFID, [c_void_p])
+get_field_as_datetime = int_output(lgdal.OGR_F_GetFieldAsDateTime, [c_void_p, c_int, c_int_p, c_int_p, c_int_p, c_int_p, c_int_p, c_int_p])
+get_field_as_double = double_output(lgdal.OGR_F_GetFieldAsDouble, [c_void_p, c_int])
+get_field_as_integer = int_output(lgdal.OGR_F_GetFieldAsInteger, [c_void_p, c_int])
+get_field_as_string = const_string_output(lgdal.OGR_F_GetFieldAsString, [c_void_p, c_int])
+get_field_index = int_output(lgdal.OGR_F_GetFieldIndex, [c_void_p, c_char_p])
+
+### Field Routines ###
+get_field_name = const_string_output(lgdal.OGR_Fld_GetNameRef, [c_void_p])
+get_field_precision = int_output(lgdal.OGR_Fld_GetPrecision, [c_void_p])
+get_field_type = int_output(lgdal.OGR_Fld_GetType, [c_void_p])
+get_field_type_name = const_string_output(lgdal.OGR_GetFieldTypeName, [c_int])
+get_field_width = int_output(lgdal.OGR_Fld_GetWidth, [c_void_p])
diff --git a/django/contrib/gis/gdal/prototypes/errcheck.py b/django/contrib/gis/gdal/prototypes/errcheck.py
new file mode 100644
index 0000000000..c66be9adfb
--- /dev/null
+++ b/django/contrib/gis/gdal/prototypes/errcheck.py
@@ -0,0 +1,125 @@
+"""
+ This module houses the error-checking routines used by the GDAL
+ ctypes prototypes.
+"""
+from ctypes import c_void_p, string_at
+from django.contrib.gis.gdal.error import check_err, OGRException, SRSException
+from django.contrib.gis.gdal.libgdal import lgdal
+
+# Helper routines for retrieving pointers and/or values from
+# arguments passed in by reference.
+def arg_byref(args, offset=-1):
+ "Returns the pointer argument's by-refernece value."
+ return args[offset]._obj.value
+
+def ptr_byref(args, offset=-1):
+ "Returns the pointer argument passed in by-reference."
+ return args[offset]._obj
+
+def check_bool(result, func, cargs):
+ "Returns the boolean evaluation of the value."
+ if bool(result): return True
+ else: return False
+
+### String checking Routines ###
+def check_const_string(result, func, cargs, offset=None):
+ """
+ Similar functionality to `check_string`, but does not free the pointer.
+ """
+ if offset:
+ check_err(result)
+ ptr = ptr_byref(cargs, offset)
+ return ptr.value
+ else:
+ return result
+
+def check_string(result, func, cargs, offset=-1, str_result=False):
+ """
+ Checks the string output returned from the given function, and frees
+ the string pointer allocated by OGR. The `str_result` keyword
+ may be used when the result is the string pointer, otherwise
+ the OGR error code is assumed. The `offset` keyword may be used
+ to extract the string pointer passed in by-reference at the given
+ slice offset in the function arguments.
+ """
+ if str_result:
+ # For routines that return a string.
+ ptr = result
+ if not ptr: s = None
+ else: s = string_at(result)
+ else:
+ # Error-code return specified.
+ check_err(result)
+ ptr = ptr_byref(cargs, offset)
+ # Getting the string value
+ s = ptr.value
+ # Correctly freeing the allocated memory beind GDAL pointer
+ # w/the VSIFree routine.
+ if ptr: lgdal.VSIFree(ptr)
+ return s
+
+### DataSource, Layer error-checking ###
+
+### Envelope checking ###
+def check_envelope(result, func, cargs, offset=-1):
+ "Checks a function that returns an OGR Envelope by reference."
+ env = ptr_byref(cargs, offset)
+ return env
+
+### Geometry error-checking routines ###
+def check_geom(result, func, cargs):
+ "Checks a function that returns a geometry."
+ # OGR_G_Clone may return an integer, even though the
+ # restype is set to c_void_p
+ if isinstance(result, int):
+ result = c_void_p(result)
+ if not result:
+ raise OGRException('Invalid geometry pointer returned from "%s".' % func.__name__)
+ return result
+
+def check_geom_offset(result, func, cargs, offset=-1):
+ "Chcks the geometry at the given offset in the C parameter list."
+ check_err(result)
+ geom = ptr_byref(cargs, offset=offset)
+ return check_geom(geom, func, cargs)
+
+### Spatial Reference error-checking routines ###
+def check_srs(result, func, cargs):
+ if isinstance(result, int):
+ result = c_void_p(result)
+ if not result:
+ raise SRSException('Invalid spatial reference pointer returned from "%s".' % func.__name__)
+ return result
+
+### Other error-checking routines ###
+def check_arg_errcode(result, func, cargs):
+ """
+ The error code is returned in the last argument, by reference.
+ Check its value with `check_err` before returning the result.
+ """
+ check_err(arg_byref(cargs))
+ return result
+
+def check_errcode(result, func, cargs):
+ """
+ Check the error code returned (c_int).
+ """
+ check_err(result)
+ return
+
+def check_pointer(result, func, cargs):
+ "Makes sure the result pointer is valid."
+ if bool(result):
+ return result
+ else:
+ raise OGRException('Invalid pointer returned from "%s"' % func.__name__)
+
+def check_str_arg(result, func, cargs):
+ """
+ This is for the OSRGet[Angular|Linear]Units functions, which
+ require that the returned string pointer not be freed. This
+ returns both the double and tring values.
+ """
+ dbl = result
+ ptr = cargs[-1]._obj
+ return dbl, ptr.value
diff --git a/django/contrib/gis/gdal/prototypes/generation.py b/django/contrib/gis/gdal/prototypes/generation.py
new file mode 100644
index 0000000000..bba715d67c
--- /dev/null
+++ b/django/contrib/gis/gdal/prototypes/generation.py
@@ -0,0 +1,116 @@
+"""
+ This module contains functions that generate ctypes prototypes for the
+ GDAL routines.
+"""
+
+from ctypes import c_char_p, c_double, c_int, c_void_p
+from django.contrib.gis.gdal.prototypes.errcheck import \
+ check_arg_errcode, check_errcode, check_geom, check_geom_offset, \
+ check_pointer, check_srs, check_str_arg, check_string, check_const_string
+
+def double_output(func, argtypes, errcheck=False, strarg=False):
+ "Generates a ctypes function that returns a double value."
+ func.argtypes = argtypes
+ func.restype = c_double
+ if errcheck: func.errcheck = check_arg_errcode
+ if strarg: func.errcheck = check_str_arg
+ return func
+
+def geom_output(func, argtypes, offset=None):
+ """
+ Generates a function that returns a Geometry either by reference
+ or directly (if the return_geom keyword is set to True).
+ """
+ # Setting the argument types
+ func.argtypes = argtypes
+
+ if not offset:
+ # When a geometry pointer is directly returned.
+ func.restype = c_void_p
+ func.errcheck = check_geom
+ else:
+ # Error code returned, geometry is returned by-reference.
+ func.restype = c_int
+ def geomerrcheck(result, func, cargs):
+ return check_geom_offset(result, func, cargs, offset)
+ func.errcheck = geomerrcheck
+
+ return func
+
+def int_output(func, argtypes):
+ "Generates a ctypes function that returns an integer value."
+ func.argtypes = argtypes
+ func.restype = c_int
+ return func
+
+def srs_output(func, argtypes):
+ """
+ Generates a ctypes prototype for the given function with
+ the given C arguments that returns a pointer to an OGR
+ Spatial Reference System.
+ """
+ func.argtypes = argtypes
+ func.restype = c_void_p
+ func.errcheck = check_srs
+ return func
+
+def const_string_output(func, argtypes, offset=None):
+ func.argtypes = argtypes
+ if offset:
+ func.restype = c_int
+ else:
+ func.restype = c_char_p
+
+ def _check_const(result, func, cargs):
+ return check_const_string(result, func, cargs, offset=offset)
+ func.errcheck = _check_const
+
+ return func
+
+def string_output(func, argtypes, offset=-1, str_result=False):
+ """
+ Generates a ctypes prototype for the given function with the
+ given argument types that returns a string from a GDAL pointer.
+ The `const` flag indicates whether the allocated pointer should
+ be freed via the GDAL library routine VSIFree -- but only applies
+ only when `str_result` is True.
+ """
+ func.argtypes = argtypes
+ if str_result:
+ # String is the result, don't explicitly define
+ # the argument type so we can get the pointer.
+ pass
+ else:
+ # Error code is returned
+ func.restype = c_int
+
+ # Dynamically defining our error-checking function with the
+ # given offset.
+ def _check_str(result, func, cargs):
+ return check_string(result, func, cargs,
+ offset=offset, str_result=str_result)
+ func.errcheck = _check_str
+ return func
+
+def void_output(func, argtypes, errcheck=True):
+ """
+ For functions that don't only return an error code that needs to
+ be examined.
+ """
+ if argtypes: func.argtypes = argtypes
+ if errcheck:
+ # `errcheck` keyword may be set to False for routines that
+ # return void, rather than a status code.
+ func.restype = c_int
+ func.errcheck = check_errcode
+ else:
+ func.restype = None
+
+ return func
+
+def voidptr_output(func, argtypes):
+ "For functions that return c_void_p."
+ func.argtypes = argtypes
+ func.restype = c_void_p
+ func.errcheck = check_pointer
+ return func
diff --git a/django/contrib/gis/gdal/prototypes/geom.py b/django/contrib/gis/gdal/prototypes/geom.py
new file mode 100644
index 0000000000..7757f557ad
--- /dev/null
+++ b/django/contrib/gis/gdal/prototypes/geom.py
@@ -0,0 +1,109 @@
+from datetime import date
+from ctypes import c_char, c_char_p, c_double, c_int, c_ubyte, c_void_p, POINTER
+from django.contrib.gis.gdal.envelope import OGREnvelope
+from django.contrib.gis.gdal.libgdal import lgdal, gdal_version
+from django.contrib.gis.gdal.prototypes.errcheck import check_bool, check_envelope
+from django.contrib.gis.gdal.prototypes.generation import \
+ const_string_output, double_output, geom_output, int_output, \
+ srs_output, string_output, void_output
+
+# Some prototypes need to be aware of what version GDAL we have.
+major, minor = map(int, gdal_version().split('.')[:2])
+if major <= 1 and minor <= 4:
+ GEOJSON = False
+else:
+ GEOJSON = True
+
+### Generation routines specific to this module ###
+def env_func(f, argtypes):
+ "For getting OGREnvelopes."
+ f.argtypes = argtypes
+ f.restype = None
+ f.errcheck = check_envelope
+ return f
+
+def pnt_func(f):
+ "For accessing point information."
+ return double_output(f, [c_void_p, c_int])
+
+def topology_func(f):
+ f.argtypes = [c_void_p, c_void_p]
+ f.restype = c_int
+ f.errchck = check_bool
+ return f
+
+### OGR_G ctypes function prototypes ###
+
+# GeoJSON routines, if supported.
+if GEOJSON:
+ from_json = geom_output(lgdal.OGR_G_CreateGeometryFromJson, [c_char_p])
+ to_json = string_output(lgdal.OGR_G_ExportToJson, [c_void_p], str_result=True)
+else:
+ from_json = False
+ to_json = False
+
+# GetX, GetY, GetZ all return doubles.
+getx = pnt_func(lgdal.OGR_G_GetX)
+gety = pnt_func(lgdal.OGR_G_GetY)
+getz = pnt_func(lgdal.OGR_G_GetZ)
+
+# Geometry creation routines.
+from_wkb = geom_output(lgdal.OGR_G_CreateFromWkb, [c_char_p, c_void_p, POINTER(c_void_p), c_int], offset=-2)
+from_wkt = geom_output(lgdal.OGR_G_CreateFromWkt, [POINTER(c_char_p), c_void_p, POINTER(c_void_p)], offset=-1)
+create_geom = geom_output(lgdal.OGR_G_CreateGeometry, [c_int])
+clone_geom = geom_output(lgdal.OGR_G_Clone, [c_void_p])
+get_geom_ref = geom_output(lgdal.OGR_G_GetGeometryRef, [c_void_p, c_int])
+get_boundary = geom_output(lgdal.OGR_G_GetBoundary, [c_void_p])
+geom_convex_hull = geom_output(lgdal.OGR_G_ConvexHull, [c_void_p])
+geom_diff = geom_output(lgdal.OGR_G_Difference, [c_void_p, c_void_p])
+geom_intersection = geom_output(lgdal.OGR_G_Intersection, [c_void_p, c_void_p])
+geom_sym_diff = geom_output(lgdal.OGR_G_SymmetricDifference, [c_void_p, c_void_p])
+geom_union = geom_output(lgdal.OGR_G_Union, [c_void_p, c_void_p])
+
+# Geometry modification routines.
+add_geom = void_output(lgdal.OGR_G_AddGeometry, [c_void_p, c_void_p])
+import_wkt = void_output(lgdal.OGR_G_ImportFromWkt, [c_void_p, POINTER(c_char_p)])
+
+# Destroys a geometry
+destroy_geom = void_output(lgdal.OGR_G_DestroyGeometry, [c_void_p], errcheck=False)
+
+# Geometry export routines.
+to_wkb = void_output(lgdal.OGR_G_ExportToWkb, None, errcheck=True) # special handling for WKB.
+to_wkt = string_output(lgdal.OGR_G_ExportToWkt, [c_void_p, POINTER(c_char_p)])
+to_gml = string_output(lgdal.OGR_G_ExportToGML, [c_void_p], str_result=True)
+get_wkbsize = int_output(lgdal.OGR_G_WkbSize, [c_void_p])
+
+# Geometry spatial-reference related routines.
+assign_srs = void_output(lgdal.OGR_G_AssignSpatialReference, [c_void_p, c_void_p], errcheck=False)
+get_geom_srs = srs_output(lgdal.OGR_G_GetSpatialReference, [c_void_p])
+
+# Geometry properties
+get_area = double_output(lgdal.OGR_G_GetArea, [c_void_p])
+get_centroid = void_output(lgdal.OGR_G_Centroid, [c_void_p, c_void_p])
+get_dims = int_output(lgdal.OGR_G_GetDimension, [c_void_p])
+get_coord_dims = int_output(lgdal.OGR_G_GetCoordinateDimension, [c_void_p])
+
+get_geom_count = int_output(lgdal.OGR_G_GetGeometryCount, [c_void_p])
+get_geom_name = const_string_output(lgdal.OGR_G_GetGeometryName, [c_void_p])
+get_geom_type = int_output(lgdal.OGR_G_GetGeometryType, [c_void_p])
+get_point_count = int_output(lgdal.OGR_G_GetPointCount, [c_void_p])
+get_point = void_output(lgdal.OGR_G_GetPoint, [c_void_p, c_int, POINTER(c_double), POINTER(c_double), POINTER(c_double)], errcheck=False)
+geom_close_rings = void_output(lgdal.OGR_G_CloseRings, [c_void_p], errcheck=False)
+
+# Topology routines.
+ogr_contains = topology_func(lgdal.OGR_G_Contains)
+ogr_crosses = topology_func(lgdal.OGR_G_Crosses)
+ogr_disjoint = topology_func(lgdal.OGR_G_Disjoint)
+ogr_equals = topology_func(lgdal.OGR_G_Equals)
+ogr_intersects = topology_func(lgdal.OGR_G_Intersects)
+ogr_overlaps = topology_func(lgdal.OGR_G_Overlaps)
+ogr_touches = topology_func(lgdal.OGR_G_Touches)
+ogr_within = topology_func(lgdal.OGR_G_Within)
+
+# Transformation routines.
+geom_transform = void_output(lgdal.OGR_G_Transform, [c_void_p, c_void_p])
+geom_transform_to = void_output(lgdal.OGR_G_TransformTo, [c_void_p, c_void_p])
+
+# For retrieving the envelope of the geometry.
+get_envelope = env_func(lgdal.OGR_G_GetEnvelope, [c_void_p, POINTER(OGREnvelope)])
+
diff --git a/django/contrib/gis/gdal/prototypes/srs.py b/django/contrib/gis/gdal/prototypes/srs.py
new file mode 100644
index 0000000000..ff4d0add95
--- /dev/null
+++ b/django/contrib/gis/gdal/prototypes/srs.py
@@ -0,0 +1,71 @@
+from ctypes import c_char_p, c_int, c_void_p, POINTER
+from django.contrib.gis.gdal.libgdal import lgdal, std_call
+from django.contrib.gis.gdal.prototypes.generation import \
+ const_string_output, double_output, int_output, \
+ srs_output, string_output, void_output
+
+## Shortcut generation for routines with known parameters.
+def srs_double(f):
+ """
+ Creates a function prototype for the OSR routines that take
+ the OSRSpatialReference object and
+ """
+ return double_output(f, [c_void_p, POINTER(c_int)], errcheck=True)
+
+def units_func(f):
+ """
+ Creates a ctypes function prototype for OSR units functions, e.g.,
+ OSRGetAngularUnits, OSRGetLinearUnits.
+ """
+ return double_output(f, [c_void_p, POINTER(c_char_p)], strarg=True)
+
+# Creation & destruction.
+clone_srs = srs_output(std_call('OSRClone'), [c_void_p])
+new_srs = srs_output(std_call('OSRNewSpatialReference'), [c_char_p])
+release_srs = void_output(lgdal.OSRRelease, [c_void_p], errcheck=False)
+destroy_srs = void_output(std_call('OSRDestroySpatialReference'), [c_void_p], errcheck=False)
+srs_validate = void_output(lgdal.OSRValidate, [c_void_p])
+
+# Getting the semi_major, semi_minor, and flattening functions.
+semi_major = srs_double(lgdal.OSRGetSemiMajor)
+semi_minor = srs_double(lgdal.OSRGetSemiMinor)
+invflattening = srs_double(lgdal.OSRGetInvFlattening)
+
+# WKT, PROJ, EPSG, XML importation routines.
+from_wkt = void_output(lgdal.OSRImportFromWkt, [c_void_p, POINTER(c_char_p)])
+from_proj = void_output(lgdal.OSRImportFromProj4, [c_void_p, c_char_p])
+from_epsg = void_output(std_call('OSRImportFromEPSG'), [c_void_p, c_int])
+from_xml = void_output(lgdal.OSRImportFromXML, [c_void_p, c_char_p])
+
+# Morphing to/from ESRI WKT.
+morph_to_esri = void_output(lgdal.OSRMorphToESRI, [c_void_p])
+morph_from_esri = void_output(lgdal.OSRMorphFromESRI, [c_void_p])
+
+# Identifying the EPSG
+identify_epsg = void_output(lgdal.OSRAutoIdentifyEPSG, [c_void_p])
+
+# Getting the angular_units, linear_units functions
+linear_units = units_func(lgdal.OSRGetLinearUnits)
+angular_units = units_func(lgdal.OSRGetAngularUnits)
+
+# For exporting to WKT, PROJ.4, "Pretty" WKT, and XML.
+to_wkt = string_output(std_call('OSRExportToWkt'), [c_void_p, POINTER(c_char_p)])
+to_proj = string_output(std_call('OSRExportToProj4'), [c_void_p, POINTER(c_char_p)])
+to_pretty_wkt = string_output(std_call('OSRExportToPrettyWkt'), [c_void_p, POINTER(c_char_p), c_int], offset=-2)
+
+# Memory leak fixed in GDAL 1.5; still exists in 1.4.
+to_xml = string_output(lgdal.OSRExportToXML, [c_void_p, POINTER(c_char_p), c_char_p], offset=-2)
+
+# String attribute retrival routines.
+get_attr_value = const_string_output(std_call('OSRGetAttrValue'), [c_void_p, c_char_p, c_int])
+get_auth_name = const_string_output(lgdal.OSRGetAuthorityName, [c_void_p, c_char_p])
+get_auth_code = const_string_output(lgdal.OSRGetAuthorityCode, [c_void_p, c_char_p])
+
+# SRS Properties
+isgeographic = int_output(lgdal.OSRIsGeographic, [c_void_p])
+islocal = int_output(lgdal.OSRIsLocal, [c_void_p])
+isprojected = int_output(lgdal.OSRIsProjected, [c_void_p])
+
+# Coordinate transformation
+new_ct= srs_output(std_call('OCTNewCoordinateTransformation'), [c_void_p, c_void_p])
+destroy_ct = void_output(std_call('OCTDestroyCoordinateTransformation'), [c_void_p], errcheck=False)
diff --git a/django/contrib/gis/gdal/srs.py b/django/contrib/gis/gdal/srs.py
new file mode 100644
index 0000000000..d70e71ebc7
--- /dev/null
+++ b/django/contrib/gis/gdal/srs.py
@@ -0,0 +1,360 @@
+"""
+ The Spatial Reference class, represensents OGR Spatial Reference objects.
+
+ Example:
+ >>> from django.contrib.gis.gdal import SpatialReference
+ >>> srs = SpatialReference('WGS84')
+ >>> print srs
+ GEOGCS["WGS 84",
+ DATUM["WGS_1984",
+ SPHEROID["WGS 84",6378137,298.257223563,
+ AUTHORITY["EPSG","7030"]],
+ TOWGS84[0,0,0,0,0,0,0],
+ AUTHORITY["EPSG","6326"]],
+ PRIMEM["Greenwich",0,
+ AUTHORITY["EPSG","8901"]],
+ UNIT["degree",0.01745329251994328,
+ AUTHORITY["EPSG","9122"]],
+ AUTHORITY["EPSG","4326"]]
+ >>> print srs.proj
+ +proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs
+ >>> print srs.ellipsoid
+ (6378137.0, 6356752.3142451793, 298.25722356300003)
+ >>> print srs.projected, srs.geographic
+ False True
+ >>> srs.import_epsg(32140)
+ >>> print srs.name
+ NAD83 / Texas South Central
+"""
+import re
+from types import UnicodeType, TupleType
+from ctypes import byref, c_char_p, c_int, c_void_p
+
+# Getting the error checking routine and exceptions
+from django.contrib.gis.gdal.error import OGRException, SRSException
+from django.contrib.gis.gdal.prototypes.srs import *
+
+#### Spatial Reference class. ####
+class SpatialReference(object):
+ """
+ A wrapper for the OGRSpatialReference object. According to the GDAL website,
+ the SpatialReference object "provide[s] services to represent coordinate
+ systems (projections and datums) and to transform between them."
+ """
+
+ # Well-Known Geographical Coordinate System Name
+ _well_known = {'WGS84':4326, 'WGS72':4322, 'NAD27':4267, 'NAD83':4269}
+ _epsg_regex = re.compile('^(EPSG:)?(?P<epsg>\d+)$', re.I)
+ _proj_regex = re.compile(r'^\+proj')
+
+ #### Python 'magic' routines ####
+ def __init__(self, srs_input='', srs_type='wkt'):
+ """
+ Creates a GDAL OSR Spatial Reference object from the given input.
+ The input may be string of OGC Well Known Text (WKT), an integer
+ EPSG code, a PROJ.4 string, and/or a projection "well known" shorthand
+ string (one of 'WGS84', 'WGS72', 'NAD27', 'NAD83').
+ """
+ # Intializing pointer and string buffer.
+ self._ptr = None
+ buf = c_char_p('')
+
+ if isinstance(srs_input, basestring):
+ # Encoding to ASCII if unicode passed in.
+ if isinstance(srs_input, UnicodeType):
+ srs_input = srs_input.encode('ascii')
+
+ epsg_m = self._epsg_regex.match(srs_input)
+ proj_m = self._proj_regex.match(srs_input)
+ if epsg_m:
+ # Is this an EPSG well known name?
+ srs_type = 'epsg'
+ srs_input = int(epsg_m.group('epsg'))
+ elif proj_m:
+ # Is the string a PROJ.4 string?
+ srs_type = 'proj'
+ elif srs_input in self._well_known:
+ # Is this a short-hand well known name?
+ srs_type = 'epsg'
+ srs_input = self._well_known[srs_input]
+ elif srs_type == 'proj':
+ pass
+ else:
+ # Setting the buffer with WKT, PROJ.4 string, etc.
+ buf = c_char_p(srs_input)
+ elif isinstance(srs_input, int):
+ # EPSG integer code was input.
+ if srs_type != 'epsg': srs_type = 'epsg'
+ elif isinstance(srs_input, c_void_p):
+ srs_type = 'ogr'
+ else:
+ raise TypeError('Invalid SRS type "%s"' % srs_type)
+
+ if srs_type == 'ogr':
+ # SRS input is OGR pointer
+ srs = srs_input
+ else:
+ # Creating a new pointer, using the string buffer.
+ srs = new_srs(buf)
+
+ # If the pointer is NULL, throw an exception.
+ if not srs:
+ raise SRSException('Could not create spatial reference from: %s' % srs_input)
+ else:
+ self._ptr = srs
+
+ # Post-processing if in PROJ.4 or EPSG formats.
+ if srs_type == 'proj': self.import_proj(srs_input)
+ elif srs_type == 'epsg': self.import_epsg(srs_input)
+
+ def __del__(self):
+ "Destroys this spatial reference."
+ if self._ptr: release_srs(self._ptr)
+
+ def __getitem__(self, target):
+ """
+ Returns the value of the given string attribute node, None if the node
+ doesn't exist. Can also take a tuple as a parameter, (target, child),
+ where child is the index of the attribute in the WKT. For example:
+
+ >>> wkt = 'GEOGCS["WGS 84", DATUM["WGS_1984, ... AUTHORITY["EPSG","4326"]]')
+ >>> srs = SpatialReference(wkt) # could also use 'WGS84', or 4326
+ >>> print srs['GEOGCS']
+ WGS 84
+ >>> print srs['DATUM']
+ WGS_1984
+ >>> print srs['AUTHORITY']
+ EPSG
+ >>> print srs['AUTHORITY', 1] # The authority value
+ 4326
+ >>> print srs['TOWGS84', 4] # the fourth value in this wkt
+ 0
+ >>> print srs['UNIT|AUTHORITY'] # For the units authority, have to use the pipe symbole.
+ EPSG
+ >>> print srs['UNIT|AUTHORITY', 1] # The authority value for the untis
+ 9122
+ """
+ if isinstance(target, TupleType):
+ return self.attr_value(*target)
+ else:
+ return self.attr_value(target)
+
+ def __str__(self):
+ "The string representation uses 'pretty' WKT."
+ return self.pretty_wkt
+
+ #### SpatialReference Methods ####
+ def attr_value(self, target, index=0):
+ """
+ The attribute value for the given target node (e.g. 'PROJCS'). The index
+ keyword specifies an index of the child node to return.
+ """
+ if not isinstance(target, str) or not isinstance(index, int):
+ raise TypeError
+ return get_attr_value(self._ptr, target, index)
+
+ def auth_name(self, target):
+ "Returns the authority name for the given string target node."
+ return get_auth_name(self._ptr, target)
+
+ def auth_code(self, target):
+ "Returns the authority code for the given string target node."
+ return get_auth_code(self._ptr, target)
+
+ def clone(self):
+ "Returns a clone of this SpatialReference object."
+ return SpatialReference(clone_srs(self._ptr))
+
+ def from_esri(self):
+ "Morphs this SpatialReference from ESRI's format to EPSG."
+ morph_from_esri(self._ptr)
+
+ def identify_epsg(self):
+ """
+ This method inspects the WKT of this SpatialReference, and will
+ add EPSG authority nodes where an EPSG identifier is applicable.
+ """
+ identify_epsg(self._ptr)
+
+ def to_esri(self):
+ "Morphs this SpatialReference to ESRI's format."
+ morph_to_esri(self._ptr)
+
+ def validate(self):
+ "Checks to see if the given spatial reference is valid."
+ srs_validate(self._ptr)
+
+ #### Name & SRID properties ####
+ @property
+ def name(self):
+ "Returns the name of this Spatial Reference."
+ if self.projected: return self.attr_value('PROJCS')
+ elif self.geographic: return self.attr_value('GEOGCS')
+ elif self.local: return self.attr_value('LOCAL_CS')
+ else: return None
+
+ @property
+ def srid(self):
+ "Returns the SRID of top-level authority, or None if undefined."
+ try:
+ return int(self.attr_value('AUTHORITY', 1))
+ except (TypeError, ValueError):
+ return None
+
+ #### Unit Properties ####
+ @property
+ def linear_name(self):
+ "Returns the name of the linear units."
+ units, name = linear_units(self._ptr, byref(c_char_p()))
+ return name
+
+ @property
+ def linear_units(self):
+ "Returns the value of the linear units."
+ units, name = linear_units(self._ptr, byref(c_char_p()))
+ return units
+
+ @property
+ def angular_name(self):
+ "Returns the name of the angular units."
+ units, name = angular_units(self._ptr, byref(c_char_p()))
+ return name
+
+ @property
+ def angular_units(self):
+ "Returns the value of the angular units."
+ units, name = angular_units(self._ptr, byref(c_char_p()))
+ return units
+
+ @property
+ def units(self):
+ """
+ Returns a 2-tuple of the units value and the units name,
+ and will automatically determines whether to return the linear
+ or angular units.
+ """
+ if self.projected or self.local:
+ return linear_units(self._ptr, byref(c_char_p()))
+ elif self.geographic:
+ return angular_units(self._ptr, byref(c_char_p()))
+ else:
+ return (None, None)
+
+ #### Spheroid/Ellipsoid Properties ####
+ @property
+ def ellipsoid(self):
+ """
+ Returns a tuple of the ellipsoid parameters:
+ (semimajor axis, semiminor axis, and inverse flattening)
+ """
+ return (self.semi_major, self.semi_minor, self.inverse_flattening)
+
+ @property
+ def semi_major(self):
+ "Returns the Semi Major Axis for this Spatial Reference."
+ return semi_major(self._ptr, byref(c_int()))
+
+ @property
+ def semi_minor(self):
+ "Returns the Semi Minor Axis for this Spatial Reference."
+ return semi_minor(self._ptr, byref(c_int()))
+
+ @property
+ def inverse_flattening(self):
+ "Returns the Inverse Flattening for this Spatial Reference."
+ return invflattening(self._ptr, byref(c_int()))
+
+ #### Boolean Properties ####
+ @property
+ def geographic(self):
+ """
+ Returns True if this SpatialReference is geographic
+ (root node is GEOGCS).
+ """
+ return bool(isgeographic(self._ptr))
+
+ @property
+ def local(self):
+ "Returns True if this SpatialReference is local (root node is LOCAL_CS)."
+ return bool(islocal(self._ptr))
+
+ @property
+ def projected(self):
+ """
+ Returns True if this SpatialReference is a projected coordinate system
+ (root node is PROJCS).
+ """
+ return bool(isprojected(self._ptr))
+
+ #### Import Routines #####
+ def import_wkt(self, wkt):
+ "Imports the Spatial Reference from OGC WKT (string)"
+ from_wkt(self._ptr, byref(c_char_p(wkt)))
+
+ def import_proj(self, proj):
+ "Imports the Spatial Reference from a PROJ.4 string."
+ from_proj(self._ptr, proj)
+
+ def import_epsg(self, epsg):
+ "Imports the Spatial Reference from the EPSG code (an integer)."
+ from_epsg(self._ptr, epsg)
+
+ def import_xml(self, xml):
+ "Imports the Spatial Reference from an XML string."
+ from_xml(self._ptr, xml)
+
+ #### Export Properties ####
+ @property
+ def wkt(self):
+ "Returns the WKT representation of this Spatial Reference."
+ return to_wkt(self._ptr, byref(c_char_p()))
+
+ @property
+ def pretty_wkt(self, simplify=0):
+ "Returns the 'pretty' representation of the WKT."
+ return to_pretty_wkt(self._ptr, byref(c_char_p()), simplify)
+
+ @property
+ def proj(self):
+ "Returns the PROJ.4 representation for this Spatial Reference."
+ return to_proj(self._ptr, byref(c_char_p()))
+
+ @property
+ def proj4(self):
+ "Alias for proj()."
+ return self.proj
+
+ @property
+ def xml(self, dialect=''):
+ "Returns the XML representation of this Spatial Reference."
+ # FIXME: This leaks memory, have to figure out why.
+ return to_xml(self._ptr, byref(c_char_p()), dialect)
+
+ def to_esri(self):
+ "Morphs this SpatialReference to ESRI's format."
+ morph_to_esri(self._ptr)
+
+ def from_esri(self):
+ "Morphs this SpatialReference from ESRI's format to EPSG."
+ morph_from_esri(self._ptr)
+
+class CoordTransform(object):
+ "The coordinate system transformation object."
+
+ def __init__(self, source, target):
+ "Initializes on a source and target SpatialReference objects."
+ self._ptr = None # Initially NULL
+ if not isinstance(source, SpatialReference) or not isinstance(target, SpatialReference):
+ raise SRSException('source and target must be of type SpatialReference')
+ self._ptr = new_ct(source._ptr, target._ptr)
+ if not self._ptr:
+ raise SRSException('could not intialize CoordTransform object')
+ self._srs1_name = source.name
+ self._srs2_name = target.name
+
+ def __del__(self):
+ "Deletes this Coordinate Transformation object."
+ if self._ptr: destroy_ct(self._ptr)
+
+ def __str__(self):
+ return 'Transform from "%s" to "%s"' % (self._srs1_name, self._srs2_name)
diff --git a/django/contrib/gis/geos/LICENSE b/django/contrib/gis/geos/LICENSE
new file mode 100644
index 0000000000..84cf485d00
--- /dev/null
+++ b/django/contrib/gis/geos/LICENSE
@@ -0,0 +1,27 @@
+Copyright (c) 2007, Justin Bronn
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without modification,
+are permitted provided that the following conditions are met:
+
+ 1. Redistributions of source code must retain the above copyright notice,
+ this list of conditions and the following disclaimer.
+
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+ 3. Neither the name of GEOSGeometry nor the names of its contributors may be used
+ to endorse or promote products derived from this software without
+ specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
+ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
+ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
diff --git a/django/contrib/gis/geos/__init__.py b/django/contrib/gis/geos/__init__.py
new file mode 100644
index 0000000000..90e2605240
--- /dev/null
+++ b/django/contrib/gis/geos/__init__.py
@@ -0,0 +1,69 @@
+"""
+ The goal of this module is to be a ctypes wrapper around the GEOS library
+ that will work on both *NIX and Windows systems. Specifically, this uses
+ the GEOS C api.
+
+ I have several motivations for doing this:
+ (1) The GEOS SWIG wrapper is no longer maintained, and requires the
+ installation of SWIG.
+ (2) The PCL implementation is over 2K+ lines of C and would make
+ PCL a requisite package for the GeoDjango application stack.
+ (3) Windows and Mac compatibility becomes substantially easier, and does not
+ require the additional compilation of PCL or GEOS and SWIG -- all that
+ is needed is a Win32 or Mac compiled GEOS C library (dll or dylib)
+ in a location that Python can read (e.g. 'C:\Python25').
+
+ In summary, I wanted to wrap GEOS in a more maintainable and portable way using
+ only Python and the excellent ctypes library (now standard in Python 2.5).
+
+ In the spirit of loose coupling, this library does not require Django or
+ GeoDjango. Only the GEOS C library and ctypes are needed for the platform
+ of your choice.
+
+ For more information about GEOS:
+ http://geos.refractions.net
+
+ For more info about PCL and the discontinuation of the Python GEOS
+ library see Sean Gillies' writeup (and subsequent update) at:
+ http://zcologia.com/news/150/geometries-for-python/
+ http://zcologia.com/news/429/geometries-for-python-update/
+"""
+from django.contrib.gis.geos.base import GEOSGeometry, wkt_regex, hex_regex
+from django.contrib.gis.geos.geometries import Point, LineString, LinearRing, Polygon, HAS_NUMPY
+from django.contrib.gis.geos.collections import GeometryCollection, MultiPoint, MultiLineString, MultiPolygon
+from django.contrib.gis.geos.error import GEOSException, GEOSIndexError
+from django.contrib.gis.geos.libgeos import geos_version, geos_version_info
+
+def fromfile(file_name):
+ """
+ Given a string file name, returns a GEOSGeometry. The file may contain WKB,
+ WKT, or HEX.
+ """
+ fh = open(file_name, 'rb')
+ buf = fh.read()
+ fh.close()
+ if wkt_regex.match(buf) or hex_regex.match(buf):
+ return GEOSGeometry(buf)
+ else:
+ return GEOSGeometry(buffer(buf))
+
+def fromstr(wkt_or_hex, **kwargs):
+ "Given a string value (wkt or hex), returns a GEOSGeometry object."
+ return GEOSGeometry(wkt_or_hex, **kwargs)
+
+def hex_to_wkt(hex):
+ "Converts HEXEWKB into WKT."
+ return GEOSGeometry(hex).wkt
+
+def wkt_to_hex(wkt):
+ "Converts WKT into HEXEWKB."
+ return GEOSGeometry(wkt).hex
+
+def centroid(input):
+ "Returns the centroid of the geometry (given in HEXEWKB)."
+ return GEOSGeometry(input).centroid.wkt
+
+def area(input):
+ "Returns the area of the geometry (given in HEXEWKB)."
+ return GEOSGeometry(input).area
+
diff --git a/django/contrib/gis/geos/base.py b/django/contrib/gis/geos/base.py
new file mode 100644
index 0000000000..8200d59eec
--- /dev/null
+++ b/django/contrib/gis/geos/base.py
@@ -0,0 +1,608 @@
+"""
+ This module contains the 'base' GEOSGeometry object -- all GEOS Geometries
+ inherit from this object.
+"""
+# Python, ctypes and types dependencies.
+import re
+from ctypes import addressof, byref, c_double, c_size_t
+from types import UnicodeType
+
+# GEOS-related dependencies.
+from django.contrib.gis.geos.coordseq import GEOSCoordSeq
+from django.contrib.gis.geos.error import GEOSException
+from django.contrib.gis.geos.libgeos import GEOM_PTR
+
+# All other functions in this module come from the ctypes
+# prototypes module -- which handles all interaction with
+# the underlying GEOS library.
+from django.contrib.gis.geos.prototypes import *
+
+# Trying to import GDAL libraries, if available. Have to place in
+# try/except since this package may be used outside GeoDjango.
+try:
+ from django.contrib.gis.gdal import OGRGeometry, SpatialReference, GEOJSON
+ HAS_GDAL = True
+except:
+ HAS_GDAL, GEOJSON = False, False
+
+# Regular expression for recognizing HEXEWKB and WKT. A prophylactic measure
+# to prevent potentially malicious input from reaching the underlying C
+# library. Not a substitute for good web security programming practices.
+hex_regex = re.compile(r'^[0-9A-F]+$', re.I)
+wkt_regex = re.compile(r'^(SRID=(?P<srid>\d+);)?(?P<wkt>(POINT|LINESTRING|LINEARRING|POLYGON|MULTIPOINT|MULTILINESTRING|MULTIPOLYGON|GEOMETRYCOLLECTION)[ACEGIMLONPSRUTY\d,\.\-\(\) ]+)$', re.I)
+json_regex = re.compile(r'^\{.+\}$')
+
+class GEOSGeometry(object):
+ "A class that, generally, encapsulates a GEOS geometry."
+
+ # Initially, the geometry pointer is NULL
+ _ptr = None
+
+ #### Python 'magic' routines ####
+ def __init__(self, geo_input, srid=None):
+ """
+ The base constructor for GEOS geometry objects, and may take the
+ following inputs:
+
+ * string: WKT
+ * string: HEXEWKB (a PostGIS-specific canonical form)
+ * buffer: WKB
+
+ The `srid` keyword is used to specify the Source Reference Identifier
+ (SRID) number for this Geometry. If not set, the SRID will be None.
+ """
+ if isinstance(geo_input, basestring):
+ if isinstance(geo_input, UnicodeType):
+ # Encoding to ASCII, WKT or HEXEWKB doesn't need any more.
+ geo_input = geo_input.encode('ascii')
+
+ wkt_m = wkt_regex.match(geo_input)
+ if wkt_m:
+ # Handling WKT input.
+ if wkt_m.group('srid'): srid = int(wkt_m.group('srid'))
+ g = from_wkt(wkt_m.group('wkt'))
+ elif hex_regex.match(geo_input):
+ # Handling HEXEWKB input.
+ g = from_hex(geo_input, len(geo_input))
+ elif GEOJSON and json_regex.match(geo_input):
+ # Handling GeoJSON input.
+ wkb_input = str(OGRGeometry(geo_input).wkb)
+ g = from_wkb(wkb_input, len(wkb_input))
+ else:
+ raise ValueError('String or unicode input unrecognized as WKT EWKT, and HEXEWKB.')
+ elif isinstance(geo_input, GEOM_PTR):
+ # When the input is a pointer to a geomtry (GEOM_PTR).
+ g = geo_input
+ elif isinstance(geo_input, buffer):
+ # When the input is a buffer (WKB).
+ wkb_input = str(geo_input)
+ g = from_wkb(wkb_input, len(wkb_input))
+ else:
+ # Invalid geometry type.
+ raise TypeError('Improper geometry input type: %s' % str(type(geo_input)))
+
+ if bool(g):
+ # Setting the pointer object with a valid pointer.
+ self._ptr = g
+ else:
+ raise GEOSException('Could not initialize GEOS Geometry with given input.')
+
+ # Post-initialization setup.
+ self._post_init(srid)
+
+ def _post_init(self, srid):
+ "Helper routine for performing post-initialization setup."
+ # Setting the SRID, if given.
+ if srid and isinstance(srid, int): self.srid = srid
+
+ # Setting the class type (e.g., Point, Polygon, etc.)
+ self.__class__ = GEOS_CLASSES[self.geom_typeid]
+
+ # Setting the coordinate sequence for the geometry (will be None on
+ # geometries that do not have coordinate sequences)
+ self._set_cs()
+
+ @property
+ def ptr(self):
+ """
+ Property for controlling access to the GEOS geometry pointer. Using
+ this raises an exception when the pointer is NULL, thus preventing
+ the C library from attempting to access an invalid memory location.
+ """
+ if self._ptr:
+ return self._ptr
+ else:
+ raise GEOSException('NULL GEOS pointer encountered; was this geometry modified?')
+
+ def __del__(self):
+ """
+ Destroys this Geometry; in other words, frees the memory used by the
+ GEOS C++ object.
+ """
+ if self._ptr: destroy_geom(self._ptr)
+
+ def __copy__(self):
+ """
+ Returns a clone because the copy of a GEOSGeometry may contain an
+ invalid pointer location if the original is garbage collected.
+ """
+ return self.clone()
+
+ def __deepcopy__(self, memodict):
+ """
+ The `deepcopy` routine is used by the `Node` class of django.utils.tree;
+ thus, the protocol routine needs to be implemented to return correct
+ copies (clones) of these GEOS objects, which use C pointers.
+ """
+ return self.clone()
+
+ def __str__(self):
+ "WKT is used for the string representation."
+ return self.wkt
+
+ def __repr__(self):
+ "Short-hand representation because WKT may be very large."
+ return '<%s object at %s>' % (self.geom_type, hex(addressof(self.ptr)))
+
+ # Pickling support
+ def __getstate__(self):
+ # The pickled state is simply a tuple of the WKB (in string form)
+ # and the SRID.
+ return str(self.wkb), self.srid
+
+ def __setstate__(self, state):
+ # Instantiating from the tuple state that was pickled.
+ wkb, srid = state
+ ptr = from_wkb(wkb, len(wkb))
+ if not ptr: raise GEOSException('Invalid Geometry loaded from pickled state.')
+ self._ptr = ptr
+ self._post_init(srid)
+
+ # Comparison operators
+ def __eq__(self, other):
+ """
+ Equivalence testing, a Geometry may be compared with another Geometry
+ or a WKT representation.
+ """
+ if isinstance(other, basestring):
+ return self.wkt == other
+ elif isinstance(other, GEOSGeometry):
+ return self.equals_exact(other)
+ else:
+ return False
+
+ def __ne__(self, other):
+ "The not equals operator."
+ return not (self == other)
+
+ ### Geometry set-like operations ###
+ # Thanks to Sean Gillies for inspiration:
+ # http://lists.gispython.org/pipermail/community/2007-July/001034.html
+ # g = g1 | g2
+ def __or__(self, other):
+ "Returns the union of this Geometry and the other."
+ return self.union(other)
+
+ # g = g1 & g2
+ def __and__(self, other):
+ "Returns the intersection of this Geometry and the other."
+ return self.intersection(other)
+
+ # g = g1 - g2
+ def __sub__(self, other):
+ "Return the difference this Geometry and the other."
+ return self.difference(other)
+
+ # g = g1 ^ g2
+ def __xor__(self, other):
+ "Return the symmetric difference of this Geometry and the other."
+ return self.sym_difference(other)
+
+ #### Coordinate Sequence Routines ####
+ @property
+ def has_cs(self):
+ "Returns True if this Geometry has a coordinate sequence, False if not."
+ # Only these geometries are allowed to have coordinate sequences.
+ if isinstance(self, (Point, LineString, LinearRing)):
+ return True
+ else:
+ return False
+
+ def _set_cs(self):
+ "Sets the coordinate sequence for this Geometry."
+ if self.has_cs:
+ self._cs = GEOSCoordSeq(get_cs(self.ptr), self.hasz)
+ else:
+ self._cs = None
+
+ @property
+ def coord_seq(self):
+ "Returns a clone of the coordinate sequence for this Geometry."
+ if self.has_cs:
+ return self._cs.clone()
+
+ #### Geometry Info ####
+ @property
+ def geom_type(self):
+ "Returns a string representing the Geometry type, e.g. 'Polygon'"
+ return geos_type(self.ptr)
+
+ @property
+ def geom_typeid(self):
+ "Returns an integer representing the Geometry type."
+ return geos_typeid(self.ptr)
+
+ @property
+ def num_geom(self):
+ "Returns the number of geometries in the Geometry."
+ return get_num_geoms(self.ptr)
+
+ @property
+ def num_coords(self):
+ "Returns the number of coordinates in the Geometry."
+ return get_num_coords(self.ptr)
+
+ @property
+ def num_points(self):
+ "Returns the number points, or coordinates, in the Geometry."
+ return self.num_coords
+
+ @property
+ def dims(self):
+ "Returns the dimension of this Geometry (0=point, 1=line, 2=surface)."
+ return get_dims(self.ptr)
+
+ def normalize(self):
+ "Converts this Geometry to normal form (or canonical form)."
+ return geos_normalize(self.ptr)
+
+ #### Unary predicates ####
+ @property
+ def empty(self):
+ """
+ Returns a boolean indicating whether the set of points in this Geometry
+ are empty.
+ """
+ return geos_isempty(self.ptr)
+
+ @property
+ def hasz(self):
+ "Returns whether the geometry has a 3D dimension."
+ return geos_hasz(self.ptr)
+
+ @property
+ def ring(self):
+ "Returns whether or not the geometry is a ring."
+ return geos_isring(self.ptr)
+
+ @property
+ def simple(self):
+ "Returns false if the Geometry not simple."
+ return geos_issimple(self.ptr)
+
+ @property
+ def valid(self):
+ "This property tests the validity of this Geometry."
+ return geos_isvalid(self.ptr)
+
+ #### Binary predicates. ####
+ def contains(self, other):
+ "Returns true if other.within(this) returns true."
+ return geos_contains(self.ptr, other.ptr)
+
+ def crosses(self, other):
+ """
+ Returns true if the DE-9IM intersection matrix for the two Geometries
+ is T*T****** (for a point and a curve,a point and an area or a line and
+ an area) 0******** (for two curves).
+ """
+ return geos_crosses(self.ptr, other.ptr)
+
+ def disjoint(self, other):
+ """
+ Returns true if the DE-9IM intersection matrix for the two Geometries
+ is FF*FF****.
+ """
+ return geos_disjoint(self.ptr, other.ptr)
+
+ def equals(self, other):
+ """
+ Returns true if the DE-9IM intersection matrix for the two Geometries
+ is T*F**FFF*.
+ """
+ return geos_equals(self.ptr, other.ptr)
+
+ def equals_exact(self, other, tolerance=0):
+ """
+ Returns true if the two Geometries are exactly equal, up to a
+ specified tolerance.
+ """
+ return geos_equalsexact(self.ptr, other.ptr, float(tolerance))
+
+ def intersects(self, other):
+ "Returns true if disjoint returns false."
+ return geos_intersects(self.ptr, other.ptr)
+
+ def overlaps(self, other):
+ """
+ Returns true if the DE-9IM intersection matrix for the two Geometries
+ is T*T***T** (for two points or two surfaces) 1*T***T** (for two curves).
+ """
+ return geos_overlaps(self.ptr, other.ptr)
+
+ def relate_pattern(self, other, pattern):
+ """
+ Returns true if the elements in the DE-9IM intersection matrix for the
+ two Geometries match the elements in pattern.
+ """
+ if not isinstance(pattern, str) or len(pattern) > 9:
+ raise GEOSException('invalid intersection matrix pattern')
+ return geos_relatepattern(self.ptr, other.ptr, pattern)
+
+ def touches(self, other):
+ """
+ Returns true if the DE-9IM intersection matrix for the two Geometries
+ is FT*******, F**T***** or F***T****.
+ """
+ return geos_touches(self.ptr, other.ptr)
+
+ def within(self, other):
+ """
+ Returns true if the DE-9IM intersection matrix for the two Geometries
+ is T*F**F***.
+ """
+ return geos_within(self.ptr, other.ptr)
+
+ #### SRID Routines ####
+ def get_srid(self):
+ "Gets the SRID for the geometry, returns None if no SRID is set."
+ s = geos_get_srid(self.ptr)
+ if s == 0: return None
+ else: return s
+
+ def set_srid(self, srid):
+ "Sets the SRID for the geometry."
+ geos_set_srid(self.ptr, srid)
+ srid = property(get_srid, set_srid)
+
+ #### Output Routines ####
+ @property
+ def ewkt(self):
+ "Returns the EWKT (WKT + SRID) of the Geometry."
+ if self.get_srid(): return 'SRID=%s;%s' % (self.srid, self.wkt)
+ else: return self.wkt
+
+ @property
+ def wkt(self):
+ "Returns the WKT (Well-Known Text) of the Geometry."
+ return to_wkt(self.ptr)
+
+ @property
+ def hex(self):
+ """
+ Returns the HEX of the Geometry -- please note that the SRID is not
+ included in this representation, because the GEOS C library uses
+ -1 by default, even if the SRID is set.
+ """
+ # A possible faster, all-python, implementation:
+ # str(self.wkb).encode('hex')
+ return to_hex(self.ptr, byref(c_size_t()))
+
+ @property
+ def json(self):
+ """
+ Returns GeoJSON representation of this Geometry if GDAL 1.5+
+ is installed.
+ """
+ if GEOJSON: return self.ogr.json
+ geojson = json
+
+ @property
+ def wkb(self):
+ "Returns the WKB of the Geometry as a buffer."
+ bin = to_wkb(self.ptr, byref(c_size_t()))
+ return buffer(bin)
+
+ @property
+ def kml(self):
+ "Returns the KML representation of this Geometry."
+ gtype = self.geom_type
+ return '<%s>%s</%s>' % (gtype, self.coord_seq.kml, gtype)
+
+ #### GDAL-specific output routines ####
+ @property
+ def ogr(self):
+ "Returns the OGR Geometry for this Geometry."
+ if HAS_GDAL:
+ if self.srid:
+ return OGRGeometry(self.wkb, self.srid)
+ else:
+ return OGRGeometry(self.wkb)
+ else:
+ return None
+
+ @property
+ def srs(self):
+ "Returns the OSR SpatialReference for SRID of this Geometry."
+ if HAS_GDAL and self.srid:
+ return SpatialReference(self.srid)
+ else:
+ return None
+
+ @property
+ def crs(self):
+ "Alias for `srs` property."
+ return self.srs
+
+ def transform(self, ct, clone=False):
+ """
+ Requires GDAL. Transforms the geometry according to the given
+ transformation object, which may be an integer SRID, and WKT or
+ PROJ.4 string. By default, the geometry is transformed in-place and
+ nothing is returned. However if the `clone` keyword is set, then this
+ geometry will not be modified and a transformed clone will be returned
+ instead.
+ """
+ srid = self.srid
+ if HAS_GDAL and srid:
+ g = OGRGeometry(self.wkb, srid)
+ g.transform(ct)
+ wkb = str(g.wkb)
+ ptr = from_wkb(wkb, len(wkb))
+ if clone:
+ # User wants a cloned transformed geometry returned.
+ return GEOSGeometry(ptr, srid=g.srid)
+ if ptr:
+ # Reassigning pointer, and performing post-initialization setup
+ # again due to the reassignment.
+ destroy_geom(self.ptr)
+ self._ptr = ptr
+ self._post_init(g.srid)
+ else:
+ raise GEOSException('Transformed WKB was invalid.')
+
+ #### Topology Routines ####
+ def _topology(self, gptr):
+ "Helper routine to return Geometry from the given pointer."
+ return GEOSGeometry(gptr, srid=self.srid)
+
+ @property
+ def boundary(self):
+ "Returns the boundary as a newly allocated Geometry object."
+ return self._topology(geos_boundary(self.ptr))
+
+ def buffer(self, width, quadsegs=8):
+ """
+ Returns a geometry that represents all points whose distance from this
+ Geometry is less than or equal to distance. Calculations are in the
+ Spatial Reference System of this Geometry. The optional third parameter sets
+ the number of segment used to approximate a quarter circle (defaults to 8).
+ (Text from PostGIS documentation at ch. 6.1.3)
+ """
+ return self._topology(geos_buffer(self.ptr, width, quadsegs))
+
+ @property
+ def centroid(self):
+ """
+ The centroid is equal to the centroid of the set of component Geometries
+ of highest dimension (since the lower-dimension geometries contribute zero
+ "weight" to the centroid).
+ """
+ return self._topology(geos_centroid(self.ptr))
+
+ @property
+ def convex_hull(self):
+ """
+ Returns the smallest convex Polygon that contains all the points
+ in the Geometry.
+ """
+ return self._topology(geos_convexhull(self.ptr))
+
+ def difference(self, other):
+ """
+ Returns a Geometry representing the points making up this Geometry
+ that do not make up other.
+ """
+ return self._topology(geos_difference(self.ptr, other.ptr))
+
+ @property
+ def envelope(self):
+ "Return the envelope for this geometry (a polygon)."
+ return self._topology(geos_envelope(self.ptr))
+
+ def intersection(self, other):
+ "Returns a Geometry representing the points shared by this Geometry and other."
+ return self._topology(geos_intersection(self.ptr, other.ptr))
+
+ @property
+ def point_on_surface(self):
+ "Computes an interior point of this Geometry."
+ return self._topology(geos_pointonsurface(self.ptr))
+
+ def relate(self, other):
+ "Returns the DE-9IM intersection matrix for this Geometry and the other."
+ return geos_relate(self.ptr, other.ptr)
+
+ def simplify(self, tolerance=0.0, preserve_topology=False):
+ """
+ Returns the Geometry, simplified using the Douglas-Peucker algorithm
+ to the specified tolerance (higher tolerance => less points). If no
+ tolerance provided, defaults to 0.
+
+ By default, this function does not preserve topology - e.g. polygons can
+ be split, collapse to lines or disappear holes can be created or
+ disappear, and lines can cross. By specifying preserve_topology=True,
+ the result will have the same dimension and number of components as the
+ input. This is significantly slower.
+ """
+ if preserve_topology:
+ return self._topology(geos_preservesimplify(self.ptr, tolerance))
+ else:
+ return self._topology(geos_simplify(self.ptr, tolerance))
+
+ def sym_difference(self, other):
+ """
+ Returns a set combining the points in this Geometry not in other,
+ and the points in other not in this Geometry.
+ """
+ return self._topology(geos_symdifference(self.ptr, other.ptr))
+
+ def union(self, other):
+ "Returns a Geometry representing all the points in this Geometry and other."
+ return self._topology(geos_union(self.ptr, other.ptr))
+
+ #### Other Routines ####
+ @property
+ def area(self):
+ "Returns the area of the Geometry."
+ return geos_area(self.ptr, byref(c_double()))
+
+ def distance(self, other):
+ """
+ Returns the distance between the closest points on this Geometry
+ and the other. Units will be in those of the coordinate system of
+ the Geometry.
+ """
+ if not isinstance(other, GEOSGeometry):
+ raise TypeError('distance() works only on other GEOS Geometries.')
+ return geos_distance(self.ptr, other.ptr, byref(c_double()))
+
+ @property
+ def extent(self):
+ """
+ Returns the extent of this geometry as a 4-tuple, consisting of
+ (xmin, ymin, xmax, ymax).
+ """
+ env = self.envelope
+ if isinstance(env, Point):
+ xmin, ymin = env.tuple
+ xmax, ymax = xmin, ymin
+ else:
+ xmin, ymin = env[0][0]
+ xmax, ymax = env[0][2]
+ return (xmin, ymin, xmax, ymax)
+
+ @property
+ def length(self):
+ """
+ Returns the length of this Geometry (e.g., 0 for point, or the
+ circumfrence of a Polygon).
+ """
+ return geos_length(self.ptr, byref(c_double()))
+
+ def clone(self):
+ "Clones this Geometry."
+ return GEOSGeometry(geom_clone(self.ptr), srid=self.srid)
+
+# Class mapping dictionary
+from django.contrib.gis.geos.geometries import Point, Polygon, LineString, LinearRing
+from django.contrib.gis.geos.collections import GeometryCollection, MultiPoint, MultiLineString, MultiPolygon
+GEOS_CLASSES = {0 : Point,
+ 1 : LineString,
+ 2 : LinearRing,
+ 3 : Polygon,
+ 4 : MultiPoint,
+ 5 : MultiLineString,
+ 6 : MultiPolygon,
+ 7 : GeometryCollection,
+ }
diff --git a/django/contrib/gis/geos/collections.py b/django/contrib/gis/geos/collections.py
new file mode 100644
index 0000000000..a69b2e7c84
--- /dev/null
+++ b/django/contrib/gis/geos/collections.py
@@ -0,0 +1,105 @@
+"""
+ This module houses the Geometry Collection objects:
+ GeometryCollection, MultiPoint, MultiLineString, and MultiPolygon
+"""
+from ctypes import c_int, c_uint, byref
+from types import TupleType, ListType
+from django.contrib.gis.geos.base import GEOSGeometry
+from django.contrib.gis.geos.error import GEOSException, GEOSIndexError
+from django.contrib.gis.geos.geometries import Point, LineString, LinearRing, Polygon
+from django.contrib.gis.geos.libgeos import get_pointer_arr, GEOM_PTR
+from django.contrib.gis.geos.prototypes import create_collection, destroy_geom, geom_clone, geos_typeid, get_cs, get_geomn
+
+class GeometryCollection(GEOSGeometry):
+ _allowed = (Point, LineString, LinearRing, Polygon)
+ _typeid = 7
+
+ def __init__(self, *args, **kwargs):
+ "Initializes a Geometry Collection from a sequence of Geometry objects."
+
+ # Checking the arguments
+ if not args:
+ raise TypeError, 'Must provide at least one Geometry to initialize %s.' % self.__class__.__name__
+
+ if len(args) == 1:
+ # If only one geometry provided or a list of geometries is provided
+ # in the first argument.
+ if isinstance(args[0], (TupleType, ListType)):
+ init_geoms = args[0]
+ else:
+ init_geoms = args
+ else:
+ init_geoms = args
+
+ # Ensuring that only the permitted geometries are allowed in this collection
+ if False in [isinstance(geom, self._allowed) for geom in init_geoms]:
+ raise TypeError('Invalid Geometry type encountered in the arguments.')
+
+ # Creating the geometry pointer array.
+ ngeoms = len(init_geoms)
+ geoms = get_pointer_arr(ngeoms)
+ for i in xrange(ngeoms): geoms[i] = geom_clone(init_geoms[i].ptr)
+ super(GeometryCollection, self).__init__(create_collection(c_int(self._typeid), byref(geoms), c_uint(ngeoms)), **kwargs)
+
+ def __getitem__(self, index):
+ "Returns the Geometry from this Collection at the given index (0-based)."
+ # Checking the index and returning the corresponding GEOS geometry.
+ self._checkindex(index)
+ return GEOSGeometry(geom_clone(get_geomn(self.ptr, index)), srid=self.srid)
+
+ def __setitem__(self, index, geom):
+ "Sets the Geometry at the specified index."
+ self._checkindex(index)
+ if not isinstance(geom, self._allowed):
+ raise TypeError('Incompatible Geometry for collection.')
+
+ ngeoms = len(self)
+ geoms = get_pointer_arr(ngeoms)
+ for i in xrange(ngeoms):
+ if i == index:
+ geoms[i] = geom_clone(geom.ptr)
+ else:
+ geoms[i] = geom_clone(get_geomn(self.ptr, i))
+
+ # Creating a new collection, and destroying the contents of the previous poiner.
+ prev_ptr = self.ptr
+ srid = self.srid
+ self._ptr = create_collection(c_int(self._typeid), byref(geoms), c_uint(ngeoms))
+ if srid: self.srid = srid
+ destroy_geom(prev_ptr)
+
+ def __iter__(self):
+ "Iterates over each Geometry in the Collection."
+ for i in xrange(len(self)):
+ yield self.__getitem__(i)
+
+ def __len__(self):
+ "Returns the number of geometries in this Collection."
+ return self.num_geom
+
+ def _checkindex(self, index):
+ "Checks the given geometry index."
+ if index < 0 or index >= self.num_geom:
+ raise GEOSIndexError('invalid GEOS Geometry index: %s' % str(index))
+
+ @property
+ def kml(self):
+ "Returns the KML for this Geometry Collection."
+ return '<MultiGeometry>%s</MultiGeometry>' % ''.join([g.kml for g in self])
+
+ @property
+ def tuple(self):
+ "Returns a tuple of all the coordinates in this Geometry Collection"
+ return tuple([g.tuple for g in self])
+ coords = tuple
+
+# MultiPoint, MultiLineString, and MultiPolygon class definitions.
+class MultiPoint(GeometryCollection):
+ _allowed = Point
+ _typeid = 4
+class MultiLineString(GeometryCollection):
+ _allowed = (LineString, LinearRing)
+ _typeid = 5
+class MultiPolygon(GeometryCollection):
+ _allowed = Polygon
+ _typeid = 6
diff --git a/django/contrib/gis/geos/coordseq.py b/django/contrib/gis/geos/coordseq.py
new file mode 100644
index 0000000000..bc0c4794d4
--- /dev/null
+++ b/django/contrib/gis/geos/coordseq.py
@@ -0,0 +1,164 @@
+"""
+ This module houses the GEOSCoordSeq object, which is used internally
+ by GEOSGeometry to house the actual coordinates of the Point,
+ LineString, and LinearRing geometries.
+"""
+from ctypes import c_double, c_uint, byref
+from types import ListType, TupleType
+from django.contrib.gis.geos.error import GEOSException, GEOSIndexError
+from django.contrib.gis.geos.libgeos import CS_PTR, HAS_NUMPY
+from django.contrib.gis.geos.prototypes import cs_clone, cs_getdims, cs_getordinate, cs_getsize, cs_setordinate
+if HAS_NUMPY: from numpy import ndarray
+
+class GEOSCoordSeq(object):
+ "The internal representation of a list of coordinates inside a Geometry."
+
+ #### Python 'magic' routines ####
+ def __init__(self, ptr, z=False):
+ "Initializes from a GEOS pointer."
+ if not isinstance(ptr, CS_PTR):
+ raise TypeError('Coordinate sequence should initialize with a CS_PTR.')
+ self._ptr = ptr
+ self._z = z
+
+ def __iter__(self):
+ "Iterates over each point in the coordinate sequence."
+ for i in xrange(self.size):
+ yield self[i]
+
+ def __len__(self):
+ "Returns the number of points in the coordinate sequence."
+ return int(self.size)
+
+ def __str__(self):
+ "Returns the string representation of the coordinate sequence."
+ return str(self.tuple)
+
+ def __getitem__(self, index):
+ "Returns the coordinate sequence value at the given index."
+ coords = [self.getX(index), self.getY(index)]
+ if self.dims == 3 and self._z:
+ coords.append(self.getZ(index))
+ return tuple(coords)
+
+ def __setitem__(self, index, value):
+ "Sets the coordinate sequence value at the given index."
+ # Checking the input value
+ if isinstance(value, (ListType, TupleType)):
+ pass
+ elif HAS_NUMPY and isinstance(value, ndarray):
+ pass
+ else:
+ raise TypeError('Must set coordinate with a sequence (list, tuple, or numpy array).')
+ # Checking the dims of the input
+ if self.dims == 3 and self._z:
+ n_args = 3
+ set_3d = True
+ else:
+ n_args = 2
+ set_3d = False
+ if len(value) != n_args:
+ raise TypeError('Dimension of value does not match.')
+ # Setting the X, Y, Z
+ self.setX(index, value[0])
+ self.setY(index, value[1])
+ if set_3d: self.setZ(index, value[2])
+
+ #### Internal Routines ####
+ def _checkindex(self, index):
+ "Checks the given index."
+ sz = self.size
+ if (sz < 1) or (index < 0) or (index >= sz):
+ raise GEOSIndexError('invalid GEOS Geometry index: %s' % str(index))
+
+ def _checkdim(self, dim):
+ "Checks the given dimension."
+ if dim < 0 or dim > 2:
+ raise GEOSException('invalid ordinate dimension "%d"' % dim)
+
+ @property
+ def ptr(self):
+ """
+ Property for controlling access to coordinate sequence pointer,
+ preventing attempted access to a NULL memory location.
+ """
+ if self._ptr: return self._ptr
+ else: raise GEOSException('NULL coordinate sequence pointer encountered.')
+
+ #### Ordinate getting and setting routines ####
+ def getOrdinate(self, dimension, index):
+ "Returns the value for the given dimension and index."
+ self._checkindex(index)
+ self._checkdim(dimension)
+ return cs_getordinate(self.ptr, index, dimension, byref(c_double()))
+
+ def setOrdinate(self, dimension, index, value):
+ "Sets the value for the given dimension and index."
+ self._checkindex(index)
+ self._checkdim(dimension)
+ cs_setordinate(self.ptr, index, dimension, value)
+
+ def getX(self, index):
+ "Get the X value at the index."
+ return self.getOrdinate(0, index)
+
+ def setX(self, index, value):
+ "Set X with the value at the given index."
+ self.setOrdinate(0, index, value)
+
+ def getY(self, index):
+ "Get the Y value at the given index."
+ return self.getOrdinate(1, index)
+
+ def setY(self, index, value):
+ "Set Y with the value at the given index."
+ self.setOrdinate(1, index, value)
+
+ def getZ(self, index):
+ "Get Z with the value at the given index."
+ return self.getOrdinate(2, index)
+
+ def setZ(self, index, value):
+ "Set Z with the value at the given index."
+ self.setOrdinate(2, index, value)
+
+ ### Dimensions ###
+ @property
+ def size(self):
+ "Returns the size of this coordinate sequence."
+ return cs_getsize(self.ptr, byref(c_uint()))
+
+ @property
+ def dims(self):
+ "Returns the dimensions of this coordinate sequence."
+ return cs_getdims(self.ptr, byref(c_uint()))
+
+ @property
+ def hasz(self):
+ """
+ Returns whether this coordinate sequence is 3D. This property value is
+ inherited from the parent Geometry.
+ """
+ return self._z
+
+ ### Other Methods ###
+ def clone(self):
+ "Clones this coordinate sequence."
+ return GEOSCoordSeq(cs_clone(self.ptr), self.hasz)
+
+ @property
+ def kml(self):
+ "Returns the KML representation for the coordinates."
+ # Getting the substitution string depending on whether the coordinates have
+ # a Z dimension.
+ if self.hasz: substr = '%s,%s,%s '
+ else: substr = '%s,%s,0 '
+ return '<coordinates>%s</coordinates>' % \
+ ''.join([substr % self[i] for i in xrange(len(self))]).strip()
+
+ @property
+ def tuple(self):
+ "Returns a tuple version of this coordinate sequence."
+ n = self.size
+ if n == 1: return self[0]
+ else: return tuple([self[i] for i in xrange(n)])
diff --git a/django/contrib/gis/geos/error.py b/django/contrib/gis/geos/error.py
new file mode 100644
index 0000000000..46bdfe691a
--- /dev/null
+++ b/django/contrib/gis/geos/error.py
@@ -0,0 +1,20 @@
+"""
+ This module houses the GEOS exceptions, specifically, GEOSException and
+ GEOSGeometryIndexError.
+"""
+
+class GEOSException(Exception):
+ "The base GEOS exception, indicates a GEOS-related error."
+ pass
+
+class GEOSIndexError(GEOSException, KeyError):
+ """
+ This exception is raised when an invalid index is encountered, and has
+ the 'silent_variable_feature' attribute set to true. This ensures that
+ django's templates proceed to use the next lookup type gracefully when
+ an Exception is raised. Fixes ticket #4740.
+ """
+ # "If, during the method lookup, a method raises an exception, the exception
+ # will be propagated, unless the exception has an attribute
+ # `silent_variable_failure` whose value is True." -- Django template docs.
+ silent_variable_failure = True
diff --git a/django/contrib/gis/geos/geometries.py b/django/contrib/gis/geos/geometries.py
new file mode 100644
index 0000000000..c5420e93af
--- /dev/null
+++ b/django/contrib/gis/geos/geometries.py
@@ -0,0 +1,391 @@
+"""
+ This module houses the Point, LineString, LinearRing, and Polygon OGC
+ geometry classes. All geometry classes in this module inherit from
+ GEOSGeometry.
+"""
+from ctypes import c_uint, byref
+from django.contrib.gis.geos.base import GEOSGeometry
+from django.contrib.gis.geos.coordseq import GEOSCoordSeq
+from django.contrib.gis.geos.error import GEOSException, GEOSIndexError
+from django.contrib.gis.geos.libgeos import get_pointer_arr, GEOM_PTR, HAS_NUMPY
+from django.contrib.gis.geos.prototypes import *
+if HAS_NUMPY: from numpy import ndarray, array
+
+class Point(GEOSGeometry):
+
+ def __init__(self, x, y=None, z=None, srid=None):
+ """
+ The Point object may be initialized with either a tuple, or individual
+ parameters.
+
+ For Example:
+ >>> p = Point((5, 23)) # 2D point, passed in as a tuple
+ >>> p = Point(5, 23, 8) # 3D point, passed in with individual parameters
+ """
+
+ if isinstance(x, (tuple, list)):
+ # Here a tuple or list was passed in under the `x` parameter.
+ ndim = len(x)
+ if ndim < 2 or ndim > 3:
+ raise TypeError('Invalid sequence parameter: %s' % str(x))
+ coords = x
+ elif isinstance(x, (int, float, long)) and isinstance(y, (int, float, long)):
+ # Here X, Y, and (optionally) Z were passed in individually, as parameters.
+ if isinstance(z, (int, float, long)):
+ ndim = 3
+ coords = [x, y, z]
+ else:
+ ndim = 2
+ coords = [x, y]
+ else:
+ raise TypeError('Invalid parameters given for Point initialization.')
+
+ # Creating the coordinate sequence, and setting X, Y, [Z]
+ cs = create_cs(c_uint(1), c_uint(ndim))
+ cs_setx(cs, 0, coords[0])
+ cs_sety(cs, 0, coords[1])
+ if ndim == 3: cs_setz(cs, 0, coords[2])
+
+ # Initializing using the address returned from the GEOS
+ # createPoint factory.
+ super(Point, self).__init__(create_point(cs), srid=srid)
+
+ def __len__(self):
+ "Returns the number of dimensions for this Point (either 0, 2 or 3)."
+ if self.empty: return 0
+ if self.hasz: return 3
+ else: return 2
+
+ def get_x(self):
+ "Returns the X component of the Point."
+ return self._cs.getOrdinate(0, 0)
+
+ def set_x(self, value):
+ "Sets the X component of the Point."
+ self._cs.setOrdinate(0, 0, value)
+
+ def get_y(self):
+ "Returns the Y component of the Point."
+ return self._cs.getOrdinate(1, 0)
+
+ def set_y(self, value):
+ "Sets the Y component of the Point."
+ self._cs.setOrdinate(1, 0, value)
+
+ def get_z(self):
+ "Returns the Z component of the Point."
+ if self.hasz:
+ return self._cs.getOrdinate(2, 0)
+ else:
+ return None
+
+ def set_z(self, value):
+ "Sets the Z component of the Point."
+ if self.hasz:
+ self._cs.setOrdinate(2, 0, value)
+ else:
+ raise GEOSException('Cannot set Z on 2D Point.')
+
+ # X, Y, Z properties
+ x = property(get_x, set_x)
+ y = property(get_y, set_y)
+ z = property(get_z, set_z)
+
+ ### Tuple setting and retrieval routines. ###
+ def get_coords(self):
+ "Returns a tuple of the point."
+ return self._cs.tuple
+
+ def set_coords(self, tup):
+ "Sets the coordinates of the point with the given tuple."
+ self._cs[0] = tup
+
+ # The tuple and coords properties
+ tuple = property(get_coords, set_coords)
+ coords = tuple
+
+class LineString(GEOSGeometry):
+
+ #### Python 'magic' routines ####
+ def __init__(self, *args, **kwargs):
+ """
+ Initializes on the given sequence -- may take lists, tuples, NumPy arrays
+ of X,Y pairs, or Point objects. If Point objects are used, ownership is
+ _not_ transferred to the LineString object.
+
+ Examples:
+ ls = LineString((1, 1), (2, 2))
+ ls = LineString([(1, 1), (2, 2)])
+ ls = LineString(array([(1, 1), (2, 2)]))
+ ls = LineString(Point(1, 1), Point(2, 2))
+ """
+ # If only one argument provided, set the coords array appropriately
+ if len(args) == 1: coords = args[0]
+ else: coords = args
+
+ if isinstance(coords, (tuple, list)):
+ # Getting the number of coords and the number of dimensions -- which
+ # must stay the same, e.g., no LineString((1, 2), (1, 2, 3)).
+ ncoords = len(coords)
+ if coords: ndim = len(coords[0])
+ else: raise TypeError('Cannot initialize on empty sequence.')
+ self._checkdim(ndim)
+ # Incrementing through each of the coordinates and verifying
+ for i in xrange(1, ncoords):
+ if not isinstance(coords[i], (tuple, list, Point)):
+ raise TypeError('each coordinate should be a sequence (list or tuple)')
+ if len(coords[i]) != ndim: raise TypeError('Dimension mismatch.')
+ numpy_coords = False
+ elif HAS_NUMPY and isinstance(coords, ndarray):
+ shape = coords.shape # Using numpy's shape.
+ if len(shape) != 2: raise TypeError('Too many dimensions.')
+ self._checkdim(shape[1])
+ ncoords = shape[0]
+ ndim = shape[1]
+ numpy_coords = True
+ else:
+ raise TypeError('Invalid initialization input for LineStrings.')
+
+ # Creating a coordinate sequence object because it is easier to
+ # set the points using GEOSCoordSeq.__setitem__().
+ cs = GEOSCoordSeq(create_cs(ncoords, ndim), z=bool(ndim==3))
+ for i in xrange(ncoords):
+ if numpy_coords: cs[i] = coords[i,:]
+ elif isinstance(coords[i], Point): cs[i] = coords[i].tuple
+ else: cs[i] = coords[i]
+
+ # Getting the correct initialization function
+ if kwargs.get('ring', False):
+ func = create_linearring
+ else:
+ func = create_linestring
+
+ # If SRID was passed in with the keyword arguments
+ srid = kwargs.get('srid', None)
+
+ # Calling the base geometry initialization with the returned pointer
+ # from the function.
+ super(LineString, self).__init__(func(cs.ptr), srid=srid)
+
+ def __getitem__(self, index):
+ "Gets the point at the specified index."
+ return self._cs[index]
+
+ def __setitem__(self, index, value):
+ "Sets the point at the specified index, e.g., line_str[0] = (1, 2)."
+ self._cs[index] = value
+
+ def __iter__(self):
+ "Allows iteration over this LineString."
+ for i in xrange(len(self)):
+ yield self[i]
+
+ def __len__(self):
+ "Returns the number of points in this LineString."
+ return len(self._cs)
+
+ def _checkdim(self, dim):
+ if dim not in (2, 3): raise TypeError('Dimension mismatch.')
+
+ #### Sequence Properties ####
+ @property
+ def tuple(self):
+ "Returns a tuple version of the geometry from the coordinate sequence."
+ return self._cs.tuple
+ coords = tuple
+
+ def _listarr(self, func):
+ """
+ Internal routine that returns a sequence (list) corresponding with
+ the given function. Will return a numpy array if possible.
+ """
+ lst = [func(i) for i in xrange(len(self))]
+ if HAS_NUMPY: return array(lst) # ARRRR!
+ else: return lst
+
+ @property
+ def array(self):
+ "Returns a numpy array for the LineString."
+ return self._listarr(self._cs.__getitem__)
+
+ @property
+ def x(self):
+ "Returns a list or numpy array of the X variable."
+ return self._listarr(self._cs.getX)
+
+ @property
+ def y(self):
+ "Returns a list or numpy array of the Y variable."
+ return self._listarr(self._cs.getY)
+
+ @property
+ def z(self):
+ "Returns a list or numpy array of the Z variable."
+ if not self.hasz: return None
+ else: return self._listarr(self._cs.getZ)
+
+# LinearRings are LineStrings used within Polygons.
+class LinearRing(LineString):
+ def __init__(self, *args, **kwargs):
+ "Overriding the initialization function to set the ring keyword."
+ kwargs['ring'] = True # Setting the ring keyword argument to True
+ super(LinearRing, self).__init__(*args, **kwargs)
+
+class Polygon(GEOSGeometry):
+
+ def __init__(self, *args, **kwargs):
+ """
+ Initializes on an exterior ring and a sequence of holes (both
+ instances may be either LinearRing instances, or a tuple/list
+ that may be constructed into a LinearRing).
+
+ Examples of initialization, where shell, hole1, and hole2 are
+ valid LinearRing geometries:
+ >>> poly = Polygon(shell, hole1, hole2)
+ >>> poly = Polygon(shell, (hole1, hole2))
+
+ Example where a tuple parameters are used:
+ >>> poly = Polygon(((0, 0), (0, 10), (10, 10), (0, 10), (0, 0)),
+ ((4, 4), (4, 6), (6, 6), (6, 4), (4, 4)))
+ """
+ if not args:
+ raise TypeError('Must provide at list one LinearRing instance to initialize Polygon.')
+
+ # Getting the ext_ring and init_holes parameters from the argument list
+ ext_ring = args[0]
+ init_holes = args[1:]
+ n_holes = len(init_holes)
+
+ # If initialized as Polygon(shell, (LinearRing, LinearRing)) [for backward-compatibility]
+ if n_holes == 1 and isinstance(init_holes[0], (tuple, list)) and \
+ (len(init_holes[0]) == 0 or isinstance(init_holes[0][0], LinearRing)):
+ init_holes = init_holes[0]
+ n_holes = len(init_holes)
+
+ # Ensuring the exterior ring and holes parameters are LinearRing objects
+ # or may be instantiated into LinearRings.
+ ext_ring = self._construct_ring(ext_ring, 'Exterior parameter must be a LinearRing or an object that can initialize a LinearRing.')
+ holes_list = [] # Create new list, cause init_holes is a tuple.
+ for i in xrange(n_holes):
+ holes_list.append(self._construct_ring(init_holes[i], 'Holes parameter must be a sequence of LinearRings or objects that can initialize to LinearRings'))
+
+ # Why another loop? Because if a TypeError is raised, cloned pointers will
+ # be around that can't be cleaned up.
+ holes = get_pointer_arr(n_holes)
+ for i in xrange(n_holes): holes[i] = geom_clone(holes_list[i].ptr)
+
+ # Getting the shell pointer address.
+ shell = geom_clone(ext_ring.ptr)
+
+ # Calling with the GEOS createPolygon factory.
+ super(Polygon, self).__init__(create_polygon(shell, byref(holes), c_uint(n_holes)), **kwargs)
+
+ def __getitem__(self, index):
+ """
+ Returns the ring at the specified index. The first index, 0, will
+ always return the exterior ring. Indices > 0 will return the
+ interior ring at the given index (e.g., poly[1] and poly[2] would
+ return the first and second interior ring, respectively).
+ """
+ if index == 0:
+ return self.exterior_ring
+ else:
+ # Getting the interior ring, have to subtract 1 from the index.
+ return self.get_interior_ring(index-1)
+
+ def __setitem__(self, index, ring):
+ "Sets the ring at the specified index with the given ring."
+ # Checking the index and ring parameters.
+ self._checkindex(index)
+ if not isinstance(ring, LinearRing):
+ raise TypeError('must set Polygon index with a LinearRing object')
+
+ # Getting the shell
+ if index == 0:
+ shell = geom_clone(ring.ptr)
+ else:
+ shell = geom_clone(get_extring(self.ptr))
+
+ # Getting the interior rings (holes)
+ nholes = len(self)-1
+ if nholes > 0:
+ holes = get_pointer_arr(nholes)
+ for i in xrange(nholes):
+ if i == (index-1):
+ holes[i] = geom_clone(ring.ptr)
+ else:
+ holes[i] = geom_clone(get_intring(self.ptr, i))
+ holes_param = byref(holes)
+ else:
+ holes_param = None
+
+ # Getting the current pointer, replacing with the newly constructed
+ # geometry, and destroying the old geometry.
+ prev_ptr = self.ptr
+ srid = self.srid
+ self._ptr = create_polygon(shell, holes_param, c_uint(nholes))
+ if srid: self.srid = srid
+ destroy_geom(prev_ptr)
+
+ def __iter__(self):
+ "Iterates over each ring in the polygon."
+ for i in xrange(len(self)):
+ yield self[i]
+
+ def __len__(self):
+ "Returns the number of rings in this Polygon."
+ return self.num_interior_rings + 1
+
+ def _checkindex(self, index):
+ "Internal routine for checking the given ring index."
+ if index < 0 or index >= len(self):
+ raise GEOSIndexError('invalid Polygon ring index: %s' % index)
+
+ def _construct_ring(self, param, msg=''):
+ "Helper routine for trying to construct a ring from the given parameter."
+ if isinstance(param, LinearRing): return param
+ try:
+ ring = LinearRing(param)
+ return ring
+ except TypeError:
+ raise TypeError(msg)
+
+ def get_interior_ring(self, ring_i):
+ """
+ Gets the interior ring at the specified index, 0 is for the first
+ interior ring, not the exterior ring.
+ """
+ self._checkindex(ring_i+1)
+ return GEOSGeometry(geom_clone(get_intring(self.ptr, ring_i)), srid=self.srid)
+
+ #### Polygon Properties ####
+ @property
+ def num_interior_rings(self):
+ "Returns the number of interior rings."
+ # Getting the number of rings
+ return get_nrings(self.ptr)
+
+ def get_ext_ring(self):
+ "Gets the exterior ring of the Polygon."
+ return GEOSGeometry(geom_clone(get_extring(self.ptr)), srid=self.srid)
+
+ def set_ext_ring(self, ring):
+ "Sets the exterior ring of the Polygon."
+ self[0] = ring
+
+ # properties for the exterior ring/shell
+ exterior_ring = property(get_ext_ring, set_ext_ring)
+ shell = exterior_ring
+
+ @property
+ def tuple(self):
+ "Gets the tuple for each ring in this Polygon."
+ return tuple([self[i].tuple for i in xrange(len(self))])
+ coords = tuple
+
+ @property
+ def kml(self):
+ "Returns the KML representation of this Polygon."
+ inner_kml = ''.join(["<innerBoundaryIs>%s</innerBoundaryIs>" % self[i+1].kml
+ for i in xrange(self.num_interior_rings)])
+ return "<Polygon><outerBoundaryIs>%s</outerBoundaryIs>%s</Polygon>" % (self[0].kml, inner_kml)
diff --git a/django/contrib/gis/geos/libgeos.py b/django/contrib/gis/geos/libgeos.py
new file mode 100644
index 0000000000..d2990a6d0e
--- /dev/null
+++ b/django/contrib/gis/geos/libgeos.py
@@ -0,0 +1,126 @@
+"""
+ This module houses the ctypes initialization procedures, as well
+ as the notice and error handler function callbacks (get called
+ when an error occurs in GEOS).
+
+ This module also houses GEOS Pointer utilities, including
+ get_pointer_arr(), and GEOM_PTR.
+"""
+import atexit, os, re, sys
+from ctypes import c_char_p, Structure, CDLL, CFUNCTYPE, POINTER
+from ctypes.util import find_library
+from django.contrib.gis.geos.error import GEOSException
+
+# NumPy supported?
+try:
+ from numpy import array, ndarray
+ HAS_NUMPY = True
+except ImportError:
+ HAS_NUMPY = False
+
+# Custom library path set?
+try:
+ from django.conf import settings
+ lib_path = settings.GEOS_LIBRARY_PATH
+except (AttributeError, EnvironmentError, ImportError):
+ lib_path = None
+
+# Setting the appropriate names for the GEOS-C library.
+if lib_path:
+ lib_names = None
+elif os.name == 'nt':
+ # Windows NT libraries
+ lib_names = ['libgeos_c-1']
+elif os.name == 'posix':
+ # *NIX libraries
+ lib_names = ['geos_c']
+else:
+ raise GEOSException('Unsupported OS "%s"' % os.name)
+
+# Using the ctypes `find_library` utility to find the the path to the GEOS
+# shared library. This is better than manually specifiying each library name
+# and extension (e.g., libgeos_c.[so|so.1|dylib].).
+if lib_names:
+ for lib_name in lib_names:
+ lib_path = find_library(lib_name)
+ if not lib_path is None: break
+
+# No GEOS library could be found.
+if lib_path is None:
+ raise GEOSException('Could not find the GEOS library (tried "%s"). '
+ 'Try setting GEOS_LIBRARY_PATH in your settings.' %
+ '", "'.join(lib_names))
+
+# Getting the GEOS C library. The C interface (CDLL) is used for
+# both *NIX and Windows.
+# See the GEOS C API source code for more details on the library function calls:
+# http://geos.refractions.net/ro/doxygen_docs/html/geos__c_8h-source.html
+lgeos = CDLL(lib_path)
+
+# The notice and error handler C function callback definitions.
+# Supposed to mimic the GEOS message handler (C below):
+# "typedef void (*GEOSMessageHandler)(const char *fmt, ...);"
+NOTICEFUNC = CFUNCTYPE(None, c_char_p, c_char_p)
+def notice_h(fmt, lst, output_h=sys.stdout):
+ try:
+ warn_msg = fmt % lst
+ except:
+ warn_msg = fmt
+ output_h.write('GEOS_NOTICE: %s\n' % warn_msg)
+notice_h = NOTICEFUNC(notice_h)
+
+ERRORFUNC = CFUNCTYPE(None, c_char_p, c_char_p)
+def error_h(fmt, lst, output_h=sys.stderr):
+ try:
+ err_msg = fmt % lst
+ except:
+ err_msg = fmt
+ output_h.write('GEOS_ERROR: %s\n' % err_msg)
+error_h = ERRORFUNC(error_h)
+
+# The initGEOS routine should be called first, however, that routine takes
+# the notice and error functions as parameters. Here is the C code that
+# is wrapped:
+# "extern void GEOS_DLL initGEOS(GEOSMessageHandler notice_function, GEOSMessageHandler error_function);"
+lgeos.initGEOS(notice_h, error_h)
+
+#### GEOS Geometry C data structures, and utility functions. ####
+
+# Opaque GEOS geometry structures, used for GEOM_PTR and CS_PTR
+class GEOSGeom_t(Structure): pass
+class GEOSCoordSeq_t(Structure): pass
+
+# Pointers to opaque GEOS geometry structures.
+GEOM_PTR = POINTER(GEOSGeom_t)
+CS_PTR = POINTER(GEOSCoordSeq_t)
+
+# Used specifically by the GEOSGeom_createPolygon and GEOSGeom_createCollection
+# GEOS routines
+def get_pointer_arr(n):
+ "Gets a ctypes pointer array (of length `n`) for GEOSGeom_t opaque pointer."
+ GeomArr = GEOM_PTR * n
+ return GeomArr()
+
+# Returns the string version of the GEOS library. Have to set the restype
+# explicitly to c_char_p to ensure compatibility accross 32 and 64-bit platforms.
+geos_version = lgeos.GEOSversion
+geos_version.argtypes = None
+geos_version.restype = c_char_p
+
+# Regular expression should be able to parse version strings such as
+# '3.0.0rc4-CAPI-1.3.3', or '3.0.0-CAPI-1.4.1'
+version_regex = re.compile(r'^(?P<version>\d+\.\d+\.\d+)(rc(?P<release_candidate>\d+))?-CAPI-(?P<capi_version>\d+\.\d+\.\d+)$')
+def geos_version_info():
+ """
+ Returns a dictionary containing the various version metadata parsed from
+ the GEOS version string, including the version number, whether the version
+ is a release candidate (and what number release candidate), and the C API
+ version.
+ """
+ ver = geos_version()
+ m = version_regex.match(ver)
+ if not m: raise GEOSException('Could not parse version info string "%s"' % ver)
+ return dict((key, m.group(key)) for key in ('version', 'release_candidate', 'capi_version'))
+
+# Calling the finishGEOS() upon exit of the interpreter.
+atexit.register(lgeos.finishGEOS)
diff --git a/django/contrib/gis/geos/prototypes/__init__.py b/django/contrib/gis/geos/prototypes/__init__.py
new file mode 100644
index 0000000000..b4639f3d37
--- /dev/null
+++ b/django/contrib/gis/geos/prototypes/__init__.py
@@ -0,0 +1,33 @@
+"""
+ This module contains all of the GEOS ctypes function prototypes. Each
+ prototype handles the interaction between the GEOS library and Python
+ via ctypes.
+"""
+
+# Coordinate sequence routines.
+from django.contrib.gis.geos.prototypes.coordseq import create_cs, get_cs, \
+ cs_clone, cs_getordinate, cs_setordinate, cs_getx, cs_gety, cs_getz, \
+ cs_setx, cs_sety, cs_setz, cs_getsize, cs_getdims
+
+# Geometry routines.
+from django.contrib.gis.geos.prototypes.geom import from_hex, from_wkb, from_wkt, \
+ create_point, create_linestring, create_linearring, create_polygon, create_collection, \
+ destroy_geom, get_extring, get_intring, get_nrings, get_geomn, geom_clone, \
+ geos_normalize, geos_type, geos_typeid, geos_get_srid, geos_set_srid, \
+ get_dims, get_num_coords, get_num_geoms, \
+ to_hex, to_wkb, to_wkt
+
+# Miscellaneous routines.
+from django.contrib.gis.geos.prototypes.misc import geos_area, geos_distance, geos_length
+
+# Predicates
+from django.contrib.gis.geos.prototypes.predicates import geos_hasz, geos_isempty, \
+ geos_isring, geos_issimple, geos_isvalid, geos_contains, geos_crosses, \
+ geos_disjoint, geos_equals, geos_equalsexact, geos_intersects, \
+ geos_intersects, geos_overlaps, geos_relatepattern, geos_touches, geos_within
+
+# Topology routines
+from django.contrib.gis.geos.prototypes.topology import \
+ geos_boundary, geos_buffer, geos_centroid, geos_convexhull, geos_difference, \
+ geos_envelope, geos_intersection, geos_pointonsurface, geos_preservesimplify, \
+ geos_simplify, geos_symdifference, geos_union, geos_relate
diff --git a/django/contrib/gis/geos/prototypes/coordseq.py b/django/contrib/gis/geos/prototypes/coordseq.py
new file mode 100644
index 0000000000..3b5fb2cf35
--- /dev/null
+++ b/django/contrib/gis/geos/prototypes/coordseq.py
@@ -0,0 +1,82 @@
+from ctypes import c_double, c_int, c_uint, POINTER
+from django.contrib.gis.geos.libgeos import lgeos, GEOM_PTR, CS_PTR
+from django.contrib.gis.geos.prototypes.errcheck import last_arg_byref, GEOSException
+
+## Error-checking routines specific to coordinate sequences. ##
+def check_cs_ptr(result, func, cargs):
+ "Error checking on routines that return Geometries."
+ if not result:
+ raise GEOSException('Error encountered checking Coordinate Sequence returned from GEOS C function "%s".' % func.__name__)
+ return result
+
+def check_cs_op(result, func, cargs):
+ "Checks the status code of a coordinate sequence operation."
+ if result == 0:
+ raise GEOSException('Could not set value on coordinate sequence')
+ else:
+ return result
+
+def check_cs_get(result, func, cargs):
+ "Checking the coordinate sequence retrieval."
+ check_cs_op(result, func, cargs)
+ # Object in by reference, return its value.
+ return last_arg_byref(cargs)
+
+## Coordinate sequence prototype generation functions. ##
+def cs_int(func):
+ "For coordinate sequence routines that return an integer."
+ func.argtypes = [CS_PTR, POINTER(c_uint)]
+ func.restype = c_int
+ func.errcheck = check_cs_get
+ return func
+
+def cs_operation(func, ordinate=False, get=False):
+ "For coordinate sequence operations."
+ if get:
+ # Get routines get double parameter passed-in by reference.
+ func.errcheck = check_cs_get
+ dbl_param = POINTER(c_double)
+ else:
+ func.errcheck = check_cs_op
+ dbl_param = c_double
+
+ if ordinate:
+ # Get/Set ordinate routines have an extra uint parameter.
+ func.argtypes = [CS_PTR, c_uint, c_uint, dbl_param]
+ else:
+ func.argtypes = [CS_PTR, c_uint, dbl_param]
+
+ func.restype = c_int
+ return func
+
+def cs_output(func, argtypes):
+ "For routines that return a coordinate sequence."
+ func.argtypes = argtypes
+ func.restype = CS_PTR
+ func.errcheck = check_cs_ptr
+ return func
+
+## Coordinate Sequence ctypes prototypes ##
+
+# Coordinate Sequence constructors & cloning.
+cs_clone = cs_output(lgeos.GEOSCoordSeq_clone, [CS_PTR])
+create_cs = cs_output(lgeos.GEOSCoordSeq_create, [c_uint, c_uint])
+get_cs = cs_output(lgeos.GEOSGeom_getCoordSeq, [GEOM_PTR])
+
+# Getting, setting ordinate
+cs_getordinate = cs_operation(lgeos.GEOSCoordSeq_getOrdinate, ordinate=True, get=True)
+cs_setordinate = cs_operation(lgeos.GEOSCoordSeq_setOrdinate, ordinate=True)
+
+# For getting, x, y, z
+cs_getx = cs_operation(lgeos.GEOSCoordSeq_getX, get=True)
+cs_gety = cs_operation(lgeos.GEOSCoordSeq_getY, get=True)
+cs_getz = cs_operation(lgeos.GEOSCoordSeq_getZ, get=True)
+
+# For setting, x, y, z
+cs_setx = cs_operation(lgeos.GEOSCoordSeq_setX)
+cs_sety = cs_operation(lgeos.GEOSCoordSeq_setY)
+cs_setz = cs_operation(lgeos.GEOSCoordSeq_setZ)
+
+# These routines return size & dimensions.
+cs_getsize = cs_int(lgeos.GEOSCoordSeq_getSize)
+cs_getdims = cs_int(lgeos.GEOSCoordSeq_getDimensions)
diff --git a/django/contrib/gis/geos/prototypes/errcheck.py b/django/contrib/gis/geos/prototypes/errcheck.py
new file mode 100644
index 0000000000..6fcc1a7a78
--- /dev/null
+++ b/django/contrib/gis/geos/prototypes/errcheck.py
@@ -0,0 +1,76 @@
+"""
+ Error checking functions for GEOS ctypes prototype functions.
+"""
+import os
+from ctypes import string_at, CDLL
+from ctypes.util import find_library
+from django.contrib.gis.geos.error import GEOSException
+
+# Getting the C library, needed to free the string pointers
+# returned from GEOS.
+if os.name == 'nt':
+ libc_name = 'msvcrt'
+else:
+ libc_name = 'libc'
+libc = CDLL(find_library(libc_name))
+
+### ctypes error checking routines ###
+def last_arg_byref(args):
+ "Returns the last C argument's by reference value."
+ return args[-1]._obj.value
+
+def check_dbl(result, func, cargs):
+ "Checks the status code and returns the double value passed in by reference."
+ # Checking the status code
+ if result != 1: return None
+ # Double passed in by reference, return its value.
+ return last_arg_byref(cargs)
+
+def check_geom(result, func, cargs):
+ "Error checking on routines that return Geometries."
+ if not result:
+ raise GEOSException('Error encountered checking Geometry returned from GEOS C function "%s".' % func.__name__)
+ return result
+
+def check_minus_one(result, func, cargs):
+ "Error checking on routines that should not return -1."
+ if result == -1:
+ raise GEOSException('Error encountered in GEOS C function "%s".' % func.__name__)
+ else:
+ return result
+
+def check_predicate(result, func, cargs):
+ "Error checking for unary/binary predicate functions."
+ val = ord(result) # getting the ordinal from the character
+ if val == 1: return True
+ elif val == 0: return False
+ else:
+ raise GEOSException('Error encountered on GEOS C predicate function "%s".' % func.__name__)
+
+def check_sized_string(result, func, cargs):
+ "Error checking for routines that return explicitly sized strings."
+ if not result:
+ raise GEOSException('Invalid string pointer returned by GEOS C function "%s"' % func.__name__)
+ # A c_size_t object is passed in by reference for the second
+ # argument on these routines, and its needed to determine the
+ # correct size.
+ s = string_at(result, last_arg_byref(cargs))
+ libc.free(result)
+ return s
+
+def check_string(result, func, cargs):
+ "Error checking for routines that return strings."
+ if not result: raise GEOSException('Error encountered checking string return value in GEOS C function "%s".' % func.__name__)
+ # Getting the string value at the pointer address.
+ s = string_at(result)
+ # Freeing the memory allocated by the GEOS library.
+ libc.free(result)
+ return s
+
+def check_zero(result, func, cargs):
+ "Error checking on routines that should not return 0."
+ if result == 0:
+ raise GEOSException('Error encountered in GEOS C function "%s".' % func.__name__)
+ else:
+ return result
+
diff --git a/django/contrib/gis/geos/prototypes/geom.py b/django/contrib/gis/geos/prototypes/geom.py
new file mode 100644
index 0000000000..e5942a5957
--- /dev/null
+++ b/django/contrib/gis/geos/prototypes/geom.py
@@ -0,0 +1,111 @@
+from ctypes import c_char_p, c_int, c_size_t, c_uint, POINTER
+from django.contrib.gis.geos.libgeos import lgeos, CS_PTR, GEOM_PTR
+from django.contrib.gis.geos.prototypes.errcheck import \
+ check_geom, check_minus_one, check_sized_string, check_string, check_zero
+
+### ctypes generation functions ###
+def bin_constructor(func):
+ "Generates a prototype for binary construction (HEX, WKB) GEOS routines."
+ func.argtypes = [c_char_p, c_size_t]
+ func.restype = GEOM_PTR
+ func.errcheck = check_geom
+ return func
+
+# HEX & WKB output
+def bin_output(func):
+ "Generates a prototype for the routines that return a a sized string."
+ func.argtypes = [GEOM_PTR, POINTER(c_size_t)]
+ func.errcheck = check_sized_string
+ return func
+
+def geom_output(func, argtypes):
+ "For GEOS routines that return a geometry."
+ if argtypes: func.argtypes = argtypes
+ func.restype = GEOM_PTR
+ func.errcheck = check_geom
+ return func
+
+def geom_index(func):
+ "For GEOS routines that return geometries from an index."
+ return geom_output(func, [GEOM_PTR, c_int])
+
+def int_from_geom(func, zero=False):
+ "Argument is a geometry, return type is an integer."
+ func.argtypes = [GEOM_PTR]
+ func.restype = c_int
+ if zero:
+ func.errcheck = check_zero
+ else:
+ func.errcheck = check_minus_one
+ return func
+
+def string_from_geom(func):
+ "Argument is a Geometry, return type is a string."
+ # We do _not_ specify an argument type because we want just an
+ # address returned from the function.
+ func.argtypes = [GEOM_PTR]
+ func.errcheck = check_string
+ return func
+
+### ctypes prototypes ###
+
+# TODO: Tell all users to use GEOS 3.0.0, instead of the release
+# candidates, and use the new Reader and Writer APIs (e.g.,
+# GEOSWKT[Reader|Writer], GEOSWKB[Reader|Writer]). A good time
+# to do this will be when Refractions releases a Windows PostGIS
+# installer using GEOS 3.0.0.
+
+# Creation routines from WKB, HEX, WKT
+from_hex = bin_constructor(lgeos.GEOSGeomFromHEX_buf)
+from_wkb = bin_constructor(lgeos.GEOSGeomFromWKB_buf)
+from_wkt = geom_output(lgeos.GEOSGeomFromWKT, [c_char_p])
+
+# Output routines
+to_hex = bin_output(lgeos.GEOSGeomToHEX_buf)
+to_wkb = bin_output(lgeos.GEOSGeomToWKB_buf)
+to_wkt = string_from_geom(lgeos.GEOSGeomToWKT)
+
+# The GEOS geometry type, typeid, num_coordites and number of geometries
+geos_normalize = int_from_geom(lgeos.GEOSNormalize)
+geos_type = string_from_geom(lgeos.GEOSGeomType)
+geos_typeid = int_from_geom(lgeos.GEOSGeomTypeId)
+get_dims = int_from_geom(lgeos.GEOSGeom_getDimensions, zero=True)
+get_num_coords = int_from_geom(lgeos.GEOSGetNumCoordinates)
+get_num_geoms = int_from_geom(lgeos.GEOSGetNumGeometries)
+
+# Geometry creation factories
+create_point = geom_output(lgeos.GEOSGeom_createPoint, [CS_PTR])
+create_linestring = geom_output(lgeos.GEOSGeom_createLineString, [CS_PTR])
+create_linearring = geom_output(lgeos.GEOSGeom_createLinearRing, [CS_PTR])
+
+# Polygon and collection creation routines are special and will not
+# have their argument types defined.
+create_polygon = geom_output(lgeos.GEOSGeom_createPolygon, None)
+create_collection = geom_output(lgeos.GEOSGeom_createCollection, None)
+
+# Ring routines
+get_extring = geom_output(lgeos.GEOSGetExteriorRing, [GEOM_PTR])
+get_intring = geom_index(lgeos.GEOSGetInteriorRingN)
+get_nrings = int_from_geom(lgeos.GEOSGetNumInteriorRings)
+
+# Collection Routines
+get_geomn = geom_index(lgeos.GEOSGetGeometryN)
+
+# Cloning
+geom_clone = lgeos.GEOSGeom_clone
+geom_clone.argtypes = [GEOM_PTR]
+geom_clone.restype = GEOM_PTR
+
+# Destruction routine.
+destroy_geom = lgeos.GEOSGeom_destroy
+destroy_geom.argtypes = [GEOM_PTR]
+destroy_geom.restype = None
+
+# SRID routines
+geos_get_srid = lgeos.GEOSGetSRID
+geos_get_srid.argtypes = [GEOM_PTR]
+geos_get_srid.restype = c_int
+
+geos_set_srid = lgeos.GEOSSetSRID
+geos_set_srid.argtypes = [GEOM_PTR, c_int]
+geos_set_srid.restype = None
diff --git a/django/contrib/gis/geos/prototypes/misc.py b/django/contrib/gis/geos/prototypes/misc.py
new file mode 100644
index 0000000000..255da91d9e
--- /dev/null
+++ b/django/contrib/gis/geos/prototypes/misc.py
@@ -0,0 +1,27 @@
+"""
+ This module is for the miscellaneous GEOS routines, particularly the
+ ones that return the area, distance, and length.
+"""
+from ctypes import c_int, c_double, POINTER
+from django.contrib.gis.geos.libgeos import lgeos, GEOM_PTR
+from django.contrib.gis.geos.prototypes.errcheck import check_dbl
+
+### ctypes generator function ###
+def dbl_from_geom(func, num_geom=1):
+ """
+ Argument is a Geometry, return type is double that is passed
+ in by reference as the last argument.
+ """
+ argtypes = [GEOM_PTR for i in xrange(num_geom)]
+ argtypes += [POINTER(c_double)]
+ func.argtypes = argtypes
+ func.restype = c_int # Status code returned
+ func.errcheck = check_dbl
+ return func
+
+### ctypes prototypes ###
+
+# Area, distance, and length prototypes.
+geos_area = dbl_from_geom(lgeos.GEOSArea)
+geos_distance = dbl_from_geom(lgeos.GEOSDistance, num_geom=2)
+geos_length = dbl_from_geom(lgeos.GEOSLength)
diff --git a/django/contrib/gis/geos/prototypes/predicates.py b/django/contrib/gis/geos/prototypes/predicates.py
new file mode 100644
index 0000000000..45240d971a
--- /dev/null
+++ b/django/contrib/gis/geos/prototypes/predicates.py
@@ -0,0 +1,43 @@
+"""
+ This module houses the GEOS ctypes prototype functions for the
+ unary and binary predicate operations on geometries.
+"""
+from ctypes import c_char, c_char_p, c_double
+from django.contrib.gis.geos.libgeos import lgeos, GEOM_PTR
+from django.contrib.gis.geos.prototypes.errcheck import check_predicate
+
+## Binary & unary predicate functions ##
+def binary_predicate(func, *args):
+ "For GEOS binary predicate functions."
+ argtypes = [GEOM_PTR, GEOM_PTR]
+ if args: argtypes += args
+ func.argtypes = argtypes
+ func.restype = c_char
+ func.errcheck = check_predicate
+ return func
+
+def unary_predicate(func):
+ "For GEOS unary predicate functions."
+ func.argtypes = [GEOM_PTR]
+ func.restype = c_char
+ func.errcheck = check_predicate
+ return func
+
+## Unary Predicates ##
+geos_hasz = unary_predicate(lgeos.GEOSHasZ)
+geos_isempty = unary_predicate(lgeos.GEOSisEmpty)
+geos_isring = unary_predicate(lgeos.GEOSisRing)
+geos_issimple = unary_predicate(lgeos.GEOSisSimple)
+geos_isvalid = unary_predicate(lgeos.GEOSisValid)
+
+## Binary Predicates ##
+geos_contains = binary_predicate(lgeos.GEOSContains)
+geos_crosses = binary_predicate(lgeos.GEOSCrosses)
+geos_disjoint = binary_predicate(lgeos.GEOSDisjoint)
+geos_equals = binary_predicate(lgeos.GEOSEquals)
+geos_equalsexact = binary_predicate(lgeos.GEOSEqualsExact, c_double)
+geos_intersects = binary_predicate(lgeos.GEOSIntersects)
+geos_overlaps = binary_predicate(lgeos.GEOSOverlaps)
+geos_relatepattern = binary_predicate(lgeos.GEOSRelatePattern, c_char_p)
+geos_touches = binary_predicate(lgeos.GEOSTouches)
+geos_within = binary_predicate(lgeos.GEOSWithin)
diff --git a/django/contrib/gis/geos/prototypes/topology.py b/django/contrib/gis/geos/prototypes/topology.py
new file mode 100644
index 0000000000..70cf900098
--- /dev/null
+++ b/django/contrib/gis/geos/prototypes/topology.py
@@ -0,0 +1,35 @@
+"""
+ This module houses the GEOS ctypes prototype functions for the
+ topological operations on geometries.
+"""
+from ctypes import c_char_p, c_double, c_int
+from django.contrib.gis.geos.libgeos import lgeos, GEOM_PTR
+from django.contrib.gis.geos.prototypes.errcheck import check_geom, check_string
+
+def topology(func, *args):
+ "For GEOS unary topology functions."
+ argtypes = [GEOM_PTR]
+ if args: argtypes += args
+ func.argtypes = argtypes
+ func.restype = GEOM_PTR
+ func.errcheck = check_geom
+ return func
+
+### Topology Routines ###
+geos_boundary = topology(lgeos.GEOSBoundary)
+geos_buffer = topology(lgeos.GEOSBuffer, c_double, c_int)
+geos_centroid = topology(lgeos.GEOSGetCentroid)
+geos_convexhull = topology(lgeos.GEOSConvexHull)
+geos_difference = topology(lgeos.GEOSDifference, GEOM_PTR)
+geos_envelope = topology(lgeos.GEOSEnvelope)
+geos_intersection = topology(lgeos.GEOSIntersection, GEOM_PTR)
+geos_pointonsurface = topology(lgeos.GEOSPointOnSurface)
+geos_preservesimplify = topology(lgeos.GEOSTopologyPreserveSimplify, c_double)
+geos_simplify = topology(lgeos.GEOSSimplify, c_double)
+geos_symdifference = topology(lgeos.GEOSSymDifference, GEOM_PTR)
+geos_union = topology(lgeos.GEOSUnion, GEOM_PTR)
+
+# GEOSRelate returns a string, not a geometry.
+geos_relate = lgeos.GEOSRelate
+geos_relate.argtypes = [GEOM_PTR, GEOM_PTR]
+geos_relate.errcheck = check_string
diff --git a/django/contrib/gis/management/__init__.py b/django/contrib/gis/management/__init__.py
new file mode 100644
index 0000000000..e69de29bb2
--- /dev/null
+++ b/django/contrib/gis/management/__init__.py
diff --git a/django/contrib/gis/management/base.py b/django/contrib/gis/management/base.py
new file mode 100644
index 0000000000..c998063af8
--- /dev/null
+++ b/django/contrib/gis/management/base.py
@@ -0,0 +1,15 @@
+from django.core.management.base import BaseCommand, CommandError
+
+class ArgsCommand(BaseCommand):
+ """
+ Command class for commands that take multiple arguments.
+ """
+ args = '<arg arg ...>'
+
+ def handle(self, *args, **options):
+ if not args:
+ raise CommandError('Must provide the following arguments: %s' % self.args)
+ return self.handle_args(*args, **options)
+
+ def handle_args(self, *args, **options):
+ raise NotImplementedError()
diff --git a/django/contrib/gis/management/commands/__init__.py b/django/contrib/gis/management/commands/__init__.py
new file mode 100644
index 0000000000..e69de29bb2
--- /dev/null
+++ b/django/contrib/gis/management/commands/__init__.py
diff --git a/django/contrib/gis/management/commands/inspectdb.py b/django/contrib/gis/management/commands/inspectdb.py
new file mode 100644
index 0000000000..05e205353c
--- /dev/null
+++ b/django/contrib/gis/management/commands/inspectdb.py
@@ -0,0 +1,190 @@
+"""
+ This overrides the traditional `inspectdb` command so that geographic databases
+ may be introspected.
+"""
+
+from django.core.management.commands.inspectdb import Command as InspectCommand
+from django.contrib.gis.db.backend import SpatialBackend
+
+class Command(InspectCommand):
+
+ # Mapping from lower-case OGC type to the corresponding GeoDjango field.
+ geofield_mapping = {'point' : 'PointField',
+ 'linestring' : 'LineStringField',
+ 'polygon' : 'PolygonField',
+ 'multipoint' : 'MultiPointField',
+ 'multilinestring' : 'MultiLineStringField',
+ 'multipolygon' : 'MultiPolygonField',
+ 'geometrycollection' : 'GeometryCollectionField',
+ 'geometry' : 'GeometryField',
+ }
+
+ def geometry_columns(self):
+ """
+ Returns a datastructure of metadata information associated with the
+ `geometry_columns` (or equivalent) table.
+ """
+ # The `geo_cols` is a dictionary data structure that holds information
+ # about any geographic columns in the database.
+ geo_cols = {}
+ def add_col(table, column, coldata):
+ if table in geo_cols:
+ # If table already has a geometry column.
+ geo_cols[table][column] = coldata
+ else:
+ # Otherwise, create a dictionary indexed by column.
+ geo_cols[table] = { column : coldata }
+
+ if SpatialBackend.name == 'postgis':
+ # PostGIS holds all geographic column information in the `geometry_columns` table.
+ from django.contrib.gis.models import GeometryColumns
+ for geo_col in GeometryColumns.objects.all():
+ table = geo_col.f_table_name
+ column = geo_col.f_geometry_column
+ coldata = {'type' : geo_col.type, 'srid' : geo_col.srid, 'dim' : geo_col.coord_dimension}
+ add_col(table, column, coldata)
+ return geo_cols
+ elif SpatialBackend.name == 'mysql':
+ # On MySQL have to get all table metadata before hand; this means walking through
+ # each table and seeing if any column types are spatial. Can't detect this with
+ # `cursor.description` (what the introspection module does) because all spatial types
+ # have the same integer type (255 for GEOMETRY).
+ from django.db import connection
+ cursor = connection.cursor()
+ cursor.execute('SHOW TABLES')
+ tables = cursor.fetchall();
+ for table_tup in tables:
+ table = table_tup[0]
+ table_desc = cursor.execute('DESCRIBE `%s`' % table)
+ col_info = cursor.fetchall()
+ for column, typ, null, key, default, extra in col_info:
+ if typ in self.geofield_mapping: add_col(table, column, {'type' : typ})
+ return geo_cols
+ else:
+ # TODO: Oracle (has incomplete `geometry_columns` -- have to parse
+ # SDO SQL to get specific type, SRID, and other information).
+ raise NotImplementedError('Geographic database inspection not available.')
+
+ def handle_inspection(self):
+ "Overloaded from Django's version to handle geographic database tables."
+ from django.db import connection, get_introspection_module
+ import keyword
+
+ introspection_module = get_introspection_module()
+
+ geo_cols = self.geometry_columns()
+
+ table2model = lambda table_name: table_name.title().replace('_', '')
+
+ cursor = connection.cursor()
+ yield "# This is an auto-generated Django model module."
+ yield "# You'll have to do the following manually to clean this up:"
+ yield "# * Rearrange models' order"
+ yield "# * Make sure each model has one field with primary_key=True"
+ yield "# Feel free to rename the models, but don't rename db_table values or field names."
+ yield "#"
+ yield "# Also note: You'll have to insert the output of 'django-admin.py sqlcustom [appname]'"
+ yield "# into your database."
+ yield ''
+ yield 'from django.contrib.gis.db import models'
+ yield ''
+ for table_name in introspection_module.get_table_list(cursor):
+ # Getting the geographic table dictionary.
+ geo_table = geo_cols.get(table_name, {})
+
+ yield 'class %s(models.Model):' % table2model(table_name)
+ try:
+ relations = introspection_module.get_relations(cursor, table_name)
+ except NotImplementedError:
+ relations = {}
+ try:
+ indexes = introspection_module.get_indexes(cursor, table_name)
+ except NotImplementedError:
+ indexes = {}
+ for i, row in enumerate(introspection_module.get_table_description(cursor, table_name)):
+ att_name, iatt_name = row[0].lower(), row[0]
+ comment_notes = [] # Holds Field notes, to be displayed in a Python comment.
+ extra_params = {} # Holds Field parameters such as 'db_column'.
+
+ if ' ' in att_name:
+ extra_params['db_column'] = att_name
+ att_name = att_name.replace(' ', '')
+ comment_notes.append('Field renamed to remove spaces.')
+ if keyword.iskeyword(att_name):
+ extra_params['db_column'] = att_name
+ att_name += '_field'
+ comment_notes.append('Field renamed because it was a Python reserved word.')
+
+ if i in relations:
+ rel_to = relations[i][1] == table_name and "'self'" or table2model(relations[i][1])
+ field_type = 'ForeignKey(%s' % rel_to
+ if att_name.endswith('_id'):
+ att_name = att_name[:-3]
+ else:
+ extra_params['db_column'] = att_name
+ else:
+ if iatt_name in geo_table:
+ ## Customization for Geographic Columns ##
+ geo_col = geo_table[iatt_name]
+ field_type = self.geofield_mapping[geo_col['type'].lower()]
+ # Adding extra keyword arguments for the SRID and dimension (if not defaults).
+ dim, srid = geo_col.get('dim', 2), geo_col.get('srid', 4326)
+ if dim != 2: extra_params['dim'] = dim
+ if srid != 4326: extra_params['srid'] = srid
+ else:
+ try:
+ field_type = introspection_module.DATA_TYPES_REVERSE[row[1]]
+ except KeyError:
+ field_type = 'TextField'
+ comment_notes.append('This field type is a guess.')
+
+ # This is a hook for DATA_TYPES_REVERSE to return a tuple of
+ # (field_type, extra_params_dict).
+ if type(field_type) is tuple:
+ field_type, new_params = field_type
+ extra_params.update(new_params)
+
+ # Add max_length for all CharFields.
+ if field_type == 'CharField' and row[3]:
+ extra_params['max_length'] = row[3]
+
+ if field_type == 'DecimalField':
+ extra_params['max_digits'] = row[4]
+ extra_params['decimal_places'] = row[5]
+
+ # Add primary_key and unique, if necessary.
+ column_name = extra_params.get('db_column', att_name)
+ if column_name in indexes:
+ if indexes[column_name]['primary_key']:
+ extra_params['primary_key'] = True
+ elif indexes[column_name]['unique']:
+ extra_params['unique'] = True
+
+ field_type += '('
+
+ # Don't output 'id = meta.AutoField(primary_key=True)', because
+ # that's assumed if it doesn't exist.
+ if att_name == 'id' and field_type == 'AutoField(' and extra_params == {'primary_key': True}:
+ continue
+
+ # Add 'null' and 'blank', if the 'null_ok' flag was present in the
+ # table description.
+ if row[6]: # If it's NULL...
+ extra_params['blank'] = True
+ if not field_type in ('TextField(', 'CharField('):
+ extra_params['null'] = True
+
+ field_desc = '%s = models.%s' % (att_name, field_type)
+ if extra_params:
+ if not field_desc.endswith('('):
+ field_desc += ', '
+ field_desc += ', '.join(['%s=%r' % (k, v) for k, v in extra_params.items()])
+ field_desc += ')'
+ if comment_notes:
+ field_desc += ' # ' + ' '.join(comment_notes)
+ yield ' %s' % field_desc
+ if table_name in geo_cols:
+ yield ' objects = models.GeoManager()'
+ yield ' class Meta:'
+ yield ' db_table = %r' % table_name
+ yield ''
diff --git a/django/contrib/gis/management/commands/ogrinspect.py b/django/contrib/gis/management/commands/ogrinspect.py
new file mode 100644
index 0000000000..aa4f41831e
--- /dev/null
+++ b/django/contrib/gis/management/commands/ogrinspect.py
@@ -0,0 +1,119 @@
+import os, sys
+from optparse import make_option
+from django.contrib.gis import gdal
+from django.contrib.gis.management.base import ArgsCommand, CommandError
+
+def layer_option(option, opt, value, parser):
+ """
+ Callback for `make_option` for the `ogrinspect` `layer_key`
+ keyword option which may be an integer or a string.
+ """
+ try:
+ dest = int(value)
+ except ValueError:
+ dest = value
+ setattr(parser.values, option.dest, dest)
+
+def list_option(option, opt, value, parser):
+ """
+ Callback for `make_option` for `ogrinspect` keywords that require
+ a string list. If the string is 'True'/'true' then the option
+ value will be a boolean instead.
+ """
+ if value.lower() == 'true':
+ dest = True
+ else:
+ dest = [s for s in value.split(',')]
+ setattr(parser.values, option.dest, dest)
+
+class Command(ArgsCommand):
+ help = ('Inspects the given OGR-compatible data source (e.g., a shapefile) and outputs\n'
+ 'a GeoDjango model with the given model name. For example:\n'
+ ' ./manage.py ogrinspect zipcode.shp Zipcode')
+ args = '[data_source] [model_name]'
+
+ option_list = ArgsCommand.option_list + (
+ make_option('--blank', dest='blank', type='string', action='callback',
+ callback=list_option, default=False,
+ help='Use a comma separated list of OGR field names to add '
+ 'the `blank=True` option to the field definition. Set with'
+ '`true` to apply to all applicable fields.'),
+ make_option('--decimal', dest='decimal', type='string', action='callback',
+ callback=list_option, default=False,
+ help='Use a comma separated list of OGR float fields to '
+ 'generate `DecimalField` instead of the default '
+ '`FloatField`. Set to `true` to apply to all OGR float fields.'),
+ make_option('--geom-name', dest='geom_name', type='string', default='geom',
+ help='Specifies the model name for the Geometry Field '
+ '(defaults to `geom`)'),
+ make_option('--layer', dest='layer_key', type='string', action='callback',
+ callback=layer_option, default=0,
+ help='The key for specifying which layer in the OGR data '
+ 'source to use. Defaults to 0 (the first layer). May be '
+ 'an integer or a string identifier for the layer.'),
+ make_option('--multi-geom', action='store_true', dest='multi_geom', default=False,
+ help='Treat the geometry in the data source as a geometry collection.'),
+ make_option('--name-field', dest='name_field',
+ help='Specifies a field name to return for the `__unicode__` function.'),
+ make_option('--no-imports', action='store_false', dest='imports', default=True,
+ help='Do not include `from django.contrib.gis.db import models` '
+ 'statement.'),
+ make_option('--null', dest='null', type='string', action='callback',
+ callback=list_option, default=False,
+ help='Use a comma separated list of OGR field names to add '
+ 'the `null=True` option to the field definition. Set with'
+ '`true` to apply to all applicable fields.'),
+ make_option('--srid', dest='srid',
+ help='The SRID to use for the Geometry Field. If it can be '
+ 'determined, the SRID of the data source is used.'),
+ make_option('--mapping', action='store_true', dest='mapping',
+ help='Generate mapping dictionary for use with `LayerMapping`.')
+ )
+
+ requires_model_validation = False
+
+ def handle_args(self, *args, **options):
+ try:
+ data_source, model_name = args
+ except ValueError:
+ raise CommandError('Invalid arguments, must provide: %s' % self.args)
+
+ if not gdal.HAS_GDAL:
+ raise CommandError('GDAL is required to inspect geospatial data sources.')
+
+ # TODO: Support non file-based OGR datasources.
+ if not os.path.isfile(data_source):
+ raise CommandError('The given data source cannot be found: "%s"' % data_source)
+
+ # Removing options with `None` values.
+ options = dict([(k, v) for k, v in options.items() if not v is None])
+
+ # Getting the OGR DataSource from the string parameter.
+ try:
+ ds = gdal.DataSource(data_source)
+ except gdal.OGRException, msg:
+ raise CommandError(msg)
+
+ # Whether the user wants to generate the LayerMapping dictionary as well.
+ show_mapping = options.pop('mapping', False)
+
+ # Returning the output of ogrinspect with the given arguments
+ # and options.
+ from django.contrib.gis.utils.ogrinspect import _ogrinspect, mapping
+ output = [s for s in _ogrinspect(ds, model_name, **options)]
+ if show_mapping:
+ # Constructing the keyword arguments for `mapping`, and
+ # calling it on the data source.
+ kwargs = {'geom_name' : options['geom_name'],
+ 'layer_key' : options['layer_key'],
+ 'multi_geom' : options['multi_geom'],
+ }
+ mapping_dict = mapping(ds, **kwargs)
+ # This extra legwork is so that the dictionary definition comes
+ # out in the same order as the fields in the model definition.
+ rev_mapping = dict([(v, k) for k, v in mapping_dict.items()])
+ output.extend(['', '# Auto-generated `LayerMapping` dictionary for %s model' % model_name,
+ '%s_mapping = {' % model_name.lower()])
+ output.extend([" '%s' : '%s'," % (rev_mapping[ogr_fld], ogr_fld) for ogr_fld in ds[options['layer_key']].fields])
+ output.extend([" '%s' : '%s'," % (options['geom_name'], mapping_dict[options['geom_name']]), '}'])
+ return '\n'.join(output)
diff --git a/django/contrib/gis/maps/__init__.py b/django/contrib/gis/maps/__init__.py
new file mode 100644
index 0000000000..e69de29bb2
--- /dev/null
+++ b/django/contrib/gis/maps/__init__.py
diff --git a/django/contrib/gis/maps/google/__init__.py b/django/contrib/gis/maps/google/__init__.py
new file mode 100644
index 0000000000..dfbbedc3d6
--- /dev/null
+++ b/django/contrib/gis/maps/google/__init__.py
@@ -0,0 +1,61 @@
+"""
+ This module houses the GoogleMap object, used for generating
+ the needed javascript to embed Google Maps in a webpage.
+
+ Google(R) is a registered trademark of Google, Inc. of Mountain View, California.
+
+ Example:
+
+ * In the view:
+ return render_to_response('template.html', {'google' : GoogleMap(key="abcdefg")})
+
+ * In the template:
+
+ <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+ {{ google.xhtml }}
+ <head>
+ <title>Google Maps via GeoDjango</title>
+ {{ google.style }}
+ {{ google.scripts }}
+ </head>
+ {{ google.body }}
+ <div id="{{ google.dom_id }}" style="width:600px;height:400px;"></div>
+ </body>
+ </html>
+
+ Note: If you want to be more explicit in your templates, the following are
+ equivalent:
+ {{ google.body }} => "<body {{ google.onload }} {{ google.onunload }}>"
+ {{ google.xhtml }} => "<html xmlns="http://www.w3.org/1999/xhtml" {{ google.xmlns }}>"
+ {{ google.style }} => "<style>{{ google.vml_css }}</style>"
+
+ Explanation:
+ - The `xhtml` property provides the correct XML namespace needed for
+ Google Maps to operate in IE using XHTML. Google Maps on IE uses
+ VML to draw polylines. Returns, by default:
+ <html xmlns="http://www.w3.org/1999/xhtml" xmlns:v="urn:schemas-microsoft-com:vml">
+
+ - The `style` property provides the correct style tag for the CSS
+ properties required by Google Maps on IE:
+ <style type="text/css">v\:* {behavior:url(#default#VML);}</style>
+
+ - The `scripts` property provides the necessary <script> tags for
+ including the Google Maps javascript, as well as including the
+ generated javascript.
+
+ - The `body` property provides the correct attributes for the
+ body tag to load the generated javascript. By default, returns:
+ <body onload="gmap_load()" onunload="GUnload()">
+
+ - The `dom_id` property returns the DOM id for the map. Defaults to "map".
+
+ The following attributes may be set or customized in your local settings:
+ * GOOGLE_MAPS_API_KEY: String of your Google Maps API key. These are tied to
+ to a domain. May be obtained from http://www.google.com/apis/maps/
+ * GOOGLE_MAPS_API_VERSION (optional): Defaults to using "2.x"
+ * GOOGLE_MAPS_URL (optional): Must have a substitution ('%s') for the API
+ version.
+"""
+from django.contrib.gis.maps.google.gmap import GoogleMap
+from django.contrib.gis.maps.google.overlays import GEvent, GMarker, GPolygon, GPolyline
+from django.contrib.gis.maps.google.zoom import GoogleZoom
diff --git a/django/contrib/gis/maps/google/gmap.py b/django/contrib/gis/maps/google/gmap.py
new file mode 100644
index 0000000000..580ab7ad8e
--- /dev/null
+++ b/django/contrib/gis/maps/google/gmap.py
@@ -0,0 +1,138 @@
+from django.conf import settings
+from django.contrib.gis import geos
+from django.template.loader import render_to_string
+from django.utils.safestring import mark_safe
+
+class GoogleMapException(Exception): pass
+from django.contrib.gis.maps.google.overlays import GPolygon, GPolyline, GMarker
+
+# The default Google Maps URL (for the API javascript)
+# TODO: Internationalize for Japan, UK, etc.
+GOOGLE_MAPS_URL='http://maps.google.com/maps?file=api&amp;v=%s&amp;key='
+
+class GoogleMap(object):
+ "A class for generating Google Maps JavaScript."
+
+ # String constants
+ onunload = mark_safe('onunload="GUnload()"') # Cleans up after Google Maps
+ vml_css = mark_safe('v\:* {behavior:url(#default#VML);}') # CSS for IE VML
+ xmlns = mark_safe('xmlns:v="urn:schemas-microsoft-com:vml"') # XML Namespace (for IE VML).
+
+ def __init__(self, key=None, api_url=None, version=None,
+ center=None, zoom=None, dom_id='map', load_func='gmap_load',
+ kml_urls=[], polygons=[], polylines=[], markers=[],
+ template='gis/google/js/google-map.js',
+ extra_context={}):
+
+ # The Google Maps API Key defined in the settings will be used
+ # if not passed in as a parameter. The use of an API key is
+ # _required_.
+ if not key:
+ try:
+ self.key = settings.GOOGLE_MAPS_API_KEY
+ except AttributeError:
+ raise GoogleMapException('Google Maps API Key not found (try adding GOOGLE_MAPS_API_KEY to your settings).')
+ else:
+ self.key = key
+
+ # Getting the Google Maps API version, defaults to using the latest ("2.x"),
+ # this is not necessarily the most stable.
+ if not version:
+ self.version = getattr(settings, 'GOOGLE_MAPS_API_VERSION', '2.x')
+ else:
+ self.version = version
+
+ # Can specify the API URL in the `api_url` keyword.
+ if not api_url:
+ self.api_url = mark_safe(getattr(settings, 'GOOGLE_MAPS_URL', GOOGLE_MAPS_URL) % self.version)
+ else:
+ self.api_url = api_url
+
+ # Setting the DOM id of the map, the load function, the JavaScript
+ # template, and the KML URLs array.
+ self.dom_id = dom_id
+ self.load_func = load_func
+ self.template = template
+ self.kml_urls = kml_urls
+
+ # Does the user want any GMarker, GPolygon, and/or GPolyline overlays?
+ self.polygons, self.polylines, self.markers = [], [], []
+ if markers:
+ for point in markers:
+ if isinstance(point, GMarker):
+ self.markers.append(point)
+ else:
+ self.markers.append(GMarker(point))
+ if polygons:
+ for poly in polygons:
+ if isinstance(poly, GPolygon):
+ self.polygons.append(poly)
+ else:
+ self.polygons.append(GPolygon(poly))
+ if polylines:
+ for pline in polylines:
+ if isinstance(pline, GPolyline):
+ self.polylines.append(pline)
+ else:
+ self.polylines.append(GPolyline(pline))
+
+ # If GMarker, GPolygons, and/or GPolylines
+ # are used the zoom will be automatically
+ # calculated via the Google Maps API. If both a zoom level and a
+ # center coordinate are provided with polygons/polylines, no automatic
+ # determination will occur.
+ self.calc_zoom = False
+ if self.polygons or self.polylines or self.markers:
+ if center is None or zoom is None:
+ self.calc_zoom = True
+
+ # Defaults for the zoom level and center coordinates if the zoom
+ # is not automatically calculated.
+ if zoom is None: zoom = 4
+ self.zoom = zoom
+ if center is None: center = (0, 0)
+ self.center = center
+
+ # Setting the parameters for the javascript template.
+ params = {'calc_zoom' : self.calc_zoom,
+ 'center' : self.center,
+ 'dom_id' : self.dom_id,
+ 'kml_urls' : self.kml_urls,
+ 'load_func' : self.load_func,
+ 'zoom' : self.zoom,
+ 'polygons' : self.polygons,
+ 'polylines' : self.polylines,
+ 'markers' : self.markers,
+ }
+ params.update(extra_context)
+ self.js = render_to_string(self.template, params)
+
+ @property
+ def body(self):
+ "Returns HTML body tag for loading and unloading Google Maps javascript."
+ return mark_safe('<body %s %s>' % (self.onload, self.onunload))
+
+ @property
+ def onload(self):
+ "Returns the `onload` HTML <body> attribute."
+ return mark_safe('onload="%s()"' % self.load_func)
+
+ @property
+ def api_script(self):
+ "Returns the <script> tag for the Google Maps API javascript."
+ return mark_safe('<script src="%s%s" type="text/javascript"></script>' % (self.api_url, self.key))
+
+ @property
+ def scripts(self):
+ "Returns all <script></script> tags required for Google Maps JavaScript."
+ return mark_safe('%s\n <script type="text/javascript">\n//<![CDATA[\n%s//]]>\n </script>' % (self.api_script, self.js))
+
+ @property
+ def style(self):
+ "Returns additional CSS styling needed for Google Maps on IE."
+ return mark_safe('<style type="text/css">%s</style>' % self.vml_css)
+
+ @property
+ def xhtml(self):
+ "Returns XHTML information needed for IE VML overlays."
+ return mark_safe('<html xmlns="http://www.w3.org/1999/xhtml" %s>' % self.xmlns)
diff --git a/django/contrib/gis/maps/google/overlays.py b/django/contrib/gis/maps/google/overlays.py
new file mode 100644
index 0000000000..0efedf3632
--- /dev/null
+++ b/django/contrib/gis/maps/google/overlays.py
@@ -0,0 +1,220 @@
+from django.utils.safestring import mark_safe
+from django.contrib.gis.geos import fromstr, Point, LineString, LinearRing, Polygon
+
+class GEvent(object):
+ """
+ A Python wrapper for the Google GEvent object.
+
+ Events can be attached to any object derived from GOverlayBase with the
+ add_event() call.
+
+ For more information please see the Google Maps API Reference:
+ http://code.google.com/apis/maps/documentation/reference.html#GEvent
+
+ Example:
+
+ from django.shortcuts import render_to_response
+ from django.contrib.gis.maps.google import GoogleMap, GEvent, GPolyline
+
+ def sample_request(request):
+ polyline = GPolyline('LINESTRING(101 26, 112 26, 102 31)')
+ event = GEvent('click',
+ 'function() { location.href = "http://www.google.com"}')
+ polyline.add_event(event)
+ return render_to_response('mytemplate.html',
+ {'google' : GoogleMap(polylines=[polyline])})
+ """
+
+ def __init__(self, event, action):
+ """
+ Initializes a GEvent object.
+
+ Parameters:
+
+ event:
+ string for the event, such as 'click'. The event must be a valid
+ event for the object in the Google Maps API.
+ There is no validation of the event type within Django.
+
+ action:
+ string containing a Javascript function, such as
+ 'function() { location.href = "newurl";}'
+ The string must be a valid Javascript function. Again there is no
+ validation fo the function within Django.
+ """
+ self.event = event
+ self.action = action
+
+ def __unicode__(self):
+ "Returns the parameter part of a GEvent."
+ return mark_safe('"%s", %s' %(self.event, self.action))
+
+class GOverlayBase(object):
+ def __init__(self):
+ self.events = []
+
+ def latlng_from_coords(self, coords):
+ "Generates a JavaScript array of GLatLng objects for the given coordinates."
+ return '[%s]' % ','.join(['new GLatLng(%s,%s)' % (y, x) for x, y in coords])
+
+ def add_event(self, event):
+ "Attaches a GEvent to the overlay object."
+ self.events.append(event)
+
+ def __unicode__(self):
+ "The string representation is the JavaScript API call."
+ return mark_safe('%s(%s)' % (self.__class__.__name__, self.js_params))
+
+class GPolygon(GOverlayBase):
+ """
+ A Python wrapper for the Google GPolygon object. For more information
+ please see the Google Maps API Reference:
+ http://code.google.com/apis/maps/documentation/reference.html#GPolygon
+ """
+ def __init__(self, poly,
+ stroke_color='#0000ff', stroke_weight=2, stroke_opacity=1,
+ fill_color='#0000ff', fill_opacity=0.4):
+ """
+ The GPolygon object initializes on a GEOS Polygon or a parameter that
+ may be instantiated into GEOS Polygon. Please note that this will not
+ depict a Polygon's internal rings.
+
+ Keyword Options:
+
+ stroke_color:
+ The color of the polygon outline. Defaults to '#0000ff' (blue).
+
+ stroke_weight:
+ The width of the polygon outline, in pixels. Defaults to 2.
+
+ stroke_opacity:
+ The opacity of the polygon outline, between 0 and 1. Defaults to 1.
+
+ fill_color:
+ The color of the polygon fill. Defaults to '#0000ff' (blue).
+
+ fill_opacity:
+ The opacity of the polygon fill. Defaults to 0.4.
+ """
+ if isinstance(poly, basestring): poly = fromstr(poly)
+ if isinstance(poly, (tuple, list)): poly = Polygon(poly)
+ if not isinstance(poly, Polygon):
+ raise TypeError('GPolygon may only initialize on GEOS Polygons.')
+
+ # Getting the envelope of the input polygon (used for automatically
+ # determining the zoom level).
+ self.envelope = poly.envelope
+
+ # Translating the coordinates into a JavaScript array of
+ # Google `GLatLng` objects.
+ self.points = self.latlng_from_coords(poly.shell.coords)
+
+ # Stroke settings.
+ self.stroke_color, self.stroke_opacity, self.stroke_weight = stroke_color, stroke_opacity, stroke_weight
+
+ # Fill settings.
+ self.fill_color, self.fill_opacity = fill_color, fill_opacity
+
+ super(GPolygon, self).__init__()
+
+ @property
+ def js_params(self):
+ return '%s, "%s", %s, %s, "%s", %s' % (self.points, self.stroke_color, self.stroke_weight, self.stroke_opacity,
+ self.fill_color, self.fill_opacity)
+
+class GPolyline(GOverlayBase):
+ """
+ A Python wrapper for the Google GPolyline object. For more information
+ please see the Google Maps API Reference:
+ http://code.google.com/apis/maps/documentation/reference.html#GPolyline
+ """
+ def __init__(self, geom, color='#0000ff', weight=2, opacity=1):
+ """
+ The GPolyline object may be initialized on GEOS LineStirng, LinearRing,
+ and Polygon objects (internal rings not supported) or a parameter that
+ may instantiated into one of the above geometries.
+
+ Keyword Options:
+
+ color:
+ The color to use for the polyline. Defaults to '#0000ff' (blue).
+
+ weight:
+ The width of the polyline, in pixels. Defaults to 2.
+
+ opacity:
+ The opacity of the polyline, between 0 and 1. Defaults to 1.
+ """
+ # If a GEOS geometry isn't passed in, try to contsruct one.
+ if isinstance(geom, basestring): geom = fromstr(geom)
+ if isinstance(geom, (tuple, list)): geom = Polygon(geom)
+ # Generating the lat/lng coordinate pairs.
+ if isinstance(geom, (LineString, LinearRing)):
+ self.latlngs = self.latlng_from_coords(geom.coords)
+ elif isinstance(geom, Polygon):
+ self.latlngs = self.latlng_from_coords(geom.shell.coords)
+ else:
+ raise TypeError('GPolyline may only initialize on GEOS LineString, LinearRing, and/or Polygon geometries.')
+
+ # Getting the envelope for automatic zoom determination.
+ self.envelope = geom.envelope
+ self.color, self.weight, self.opacity = color, weight, opacity
+ super(GPolyline, self).__init__()
+
+ @property
+ def js_params(self):
+ return '%s, "%s", %s, %s' % (self.latlngs, self.color, self.weight, self.opacity)
+
+class GMarker(GOverlayBase):
+ """
+ A Python wrapper for the Google GMarker object. For more information
+ please see the Google Maps API Reference:
+ http://code.google.com/apis/maps/documentation/reference.html#GMarker
+
+ Example:
+
+ from django.shortcuts import render_to_response
+ from django.contrib.gis.maps.google.overlays import GMarker, GEvent
+
+ def sample_request(request):
+ marker = GMarker('POINT(101 26)')
+ event = GEvent('click',
+ 'function() { location.href = "http://www.google.com"}')
+ marker.add_event(event)
+ return render_to_response('mytemplate.html',
+ {'google' : GoogleMap(markers=[marker])})
+ """
+ def __init__(self, geom, title=None):
+ """
+ The GMarker object may initialize on GEOS Points or a parameter
+ that may be instantiated into a GEOS point. Keyword options map to
+ GMarkerOptions -- so far only the title option is supported.
+
+ Keyword Options:
+ title:
+ Title option for GMarker, will be displayed as a tooltip.
+ """
+ # If a GEOS geometry isn't passed in, try to construct one.
+ if isinstance(geom, basestring): geom = fromstr(geom)
+ if isinstance(geom, (tuple, list)): geom = Point(geom)
+ if isinstance(geom, Point):
+ self.latlng = self.latlng_from_coords(geom.coords)
+ else:
+ raise TypeError('GMarker may only initialize on GEOS Point geometry.')
+ # Getting the envelope for automatic zoom determination.
+ self.envelope = geom.envelope
+ # TODO: Add support for more GMarkerOptions
+ self.title = title
+ super(GMarker, self).__init__()
+
+ def latlng_from_coords(self, coords):
+ return 'new GLatLng(%s,%s)' %(coords[1], coords[0])
+
+ def options(self):
+ result = []
+ if self.title: result.append('title: "%s"' % self.title)
+ return '{%s}' % ','.join(result)
+
+ @property
+ def js_params(self):
+ return '%s, %s' % (self.latlng, self.options())
diff --git a/django/contrib/gis/maps/google/zoom.py b/django/contrib/gis/maps/google/zoom.py
new file mode 100644
index 0000000000..b94fa31157
--- /dev/null
+++ b/django/contrib/gis/maps/google/zoom.py
@@ -0,0 +1,164 @@
+from django.contrib.gis.geos import GEOSGeometry, LinearRing, Polygon, Point
+from django.contrib.gis.maps.google.gmap import GoogleMapException
+from math import pi, sin, cos, log, exp, atan
+
+# Constants used for degree to radian conversion, and vice-versa.
+DTOR = pi / 180.
+RTOD = 180. / pi
+
+def get_width_height(envelope):
+ # Getting the lower-left, upper-left, and upper-right
+ # coordinates of the envelope.
+ ll = Point(envelope[0][0])
+ ul = Point(envelope[0][1])
+ ur = Point(envelope[0][2])
+
+ height = ll.distance(ul)
+ width = ul.distance(ur)
+ return width, height
+
+class GoogleZoom(object):
+ """
+ GoogleZoom is a utility for performing operations related to the zoom
+ levels on Google Maps.
+
+ This class is inspired by the OpenStreetMap Mapnik tile generation routine
+ `generate_tiles.py`, and the article "How Big Is the World" (Hack #16) in
+ "Google Maps Hacks" by Rich Gibson and Schuyler Erle.
+
+ `generate_tiles.py` may be found at:
+ http://trac.openstreetmap.org/browser/applications/rendering/mapnik/generate_tiles.py
+
+ "Google Maps Hacks" may be found at http://safari.oreilly.com/0596101619
+ """
+
+ def __init__(self, num_zoom=19, tilesize=256):
+ "Initializes the Google Zoom object."
+
+ # Google's tilesize is 256x256, square tiles are assumed.
+ self._tilesize = tilesize
+
+ # The number of zoom levels
+ self._nzoom = num_zoom
+
+ # Initializing arrays to hold the parameters for each
+ # one of the zoom levels.
+ self._degpp = [] # Degrees per pixel
+ self._radpp = [] # Radians per pixel
+ self._npix = [] # 1/2 the number of pixels for a tile at the given zoom level
+
+ # Incrementing through the zoom levels and populating the
+ # parameter arrays.
+ z = tilesize # The number of pixels per zoom level.
+ for i in xrange(num_zoom):
+ # Getting the degrees and radians per pixel, and the 1/2 the number of
+ # for every zoom level.
+ self._degpp.append(z / 360.) # degrees per pixel
+ self._radpp.append(z / (2 * pi)) # radians per pixl
+ self._npix.append(z / 2) # number of pixels to center of tile
+
+ # Multiplying `z` by 2 for the next iteration.
+ z *= 2
+
+ def __len__(self):
+ "Returns the number of zoom levels."
+ return self._nzoom
+
+ def get_lon_lat(self, lonlat):
+ "Unpacks longitude, latitude from GEOS Points and 2-tuples."
+ if isinstance(lonlat, Point):
+ lon, lat = lonlat.coords
+ else:
+ lon, lat = lonlat
+ return lon, lat
+
+ def lonlat_to_pixel(self, lonlat, zoom):
+ "Converts a longitude, latitude coordinate pair for the given zoom level."
+ # Setting up, unpacking the longitude, latitude values and getting the
+ # number of pixels for the given zoom level.
+ lon, lat = self.get_lon_lat(lonlat)
+ npix = self._npix[zoom]
+
+ # Calculating the pixel x coordinate by multiplying the longitude
+ # value with with the number of degrees/pixel at the given
+ # zoom level.
+ px_x = round(npix + (lon * self._degpp[zoom]))
+
+ # Creating the factor, and ensuring that 1 or -1 is not passed in as the
+ # base to the logarithm. Here's why:
+ # if fac = -1, we'll get log(0) which is undefined;
+ # if fac = 1, our logarithm base will be divided by 0, also undefined.
+ fac = min(max(sin(DTOR * lat), -0.9999), 0.9999)
+
+ # Calculating the pixel y coordinate.
+ px_y = round(npix + (0.5 * log((1 + fac)/(1 - fac)) * (-1.0 * self._radpp[zoom])))
+
+ # Returning the pixel x, y to the caller of the function.
+ return (px_x, px_y)
+
+ def pixel_to_lonlat(self, px, zoom):
+ "Converts a pixel to a longitude, latitude pair at the given zoom level."
+ if len(px) != 2:
+ raise TypeError('Pixel should be a sequence of two elements.')
+
+ # Getting the number of pixels for the given zoom level.
+ npix = self._npix[zoom]
+
+ # Calculating the longitude value, using the degrees per pixel.
+ lon = (px[0] - npix) / self._degpp[zoom]
+
+ # Calculating the latitude value.
+ lat = RTOD * ( 2 * atan(exp((px[1] - npix)/ (-1.0 * self._radpp[zoom]))) - 0.5 * pi)
+
+ # Returning the longitude, latitude coordinate pair.
+ return (lon, lat)
+
+ def tile(self, lonlat, zoom):
+ """
+ Returns a Polygon corresponding to the region represented by a fictional
+ Google Tile for the given longitude/latitude pair and zoom level. This
+ tile is used to determine the size of a tile at the given point.
+ """
+ # The given lonlat is the center of the tile.
+ delta = self._tilesize / 2
+
+ # Getting the pixel coordinates corresponding to the
+ # the longitude/latitude.
+ px = self.lonlat_to_pixel(lonlat, zoom)
+
+ # Getting the lower-left and upper-right lat/lon coordinates
+ # for the bounding box of the tile.
+ ll = self.pixel_to_lonlat((px[0]-delta, px[1]-delta), zoom)
+ ur = self.pixel_to_lonlat((px[0]+delta, px[1]+delta), zoom)
+
+ # Constructing the Polygon, representing the tile and returning.
+ return Polygon(LinearRing(ll, (ll[0], ur[1]), ur, (ur[0], ll[1]), ll), srid=4326)
+
+ def get_zoom(self, geom):
+ "Returns the optimal Zoom level for the given geometry."
+
+ # Checking the input type.
+ if not isinstance(geom, GEOSGeometry) or geom.srid != 4326:
+ raise TypeError('get_zoom() expects a GEOS Geometry with an SRID of 4326.')
+
+ # Getting the envelope for the geometry, and its associated width, height
+ # and centroid.
+ env = geom.envelope
+ env_w, env_h = get_width_height(env)
+ center = env.centroid
+
+ for z in xrange(self._nzoom):
+ # Getting the tile at the zoom level.
+ tile = self.tile(center, z)
+ tile_w, tile_h = get_width_height(tile)
+
+ # When we span more than one tile, this is an approximately good
+ # zoom level.
+ if (env_w > tile_w) or (env_h > tile_h):
+ if z == 0:
+ raise GoogleMapException('Geometry width and height should not exceed that of the Earth.')
+ return z-1
+
+ # Otherwise, we've zoomed in to the max.
+ return self._nzoom-1
+
diff --git a/django/contrib/gis/maps/openlayers/__init__.py b/django/contrib/gis/maps/openlayers/__init__.py
new file mode 100644
index 0000000000..e69de29bb2
--- /dev/null
+++ b/django/contrib/gis/maps/openlayers/__init__.py
diff --git a/django/contrib/gis/measure.py b/django/contrib/gis/measure.py
new file mode 100644
index 0000000000..42c49ce154
--- /dev/null
+++ b/django/contrib/gis/measure.py
@@ -0,0 +1,329 @@
+# Copyright (c) 2007, Robert Coup <robert.coup@onetrackmind.co.nz>
+# All rights reserved.
+#
+# Redistribution and use in source and binary forms, with or without modification,
+# are permitted provided that the following conditions are met:
+#
+# 1. Redistributions of source code must retain the above copyright notice,
+# this list of conditions and the following disclaimer.
+#
+# 2. Redistributions in binary form must reproduce the above copyright
+# notice, this list of conditions and the following disclaimer in the
+# documentation and/or other materials provided with the distribution.
+#
+# 3. Neither the name of Distance nor the names of its contributors may be used
+# to endorse or promote products derived from this software without
+# specific prior written permission.
+#
+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
+# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
+# ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+# (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+# ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+# SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+#
+"""
+Distance and Area objects to allow for sensible and convienient calculation
+and conversions.
+
+Authors: Robert Coup, Justin Bronn
+
+Inspired by GeoPy (http://exogen.case.edu/projects/geopy/)
+and Geoff Biggs' PhD work on dimensioned units for robotics.
+"""
+__all__ = ['A', 'Area', 'D', 'Distance']
+from decimal import Decimal
+
+class MeasureBase(object):
+ def default_units(self, kwargs):
+ """
+ Return the unit value and the the default units specified
+ from the given keyword arguments dictionary.
+ """
+ val = 0.0
+ for unit, value in kwargs.iteritems():
+ if unit in self.UNITS:
+ val += self.UNITS[unit] * value
+ default_unit = unit
+ elif unit in self.ALIAS:
+ u = self.ALIAS[unit]
+ val += self.UNITS[u] * value
+ default_unit = u
+ else:
+ lower = unit.lower()
+ if lower in self.UNITS:
+ val += self.UNITS[lower] * value
+ default_unit = lower
+ elif lower in self.LALIAS:
+ u = self.LALIAS[lower]
+ val += self.UNITS[u] * value
+ default_unit = u
+ else:
+ raise AttributeError('Unknown unit type: %s' % unit)
+ return val, default_unit
+
+ @classmethod
+ def unit_attname(cls, unit_str):
+ """
+ Retrieves the unit attribute name for the given unit string.
+ For example, if the given unit string is 'metre', 'm' would be returned.
+ An exception is raised if an attribute cannot be found.
+ """
+ lower = unit_str.lower()
+ if unit_str in cls.UNITS:
+ return unit_str
+ elif lower in cls.UNITS:
+ return lower
+ elif lower in cls.LALIAS:
+ return cls.LALIAS[lower]
+ else:
+ raise Exception('Could not find a unit keyword associated with "%s"' % unit_str)
+
+class Distance(MeasureBase):
+ UNITS = {
+ 'chain' : 20.1168,
+ 'chain_benoit' : 20.116782,
+ 'chain_sears' : 20.1167645,
+ 'british_chain_benoit' : 20.1167824944,
+ 'british_chain_sears' : 20.1167651216,
+ 'british_chain_sears_truncated' : 20.116756,
+ 'cm' : 0.01,
+ 'british_ft' : 0.304799471539,
+ 'british_yd' : 0.914398414616,
+ 'clarke_ft' : 0.3047972654,
+ 'clarke_link' : 0.201166195164,
+ 'fathom' : 1.8288,
+ 'ft': 0.3048,
+ 'german_m' : 1.0000135965,
+ 'gold_coast_ft' : 0.304799710181508,
+ 'indian_yd' : 0.914398530744,
+ 'inch' : 0.0254,
+ 'km': 1000.0,
+ 'link' : 0.201168,
+ 'link_benoit' : 0.20116782,
+ 'link_sears' : 0.20116765,
+ 'm': 1.0,
+ 'mi': 1609.344,
+ 'mm' : 0.001,
+ 'nm': 1852.0,
+ 'nm_uk' : 1853.184,
+ 'rod' : 5.0292,
+ 'sears_yd' : 0.91439841,
+ 'survey_ft' : 0.304800609601,
+ 'um' : 0.000001,
+ 'yd': 0.9144,
+ }
+
+ # Unit aliases for `UNIT` terms encountered in Spatial Reference WKT.
+ ALIAS = {
+ 'centimeter' : 'cm',
+ 'foot' : 'ft',
+ 'inches' : 'inch',
+ 'kilometer' : 'km',
+ 'kilometre' : 'km',
+ 'meter' : 'm',
+ 'metre' : 'm',
+ 'micrometer' : 'um',
+ 'micrometre' : 'um',
+ 'millimeter' : 'mm',
+ 'millimetre' : 'mm',
+ 'mile' : 'mi',
+ 'yard' : 'yd',
+ 'British chain (Benoit 1895 B)' : 'british_chain_benoit',
+ 'British chain (Sears 1922)' : 'british_chain_sears',
+ 'British chain (Sears 1922 truncated)' : 'british_chain_sears_truncated',
+ 'British foot (Sears 1922)' : 'british_ft',
+ 'British foot' : 'british_ft',
+ 'British yard (Sears 1922)' : 'british_yd',
+ 'British yard' : 'british_yd',
+ "Clarke's Foot" : 'clarke_ft',
+ "Clarke's link" : 'clarke_link',
+ 'Chain (Benoit)' : 'chain_benoit',
+ 'Chain (Sears)' : 'chain_sears',
+ 'Foot (International)' : 'ft',
+ 'German legal metre' : 'german_m',
+ 'Gold Coast foot' : 'gold_coast_ft',
+ 'Indian yard' : 'indian_yd',
+ 'Link (Benoit)': 'link_benoit',
+ 'Link (Sears)': 'link_sears',
+ 'Nautical Mile' : 'nm',
+ 'Nautical Mile (UK)' : 'nm_uk',
+ 'US survey foot' : 'survey_ft',
+ 'U.S. Foot' : 'survey_ft',
+ 'Yard (Indian)' : 'indian_yd',
+ 'Yard (Sears)' : 'sears_yd'
+ }
+ LALIAS = dict([(k.lower(), v) for k, v in ALIAS.items()])
+
+ def __init__(self, default_unit=None, **kwargs):
+ # The base unit is in meters.
+ self.m, self._default_unit = self.default_units(kwargs)
+ if default_unit and isinstance(default_unit, str):
+ self._default_unit = default_unit
+
+ def __getattr__(self, name):
+ if name in self.UNITS:
+ return self.m / self.UNITS[name]
+ else:
+ raise AttributeError('Unknown unit type: %s' % name)
+
+ def __repr__(self):
+ return 'Distance(%s=%s)' % (self._default_unit, getattr(self, self._default_unit))
+
+ def __str__(self):
+ return '%s %s' % (getattr(self, self._default_unit), self._default_unit)
+
+ def __cmp__(self, other):
+ if isinstance(other, Distance):
+ return cmp(self.m, other.m)
+ else:
+ return NotImplemented
+
+ def __add__(self, other):
+ if isinstance(other, Distance):
+ return Distance(default_unit=self._default_unit, m=(self.m + other.m))
+ else:
+ raise TypeError('Distance must be added with Distance')
+
+ def __iadd__(self, other):
+ if isinstance(other, Distance):
+ self.m += other.m
+ return self
+ else:
+ raise TypeError('Distance must be added with Distance')
+
+ def __sub__(self, other):
+ if isinstance(other, Distance):
+ return Distance(default_unit=self._default_unit, m=(self.m - other.m))
+ else:
+ raise TypeError('Distance must be subtracted from Distance')
+
+ def __isub__(self, other):
+ if isinstance(other, Distance):
+ self.m -= other.m
+ return self
+ else:
+ raise TypeError('Distance must be subtracted from Distance')
+
+ def __mul__(self, other):
+ if isinstance(other, (int, float, long, Decimal)):
+ return Distance(default_unit=self._default_unit, m=(self.m * float(other)))
+ elif isinstance(other, Distance):
+ return Area(default_unit='sq_' + self._default_unit, sq_m=(self.m * other.m))
+ else:
+ raise TypeError('Distance must be multiplied with number or Distance')
+
+ def __imul__(self, other):
+ if isinstance(other, (int, float, long, Decimal)):
+ self.m *= float(other)
+ return self
+ else:
+ raise TypeError('Distance must be multiplied with number')
+
+ def __div__(self, other):
+ if isinstance(other, (int, float, long, Decimal)):
+ return Distance(default_unit=self._default_unit, m=(self.m / float(other)))
+ else:
+ raise TypeError('Distance must be divided with number')
+
+ def __idiv__(self, other):
+ if isinstance(other, (int, float, long, Decimal)):
+ self.m /= float(other)
+ return self
+ else:
+ raise TypeError('Distance must be divided with number')
+
+ def __nonzero__(self):
+ return bool(self.m)
+
+class Area(MeasureBase):
+ # Getting the square units values and the alias dictionary.
+ UNITS = dict([('sq_%s' % k, v ** 2) for k, v in Distance.UNITS.items()])
+ ALIAS = dict([(k, 'sq_%s' % v) for k, v in Distance.ALIAS.items()])
+ LALIAS = dict([(k.lower(), v) for k, v in ALIAS.items()])
+
+ def __init__(self, default_unit=None, **kwargs):
+ self.sq_m, self._default_unit = self.default_units(kwargs)
+ if default_unit and isinstance(default_unit, str):
+ self._default_unit = default_unit
+
+ def __getattr__(self, name):
+ if name in self.UNITS:
+ return self.sq_m / self.UNITS[name]
+ else:
+ raise AttributeError('Unknown unit type: ' + name)
+
+ def __repr__(self):
+ return 'Area(%s=%s)' % (self._default_unit, getattr(self, self._default_unit))
+
+ def __str__(self):
+ return '%s %s' % (getattr(self, self._default_unit), self._default_unit)
+
+ def __cmp__(self, other):
+ if isinstance(other, Area):
+ return cmp(self.sq_m, other.sq_m)
+ else:
+ return NotImplemented
+
+ def __add__(self, other):
+ if isinstance(other, Area):
+ return Area(default_unit=self._default_unit, sq_m=(self.sq_m + other.sq_m))
+ else:
+ raise TypeError('Area must be added with Area')
+
+ def __iadd__(self, other):
+ if isinstance(other, Area):
+ self.sq_m += other.sq_m
+ return self
+ else:
+ raise TypeError('Area must be added with Area')
+
+ def __sub__(self, other):
+ if isinstance(other, Area):
+ return Area(default_unit=self._default_unit, sq_m=(self.sq_m - other.sq_m))
+ else:
+ raise TypeError('Area must be subtracted from Area')
+
+ def __isub__(self, other):
+ if isinstance(other, Area):
+ self.sq_m -= other.sq_m
+ return self
+ else:
+ raise TypeError('Area must be subtracted from Area')
+
+ def __mul__(self, other):
+ if isinstance(other, (int, float, long, Decimal)):
+ return Area(default_unit=self._default_unit, sq_m=(self.sq_m * float(other)))
+ else:
+ raise TypeError('Area must be multiplied with number')
+
+ def __imul__(self, other):
+ if isinstance(other, (int, float, long, Decimal)):
+ self.sq_m *= float(other)
+ return self
+ else:
+ raise TypeError('Area must be multiplied with number')
+
+ def __div__(self, other):
+ if isinstance(other, (int, float, long, Decimal)):
+ return Area(default_unit=self._default_unit, sq_m=(self.sq_m / float(other)))
+ else:
+ raise TypeError('Area must be divided with number')
+
+ def __idiv__(self, other):
+ if isinstance(other, (int, float, long, Decimal)):
+ self.sq_m /= float(other)
+ return self
+ else:
+ raise TypeError('Area must be divided with number')
+
+ def __nonzero__(self):
+ return bool(self.sq_m)
+
+# Shortcuts
+D = Distance
+A = Area
diff --git a/django/contrib/gis/models.py b/django/contrib/gis/models.py
new file mode 100644
index 0000000000..d3e8dbdb83
--- /dev/null
+++ b/django/contrib/gis/models.py
@@ -0,0 +1,284 @@
+"""
+ Imports the SpatialRefSys and GeometryColumns models dependent on the
+ spatial database backend.
+"""
+import re
+from django.conf import settings
+
+# Checking for the presence of GDAL (needed for the SpatialReference object)
+from django.contrib.gis.gdal import HAS_GDAL
+if HAS_GDAL:
+ from django.contrib.gis.gdal import SpatialReference
+
+class SpatialRefSysMixin(object):
+ """
+ The SpatialRefSysMixin is a class used by the database-dependent
+ SpatialRefSys objects to reduce redundnant code.
+ """
+
+ # For pulling out the spheroid from the spatial reference string. This
+ # regular expression is used only if the user does not have GDAL installed.
+ # TODO: Flattening not used in all ellipsoids, could also be a minor axis, or 'b'
+ # parameter.
+ spheroid_regex = re.compile(r'.+SPHEROID\[\"(?P<name>.+)\",(?P<major>\d+(\.\d+)?),(?P<flattening>\d{3}\.\d+),')
+
+ # For pulling out the units on platforms w/o GDAL installed.
+ # TODO: Figure out how to pull out angular units of projected coordinate system and
+ # fix for LOCAL_CS types. GDAL should be highly recommended for performing
+ # distance queries.
+ units_regex = re.compile(r'.+UNIT ?\["(?P<unit_name>[\w \'\(\)]+)", ?(?P<unit>[\d\.]+)(,AUTHORITY\["(?P<unit_auth_name>[\w \'\(\)]+)","(?P<unit_auth_val>\d+)"\])?\]([\w ]+)?(,AUTHORITY\["(?P<auth_name>[\w \'\(\)]+)","(?P<auth_val>\d+)"\])?\]$')
+
+ @property
+ def srs(self):
+ """
+ Returns a GDAL SpatialReference object, if GDAL is installed.
+ """
+ if HAS_GDAL:
+ if hasattr(self, '_srs'):
+ # Returning a clone of the cached SpatialReference object.
+ return self._srs.clone()
+ else:
+ # Attempting to cache a SpatialReference object.
+
+ # Trying to get from WKT first.
+ try:
+ self._srs = SpatialReference(self.wkt)
+ return self.srs
+ except Exception, msg:
+ pass
+
+ raise Exception('Could not get OSR SpatialReference from WKT: %s\nError:\n%s' % (self.wkt, msg))
+ else:
+ raise Exception('GDAL is not installed.')
+
+ @property
+ def ellipsoid(self):
+ """
+ Returns a tuple of the ellipsoid parameters:
+ (semimajor axis, semiminor axis, and inverse flattening).
+ """
+ if HAS_GDAL:
+ return self.srs.ellipsoid
+ else:
+ m = self.spheroid_regex.match(self.wkt)
+ if m: return (float(m.group('major')), float(m.group('flattening')))
+ else: return None
+
+ @property
+ def name(self):
+ "Returns the projection name."
+ return self.srs.name
+
+ @property
+ def spheroid(self):
+ "Returns the spheroid name for this spatial reference."
+ return self.srs['spheroid']
+
+ @property
+ def datum(self):
+ "Returns the datum for this spatial reference."
+ return self.srs['datum']
+
+ @property
+ def projected(self):
+ "Is this Spatial Reference projected?"
+ if HAS_GDAL:
+ return self.srs.projected
+ else:
+ return self.wkt.startswith('PROJCS')
+
+ @property
+ def local(self):
+ "Is this Spatial Reference local?"
+ if HAS_GDAL:
+ return self.srs.local
+ else:
+ return self.wkt.startswith('LOCAL_CS')
+
+ @property
+ def geographic(self):
+ "Is this Spatial Reference geographic?"
+ if HAS_GDAL:
+ return self.srs.geographic
+ else:
+ return self.wkt.startswith('GEOGCS')
+
+ @property
+ def linear_name(self):
+ "Returns the linear units name."
+ if HAS_GDAL:
+ return self.srs.linear_name
+ elif self.geographic:
+ return None
+ else:
+ m = self.units_regex.match(self.wkt)
+ return m.group('unit_name')
+
+ @property
+ def linear_units(self):
+ "Returns the linear units."
+ if HAS_GDAL:
+ return self.srs.linear_units
+ elif self.geographic:
+ return None
+ else:
+ m = self.units_regex.match(self.wkt)
+ return m.group('unit')
+
+ @property
+ def angular_name(self):
+ "Returns the name of the angular units."
+ if HAS_GDAL:
+ return self.srs.angular_name
+ elif self.projected:
+ return None
+ else:
+ m = self.units_regex.match(self.wkt)
+ return m.group('unit_name')
+
+ @property
+ def angular_units(self):
+ "Returns the angular units."
+ if HAS_GDAL:
+ return self.srs.angular_units
+ elif self.projected:
+ return None
+ else:
+ m = self.units_regex.match(self.wkt)
+ return m.group('unit')
+
+ @property
+ def units(self):
+ "Returns a tuple of the units and the name."
+ if self.projected or self.local:
+ return (self.linear_units, self.linear_name)
+ elif self.geographic:
+ return (self.angular_units, self.angular_name)
+ else:
+ return (None, None)
+
+ @classmethod
+ def get_units(cls, wkt):
+ """
+ Class method used by GeometryField on initialization to
+ retrive the units on the given WKT, without having to use
+ any of the database fields.
+ """
+ if HAS_GDAL:
+ return SpatialReference(wkt).units
+ else:
+ m = cls.units_regex.match(wkt)
+ return m.group('unit'), m.group('unit_name')
+
+ @classmethod
+ def get_spheroid(cls, wkt, string=True):
+ """
+ Class method used by GeometryField on initialization to
+ retrieve the `SPHEROID[..]` parameters from the given WKT.
+ """
+ if HAS_GDAL:
+ srs = SpatialReference(wkt)
+ sphere_params = srs.ellipsoid
+ sphere_name = srs['spheroid']
+ else:
+ m = cls.spheroid_regex.match(wkt)
+ if m:
+ sphere_params = (float(m.group('major')), float(m.group('flattening')))
+ sphere_name = m.group('name')
+ else:
+ return None
+
+ if not string:
+ return sphere_name, sphere_params
+ else:
+ # `string` parameter used to place in format acceptable by PostGIS
+ if len(sphere_params) == 3:
+ radius, flattening = sphere_params[0], sphere_params[2]
+ else:
+ radius, flattening = sphere_params
+ return 'SPHEROID["%s",%s,%s]' % (sphere_name, radius, flattening)
+
+ def __unicode__(self):
+ """
+ Returns the string representation. If GDAL is installed,
+ it will be 'pretty' OGC WKT.
+ """
+ try:
+ return unicode(self.srs)
+ except:
+ return unicode(self.wkt)
+
+# The SpatialRefSys and GeometryColumns models
+_srid_info = True
+if settings.DATABASE_ENGINE == 'postgresql_psycopg2':
+ # Because the PostGIS version is checked when initializing the spatial
+ # backend a `ProgrammingError` will be raised if the PostGIS tables
+ # and functions are not installed. We catch here so it won't be raised when
+ # running the Django test suite.
+ from psycopg2 import ProgrammingError
+ try:
+ from django.contrib.gis.db.backend.postgis.models import GeometryColumns, SpatialRefSys
+ except ProgrammingError:
+ _srid_info = False
+elif settings.DATABASE_ENGINE == 'oracle':
+ # Same thing as above, except the GEOS library is attempted to be loaded for
+ # `BaseSpatialBackend`, and an exception will be raised during the
+ # Django test suite if it doesn't exist.
+ try:
+ from django.contrib.gis.db.backend.oracle.models import GeometryColumns, SpatialRefSys
+ except:
+ _srid_info = False
+else:
+ _srid_info = False
+
+if _srid_info:
+ def get_srid_info(srid):
+ """
+ Returns the units, unit name, and spheroid WKT associated with the
+ given SRID from the `spatial_ref_sys` (or equivalent) spatial database
+ table. We use a database cursor to execute the query because this
+ function is used when it is not possible to use the ORM (for example,
+ during field initialization).
+ """
+ # SRID=-1 is a common convention for indicating the geometry has no
+ # spatial reference information associated with it. Thus, we will
+ # return all None values without raising an exception.
+ if srid == -1: return None, None, None
+
+ # Getting the spatial reference WKT associated with the SRID from the
+ # `spatial_ref_sys` (or equivalent) spatial database table. This query
+ # cannot be executed using the ORM because this information is needed
+ # when the ORM cannot be used (e.g., during the initialization of
+ # `GeometryField`).
+ from django.db import connection
+ cur = connection.cursor()
+ qn = connection.ops.quote_name
+ stmt = 'SELECT %(table)s.%(wkt_col)s FROM %(table)s WHERE (%(table)s.%(srid_col)s = %(srid)s)'
+ stmt = stmt % {'table' : qn(SpatialRefSys._meta.db_table),
+ 'wkt_col' : qn(SpatialRefSys.wkt_col()),
+ 'srid_col' : qn('srid'),
+ 'srid' : srid,
+ }
+ cur.execute(stmt)
+
+ # Fetching the WKT from the cursor; if the query failed raise an Exception.
+ fetched = cur.fetchone()
+ if not fetched:
+ raise ValueError('Failed to find spatial reference entry in "%s" corresponding to SRID=%s.' %
+ (SpatialRefSys._meta.db_table, srid))
+ srs_wkt = fetched[0]
+
+ # Getting metadata associated with the spatial reference system identifier.
+ # Specifically, getting the unit information and spheroid information
+ # (both required for distance queries).
+ unit, unit_name = SpatialRefSys.get_units(srs_wkt)
+ spheroid = SpatialRefSys.get_spheroid(srs_wkt)
+ return unit, unit_name, spheroid
+else:
+ def get_srid_info(srid):
+ """
+ Dummy routine for the backends that do not have the OGC required
+ spatial metadata tables (like MySQL).
+ """
+ return None, None, None
+
diff --git a/django/contrib/gis/oldforms/__init__.py b/django/contrib/gis/oldforms/__init__.py
new file mode 100644
index 0000000000..94ef9acc1f
--- /dev/null
+++ b/django/contrib/gis/oldforms/__init__.py
@@ -0,0 +1,29 @@
+from django.core.validators import ValidationError
+from django.oldforms import LargeTextField
+from django.contrib.gis.geos import GEOSException, GEOSGeometry
+
+class WKTField(LargeTextField):
+ "An oldforms LargeTextField for editing WKT text in the admin."
+ def __init__(self, *args, **kwargs):
+ super(WKTField, self).__init__(*args, **kwargs)
+ # Overridding the validator list.
+ self.validator_list = [self.isValidGeom]
+
+ def render(self, data):
+ # Returns the WKT value for the geometry field. When no such data
+ # is present, return None to LargeTextField's render.
+ if isinstance(data, GEOSGeometry):
+ return super(WKTField, self).render(data.wkt)
+ elif isinstance(data, basestring):
+ return super(WKTField, self).render(data)
+ else:
+ return super(WKTField, self).render(None)
+
+ def isValidGeom(self, field_data, all_data):
+ try:
+ g = GEOSGeometry(field_data)
+ except GEOSException:
+ raise ValidationError('Valid WKT or HEXEWKB is required for Geometry Fields.')
+
+
+
diff --git a/django/contrib/gis/shortcuts.py b/django/contrib/gis/shortcuts.py
new file mode 100644
index 0000000000..8eeaed1aaa
--- /dev/null
+++ b/django/contrib/gis/shortcuts.py
@@ -0,0 +1,12 @@
+from django.http import HttpResponse
+from django.template import loader
+
+def render_to_kml(*args, **kwargs):
+ "Renders the response using the MIME type for KML."
+ return HttpResponse(loader.render_to_string(*args, **kwargs),
+ mimetype='application/vnd.google-earth.kml+xml kml')
+
+def render_to_text(*args, **kwargs):
+ "Renders the response using the MIME type for plain text."
+ return HttpResponse(loader.render_to_string(*args, **kwargs),
+ mimetype='text/plain')
diff --git a/django/contrib/gis/sitemaps.py b/django/contrib/gis/sitemaps.py
new file mode 100644
index 0000000000..d5d11b9c0f
--- /dev/null
+++ b/django/contrib/gis/sitemaps.py
@@ -0,0 +1,55 @@
+from django.core import urlresolvers
+from django.contrib.sitemaps import Sitemap
+from django.contrib.gis.db.models.fields import GeometryField
+from django.contrib.gis.shortcuts import render_to_kml
+from django.db.models import get_model, get_models
+from django.http import HttpResponse
+
+class KMLSitemap(Sitemap):
+ """
+ A minimal hook to produce KML sitemaps.
+ """
+ def __init__(self, locations=None):
+ if locations is None:
+ self.locations = _build_kml_sources()
+ else:
+ self.locations = locations
+
+ def items(self):
+ return self.locations
+
+ def location(self, obj):
+ return urlresolvers.reverse('django.contrib.gis.sitemaps.kml',
+ kwargs={'label':obj[0],
+ 'field_name':obj[1]})
+
+def _build_kml_sources():
+ "Make a mapping of all available KML sources."
+ ret = []
+ for klass in get_models():
+ for field in klass._meta.fields:
+ if isinstance(field, GeometryField):
+ label = "%s.%s" % (klass._meta.app_label,
+ klass._meta.module_name)
+
+ ret.append((label, field.name))
+ return ret
+
+
+class KMLNotFound(Exception):
+ pass
+
+def kml(request, label, field_name):
+ placemarks = []
+ klass = get_model(*label.split('.'))
+ if not klass:
+ raise KMLNotFound("You must supply a valid app.model label. Got %s" % label)
+
+ #FIXME: GMaps apparently has a limit on size of displayed kml files
+ # check if paginating w/ external refs (i.e. linked list) helps.
+ placemarks.extend(list(klass._default_manager.kml(field_name)[:100]))
+
+ #FIXME: other KML features?
+ return render_to_kml('gis/kml/placemarks.kml', {'places' : placemarks})
+
+
diff --git a/django/contrib/gis/templates/gis/admin/openlayers.html b/django/contrib/gis/templates/gis/admin/openlayers.html
new file mode 100644
index 0000000000..acf82b284e
--- /dev/null
+++ b/django/contrib/gis/templates/gis/admin/openlayers.html
@@ -0,0 +1,37 @@
+{% block extrastyle %}
+<style type="text/css">
+ #{{ id }}_map { width: {{ map_width }}px; height: {{ map_height }}px; }
+ #{{ id }}_map .aligned label { float:inherit; }
+ #{{ id }}_admin_map { position: relative; vertical-align: top; float: left; }
+ {% if not display_wkt %}#{{ id }} { display: none; }{% endif %}
+ .olControlEditingToolbar .olControlModifyFeatureItemActive {
+ background-image: url("{{ admin_media_prefix }}img/gis/move_vertex_on.png");
+ background-repeat: no-repeat;
+ }
+ .olControlEditingToolbar .olControlModifyFeatureItemInactive {
+ background-image: url("{{ admin_media_prefix }}img/gis/move_vertex_off.png");
+ background-repeat: no-repeat;
+ }
+</style>
+<!--[if IE]>
+<style type="text/css">
+ /* This fixes the the mouse offset issues in IE. */
+ #{{ id }}_admin_map { position: static; vertical-align: top; }
+ /* `font-size: 0` fixes the 1px border between tiles, but borks LayerSwitcher.
+ Thus, this is disabled until a better fix is found.
+ #{{ id }}_map { width: {{ map_width }}px; height: {{ map_height }}px; font-size: 0; } */
+</style>
+<![endif]-->
+{% endblock %}
+<span id="{{ id }}_admin_map">
+<script type="text/javascript">
+//<![CDATA[
+{% block openlayers %}{% include "gis/admin/openlayers.js" %}{% endblock %}
+//]]>
+</script>
+<div id="{{ id }}_map"></div>
+<a href="javascript:{{ module }}.clearFeatures()">Delete all Features</a>
+{% if display_wkt %}<p> WKT debugging window:</p>{% endif %}
+<textarea id="{{ id }}" class="vWKTField required" cols="150" rows="10" name="{{ field_name }}">{{ wkt }}</textarea>
+<script type="text/javascript">{% block init_function %}{{ module }}.init();{% endblock %}</script>
+</span>
diff --git a/django/contrib/gis/templates/gis/admin/openlayers.js b/django/contrib/gis/templates/gis/admin/openlayers.js
new file mode 100644
index 0000000000..719426127c
--- /dev/null
+++ b/django/contrib/gis/templates/gis/admin/openlayers.js
@@ -0,0 +1,157 @@
+{# Author: Justin Bronn, Travis Pinney & Dane Springmeyer #}
+{% block vars %}var {{ module }} = {};
+{{ module }}.map = null; {{ module }}.controls = null; {{ module }}.panel = null; {{ module }}.re = new RegExp("^SRID=\d+;(.+)", "i"); {{ module }}.layers = {};
+{{ module }}.wkt_f = new OpenLayers.Format.WKT();
+{{ module }}.is_collection = {% if is_collection %}true{% else %}false{% endif %};
+{{ module }}.collection_type = '{{ collection_type }}';
+{{ module }}.is_linestring = {% if is_linestring %}true{% else %}false{% endif %};
+{{ module }}.is_polygon = {% if is_polygon %}true{% else %}false{% endif %};
+{{ module }}.is_point = {% if is_point %}true{% else %}false{% endif %};
+{% endblock %}
+{{ module }}.get_ewkt = function(feat){return 'SRID={{ srid }};' + {{ module }}.wkt_f.write(feat);}
+{{ module }}.read_wkt = function(wkt){
+ // OpenLayers cannot handle EWKT -- we make sure to strip it out.
+ // EWKT is only exposed to OL if there's a validation error in the admin.
+ var match = {{ module }}.re.exec(wkt);
+ if (match){wkt = match[1];}
+ return {{ module }}.wkt_f.read(wkt);
+}
+{{ module }}.write_wkt = function(feat){
+ if ({{ module }}.is_collection){ {{ module }}.num_geom = feat.geometry.components.length;}
+ else { {{ module }}.num_geom = 1;}
+ document.getElementById('{{ id }}').value = {{ module }}.get_ewkt(feat);
+}
+{{ module }}.add_wkt = function(event){
+ // This function will sync the contents of the `vector` layer with the
+ // WKT in the text field.
+ if ({{ module }}.is_collection){
+ var feat = new OpenLayers.Feature.Vector(new OpenLayers.Geometry.{{ geom_type }}());
+ for (var i = 0; i < {{ module }}.layers.vector.features.length; i++){
+ feat.geometry.addComponents([{{ module }}.layers.vector.features[i].geometry]);
+ }
+ {{ module }}.write_wkt(feat);
+ } else {
+ // Make sure to remove any previously added features.
+ if ({{ module }}.layers.vector.features.length > 1){
+ old_feats = [{{ module }}.layers.vector.features[0]];
+ {{ module }}.layers.vector.removeFeatures(old_feats);
+ {{ module }}.layers.vector.destroyFeatures(old_feats);
+ }
+ {{ module }}.write_wkt(event.feature);
+ }
+}
+{{ module }}.modify_wkt = function(event){
+ if ({{ module }}.is_collection){
+ if ({{ module }}.is_point){
+ {{ module }}.add_wkt(event);
+ return;
+ } else {
+ // When modifying the selected components are added to the
+ // vector layer so we only increment to the `num_geom` value.
+ var feat = new OpenLayers.Feature.Vector(new OpenLayers.Geometry.{{ geom_type }}());
+ for (var i = 0; i < {{ module }}.num_geom; i++){
+ feat.geometry.addComponents([{{ module }}.layers.vector.features[i].geometry]);
+ }
+ {{ module }}.write_wkt(feat);
+ }
+ } else {
+ {{ module }}.write_wkt(event.feature);
+ }
+}
+// Function to clear vector features and purge wkt from div
+{{ module }}.deleteFeatures = function(){
+ {{ module }}.layers.vector.removeFeatures({{ module }}.layers.vector.features);
+ {{ module }}.layers.vector.destroyFeatures();
+}
+{{ module }}.clearFeatures = function (){
+ {{ module }}.deleteFeatures();
+ document.getElementById('{{ id }}').value = '';
+ {{ module }}.map.setCenter(new OpenLayers.LonLat({{ default_lon }}, {{ default_lat }}), {{ default_zoom }});
+}
+// Add Select control
+{{ module }}.addSelectControl = function(){
+ var select = new OpenLayers.Control.SelectFeature({{ module }}.layers.vector, {'toggle' : true, 'clickout' : true});
+ {{ module }}.map.addControl(select);
+ select.activate();
+}
+{{ module }}.enableDrawing = function(){ {{ module }}.map.getControlsByClass('OpenLayers.Control.DrawFeature')[0].activate();}
+{{ module }}.enableEditing = function(){ {{ module }}.map.getControlsByClass('OpenLayers.Control.ModifyFeature')[0].activate();}
+// Create an array of controls based on geometry type
+{{ module }}.getControls = function(lyr){
+ {{ module }}.panel = new OpenLayers.Control.Panel({'displayClass': 'olControlEditingToolbar'});
+ var nav = new OpenLayers.Control.Navigation();
+ var draw_ctl;
+ if ({{ module }}.is_linestring){
+ draw_ctl = new OpenLayers.Control.DrawFeature(lyr, OpenLayers.Handler.Path, {'displayClass': 'olControlDrawFeaturePath'});
+ } else if ({{ module }}.is_polygon){
+ draw_ctl = new OpenLayers.Control.DrawFeature(lyr, OpenLayers.Handler.Polygon, {'displayClass': 'olControlDrawFeaturePolygon'});
+ } else if ({{ module }}.is_point){
+ draw_ctl = new OpenLayers.Control.DrawFeature(lyr, OpenLayers.Handler.Point, {'displayClass': 'olControlDrawFeaturePoint'});
+ }
+ {% if modifiable %}
+ var mod = new OpenLayers.Control.ModifyFeature(lyr, {'displayClass': 'olControlModifyFeature'});
+ {{ module }}.controls = [nav, draw_ctl, mod];
+ {% else %}
+ {{ module }}.controls = [nav, darw_ctl];
+ {% endif %}
+}
+{{ module }}.init = function(){
+ {% block map_options %}// The options hash, w/ zoom, resolution, and projection settings.
+ var options = {
+{% autoescape off %}{% for item in map_options.items %} '{{ item.0 }}' : {{ item.1 }}{% if not forloop.last %},{% endif %}
+{% endfor %}{% endautoescape %} };{% endblock %}
+ // The admin map for this geometry field.
+ {{ module }}.map = new OpenLayers.Map('{{ id }}_map', options);
+ // Base Layer
+ {{ module }}.layers.base = {% block base_layer %}new OpenLayers.Layer.WMS( "{{ wms_name }}", "{{ wms_url }}", {layers: '{{ wms_layer }}'} );{% endblock %}
+ {{ module }}.map.addLayer({{ module }}.layers.base);
+ {% block extra_layers %}{% endblock %}
+ {% if is_linestring %}OpenLayers.Feature.Vector.style["default"]["strokeWidth"] = 3; // Default too thin for linestrings. {% endif %}
+ {{ module }}.layers.vector = new OpenLayers.Layer.Vector(" {{ field_name }}");
+ {{ module }}.map.addLayer({{ module }}.layers.vector);
+ // Read WKT from the text field.
+ var wkt = document.getElementById('{{ id }}').value;
+ if (wkt){
+ // After reading into geometry, immediately write back to
+ // WKT <textarea> as EWKT (so that SRID is included).
+ var admin_geom = {{ module }}.read_wkt(wkt);
+ {{ module }}.write_wkt(admin_geom);
+ if ({{ module }}.is_collection){
+ // If geometry collection, add each component individually so they may be
+ // edited individually.
+ for (var i = 0; i < {{ module }}.num_geom; i++){
+ {{ module }}.layers.vector.addFeatures([new OpenLayers.Feature.Vector(admin_geom.geometry.components[i].clone())]);
+ }
+ } else {
+ {{ module }}.layers.vector.addFeatures([admin_geom]);
+ }
+ // Zooming to the bounds.
+ {{ module }}.map.zoomToExtent(admin_geom.geometry.getBounds());
+ } else {
+ {{ module }}.map.setCenter(new OpenLayers.LonLat({{ default_lon }}, {{ default_lat }}), {{ default_zoom }});
+ }
+ // This allows editing of the geographic fields -- the modified WKT is
+ // written back to the content field (as EWKT, so that the ORM will know
+ // to transform back to original SRID).
+ {{ module }}.layers.vector.events.on({"featuremodified" : {{ module }}.modify_wkt});
+ {{ module }}.layers.vector.events.on({"featureadded" : {{ module }}.add_wkt});
+ {% block controls %}
+ // Map controls:
+ // Add geometry specific panel of toolbar controls
+ {{ module }}.getControls({{ module }}.layers.vector);
+ {{ module }}.panel.addControls({{ module }}.controls);
+ {{ module }}.map.addControl({{ module }}.panel);
+ {{ module }}.addSelectControl();
+ // Then add optional visual controls
+ {% if mouse_position %}{{ module }}.map.addControl(new OpenLayers.Control.MousePosition());{% endif %}
+ {% if scale_text %}{{ module }}.map.addControl(new OpenLayers.Control.Scale());{% endif %}
+ {% if layerswitcher %}{{ module }}.map.addControl(new OpenLayers.Control.LayerSwitcher());{% endif %}
+ // Then add optional behavior controls
+ {% if scrollable %}{% else %}{{ module }}.map.getControlsByClass('OpenLayers.Control.Navigation')[0].disableZoomWheel();{% endif %}
+ {% endblock %}
+ if (wkt){
+ {{ module }}.enableEditing();
+ } else {
+ {{ module }}.enableDrawing();
+ }
+}
diff --git a/django/contrib/gis/templates/gis/admin/osm.html b/django/contrib/gis/templates/gis/admin/osm.html
new file mode 100644
index 0000000000..b74b41fee8
--- /dev/null
+++ b/django/contrib/gis/templates/gis/admin/osm.html
@@ -0,0 +1,2 @@
+{% extends "gis/admin/openlayers.html" %}
+{% block openlayers %}{% include "gis/admin/osm.js" %}{% endblock %} \ No newline at end of file
diff --git a/django/contrib/gis/templates/gis/admin/osm.js b/django/contrib/gis/templates/gis/admin/osm.js
new file mode 100644
index 0000000000..2a1f59e4d3
--- /dev/null
+++ b/django/contrib/gis/templates/gis/admin/osm.js
@@ -0,0 +1,2 @@
+{% extends "gis/admin/openlayers.js" %}
+{% block base_layer %}new OpenLayers.Layer.OSM.Mapnik("OpenStreetMap (Mapnik)");{% endblock %}
diff --git a/django/contrib/gis/templates/gis/google/js/google-map.js b/django/contrib/gis/templates/gis/google/js/google-map.js
new file mode 100644
index 0000000000..5efdf9045e
--- /dev/null
+++ b/django/contrib/gis/templates/gis/google/js/google-map.js
@@ -0,0 +1,34 @@
+{% autoescape off %}{% block vars %}var map;{% endblock %}
+{% block functions %}{% endblock %}
+{% block load %}function {{ load_func }}(){
+ if (GBrowserIsCompatible()) {
+ map = new GMap2(document.getElementById("{{ dom_id }}"));
+ map.setCenter(new GLatLng({{ center.1 }}, {{ center.0 }}), {{ zoom }});
+ {% block controls %}map.addControl(new GSmallMapControl());
+ map.addControl(new GMapTypeControl());{% endblock %}
+ {% if calc_zoom %}var bounds = new GLatLngBounds(); var tmp_bounds = new GLatLngBounds();{% endif %}
+ {% for kml_url in kml_urls %}var kml{{ forloop.counter }} = new GGeoXml("{{ kml_url }}");
+ map.addOverlay(kml{{ forloop.counter }});{% endfor %}
+
+ {% for polygon in polygons %}var poly{{ forloop.counter }} = new {{ polygon }};
+ map.addOverlay(poly{{ forloop.counter }});
+ {% for event in polygon.events %}GEvent.addListener(poly{{ forloop.parentloop.counter }}, {{ event }});{% endfor %}
+ {% if calc_zoom %}tmp_bounds = poly{{ forloop.counter }}.getBounds(); bounds.extend(tmp_bounds.getSouthWest()); bounds.extend(tmp_bounds.getNorthEast());{% endif %}{% endfor %}
+
+ {% for polyline in polylines %}var polyline{{ forloop.counter }} = new {{ polyline }};
+ map.addOverlay(polyline{{ forloop.counter }});
+ {% for event in polyline.events %}GEvent.addListener(polyline{{ forloop.parentloop.counter }}, {{ event }}); {% endfor %}
+ {% if calc_zoom %}tmp_bounds = polyline{{ forloop.counter }}.getBounds(); bounds.extend(tmp_bounds.getSouthWest()); bounds.extend(tmp_bounds.getNorthEast());{% endif %}{% endfor %}
+
+ {% for marker in markers %}var marker{{ forloop.counter }} = new {{ marker }};
+ map.addOverlay(marker{{ forloop.counter }});
+ {% for event in marker.events %}GEvent.addListener(marker{{ forloop.parentloop.counter }}, {{ event }}); {% endfor %}
+ {% if calc_zoom %}bounds.extend(marker{{ forloop.counter }}.getLatLng()); {% endif %}{% endfor %}
+
+ {% if calc_zoom %}map.setCenter(bounds.getCenter(), map.getBoundsZoomLevel(bounds));{% endif %}
+ {% block load_extra %}{% endblock %}
+ }else {
+ alert("Sorry, the Google Maps API is not compatible with this browser.");
+ }
+}
+{% endblock %}{% endautoescape %}
diff --git a/django/contrib/gis/templates/gis/kml/base.kml b/django/contrib/gis/templates/gis/kml/base.kml
new file mode 100644
index 0000000000..374404c39f
--- /dev/null
+++ b/django/contrib/gis/templates/gis/kml/base.kml
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<kml xmlns="http://earth.google.com/kml/{% block kml_version %}2.1{% endblock %}">
+<Document>{% block name %}{% endblock %}
+{% block placemarks %}{% endblock %}
+</Document>
+</kml>
diff --git a/django/contrib/gis/templates/gis/kml/placemarks.kml b/django/contrib/gis/templates/gis/kml/placemarks.kml
new file mode 100644
index 0000000000..2b9b5e2f02
--- /dev/null
+++ b/django/contrib/gis/templates/gis/kml/placemarks.kml
@@ -0,0 +1,8 @@
+{% extends "gis/kml/base.kml" %}
+{% block placemarks %}{% for place in places %}
+ <Placemark>
+ <name>{{ place.name|escape }}</name>
+ <description>{{ place.description|escape }}</description>
+ {{ place.kml }}
+ </Placemark>{% endfor %}{% endblock %}
+
diff --git a/django/contrib/gis/tests/__init__.py b/django/contrib/gis/tests/__init__.py
new file mode 100644
index 0000000000..9bf1ccd936
--- /dev/null
+++ b/django/contrib/gis/tests/__init__.py
@@ -0,0 +1,148 @@
+import sys
+from copy import copy
+from unittest import TestSuite, TextTestRunner
+from django.contrib.gis.gdal import HAS_GDAL
+try:
+ from django.contrib.gis.tests.utils import mysql, oracle, postgis
+except:
+ mysql, oracle, postgis = (False, False, False)
+from django.contrib.gis.utils import HAS_GEOIP
+from django.conf import settings
+if not settings._target: settings.configure()
+
+# Tests that require use of a spatial database (e.g., creation of models)
+test_models = ['geoapp',]
+
+# Tests that do not require setting up and tearing down a spatial database.
+test_suite_names = [
+ 'test_geos',
+ 'test_measure',
+]
+if HAS_GDAL:
+ if oracle:
+ # TODO: There's a problem with `select_related` and GeoQuerySet on
+ # Oracle -- e.g., GeoModel.objects.distance(geom, field_name='fk__point')
+ # doesn't work so we don't test `relatedapp`.
+ test_models += ['distapp', 'layermap']
+ elif postgis:
+ test_models += ['distapp', 'layermap', 'relatedapp']
+ elif mysql:
+ test_models += ['relatedapp']
+
+ test_suite_names += [
+ 'test_gdal_driver',
+ 'test_gdal_ds',
+ 'test_gdal_envelope',
+ 'test_gdal_geom',
+ 'test_gdal_srs',
+ 'test_spatialrefsys',
+ ]
+else:
+ print >>sys.stderr, "GDAL not available - no GDAL tests will be run."
+
+if HAS_GEOIP:
+ if hasattr(settings, 'GEOIP_PATH'):
+ test_suite_names.append('test_geoip')
+
+def geo_suite():
+ """
+ Builds a test suite for the GIS package. This is not named
+ `suite` so it will not interfere with the Django test suite (since
+ spatial database tables are required to execute these tests on
+ some backends).
+ """
+ s = TestSuite()
+ for test_suite in test_suite_names:
+ tsuite = getattr(__import__('django.contrib.gis.tests', globals(), locals(), [test_suite]),test_suite)
+ s.addTest(tsuite.suite())
+ return s
+
+def run(verbosity=1):
+ "Runs the tests that do not require geographic (GEOS, GDAL, etc.) models."
+ TextTestRunner(verbosity=verbosity).run(geo_suite())
+
+def run_tests(module_list, verbosity=1, interactive=True):
+ """
+ Run the tests that require creation of a spatial database.
+
+ In order to run geographic model tests the DATABASE_USER will require
+ superuser priviliges. To accomplish this outside the `postgres` user,
+ create your own PostgreSQL database as a user:
+ (1) Initialize database: `initdb -D /path/to/user/db`
+ (2) If there's already a Postgres instance on the machine, it will need
+ to use a different TCP port than 5432. Edit postgresql.conf (in
+ /path/to/user/db) to change the database port (e.g. `port = 5433`).
+ (3) Start this database `pg_ctl -D /path/to/user/db start`
+
+ On Windows platforms simply use the pgAdmin III utility to add superuser
+ privileges to your database user.
+
+ Make sure your settings.py matches the settings of the user database.
+ For example, set the same port number (`DATABASE_PORT=5433`).
+ DATABASE_NAME or TEST_DATABSE_NAME must be set, along with DATABASE_USER.
+
+ In settings.py set TEST_RUNNER='django.contrib.gis.tests.run_tests'.
+
+ Finally, this assumes that the PostGIS SQL files (lwpostgis.sql and
+ spatial_ref_sys.sql) are installed in the directory specified by
+ `pg_config --sharedir` (and defaults to /usr/local/share if that fails).
+ This behavior is overridden if `POSTGIS_SQL_PATH` is in your settings.
+
+ Windows users should set POSTGIS_SQL_PATH manually because the output
+ of `pg_config` uses paths like 'C:/PROGRA~1/POSTGR~1/..'.
+
+ Finally, the tests may be run by invoking `./manage.py test`.
+ """
+ from django.contrib.gis.db.backend import create_spatial_db
+ from django.db import connection
+ from django.test.utils import destroy_test_db
+
+ # Getting initial values.
+ old_debug = settings.DEBUG
+ old_name = copy(settings.DATABASE_NAME)
+ old_installed = copy(settings.INSTALLED_APPS)
+ new_installed = copy(settings.INSTALLED_APPS)
+
+ # Want DEBUG to be set to False.
+ settings.DEBUG = False
+
+ from django.db.models import loading
+
+ # Creating the test suite, adding the test models to INSTALLED_APPS, and
+ # adding the model test suites to our suite package.
+ test_suite = geo_suite()
+ for test_model in test_models:
+ module_name = 'django.contrib.gis.tests.%s' % test_model
+ if mysql:
+ test_module_name = 'tests_mysql'
+ else:
+ test_module_name = 'tests'
+ new_installed.append(module_name)
+
+ # Getting the test suite
+ tsuite = getattr(__import__('django.contrib.gis.tests.%s' % test_model, globals(), locals(), [test_module_name]), test_module_name)
+ test_suite.addTest(tsuite.suite())
+
+ # Resetting the loaded flag to take into account what we appended to
+ # the INSTALLED_APPS (since this routine is invoked through
+ # django/core/management, it caches the apps; this ensures that syncdb
+ # will see our appended models)
+ settings.INSTALLED_APPS = new_installed
+ loading.cache.loaded = False
+
+ # Creating the test spatial database.
+ create_spatial_db(test=True, verbosity=verbosity)
+
+ # Executing the tests (including the model tests)
+ result = TextTestRunner(verbosity=verbosity).run(test_suite)
+
+ # Cleaning up, destroying the test spatial database and resetting the INSTALLED_APPS.
+ destroy_test_db(old_name, verbosity)
+ settings.DEBUG = old_debug
+ settings.INSTALLED_APPS = old_installed
+
+ # Returning the total failures and errors
+ return len(result.failures) + len(result.errors)
+
+if __name__ == '__main__':
+ run()
diff --git a/django/contrib/gis/tests/data/test_point/test_point.dbf b/django/contrib/gis/tests/data/test_point/test_point.dbf
new file mode 100644
index 0000000000..b2b4ecaea2
--- /dev/null
+++ b/django/contrib/gis/tests/data/test_point/test_point.dbf
Binary files differ
diff --git a/django/contrib/gis/tests/data/test_point/test_point.prj b/django/contrib/gis/tests/data/test_point/test_point.prj
new file mode 100644
index 0000000000..a30c00a55d
--- /dev/null
+++ b/django/contrib/gis/tests/data/test_point/test_point.prj
@@ -0,0 +1 @@
+GEOGCS["GCS_WGS_1984",DATUM["D_WGS_1984",SPHEROID["WGS_1984",6378137,298.257223563]],PRIMEM["Greenwich",0],UNIT["Degree",0.017453292519943295]] \ No newline at end of file
diff --git a/django/contrib/gis/tests/data/test_point/test_point.shp b/django/contrib/gis/tests/data/test_point/test_point.shp
new file mode 100644
index 0000000000..95e8b0ac9b
--- /dev/null
+++ b/django/contrib/gis/tests/data/test_point/test_point.shp
Binary files differ
diff --git a/django/contrib/gis/tests/data/test_point/test_point.shx b/django/contrib/gis/tests/data/test_point/test_point.shx
new file mode 100644
index 0000000000..087f3da1f7
--- /dev/null
+++ b/django/contrib/gis/tests/data/test_point/test_point.shx
Binary files differ
diff --git a/django/contrib/gis/tests/data/test_poly/test_poly.dbf b/django/contrib/gis/tests/data/test_poly/test_poly.dbf
new file mode 100644
index 0000000000..7965bd614d
--- /dev/null
+++ b/django/contrib/gis/tests/data/test_poly/test_poly.dbf
Binary files differ
diff --git a/django/contrib/gis/tests/data/test_poly/test_poly.prj b/django/contrib/gis/tests/data/test_poly/test_poly.prj
new file mode 100644
index 0000000000..a30c00a55d
--- /dev/null
+++ b/django/contrib/gis/tests/data/test_poly/test_poly.prj
@@ -0,0 +1 @@
+GEOGCS["GCS_WGS_1984",DATUM["D_WGS_1984",SPHEROID["WGS_1984",6378137,298.257223563]],PRIMEM["Greenwich",0],UNIT["Degree",0.017453292519943295]] \ No newline at end of file
diff --git a/django/contrib/gis/tests/data/test_poly/test_poly.shp b/django/contrib/gis/tests/data/test_poly/test_poly.shp
new file mode 100644
index 0000000000..b22930bd24
--- /dev/null
+++ b/django/contrib/gis/tests/data/test_poly/test_poly.shp
Binary files differ
diff --git a/django/contrib/gis/tests/data/test_poly/test_poly.shx b/django/contrib/gis/tests/data/test_poly/test_poly.shx
new file mode 100644
index 0000000000..c92f78bd4c
--- /dev/null
+++ b/django/contrib/gis/tests/data/test_poly/test_poly.shx
Binary files differ
diff --git a/django/contrib/gis/tests/data/test_vrt/test_vrt.csv b/django/contrib/gis/tests/data/test_vrt/test_vrt.csv
new file mode 100644
index 0000000000..dff648ffe0
--- /dev/null
+++ b/django/contrib/gis/tests/data/test_vrt/test_vrt.csv
@@ -0,0 +1,4 @@
+POINT_X,POINT_Y,NUM
+1.0,2.0,5
+5.0,23.0,17
+100.0,523.5,23
diff --git a/django/contrib/gis/tests/data/test_vrt/test_vrt.vrt b/django/contrib/gis/tests/data/test_vrt/test_vrt.vrt
new file mode 100644
index 0000000000..85e6be8e27
--- /dev/null
+++ b/django/contrib/gis/tests/data/test_vrt/test_vrt.vrt
@@ -0,0 +1,7 @@
+<OGRVRTDataSource>
+<OGRVRTLayer name="test_vrt">
+<SrcDataSource relativeToVRT="1">test_vrt.csv</SrcDataSource>
+<GeometryType>wkbPoint</GeometryType>
+<GeometryField encoding="PointFromColumns" x="POINT_X" y="POINT_Y" z="NUM"/>
+</OGRVRTLayer>
+</OGRVRTDataSource> \ No newline at end of file
diff --git a/django/contrib/gis/tests/distapp/__init__.py b/django/contrib/gis/tests/distapp/__init__.py
new file mode 100644
index 0000000000..e69de29bb2
--- /dev/null
+++ b/django/contrib/gis/tests/distapp/__init__.py
diff --git a/django/contrib/gis/tests/distapp/data.py b/django/contrib/gis/tests/distapp/data.py
new file mode 100644
index 0000000000..fefe313905
--- /dev/null
+++ b/django/contrib/gis/tests/distapp/data.py
@@ -0,0 +1,33 @@
+au_cities = (('Wollongong', 150.902, -34.4245),
+ ('Shellharbour', 150.87, -34.5789),
+ ('Thirroul', 150.924, -34.3147),
+ ('Mittagong', 150.449, -34.4509),
+ ('Batemans Bay', 150.175, -35.7082),
+ ('Canberra', 144.963, -37.8143),
+ ('Melbourne', 145.963, -37.8143),
+ ('Sydney', 151.26071, -33.887034),
+ ('Hobart', 147.33, -42.8827),
+ ('Adelaide', 138.6, -34.9258),
+ ('Hillsdale', 151.231341, -33.952685),
+ )
+
+stx_cities = (('Downtown Houston', -95.363151, 29.763374),
+ ('West University Place', -95.448601, 29.713803),
+ ('Southside Place', -95.436920, 29.705777),
+ ('Bellaire', -95.458732, 29.705614),
+ ('Pearland', -95.287303, 29.563568),
+ ('Galveston', -94.797489, 29.301336),
+ ('Sealy', -96.156952, 29.780918),
+ ('San Antonio', -98.493183, 29.424170),
+ ('Saint Hedwig', -98.199820, 29.414197),
+ )
+
+# Data from U.S. Census ZCTA cartographic boundary file for Texas (`zt48_d00.shp`).
+stx_zips = (('77002', 'POLYGON ((-95.365015 29.772327, -95.362415 29.772327, -95.360915 29.771827, -95.354615 29.771827, -95.351515 29.772527, -95.350915 29.765327, -95.351015 29.762436, -95.350115 29.760328, -95.347515 29.758528, -95.352315 29.753928, -95.356415 29.756328, -95.358215 29.754028, -95.360215 29.756328, -95.363415 29.757128, -95.364014 29.75638, -95.363415 29.753928, -95.360015 29.751828, -95.361815 29.749528, -95.362715 29.750028, -95.367516 29.744128, -95.369316 29.745128, -95.373916 29.744128, -95.380116 29.738028, -95.387916 29.727929, -95.388516 29.729629, -95.387916 29.732129, -95.382916 29.737428, -95.376616 29.742228, -95.372616 29.747228, -95.378601 29.750846, -95.378616 29.752028, -95.378616 29.754428, -95.376016 29.754528, -95.374616 29.759828, -95.373616 29.761128, -95.371916 29.763928, -95.372316 29.768727, -95.365884 29.76791, -95.366015 29.767127, -95.358715 29.765327, -95.358615 29.766327, -95.359115 29.767227, -95.360215 29.767027, -95.362783 29.768267, -95.365315 29.770527, -95.365015 29.772327))'),
+ ('77005', 'POLYGON ((-95.447918 29.727275, -95.428017 29.728729, -95.421117 29.729029, -95.418617 29.727629, -95.418517 29.726429, -95.402117 29.726629, -95.402117 29.725729, -95.395316 29.725729, -95.391916 29.726229, -95.389716 29.725829, -95.396517 29.715429, -95.397517 29.715929, -95.400917 29.711429, -95.411417 29.715029, -95.418417 29.714729, -95.418317 29.70623, -95.440818 29.70593, -95.445018 29.70683, -95.446618 29.70763, -95.447418 29.71003, -95.447918 29.727275))'),
+ ('77025', 'POLYGON ((-95.418317 29.70623, -95.414717 29.706129, -95.414617 29.70533, -95.418217 29.70533, -95.419817 29.69533, -95.419484 29.694196, -95.417166 29.690901, -95.414517 29.69433, -95.413317 29.69263, -95.412617 29.68973, -95.412817 29.68753, -95.414087 29.685055, -95.419165 29.685428, -95.421617 29.68513, -95.425717 29.67983, -95.425017 29.67923, -95.424517 29.67763, -95.427418 29.67763, -95.438018 29.664631, -95.436713 29.664411, -95.440118 29.662231, -95.439218 29.661031, -95.437718 29.660131, -95.435718 29.659731, -95.431818 29.660331, -95.441418 29.656631, -95.441318 29.656331, -95.441818 29.656131, -95.441718 29.659031, -95.441118 29.661031, -95.446718 29.656431, -95.446518 29.673431, -95.446918 29.69013, -95.447418 29.71003, -95.446618 29.70763, -95.445018 29.70683, -95.440818 29.70593, -95.418317 29.70623))'),
+ ('77401', 'POLYGON ((-95.447918 29.727275, -95.447418 29.71003, -95.446918 29.69013, -95.454318 29.68893, -95.475819 29.68903, -95.475819 29.69113, -95.484419 29.69103, -95.484519 29.69903, -95.480419 29.70133, -95.480419 29.69833, -95.474119 29.69833, -95.474119 29.70453, -95.472719 29.71283, -95.468019 29.71293, -95.468219 29.720229, -95.464018 29.720229, -95.464118 29.724529, -95.463018 29.725929, -95.459818 29.726129, -95.459918 29.720329, -95.451418 29.720429, -95.451775 29.726303, -95.451318 29.727029, -95.447918 29.727275))'),
+ )
+
+interstates = (('I-25', 'LINESTRING(-104.4780170766108 36.66698791870694, -104.4468522338495 36.79925409393386, -104.46212692626 36.9372149776075, -104.5126119783768 37.08163268820887, -104.5247764602161 37.29300499892048, -104.7084397427668 37.49150259925398, -104.8126599016282 37.69514285621863, -104.8452887035466 37.87613395659479, -104.7160169341003 38.05951763337799, -104.6165437927668 38.30432045855106, -104.6437227858174 38.53979986564737, -104.7596170387259 38.7322907594295, -104.8380078676822 38.89998460604341, -104.8501253693506 39.09980189213358, -104.8791648316464 39.24368776457503, -104.8635041274215 39.3785278162751, -104.8894471170052 39.5929228239605, -104.9721242843344 39.69528482419685, -105.0112104500356 39.7273080432394, -105.0010368577104 39.76677607811571, -104.981835619 39.81466504121967, -104.9858891550477 39.88806911250832, -104.9873548059578 39.98117234571016, -104.9766220487419 40.09796423450692, -104.9818565932953 40.36056530662884, -104.9912746373997 40.74904484447656)'),
+ )
diff --git a/django/contrib/gis/tests/distapp/models.py b/django/contrib/gis/tests/distapp/models.py
new file mode 100644
index 0000000000..f23b277fea
--- /dev/null
+++ b/django/contrib/gis/tests/distapp/models.py
@@ -0,0 +1,42 @@
+from django.contrib.gis.db import models
+
+class SouthTexasCity(models.Model):
+ "City model on projected coordinate system for South Texas."
+ name = models.CharField(max_length=30)
+ point = models.PointField(srid=32140)
+ objects = models.GeoManager()
+ def __unicode__(self): return self.name
+
+class SouthTexasCityFt(models.Model):
+ "Same City model as above, but U.S. survey feet are the units."
+ name = models.CharField(max_length=30)
+ point = models.PointField(srid=2278)
+ objects = models.GeoManager()
+ def __unicode__(self): return self.name
+
+class AustraliaCity(models.Model):
+ "City model for Australia, using WGS84."
+ name = models.CharField(max_length=30)
+ point = models.PointField()
+ objects = models.GeoManager()
+ def __unicode__(self): return self.name
+
+class CensusZipcode(models.Model):
+ "Model for a few South Texas ZIP codes (in original Census NAD83)."
+ name = models.CharField(max_length=5)
+ poly = models.PolygonField(srid=4269)
+ objects = models.GeoManager()
+
+class SouthTexasZipcode(models.Model):
+ "Model for a few South Texas ZIP codes."
+ name = models.CharField(max_length=5)
+ poly = models.PolygonField(srid=32140)
+ objects = models.GeoManager()
+ def __unicode__(self): return self.name
+
+class Interstate(models.Model):
+ "Geodetic model for U.S. Interstates."
+ name = models.CharField(max_length=10)
+ line = models.LineStringField()
+ objects = models.GeoManager()
+ def __unicode__(self): return self.name
diff --git a/django/contrib/gis/tests/distapp/tests.py b/django/contrib/gis/tests/distapp/tests.py
new file mode 100644
index 0000000000..057e2f715e
--- /dev/null
+++ b/django/contrib/gis/tests/distapp/tests.py
@@ -0,0 +1,296 @@
+import os, unittest
+from decimal import Decimal
+
+from django.db.models import Q
+from django.contrib.gis.gdal import DataSource
+from django.contrib.gis.geos import GEOSGeometry, Point, LineString
+from django.contrib.gis.measure import D # alias for Distance
+from django.contrib.gis.db.models import GeoQ
+from django.contrib.gis.tests.utils import oracle, postgis, no_oracle
+
+from models import AustraliaCity, Interstate, SouthTexasCity, SouthTexasCityFt, CensusZipcode, SouthTexasZipcode
+from data import au_cities, interstates, stx_cities, stx_zips
+
+class DistanceTest(unittest.TestCase):
+
+ # A point we are testing distances with -- using a WGS84
+ # coordinate that'll be implicitly transormed to that to
+ # the coordinate system of the field, EPSG:32140 (Texas South Central
+ # w/units in meters)
+ stx_pnt = GEOSGeometry('POINT (-95.370401017314293 29.704867409475465)', 4326)
+ # Another one for Australia
+ au_pnt = GEOSGeometry('POINT (150.791 -34.4919)', 4326)
+
+ def get_names(self, qs):
+ cities = [c.name for c in qs]
+ cities.sort()
+ return cities
+
+ def test01_init(self):
+ "Initialization of distance models."
+
+ # Loading up the cities.
+ def load_cities(city_model, data_tup):
+ for name, x, y in data_tup:
+ c = city_model(name=name, point=Point(x, y, srid=4326))
+ c.save()
+
+ load_cities(SouthTexasCity, stx_cities)
+ load_cities(SouthTexasCityFt, stx_cities)
+ load_cities(AustraliaCity, au_cities)
+
+ self.assertEqual(9, SouthTexasCity.objects.count())
+ self.assertEqual(9, SouthTexasCityFt.objects.count())
+ self.assertEqual(11, AustraliaCity.objects.count())
+
+ # Loading up the South Texas Zip Codes.
+ for name, wkt in stx_zips:
+ poly = GEOSGeometry(wkt, srid=4269)
+ SouthTexasZipcode(name=name, poly=poly).save()
+ CensusZipcode(name=name, poly=poly).save()
+ self.assertEqual(4, SouthTexasZipcode.objects.count())
+ self.assertEqual(4, CensusZipcode.objects.count())
+
+ # Loading up the Interstates.
+ for name, wkt in interstates:
+ Interstate(name=name, line=GEOSGeometry(wkt, srid=4326)).save()
+ self.assertEqual(1, Interstate.objects.count())
+
+ def test02_dwithin(self):
+ "Testing the `dwithin` lookup type."
+ # Distances -- all should be equal (except for the
+ # degree/meter pair in au_cities, that's somewhat
+ # approximate).
+ tx_dists = [(7000, 22965.83), D(km=7), D(mi=4.349)]
+ au_dists = [(0.5, 32000), D(km=32), D(mi=19.884)]
+
+ # Expected cities for Australia and Texas.
+ tx_cities = ['Downtown Houston', 'Southside Place']
+ au_cities = ['Mittagong', 'Shellharbour', 'Thirroul', 'Wollongong']
+
+ # Performing distance queries on two projected coordinate systems one
+ # with units in meters and the other in units of U.S. survey feet.
+ for dist in tx_dists:
+ if isinstance(dist, tuple): dist1, dist2 = dist
+ else: dist1 = dist2 = dist
+ qs1 = SouthTexasCity.objects.filter(point__dwithin=(self.stx_pnt, dist1))
+ qs2 = SouthTexasCityFt.objects.filter(point__dwithin=(self.stx_pnt, dist2))
+ for qs in qs1, qs2:
+ self.assertEqual(tx_cities, self.get_names(qs))
+
+ # Now performing the `dwithin` queries on a geodetic coordinate system.
+ for dist in au_dists:
+ if isinstance(dist, D) and not oracle: type_error = True
+ else: type_error = False
+
+ if isinstance(dist, tuple):
+ if oracle: dist = dist[1]
+ else: dist = dist[0]
+
+ # Creating the query set.
+ qs = AustraliaCity.objects.order_by('name')
+ if type_error:
+ # A TypeError should be raised on PostGIS when trying to pass
+ # Distance objects into a DWithin query using a geodetic field.
+ self.assertRaises(TypeError, AustraliaCity.objects.filter, point__dwithin=(self.au_pnt, dist))
+ else:
+ self.assertEqual(au_cities, self.get_names(qs.filter(point__dwithin=(self.au_pnt, dist))))
+
+ def test03a_distance_method(self):
+ "Testing the `distance` GeoQuerySet method on projected coordinate systems."
+ # The point for La Grange, TX
+ lagrange = GEOSGeometry('POINT(-96.876369 29.905320)', 4326)
+ # Reference distances in feet and in meters. Got these values from
+ # using the provided raw SQL statements.
+ # SELECT ST_Distance(point, ST_Transform(ST_GeomFromText('POINT(-96.876369 29.905320)', 4326), 32140)) FROM distapp_southtexascity;
+ m_distances = [147075.069813, 139630.198056, 140888.552826,
+ 138809.684197, 158309.246259, 212183.594374,
+ 70870.188967, 165337.758878, 139196.085105]
+ # SELECT ST_Distance(point, ST_Transform(ST_GeomFromText('POINT(-96.876369 29.905320)', 4326), 2278)) FROM distapp_southtexascityft;
+ ft_distances = [482528.79154625, 458103.408123001, 462231.860397575,
+ 455411.438904354, 519386.252102563, 696139.009211594,
+ 232513.278304279, 542445.630586414, 456679.155883207]
+
+ # Testing using different variations of parameters and using models
+ # with different projected coordinate systems.
+ dist1 = SouthTexasCity.objects.distance(lagrange, field_name='point')
+ dist2 = SouthTexasCity.objects.distance(lagrange) # Using GEOSGeometry parameter
+ dist3 = SouthTexasCityFt.objects.distance(lagrange.ewkt) # Using EWKT string parameter.
+ dist4 = SouthTexasCityFt.objects.distance(lagrange)
+
+ # Original query done on PostGIS, have to adjust AlmostEqual tolerance
+ # for Oracle.
+ if oracle: tol = 2
+ else: tol = 5
+
+ # Ensuring expected distances are returned for each distance queryset.
+ for qs in [dist1, dist2, dist3, dist4]:
+ for i, c in enumerate(qs):
+ self.assertAlmostEqual(m_distances[i], c.distance.m, tol)
+ self.assertAlmostEqual(ft_distances[i], c.distance.survey_ft, tol)
+
+ def test03b_distance_method(self):
+ "Testing the `distance` GeoQuerySet method on geodetic coordnate systems."
+ if oracle: tol = 2
+ else: tol = 5
+
+ # Now testing geodetic distance aggregation.
+ hillsdale = AustraliaCity.objects.get(name='Hillsdale')
+ if not oracle:
+ # PostGIS is limited to disance queries only to/from point geometries,
+ # ensuring a TypeError is raised if something else is put in.
+ self.assertRaises(TypeError, AustraliaCity.objects.distance, 'LINESTRING(0 0, 1 1)')
+ self.assertRaises(TypeError, AustraliaCity.objects.distance, LineString((0, 0), (1, 1)))
+
+ # Got the reference distances using the raw SQL statements:
+ # SELECT ST_distance_spheroid(point, ST_GeomFromText('POINT(151.231341 -33.952685)', 4326), 'SPHEROID["WGS 84",6378137.0,298.257223563]') FROM distapp_australiacity WHERE (NOT (id = 11));
+ spheroid_distances = [60504.0628825298, 77023.948962654, 49154.8867507115, 90847.435881812, 217402.811862568, 709599.234619957, 640011.483583758, 7772.00667666425, 1047861.7859506, 1165126.55237647]
+ # SELECT ST_distance_sphere(point, ST_GeomFromText('POINT(151.231341 -33.952685)', 4326)) FROM distapp_australiacity WHERE (NOT (id = 11)); st_distance_sphere
+ sphere_distances = [60580.7612632291, 77143.7785056615, 49199.2725132184, 90804.4414289463, 217712.63666124, 709131.691061906, 639825.959074112, 7786.80274606706, 1049200.46122281, 1162619.7297006]
+
+ # Testing with spheroid distances first.
+ qs = AustraliaCity.objects.exclude(id=hillsdale.id).distance(hillsdale.point, spheroid=True)
+ for i, c in enumerate(qs):
+ self.assertAlmostEqual(spheroid_distances[i], c.distance.m, tol)
+ if postgis:
+ # PostGIS uses sphere-only distances by default, testing these as well.
+ qs = AustraliaCity.objects.exclude(id=hillsdale.id).distance(hillsdale.point)
+ for i, c in enumerate(qs):
+ self.assertAlmostEqual(sphere_distances[i], c.distance.m, tol)
+
+ @no_oracle # Oracle already handles geographic distance calculation.
+ def test03c_distance_method(self):
+ "Testing the `distance` GeoQuerySet method used with `transform` on a geographic field."
+ # Normally you can't compute distances from a geometry field
+ # that is not a PointField (on PostGIS).
+ self.assertRaises(TypeError, CensusZipcode.objects.distance, self.stx_pnt)
+
+ # We'll be using a Polygon (created by buffering the centroid
+ # of 77005 to 100m) -- which aren't allowed in geographic distance
+ # queries normally, however our field has been transformed to
+ # a non-geographic system.
+ z = SouthTexasZipcode.objects.get(name='77005')
+
+ # Reference query:
+ # SELECT ST_Distance(ST_Transform("distapp_censuszipcode"."poly", 32140), ST_GeomFromText('<buffer_wkt>', 32140)) FROM "distapp_censuszipcode";
+ dists_m = [3553.30384972258, 1243.18391525602, 2186.15439472242]
+
+ # Having our buffer in the SRID of the transformation and of the field
+ # -- should get the same results. The first buffer has no need for
+ # transformation SQL because it is the same SRID as what was given
+ # to `transform()`. The second buffer will need to be transformed,
+ # however.
+ buf1 = z.poly.centroid.buffer(100)
+ buf2 = buf1.transform(4269, clone=True)
+ for buf in [buf1, buf2]:
+ qs = CensusZipcode.objects.exclude(name='77005').transform(32140).distance(buf)
+ self.assertEqual(['77002', '77025', '77401'], self.get_names(qs))
+ for i, z in enumerate(qs):
+ self.assertAlmostEqual(z.distance.m, dists_m[i], 5)
+
+ def test04_distance_lookups(self):
+ "Testing the `distance_lt`, `distance_gt`, `distance_lte`, and `distance_gte` lookup types."
+ # Retrieving the cities within a 20km 'donut' w/a 7km radius 'hole'
+ # (thus, Houston and Southside place will be excluded as tested in
+ # the `test02_dwithin` above).
+ qs1 = SouthTexasCity.objects.filter(point__distance_gte=(self.stx_pnt, D(km=7))).filter(point__distance_lte=(self.stx_pnt, D(km=20)))
+ qs2 = SouthTexasCityFt.objects.filter(point__distance_gte=(self.stx_pnt, D(km=7))).filter(point__distance_lte=(self.stx_pnt, D(km=20)))
+ for qs in qs1, qs2:
+ cities = self.get_names(qs)
+ self.assertEqual(cities, ['Bellaire', 'Pearland', 'West University Place'])
+
+ # Doing a distance query using Polygons instead of a Point.
+ z = SouthTexasZipcode.objects.get(name='77005')
+ qs = SouthTexasZipcode.objects.exclude(name='77005').filter(poly__distance_lte=(z.poly, D(m=275)))
+ self.assertEqual(['77025', '77401'], self.get_names(qs))
+ # If we add a little more distance 77002 should be included.
+ qs = SouthTexasZipcode.objects.exclude(name='77005').filter(poly__distance_lte=(z.poly, D(m=300)))
+ self.assertEqual(['77002', '77025', '77401'], self.get_names(qs))
+
+ def test05_geodetic_distance_lookups(self):
+ "Testing distance lookups on geodetic coordinate systems."
+ if not oracle:
+ # Oracle doesn't have this limitation -- PostGIS only allows geodetic
+ # distance queries from Points to PointFields.
+ mp = GEOSGeometry('MULTIPOINT(0 0, 5 23)')
+ self.assertRaises(TypeError,
+ AustraliaCity.objects.filter(point__distance_lte=(mp, D(km=100))))
+ # Too many params (4 in this case) should raise a ValueError.
+ self.assertRaises(ValueError,
+ AustraliaCity.objects.filter, point__distance_lte=('POINT(5 23)', D(km=100), 'spheroid', '4'))
+
+ # Not enough params should raise a ValueError.
+ self.assertRaises(ValueError,
+ AustraliaCity.objects.filter, point__distance_lte=('POINT(5 23)',))
+
+ # Getting all cities w/in 550 miles of Hobart.
+ hobart = AustraliaCity.objects.get(name='Hobart')
+ qs = AustraliaCity.objects.exclude(name='Hobart').filter(point__distance_lte=(hobart.point, D(mi=550)))
+ cities = self.get_names(qs)
+ self.assertEqual(cities, ['Batemans Bay', 'Canberra', 'Melbourne'])
+
+ # Cities that are either really close or really far from Wollongong --
+ # and using different units of distance.
+ wollongong = AustraliaCity.objects.get(name='Wollongong')
+ d1, d2 = D(yd=19500), D(nm=400) # Yards (~17km) & Nautical miles.
+
+ # Normal geodetic distance lookup (uses `distance_sphere` on PostGIS.
+ gq1 = GeoQ(point__distance_lte=(wollongong.point, d1))
+ gq2 = GeoQ(point__distance_gte=(wollongong.point, d2))
+ qs1 = AustraliaCity.objects.exclude(name='Wollongong').filter(gq1 | gq2)
+
+ # Geodetic distance lookup but telling GeoDjango to use `distance_spheroid`
+ # instead (we should get the same results b/c accuracy variance won't matter
+ # in this test case). Using `Q` instead of `GeoQ` to be different (post-qsrf
+ # it doesn't matter).
+ if postgis:
+ gq3 = Q(point__distance_lte=(wollongong.point, d1, 'spheroid'))
+ gq4 = Q(point__distance_gte=(wollongong.point, d2, 'spheroid'))
+ qs2 = AustraliaCity.objects.exclude(name='Wollongong').filter(gq3 | gq4)
+ querysets = [qs1, qs2]
+ else:
+ querysets = [qs1]
+
+ for qs in querysets:
+ cities = self.get_names(qs)
+ self.assertEqual(cities, ['Adelaide', 'Hobart', 'Shellharbour', 'Thirroul'])
+
+ def test06_area(self):
+ "Testing the `area` GeoQuerySet method."
+ # Reference queries:
+ # SELECT ST_Area(poly) FROM distapp_southtexaszipcode;
+ area_sq_m = [5437908.90234375, 10183031.4389648, 11254471.0073242, 9881708.91772461]
+ # Tolerance has to be lower for Oracle and differences
+ # with GEOS 3.0.0RC4
+ tol = 2
+ for i, z in enumerate(SouthTexasZipcode.objects.area()):
+ self.assertAlmostEqual(area_sq_m[i], z.area.sq_m, tol)
+
+ def test07_length(self):
+ "Testing the `length` GeoQuerySet method."
+ # Reference query (should use `length_spheroid`).
+ # SELECT ST_length_spheroid(ST_GeomFromText('<wkt>', 4326) 'SPHEROID["WGS 84",6378137,298.257223563, AUTHORITY["EPSG","7030"]]');
+ len_m = 473504.769553813
+ qs = Interstate.objects.length()
+ if oracle: tol = 2
+ else: tol = 5
+ self.assertAlmostEqual(len_m, qs[0].length.m, tol)
+
+ def test08_perimeter(self):
+ "Testing the `perimeter` GeoQuerySet method."
+ # Reference query:
+ # SELECT ST_Perimeter(distapp_southtexaszipcode.poly) FROM distapp_southtexaszipcode;
+ perim_m = [18404.3550889361, 15627.2108551001, 20632.5588368978, 17094.5996143697]
+ if oracle: tol = 2
+ else: tol = 7
+ for i, z in enumerate(SouthTexasZipcode.objects.perimeter()):
+ self.assertAlmostEqual(perim_m[i], z.perimeter.m, tol)
+
+ # Running on points; should return 0.
+ for i, c in enumerate(SouthTexasCity.objects.perimeter(model_att='perim')):
+ self.assertEqual(0, c.perim.m)
+
+def suite():
+ s = unittest.TestSuite()
+ s.addTest(unittest.makeSuite(DistanceTest))
+ return s
diff --git a/django/contrib/gis/tests/geoapp/__init__.py b/django/contrib/gis/tests/geoapp/__init__.py
new file mode 100644
index 0000000000..e69de29bb2
--- /dev/null
+++ b/django/contrib/gis/tests/geoapp/__init__.py
diff --git a/django/contrib/gis/tests/geoapp/models.py b/django/contrib/gis/tests/geoapp/models.py
new file mode 100644
index 0000000000..fcb06e16a6
--- /dev/null
+++ b/django/contrib/gis/tests/geoapp/models.py
@@ -0,0 +1,33 @@
+from django.contrib.gis.db import models
+from django.contrib.gis.tests.utils import mysql
+
+# MySQL spatial indices can't handle NULL geometries.
+null_flag = not mysql
+
+class Country(models.Model):
+ name = models.CharField(max_length=30)
+ mpoly = models.MultiPolygonField() # SRID, by default, is 4326
+ objects = models.GeoManager()
+ def __unicode__(self): return self.name
+
+class City(models.Model):
+ name = models.CharField(max_length=30)
+ point = models.PointField()
+ objects = models.GeoManager()
+ def __unicode__(self): return self.name
+
+class State(models.Model):
+ name = models.CharField(max_length=30)
+ poly = models.PolygonField(null=null_flag) # Allowing NULL geometries here.
+ objects = models.GeoManager()
+ def __unicode__(self): return self.name
+
+class Feature(models.Model):
+ name = models.CharField(max_length=20)
+ geom = models.GeometryField()
+ objects = models.GeoManager()
+ def __unicode__(self): return self.name
+
+class MinusOneSRID(models.Model):
+ geom = models.PointField(srid=-1) # Minus one SRID.
+ objects = models.GeoManager()
diff --git a/django/contrib/gis/tests/geoapp/sql/city.mysql.sql b/django/contrib/gis/tests/geoapp/sql/city.mysql.sql
new file mode 100644
index 0000000000..e73375c9cc
--- /dev/null
+++ b/django/contrib/gis/tests/geoapp/sql/city.mysql.sql
@@ -0,0 +1,8 @@
+INSERT INTO geoapp_city (`name`, `point`) VALUES ('Houston', GeomFromText('POINT (-95.363151 29.763374)'));
+INSERT INTO geoapp_city (`name`, `point`) VALUES ('Dallas', GeomFromText('POINT (-96.801611 32.782057)'));
+INSERT INTO geoapp_city (`name`, `point`) VALUES ('Oklahoma City', GeomFromText('POINT (-97.521157 34.464642)'));
+INSERT INTO geoapp_city (`name`, `point`) VALUES ('Wellington', GeomFromText('POINT (174.783117 -41.315268)'));
+INSERT INTO geoapp_city (`name`, `point`) VALUES ('Pueblo', GeomFromText('POINT (-104.609252 38.255001)'));
+INSERT INTO geoapp_city (`name`, `point`) VALUES ('Lawrence', GeomFromText('POINT (-95.235060 38.971823)'));
+INSERT INTO geoapp_city (`name`, `point`) VALUES ('Chicago', GeomFromText('POINT (-87.650175 41.850385)'));
+INSERT INTO geoapp_city (`name`, `point`) VALUES ('Victoria', GeomFromText('POINT (-123.305196 48.462611)')); \ No newline at end of file
diff --git a/django/contrib/gis/tests/geoapp/sql/city.oracle.sql b/django/contrib/gis/tests/geoapp/sql/city.oracle.sql
new file mode 100644
index 0000000000..9e6d7b76ed
--- /dev/null
+++ b/django/contrib/gis/tests/geoapp/sql/city.oracle.sql
@@ -0,0 +1,8 @@
+INSERT INTO GEOAPP_CITY ("NAME", "POINT") VALUES ('Houston', SDO_GEOMETRY('POINT (-95.363151 29.763374)', 4326));
+INSERT INTO GEOAPP_CITY ("NAME", "POINT") VALUES ('Dallas', SDO_GEOMETRY('POINT (-96.801611 32.782057)', 4326));
+INSERT INTO GEOAPP_CITY ("NAME", "POINT") VALUES ('Oklahoma City', SDO_GEOMETRY('POINT (-97.521157 34.464642)', 4326));
+INSERT INTO GEOAPP_CITY ("NAME", "POINT") VALUES ('Wellington', SDO_GEOMETRY('POINT (174.783117 -41.315268)', 4326));
+INSERT INTO GEOAPP_CITY ("NAME", "POINT") VALUES ('Pueblo', SDO_GEOMETRY('POINT (-104.609252 38.255001)', 4326));
+INSERT INTO GEOAPP_CITY ("NAME", "POINT") VALUES ('Lawrence', SDO_GEOMETRY('POINT (-95.235060 38.971823)', 4326));
+INSERT INTO GEOAPP_CITY ("NAME", "POINT") VALUES ('Chicago', SDO_GEOMETRY('POINT (-87.650175 41.850385)', 4326));
+INSERT INTO GEOAPP_CITY ("NAME", "POINT") VALUES ('Victoria', SDO_GEOMETRY('POINT (-123.305196 48.462611)', 4326)); \ No newline at end of file
diff --git a/django/contrib/gis/tests/geoapp/sql/city.postgresql_psycopg2.sql b/django/contrib/gis/tests/geoapp/sql/city.postgresql_psycopg2.sql
new file mode 100644
index 0000000000..3b9b01e84b
--- /dev/null
+++ b/django/contrib/gis/tests/geoapp/sql/city.postgresql_psycopg2.sql
@@ -0,0 +1,8 @@
+INSERT INTO geoapp_city ("name", "point") VALUES ('Houston', 'SRID=4326;POINT (-95.363151 29.763374)');
+INSERT INTO geoapp_city ("name", "point") VALUES ('Dallas', 'SRID=4326;POINT (-96.801611 32.782057)');
+INSERT INTO geoapp_city ("name", "point") VALUES ('Oklahoma City', 'SRID=4326;POINT (-97.521157 34.464642)');
+INSERT INTO geoapp_city ("name", "point") VALUES ('Wellington', 'SRID=4326;POINT (174.783117 -41.315268)');
+INSERT INTO geoapp_city ("name", "point") VALUES ('Pueblo', 'SRID=4326;POINT (-104.609252 38.255001)');
+INSERT INTO geoapp_city ("name", "point") VALUES ('Lawrence', 'SRID=4326;POINT (-95.235060 38.971823)');
+INSERT INTO geoapp_city ("name", "point") VALUES ('Chicago', 'SRID=4326;POINT (-87.650175 41.850385)');
+INSERT INTO geoapp_city ("name", "point") VALUES ('Victoria', 'SRID=4326;POINT (-123.305196 48.462611)'); \ No newline at end of file
diff --git a/django/contrib/gis/tests/geoapp/sql/co.wkt b/django/contrib/gis/tests/geoapp/sql/co.wkt
new file mode 100644
index 0000000000..17fad024e5
--- /dev/null
+++ b/django/contrib/gis/tests/geoapp/sql/co.wkt
@@ -0,0 +1 @@
+POLYGON ((-107.9184209999999800 41.0020359999999970, -107.6913358243141800 41.0021042503422490, -107.6256240000000000 41.0021240000000020, -107.5215053632723100 41.0025067105257720, -107.3674429999999900 41.0030730000000010, -107.3177944624011200 41.0029672133671140, -107.3053129562196700 41.0029406188977600, -107.2411939999999900 41.0028039999999980, -107.0006060000000000 41.0034439999999950, -106.8577729999999900 41.0026629999999910, -106.4538589999999900 41.0020569999999940, -106.4395630000000100 41.0019780000000010, -106.4374190000000100 41.0017949999999940, -106.4309500000000000 41.0017519999999960, -106.3918520000000000 41.0011760000000010, -106.3863560000000100 41.0011439999999960, -106.3211649999999900 40.9991229999999970, -106.2175730000000000 40.9977340000000010, -106.1946242545105400 40.9976261471179200, -106.1905405794911800 40.9976069549524670, -106.0611809999999900 40.9969990000000020, -105.7642468572674100 40.9968975561793200, -105.7304210000000100 40.9968860000000030, -105.7248040000000100 40.9969100000000000, -105.5544177044212800 40.9973907108230620, -105.4122207031675800 40.9977918911954480, -105.2771379999999800 40.9981730000000010, -105.2565270000000100 40.9981909999999980, -105.2547790000000000 40.9982100000000000, -105.1734357616781100 40.9981770152523170, -104.9433706805682100 40.9980837236793720, -104.8552730000000000 40.9980479999999970, -104.8295039999999900 40.9992700000000030, -104.6759990000000000 41.0009570000000000, -104.4971489999999900 41.0018280000000030, -104.4970580000000000 41.0018049999999970, -104.4676719999999800 41.0014729999999970, -104.2146920000000000 41.0016570000000020, -104.2141910000000000 41.0015679999999990, -104.2114730000000000 41.0015909999999980, -104.1235859999999900 41.0016259999999950, -104.1045900000000000 41.0015429999999910, -104.0860679999999800 41.0015629999999970, -104.0669609999999900 41.0015039999999970, -104.0532489999999900 41.0014059999999960, -104.0392380000000000 41.0015020000000020, -104.0233829999999800 41.0018870000000040, -104.0182230000000100 41.0016170000000030, -104.0108048867797200 41.0016166745085400, -103.9726419999999800 41.0016150000000010, -103.9713730000000000 41.0015240000000030, -103.9535250000000000 41.0015959999999990, -103.9063240000000000 41.0013870000000010, -103.8962070000000000 41.0017500000000010, -103.8779670000000000 41.0016729999999900, -103.8584489999999900 41.0016809999999980, -103.7504979999999900 41.0020540000000010, -103.5745220000000000 41.0017210000000030, -103.4974469999999900 41.0016350000000000, -103.4866970000000100 41.0019139999999990, -103.4219750000000000 41.0020069999999990, -103.4219250000000000 41.0019689999999950, -103.3969909999999900 41.0025580000000010, -103.3653139999999800 41.0018460000000000, -103.3629790000000000 41.0018439999999910, -103.0778040000000000 41.0022980000000030, -103.0765360000000000 41.0022530000000030, -103.0595379999999900 41.0023679999999970, -103.0579980000000000 41.0023679999999970, -103.0434439999999900 41.0023440000000010, -103.0387040000000000 41.0022510000000010, -103.0020260000000000 41.0024859999999980, -103.0001019999999800 41.0024000000000020, -102.9826900000000100 41.0021569999999970, -102.9814830000000000 41.0021119999999970, -102.9636689999999800 41.0021859999999950, -102.9625220000000100 41.0020719999999980, -102.9607060000000000 41.0020589999999960, -102.9596239999999900 41.0020949999999970, -102.9448300000000000 41.0023029999999980, -102.9431090000000100 41.0020510000000020, -102.9255680000000000 41.0022799999999990, -102.9240290000000000 41.0021419999999990, -102.9065469999999900 41.0022759999999950, -102.9047960000000000 41.0022069999999990, -102.8874069999999800 41.0021780000000010, -102.8857460000000000 41.0021309999999990, -102.8678220000000000 41.0021830000000020, -102.8657839999999900 41.0019879999999970, -102.8492629999999900 41.0023010000000030, -102.8464550000000100 41.0022560000000030, -102.8303029999999900 41.0023509999999970, -102.8272800000000000 41.0021429999999970, -102.7735460000000000 41.0024140000000020, -102.7667230000000000 41.0022749999999900, -102.7546170000000000 41.0023609999999930, -102.7396239999999900 41.0022299999999970, -102.6534629999999900 41.0023320000000030, -102.6210330000000000 41.0025970000000020, -102.5786959999999900 41.0022910000000000, -102.5757380000000000 41.0022680000000010, -102.5754960000000000 41.0022000000000020, -102.5660479999999900 41.0022000000000020, -102.5567889999999900 41.0022189999999970, -102.5177010715824500 41.0023473358779430, -102.4879549999999900 41.0024449999999940, -102.4705369999999800 41.0023819999999970, -102.4692230000000000 41.0024239999999980, -102.4603345936969100 41.0024118023655500, -102.3877509894849600 41.0023121952773270, -102.3803729919328400 41.0023020703894620, -102.3795930000000000 41.0023010000000030, -102.3640659999999900 41.0021739999999970, -102.2928330000000000 41.0022069999999990, -102.2926219999999900 41.0022299999999970, -102.2925530000000000 41.0022069999999990, -102.2913540000000000 41.0022069999999990, -102.2778034555739900 41.0022337435695480, -102.2720999999999900 41.0022450000000020, -102.2678119999999900 41.0023830000000020, -102.2319310000000000 41.0023270000000010, -102.2121999999999800 41.0024620000000010, -102.2093610000000000 41.0024420000000020, -102.2090839362510100 41.0024402293320020, -102.2077760551977500 41.0024318708833140, -102.1912100000000000 41.0023259999999960, -102.1249720000000000 41.0023380000000020, -102.0705980000000000 41.0024230000000000, -102.0516140000000000 41.0023770000000030, -102.0512919999999900 40.7495910000000020, -102.0516344326070000 40.5821295926172280, -102.0517250000000000 40.5378389999999910, -102.0515190000000000 40.5200940000000000, -102.0514649999999900 40.4400079999999990, -102.0518400000000000 40.3963960000000030, -102.0515719999999900 40.3930799999999980, -102.0517979999999900 40.3600690000000030, -102.0515855426165400 40.3506461457410240, -102.0513090000000000 40.3383809999999980, -102.0519220000000000 40.2353439999999980, -102.0518939999999900 40.2291929999999950, -102.0519089999999900 40.1626740000000030, -102.0520010000000000 40.1483589999999990, -102.0518526008886700 40.0644696175368220, -102.0517440000000000 40.0030780000000020, -102.0517155646578700 39.9781730274562650, -102.0515690000000000 39.8498050000000030, -102.0513629999999900 39.8434710000000010, -102.0513179999999900 39.8333110000000020, -102.0512540000000000 39.8189920000000010, -102.0505939999999900 39.6755939999999900, -102.0500990000000000 39.6538120000000020, -102.0504219999999800 39.6460479999999930, -102.0499540000000000 39.5923310000000010, -102.0498059999999900 39.5740580000000010, -102.0495539999999900 39.5389320000000030, -102.0496730000000000 39.5366909999999980, -102.0496790000000000 39.5061830000000000, -102.0493690000000000 39.4233330000000000, -102.0493700000000000 39.4182100000000020, -102.0491669999999800 39.4035969999999980, -102.0489599999999800 39.3737119999999900, -102.0484490000000100 39.3031379999999900, -102.0472500000000100 39.1370200000000000, -102.0471339999999900 39.1297009999999970, -102.0465709999999900 39.0470380000000010, -102.0453879999999900 38.8133919999999930, -102.0453340000000000 38.7994630000000030, -102.0454479999999900 38.7834530000000020, -102.0453710000000000 38.7700639999999980, -102.0452870000000000 38.7555279999999980, -102.0453750000000100 38.7543389999999950, -102.0452119999999900 38.6975669999999990, -102.0451560000000100 38.6885550000000010, -102.0451269999999900 38.6867250000000030, -102.0451600000000000 38.6752210000000010, -102.0451020000000000 38.6749459999999980, -102.0450740000000000 38.6696170000000020, -102.0452880000000000 38.6152489999999990, -102.0452109999999900 38.5816089999999930, -102.0451889999999800 38.5587319999999920, -102.0452229999999900 38.5437969999999980, -102.0451120000000000 38.5237839999999990, -102.0452619999999900 38.5055319999999950, -102.0452629999999900 38.5053950000000000, -102.0453239999999800 38.4536469999999970, -102.0449360000000100 38.4196800000000000, -102.0444419999999900 38.4158019999999990, -102.0449440000000000 38.3844190000000010, -102.0446130000000000 38.3123239999999970, -102.0445680000000000 38.2688190000000010, -102.0443980000000000 38.2500149999999980, -102.0442510000000000 38.1417779999999950, -102.0445353236236500 38.1276753800285280, -102.0445890000000000 38.1250129999999960, -102.0445402773320500 38.1232621932310920, -102.0442550000000100 38.1130109999999930, -102.0446235449346800 38.0490802965374900, -102.0446310070721800 38.0477858554663160, -102.0446440000000100 38.0455320000000010, -102.0446200858831200 38.0420217065706370, -102.0445393420861100 38.0301695264644910, -102.0438440000000100 37.9281019999999960, -102.0438450000000000 37.9261350000000020, -102.0432189999999900 37.8679289999999900, -102.0430329999999900 37.8241459999999990, -102.0429530000000000 37.8035349999999970, -102.0426680000000100 37.7887580000000010, -102.0421580000000000 37.7601640000000030, -102.0418760000000000 37.7238750000000000, -102.0415740000000000 37.6804360000000000, -102.0416940000000100 37.6656809999999990, -102.0415819999999900 37.6544949999999970, -102.0415850000000000 37.6442819999999970, -102.0416180000000000 37.6078680000000030, -102.0417794058394900 37.5786915552958260, -102.0418940000000000 37.5579770000000010, -102.0418990000000000 37.5411860000000030, -102.0420159999999900 37.5352609999999980, -102.0417860000000000 37.5060659999999970, -102.0418009999999900 37.4694879999999980, -102.0417549999999900 37.4348549999999920, -102.0416690000000000 37.4347399999999980, -102.0416759999999800 37.4098979999999910, -102.0415240000000000 37.3750179999999970, -102.0420890000000000 37.3528189999999970, -102.0419740000000000 37.3526129999999980, -102.0418169999999900 37.3094899999999970, -102.0416640000000000 37.2976499999999900, -102.0419630000000000 37.2581640000000010, -102.0420020000000000 37.1417440000000030, -102.0421350000000000 37.1250209999999970, -102.0420920000000000 37.1250209999999970, -102.0418089999999900 37.1119729999999990, -102.0419830000000000 37.1065510000000030, -102.0419199999999900 37.0350830000000000, -102.0417490000000000 37.0343969999999980, -102.0419210000000000 37.0321780000000020, -102.0419500000000000 37.0308050000000010, -102.0419519999999900 37.0247419999999960, -102.0422400000000100 36.9930829999999990, -102.0545030000000000 36.9931089999999970, -102.1842710000000000 36.9935929999999970, -102.2083160000000000 36.9937299999999990, -102.2607890000000000 36.9943880000000010, -102.2703456818352900 36.9943999333374620, -102.3075936504973800 36.9944464445206690, -102.3552880000000000 36.9945059999999940, -102.3553670000000000 36.9945749999999980, -102.6981420000000000 36.9951489999999980, -102.7420599999999800 36.9976890000000010, -102.7598600000000000 37.0000190000000020, -102.7785689999999900 36.9992420000000020, -102.8067620000000100 37.0000190000000020, -102.8146160000000000 37.0007829999999980, -102.8419890000000000 36.9995979999999990, -102.9796130000000000 36.9985489999999970, -102.9858069999999900 36.9985709999999980, -102.9869760000000000 36.9985240000000030, -103.0021990000000000 37.0001040000000000, -103.0861049694139500 37.0001738656940380, -103.1054053653286500 37.0001899364881130, -103.1559220000000000 37.0002319999999970, -103.2006317284721000 37.0000603865096880, -103.3271777694062600 36.9995746531243130, -103.4256788724330500 36.9991965672206930, -103.7332470000000100 36.9980159999999930, -103.7343639999999900 36.9980410000000010, -104.0078549999999900 36.9962390000000030, -104.2154754884639700 36.9948744321965890, -104.2505359999999800 36.9946440000000010, -104.2975706429598400 36.9940532503817470, -104.3388329999999900 36.9935350000000010, -104.3556505253503100 36.9935565317715810, -104.3664476855351100 36.9935703555644370, -104.3992028820832900 36.9936122926149620, -104.4297693866500100 36.9936514274448880, -104.4806103169752700 36.9937165199763950, -104.5192570000000000 36.9937659999999940, -104.6245560000000000 36.9943769999999930, -104.6255450000000000 36.9935990000000030, -104.6450289999999900 36.9933779999999930, -104.7061122072671500 36.9934264441886570, -104.7320310000000100 36.9934470000000030, -104.7321199999999800 36.9934840000000020, -104.8399904125201100 36.9933955928282070, -105.0005539999999800 36.9932640000000030, -105.0292279999999900 36.9927289999999900, -105.1208000000000000 36.9954279999999970, -105.1550419641015100 36.9953391471581630, -105.2206130000000000 36.9951689999999970, -105.2512960000000000 36.9956049999999980, -105.4193100000000000 36.9958560000000030, -105.4381027436132300 36.9959680306975970, -105.4424590000000000 36.9959940000000030, -105.4472550000000000 36.9960169999999950, -105.4651820000000000 36.9959909999999970, -105.4708767069258500 36.9959784767062560, -105.5088359999999900 36.9958949999999900, -105.5124850000000000 36.9957769999999970, -105.5339220000000000 36.9958749999999980, -105.6274699999999900 36.9956790000000030, -105.6647199999999900 36.9958740000000010, -105.7164710000000000 36.9958489999999930, -105.7184073045491700 36.9958460161492080, -105.9961590000000100 36.9954180000000010, -105.9974720000000000 36.9954170000000030, -106.0066339999999900 36.9953429999999980, -106.0998058674331200 36.9947591067049760, -106.1639713822180900 36.9943569916150140, -106.2014689999999900 36.9941219999999970, -106.2477050000000000 36.9942660000000030, -106.2486750000000100 36.9942879999999900, -106.2932790000000000 36.9938900000000000, -106.3254286788247500 36.9941092316646730, -106.3431389999999800 36.9942300000000020, -106.4762779528519600 36.9938393350510210, -106.5005890000000100 36.9937679999999960, -106.6171590000000000 36.9929670000000000, -106.6171249999999900 36.9930039999999990, -106.6286520000000000 36.9931750000000010, -106.6287329999999800 36.9931609999999940, -106.6613440000000000 36.9932430000000000, -106.6756259999999900 36.9931229999999970, -106.7505910000000000 36.9924609999999990, -106.7820952897146500 36.9924517499673660, -106.8697959999999900 36.9924259999999950, -106.8772919999999800 37.0001389999999900, -106.9188864633427000 37.0001287471619240, -106.9560183645763800 37.0001195943242540, -107.1072626267445100 37.0000823133304520, -107.2552027234696400 37.0000458467977750, -107.4209130000000000 37.0000049999999940, -107.4224150136806600 37.0000049896361030, -107.4421819991443200 37.0000048532438730, -107.4817370013986600 37.0000045803142900, -107.5240868464170200 37.0000042881002860, -107.6007136407778000 37.0000037593752680, -107.7124779008385600 37.0000029882016790, -107.8556954995019300 37.0000020000000020, -107.8663089376175300 37.0000019267672610, -107.8691399085863600 37.0000019072335460, -107.8691806993063300 37.0000019069521000, -108.0006230000000000 37.0000009999999970, -108.1791870752784600 36.9992931616249270, -108.1871395402988700 36.9992616375912750, -108.2493580000000000 36.9990150000000000, -108.2506349999999900 36.9995610000000000, -108.2880860000000100 36.9995550000000010, -108.2884000000000000 36.9995199999999970, -108.3204640000000000 36.9994990000000000, -108.3207209999999900 36.9995100000000010, -108.3791655704288800 36.9994589777070430, -108.6196889999999900 36.9992489999999990, -108.6203090000000100 36.9992870000000020, -108.7492698254058500 36.9991399338227680, -108.9544040000000000 36.9989059999999980, -108.9588680000000000 36.9989130000000020, -109.0452229999999900 36.9990840000000030, -109.0451659999999800 37.0727419999999980, -109.0450580000000000 37.0746609999999990, -109.0449950000000000 37.0864290000000030, -109.0451889999999900 37.0962709999999940, -109.0451730000000100 37.1094640000000030, -109.0452029999999900 37.1119579999999940, -109.0451559999999900 37.1120639999999970, -109.0459950000000000 37.1772789999999990, -109.0459780000000100 37.2018309999999990, -109.0458015051062800 37.2050708135988660, -109.0454869999999900 37.2108440000000020, -109.0455598795331900 37.2397756720027080, -109.0455601977475200 37.2399019965338450, -109.0455839999999900 37.2493509999999970, -109.0460389999999900 37.2499930000000030, -109.0458980422733100 37.3269349905485300, -109.0458100000000000 37.3749930000000030, -109.0437991323256200 37.4690283342420190, -109.0434637832608200 37.4847104508718160, -109.0434249427800400 37.4865267700853340, -109.0431370000000000 37.4999919999999990, -109.0419150000000000 37.5306530000000010, -109.0418650000000000 37.5307260000000010, -109.0418059999999900 37.6041710000000010, -109.0421310000000000 37.6176620000000030, -109.0420890000000000 37.6237950000000010, -109.0422690000000000 37.6660669999999980, -109.0417320000000000 37.7112139999999980, -109.0417600000000000 37.7131820000000030, -109.0416360000000000 37.7402099999999980, -109.0420980000000000 37.7499899999999970, -109.0420421489000700 37.7543839997998490, -109.0414610000000000 37.8001050000000020, -109.0417540000000000 37.8358259999999900, -109.0417229999999900 37.8420509999999980, -109.0418440000000000 37.8727880000000000, -109.0416528185789500 37.8811669027885570, -109.0410580000000100 37.9072359999999970, -109.0431209999999900 37.9742600000000010, -109.0428189999999900 37.9970679999999990, -109.0428199999999900 37.9993010000000030, -109.0419724039658400 38.1317991668174590, -109.0418366569747100 38.1530194495367920, -109.0417619999999900 38.1646900000000000, -109.0546480000000000 38.2449209999999980, -109.0600619999999900 38.2754890000000000, -109.0599620000000000 38.4999869999999900, -109.0602530000000000 38.5993279999999930, -109.0595410000000000 38.7198879999999970, -109.0573880000000000 38.7954559999999940, -109.0572160449167600 38.7997308495970760, -109.0541889999999900 38.8749839999999980, -109.0539429999999900 38.9044140000000030, -109.0537970000000000 38.9052839999999950, -109.0532330000000100 38.9424670000000010, -109.0532919999999800 38.9428780000000000, -109.0524359999999900 38.9999850000000020, -109.0515879125035400 39.1157342577700790, -109.0515835157382700 39.1163343400931040, -109.0515807806367500 39.1167076340895430, -109.0515120000000000 39.1260949999999990, -109.0507650000000000 39.3666770000000030, -109.0513629999999800 39.4976740000000040, -109.0510402483332400 39.6604720118441210, -109.0506149999999900 39.8749699999999980, -109.0508730000000000 40.0589149999999990, -109.0508130000000100 40.0595789999999920, -109.0509440000000000 40.1807119999999930, -109.0509730000000000 40.1808490000000020, -109.0509687158226500 40.2226624122704100, -109.0509460000000000 40.4443679999999970, -109.0503140000000000 40.4950920000000000, -109.0506979999999800 40.4999630000000010, -109.0499550000000000 40.5399010000000000, -109.0500740000000000 40.5403579999999980, -109.0500719640466700 40.5404371043087370, -109.0480440000000000 40.6192309999999990, -109.0482490000000000 40.6536009999999950, -109.0490880000000000 40.7145620000000010, -109.0484550000000000 40.8260810000000020, -109.0500760000000000 41.0006589999999990, -108.8841379999999900 41.0000939999999970, -108.6311080000000000 41.0001559999999900, -108.5266670000000000 40.9996080000000020, -108.5006590000000000 41.0001120000000010, -108.2506490000000000 41.0001140000000040, -108.1812270000000100 41.0004549999999950, -108.0892190031385500 41.0015541392473680, -108.0465390000000000 41.0020639999999970, -107.9232341223959400 41.0020370519008000, -107.9184209999999800 41.0020359999999970)) \ No newline at end of file
diff --git a/django/contrib/gis/tests/geoapp/sql/country.mysql.sql b/django/contrib/gis/tests/geoapp/sql/country.mysql.sql
new file mode 100644
index 0000000000..cd1cd78acf
--- /dev/null
+++ b/django/contrib/gis/tests/geoapp/sql/country.mysql.sql
@@ -0,0 +1,4 @@
+-- New Zealand bondary courtesy of 'world_borders.shp', which was assembled from public domain sources by Schuyler Erle. See: http://mappinghacks.com/data/
+-- Texas boundary data is a data product from the U.S. Census Bureau. See 'state.sql' for more information.
+INSERT INTO geoapp_country (`name`, `mpoly`) VALUES ('New Zealand', GeomFromText('MULTIPOLYGON (((174.616364000000004 -36.100861000000002,174.634978999999987 -36.124718,174.708862000000011 -36.205559,174.781096999999988 -36.266945,174.812744000000009 -36.339165,174.768311000000011 -36.34639,174.710784999999987 -36.525832999999999,174.708587999999992 -36.533332999999999,174.70773299999999 -36.541671999999998,174.714690999999988 -36.595832999999999,174.717194000000006 -36.603057999999997,174.774414000000007 -36.730277999999998,174.808319000000012 -36.805275000000002,174.854400999999996 -36.847777999999998,174.896636999999998 -36.878334000000002,175.011658000000011 -36.871941,175.020813000000004 -36.873610999999997,175.055542000000003 -36.880279999999999,175.076629999999994 -36.890839,175.082458000000003 -36.895279000000002,175.087463000000014 -36.900832999999999,175.091644000000002 -36.925559999999997,175.161652000000004 -36.955559,175.221069 -36.937775000000002,175.230255 -36.939438000000003,175.278320000000008 -36.965279000000002,175.310516000000007 -36.995002999999997,175.319976999999994 -37.005836000000002,175.323853000000014 -37.012222,175.328856999999999 -37.026947,175.330261000000007 -37.035277999999998,175.330535999999995 -37.044449,175.321899000000002 -37.06472,175.31942699999999 -37.095275999999998,175.317748999999992 -37.144165,175.319121999999993 -37.152495999999999,175.328856999999999 -37.168892,175.373290999999995 -37.216659999999997,175.385254000000003 -37.225830000000002,175.404967999999997 -37.228050000000003,175.579131999999987 -37.244446000000003,175.58914200000001 -37.169449,175.551636000000002 -37.024718999999997,175.547484999999995 -37.009171000000002,175.542480000000012 -36.994446000000003,175.536102 -36.980826999999998,175.524993999999992 -36.961669999999998,175.498566000000011 -36.927222999999998,175.484406000000007 -36.920279999999998,175.476348999999999 -36.917777999999998,175.464416999999997 -36.90889,175.435241999999988 -36.866942999999999,175.46691899999999 -36.809998,175.509430000000009 -36.776108,175.486358999999993 -36.679726000000002,175.463593000000003 -36.621383999999999,175.378296000000006 -36.570557,175.366364000000004 -36.561667999999997,175.361633000000012 -36.556389000000003,175.356628 -36.541671999999998,175.353850999999992 -36.525002,175.35244800000001 -36.489998,175.353577 -36.481940999999999,175.360229000000004 -36.478050000000003,175.538025000000005 -36.514724999999999,175.542755 -36.519996999999996,175.604950000000002 -36.622771999999998,175.631072999999986 -36.710555999999997,175.763610999999997 -36.713614999999997,175.840789999999998 -36.754173000000002,175.733582000000013 -36.805832000000002,175.701629999999994 -36.844161999999997,175.707458000000003 -36.869995000000003,175.709960999999993 -36.875275000000002,175.714690999999988 -36.880828999999999,175.720519999999993 -36.885277000000002,175.735779000000008 -36.891387999999999,175.74383499999999 -36.893889999999999,175.758330999999998 -36.876106,175.761382999999995 -36.869446000000003,175.757751000000013 -36.863059999999997,175.753051999999997 -36.857779999999998,175.749114999999989 -36.851394999999997,175.75 -36.843055999999997,175.752196999999995 -36.835555999999997,175.756378000000012 -36.830002,175.765533000000005 -36.828055999999997,175.808013999999986 -36.824173000000002,175.817200000000014 -36.825836000000002,175.833587999999992 -36.830832999999998,175.845519999999993 -36.839722000000002,175.849120999999997 -36.846107000000003,175.878570999999994 -36.914444000000003,175.881072999999986 -36.921669,175.918304000000006 -37.067504999999997,175.917480000000012 -37.075836000000002,175.915253000000007 -37.083061,175.898314999999997 -37.115004999999996,175.884154999999993 -37.168892,175.883330999999998 -37.176949,175.887206999999989 -37.244163999999998,175.892212 -37.249724999999998,175.921082000000013 -37.251671000000002,175.927185000000009 -37.256110999999997,175.93081699999999 -37.262504999999997,175.936371000000008 -37.278885000000002,175.940093999999988 -37.299717,175.974396000000013 -37.418059999999997,175.976074000000011 -37.453055999999997,176.026931999999988 -37.483108999999999,176.035583000000003 -37.487282,176.059417999999994 -37.502502,176.088287000000008 -37.525557999999997,176.093291999999991 -37.531112999999998,176.165526999999997 -37.613892,176.169433999999995 -37.620277000000002,176.167205999999993 -37.625832000000003,176.160247999999996 -37.624167999999997,176.082458000000003 -37.602500999999997,176.066924999999998 -37.59639,176.061095999999992 -37.591942000000003,176.057189999999991 -37.585555999999997,176.062744000000009 -37.580832999999998,176.070800999999989 -37.577781999999999,176.088287000000008 -37.580002,176.095245000000006 -37.576110999999997,176.090239999999994 -37.570838999999999,176.062468999999993 -37.546669,176.023087000000004 -37.528221000000002,176.018767999999994 -37.526057999999999,176.013931000000014 -37.524554999999999,176.007598999999999 -37.524222999999999,175.955535999999995 -37.521110999999998,175.946349999999995 -37.523055999999997,175.940796000000006 -37.527779000000002,175.953583000000009 -37.558891000000003,175.994415000000004 -37.638893000000003,176.071899000000002 -37.655273,176.14498900000001 -37.675277999999999,176.242187999999999 -37.709442000000003,176.267486999999988 -37.676392,176.488281 -37.756667999999998,176.521636999999998 -37.769447,176.527771 -37.773887999999999,176.537475999999998 -37.784447,176.549712999999997 -37.793334999999999,176.656646999999992 -37.855559999999997,176.671082000000013 -37.862502999999997,176.686645999999996 -37.868332000000002,176.759154999999993 -37.892775999999998,176.784149000000014 -37.900275999999998,176.80304000000001 -37.903328000000002,176.819702000000007 -37.904442000000003,176.838287000000008 -37.907501000000003,176.917755 -37.926108999999997,176.943848000000003 -37.932502999999997,177.08273299999999 -37.967216,177.107468000000011 -37.987220999999998,177.159424 -38.013336000000002,177.415253000000007 -37.982498,177.47357199999999 -37.962502,177.545806999999996 -37.919167000000002,177.552459999999996 -37.915000999999997,177.571625000000012 -37.902222000000002,177.599120999999997 -37.878051999999997,177.603577 -37.872498,177.646941999999996 -37.805,177.732178000000005 -37.682502999999997,177.738861000000014 -37.678336999999999,177.746917999999994 -37.675277999999999,177.791931000000005 -37.666946000000003,177.849396000000013 -37.657218999999998,177.858856000000003 -37.656661999999997,177.868010999999996 -37.654442000000003,177.875792999999987 -37.651389999999999,178.0 -37.592224000000002,178.006653 -37.588332999999999,178.012206999999989 -37.583328000000002,178.018004999999988 -37.550831000000002,178.05581699999999 -37.542777999999998,178.064972000000012 -37.542228999999999,178.187744000000009 -37.546951,178.281921000000011 -37.560828999999998,178.306915000000004 -37.568061999999998,178.311919999999986 -37.573334000000003,178.312468999999993 -37.578887999999999,178.306915000000004 -37.583610999999998,178.321075000000008 -37.602500999999997,178.336365 -37.618332000000002,178.34970100000001 -37.626944999999999,178.367737000000005 -37.630828999999999,178.448028999999991 -37.645279000000002,178.457458000000003 -37.646667,178.468018 -37.646949999999997,178.488861000000014 -37.644165,178.497192000000013 -37.646667,178.504424999999998 -37.649994,178.550536999999991 -37.6875,178.555542000000003 -37.692497000000003,178.559692000000013 -37.698883000000002,178.56552099999999 -37.713332999999999,178.562468999999993 -37.719994,178.483306999999996 -37.826393000000003,178.455230999999998 -37.860000999999997,178.449982000000006 -37.865004999999996,178.429687999999999 -37.876944999999999,178.419983000000002 -37.887779000000002,178.350525000000005 -38.004722999999998,178.347473000000008 -38.011116,178.347197999999992 -38.019722000000002,178.348846000000009 -38.027779000000002,178.354950000000002 -38.032218999999998,178.360229000000004 -38.037506,178.364136000000002 -38.043616999999998,178.375792999999987 -38.072777000000002,178.378296000000006 -38.089995999999999,178.377746999999999 -38.09861,178.353850999999992 -38.185555,178.319976999999994 -38.248055,178.318024000000008 -38.255561999999998,178.317474000000004 -38.263893000000003,178.320800999999989 -38.398612999999997,178.302459999999996 -38.528885000000002,178.300536999999991 -38.536391999999999,178.296356000000003 -38.541946000000003,178.158874999999995 -38.649169999999998,178.074982000000006 -38.713889999999999,178.068297999999999 -38.717773,178.060241999999988 -38.721107000000003,178.050812000000008 -38.721381999999998,178.044433999999995 -38.717216,177.928864000000004 -38.722220999999998,177.941070999999994 -38.793616999999998,177.923858999999993 -38.918334999999999,177.917786000000007 -38.942802,177.909697999999992 -38.969718999999998,177.897705000000002 -39.047942999999997,177.893859999999989 -39.064776999999999,177.906708000000009 -39.064278000000002,177.923034999999999 -39.089165,177.942200000000014 -39.091942000000003,177.967743000000013 -39.098334999999999,177.991332999999997 -39.115004999999996,177.996612999999996 -39.120277000000002,177.999390000000005 -39.127495000000003,177.909973000000008 -39.256950000000003,177.898865 -39.267502,177.874968999999993 -39.286118000000002,177.868010999999996 -39.290283000000002,177.861908 -39.285834999999999,177.844970999999987 -39.251396,177.839416999999997 -39.236946000000003,177.824127000000004 -39.193053999999997,177.823577999999998 -39.183883999999999,177.826629999999994 -39.177222999999998,177.841644000000002 -39.152779000000002,177.822021000000007 -39.114445000000003,177.823195999999996 -39.110115,177.82351700000001 -39.105110000000003,177.82119800000001 -39.101275999999999,177.816696000000007 -39.099274,177.680266999999986 -39.075279000000002,177.628845000000013 -39.071114,177.426085999999998 -39.064163,177.387755999999996 -39.077781999999999,177.246917999999994 -39.128334000000002,177.206085000000002 -39.143616000000002,177.149138999999991 -39.165000999999997,177.054961999999989 -39.204445,176.935790999999995 -39.349997999999999,176.931365999999997 -39.355559999999997,176.903870000000012 -39.398055999999997,176.898865 -39.412216,176.89776599999999 -39.438048999999999,176.899414000000007 -39.446387999999999,176.946625000000012 -39.664444000000003,177.01080300000001 -39.654998999999997,177.107178000000005 -39.660828000000002,177.116913000000011 -39.662216,177.120789000000002 -39.66861,177.119110000000006 -39.676108999999997,177.115783999999991 -39.682502999999997,177.08273299999999 -39.729996,177.073577999999998 -39.741385999999999,177.068024000000008 -39.746108999999997,177.059692000000013 -39.749167999999997,177.050262000000004 -39.751396,177.033874999999995 -39.757506999999997,177.028045999999989 -39.762504999999997,177.023590000000013 -39.768059,177.020263999999997 -39.774718999999997,176.894713999999993 -40.034728999999999,176.890533000000005 -40.049728000000002,176.889983999999998 -40.058052000000004,176.89498900000001 -40.082779000000002,176.893035999999995 -40.090279000000002,176.874114999999989 -40.121383999999999,176.834136999999998 -40.181671,176.808319000000012 -40.216659999999997,176.796935999999988 -40.226387000000003,176.687195000000003 -40.321387999999999,176.644135000000006 -40.379997000000003,176.628296000000006 -40.421944000000003,176.539977999999991 -40.495002999999997,176.521362000000011 -40.513893000000003,176.500823999999994 -40.535004,176.441924999999998 -40.600281000000003,176.405243000000013 -40.643889999999999,176.386108000000007 -40.675002999999997,176.35522499999999 -40.688606,176.349396000000013 -40.693610999999997,176.288574000000011 -40.793892,176.239136000000002 -40.90889,176.22079500000001 -40.931671,176.195526 -40.941665999999998,176.172760000000011 -40.952224999999999,176.158600000000007 -40.959999000000003,176.152771 -40.964722000000002,176.142212 -40.975273,176.134154999999993 -40.987502999999997,176.120789000000002 -41.013618,176.11300700000001 -41.035277999999998,176.098297000000002 -41.087218999999997,176.087463000000014 -41.116112,176.080811000000011 -41.129165999999998,176.062195000000003 -41.151938999999999,175.984679999999997 -41.231383999999998,175.955230999999998 -41.255279999999999,175.819121999999993 -41.347220999999998,175.743561 -41.392226999999998,175.736358999999993 -41.396110999999998,175.557738999999998 -41.485000999999997,175.471069 -41.541389000000002,175.427459999999996 -41.564444999999999,175.323028999999991 -41.614449,175.313292999999987 -41.616394,175.230804000000006 -41.620834000000002,175.222197999999992 -41.618332000000002,175.21691899999999 -41.612777999999999,175.184692000000013 -41.535834999999999,175.181915000000004 -41.519447,175.181091000000009 -41.500838999999999,175.188568000000004 -41.461112999999997,175.193024000000008 -41.446106,175.193848000000003 -41.437775000000002,175.191070999999994 -41.430557,175.186095999999992 -41.425002999999997,175.080261000000007 -41.385559,175.063018999999997 -41.380279999999999,175.05304000000001 -41.378608999999997,175.045532000000009 -41.378608999999997,175.027190999999988 -41.381667999999998,174.993286000000012 -41.393332999999998,174.985779000000008 -41.397224,174.972747999999996 -41.405830000000002,174.960509999999999 -41.415275999999999,174.949982000000006 -41.425559999999997,174.944976999999994 -41.431114,174.94165000000001 -41.437775000000002,174.936919999999986 -41.443328999999999,174.918578999999994 -41.448051,174.908600000000007 -41.448334000000003,174.872467 -41.429442999999999,174.86605800000001 -41.425002999999997,174.861084000000005 -41.419724000000002,174.861633000000012 -41.347496,174.863861000000014 -41.340279000000002,174.870789000000002 -41.327224999999999,174.87912 -41.315002,174.883881000000002 -41.309441,174.894440000000003 -41.290000999999997,174.89776599999999 -41.282501000000003,174.899993999999992 -41.275002,174.901916999999997 -41.258338999999999,174.901916999999997 -41.251114,174.898865 -41.234444000000003,174.89498900000001 -41.228050000000003,174.887482000000006 -41.224442000000003,174.827179 -41.218887000000002,174.818848000000003 -41.221938999999999,174.787475999999998 -41.244446000000003,174.778045999999989 -41.255836000000002,174.774414000000007 -41.262222,174.771087999999992 -41.278053,174.778594999999996 -41.281387000000002,174.796082000000013 -41.286949,174.818024000000008 -41.284728999999999,174.824127000000004 -41.289169,174.829407000000003 -41.294724000000002,174.833313000000004 -41.301108999999997,174.832184000000012 -41.309441,174.82995600000001 -41.316665999999998,174.826355000000007 -41.323334000000003,174.821625000000012 -41.328887999999999,174.815796000000006 -41.333610999999998,174.807189999999991 -41.336387999999999,174.744689999999991 -41.347496,174.700531000000012 -41.344444000000003,174.671906000000007 -41.338332999999999,174.654694000000006 -41.333061,174.648314999999997 -41.328612999999997,174.629669000000007 -41.315002,174.59191899999999 -41.27861,174.591644000000002 -41.271385000000002,174.594116000000014 -41.263893000000003,174.601074000000011 -41.250838999999999,174.608306999999996 -41.237777999999999,174.61300700000001 -41.232216,174.619110000000006 -41.23111,174.627746999999999 -41.233887000000003,174.637482000000006 -41.235557999999997,174.648590000000013 -41.234444000000003,174.666931000000005 -41.229720999999998,174.681365999999997 -41.221938999999999,174.694702000000007 -41.213614999999997,174.712738000000002 -41.199440000000003,174.718567000000007 -41.194716999999997,174.800812000000008 -41.100281000000003,174.844421000000011 -41.041671999999998,174.874390000000005 -41.018059,174.882721000000004 -41.015006999999997,174.892486999999988 -41.013061999999998,174.901093000000003 -41.010283999999999,174.908324999999991 -41.006393000000003,174.932189999999991 -40.987502999999997,174.94165000000001 -40.976387000000003,174.945251000000013 -40.969718999999998,174.947478999999987 -40.962218999999997,175.014983999999998 -40.84861,175.09857199999999 -40.755836000000002,175.112731999999994 -40.738892,175.120789000000002 -40.726944000000003,175.127746999999999 -40.713614999999997,175.164153999999996 -40.631943,175.169708000000014 -40.616942999999999,175.171906000000007 -40.609726000000002,175.187468999999993 -40.530830000000002,175.23800700000001 -40.329726999999998,175.23135400000001 -40.280830000000002,175.201629999999994 -40.181671,175.196349999999995 -40.166946000000003,175.178314 -40.134171000000002,175.15554800000001 -40.095832999999999,175.071625000000012 -40.003059,175.055542000000003 -39.987777999999999,175.022217000000012 -39.958053999999997,174.986358999999993 -39.93,174.974120999999997 -39.920836999999999,174.960784999999987 -39.912773,174.938873 -39.902222000000002,174.923034999999999 -39.895836000000003,174.836638999999991 -39.865004999999996,174.828307999999993 -39.862502999999997,174.790802000000014 -39.854720999999998,174.781096999999988 -39.853057999999997,174.751373 -39.865555,174.740509000000003 -39.866661,174.729674999999986 -39.865836999999999,174.57607999999999 -39.829169999999998,174.558013999999986 -39.824722,174.549408 -39.822226999999998,174.542205999999993 -39.818610999999997,174.523865 -39.805,174.421356000000003 -39.726944000000003,174.410521999999986 -39.716942000000003,174.376068000000004 -39.678612,174.353577 -39.639999000000003,174.348846000000009 -39.634444999999999,174.336638999999991 -39.625557,174.316070999999994 -39.613892,174.30886799999999 -39.610283000000003,174.217194000000006 -39.579726999999998,174.208862000000011 -39.577224999999999,174.040802000000014 -39.552779999999998,173.997741999999988 -39.551392,173.986908 -39.550552000000003,173.970245000000006 -39.545279999999998,173.963012999999989 -39.541671999999998,173.871062999999992 -39.483330000000002,173.851898000000006 -39.470551,173.839966000000004 -39.461387999999999,173.810790999999995 -39.4375,173.79525799999999 -39.421944000000003,173.786652000000004 -39.409996,173.775817999999987 -39.390839,173.769713999999993 -39.376944999999999,173.762206999999989 -39.354720999999998,173.754424999999998 -39.305,173.751923000000005 -39.288612,173.751647999999989 -39.269996999999996,173.781921000000011 -39.191383000000002,173.785247999999996 -39.184998,173.800536999999991 -39.169167000000002,173.82995600000001 -39.145836000000003,173.844421000000011 -39.138336000000002,173.868010999999996 -39.128883000000002,173.892761000000007 -39.120552000000004,174.011108000000007 -39.073334000000003,174.114685000000009 -39.024445,174.187744000000009 -38.988608999999997,174.209136999999998 -38.977218999999998,174.226623999999987 -38.972496,174.248016000000007 -38.970551,174.259978999999987 -38.970275999999998,174.281372000000005 -38.969994,174.293029999999987 -38.969994,174.313292999999987 -38.972496,174.351348999999999 -38.979438999999999,174.375244000000009 -38.979163999999997,174.384704999999997 -38.977218999999998,174.392761000000007 -38.974442000000003,174.456359999999989 -38.940277000000002,174.546082000000013 -38.871941,174.557738999999998 -38.860557999999997,174.568024000000008 -38.850281000000003,174.587738000000002 -38.828887999999999,174.594421000000011 -38.815834000000002,174.603302000000014 -38.786118000000002,174.608582000000013 -38.763061999999998,174.625518999999997 -38.677779999999998,174.642486999999988 -38.590836000000003,174.681091000000009 -38.379165999999998,174.724396000000013 -38.185828999999998,174.838561999999996 -38.157218999999998,174.848021999999986 -38.156944000000003,174.85635400000001 -38.154167,174.926636000000002 -38.116112,174.932465000000008 -38.111389000000003,174.940246999999999 -38.101112,174.898590000000013 -38.075004999999997,174.877166999999986 -38.064163,174.892486999999988 -37.976387000000003,174.893585000000002 -37.969994,174.868286000000012 -37.943610999999997,174.861084000000005 -37.939995000000003,174.85522499999999 -37.944716999999997,174.834686000000005 -37.963614999999997,174.830261000000007 -37.969161999999997,174.828033000000005 -37.976661999999997,174.828583000000009 -37.995002999999997,174.822754000000003 -37.999724999999998,174.814696999999995 -38.002502,174.804137999999995 -38.001944999999999,174.797211000000004 -37.998336999999999,174.791077 -37.993614,174.786376999999987 -37.988334999999999,174.783874999999995 -37.980826999999998,174.783600000000007 -37.971663999999997,174.788025000000005 -37.868332000000002,174.788879000000009 -37.860000999999997,174.791077 -37.852783000000002,174.795532000000009 -37.846947,174.819702000000007 -37.829169999999998,174.826629999999994 -37.825279000000002,174.841339000000005 -37.818610999999997,174.872741999999988 -37.806106999999997,174.883330999999998 -37.805,174.903045999999989 -37.807502999999997,174.945251000000013 -37.810555,174.967467999999997 -37.809165999999998,174.975525000000005 -37.806389000000003,174.974975999999998 -37.75,174.974670000000003 -37.740836999999999,174.966644000000002 -37.739998,174.951355000000007 -37.743057,174.94442699999999 -37.745002999999997,174.93081699999999 -37.752502,174.906921000000011 -37.774169999999998,174.870789000000002 -37.783057999999997,174.861633000000012 -37.785004,174.848297000000002 -37.769722000000002,174.828307999999993 -37.710830999999999,174.764160000000004 -37.527779000000002,174.744415000000004 -37.487502999999997,174.724975999999998 -37.447220000000002,174.717467999999997 -37.425002999999997,174.714690999999988 -37.408607000000003,174.714690999999988 -37.399445,174.719116000000014 -37.393616000000002,174.725799999999992 -37.389999000000003,174.744415000000004 -37.385834000000003,174.760528999999991 -37.380279999999999,174.767486999999988 -37.376389000000003,174.773041000000006 -37.371665999999998,174.831635000000006 -37.308052000000004,174.840789999999998 -37.296951,174.840515000000011 -37.291389000000002,174.82995600000001 -37.290557999999997,174.821899000000002 -37.291671999999998,174.812744000000009 -37.293616999999998,174.804687999999999 -37.296393999999999,174.797760000000011 -37.300277999999999,174.766083000000009 -37.321114,174.754700000000014 -37.330559,174.751373 -37.336945,174.744965000000008 -37.359169,174.740509000000003 -37.364722999999998,174.733582000000013 -37.368606999999997,174.724120999999997 -37.368889000000003,174.717194000000006 -37.365279999999998,174.711365 -37.360557999999997,174.701629999999994 -37.349724000000002,174.69442699999999 -37.336945,174.660187000000008 -37.273311999999997,174.645813000000004 -37.236389000000003,174.639709000000011 -37.224442000000003,174.599975999999998 -37.153885000000002,174.578307999999993 -37.115555,174.569976999999994 -37.103614999999998,174.555542000000003 -37.087502,174.551909999999992 -37.080832999999998,174.549712999999997 -37.073616,174.55304000000001 -37.067222999999998,174.558593999999999 -37.0625,174.568848000000003 -37.061385999999999,174.644135000000006 -37.061110999999997,174.661376999999987 -37.065551999999997,174.664977999999991 -37.071944999999999,174.666381999999999 -37.080283999999999,174.661925999999994 -37.085830999999999,174.650542999999999 -37.095275999999998,174.646087999999992 -37.100838000000003,174.648590000000013 -37.108055,174.703856999999999 -37.197777000000002,174.733856000000003 -37.196106,174.716644000000002 -37.154167,174.72357199999999 -37.150275999999998,174.87912 -37.088889999999999,174.887482000000006 -37.059165999999998,174.795532000000009 -37.023055999999997,174.804413000000011 -36.972220999999998,174.824982000000006 -36.960830999999999,174.829407000000003 -36.955002,174.83273299999999 -36.948608,174.828033000000005 -36.943053999999997,174.818848000000003 -36.941383000000002,174.770263999999997 -36.936661,174.696625000000012 -36.93972,174.686095999999992 -36.940834000000002,174.659697999999992 -36.947495000000004,174.653045999999989 -36.951393000000003,174.641662999999994 -36.960830999999999,174.622467 -36.982216,174.619110000000006 -36.988892,174.617187999999999 -36.996108999999997,174.600525000000005 -37.022224,174.524688999999995 -37.045555,174.515533000000005 -37.045555,174.508605999999986 -37.041946000000003,174.502472000000012 -37.037506,174.498016000000007 -37.031944000000003,174.490783999999991 -37.019165,174.484679999999997 -37.005561999999998,174.459228999999993 -36.944031000000003,174.451904000000013 -36.923889000000003,174.446930000000009 -36.909163999999997,174.443024000000008 -36.893616000000002,174.439147999999989 -36.868606999999997,174.436645999999996 -36.852226000000002,174.43386799999999 -36.835555999999997,174.427764999999994 -36.812775000000002,174.422760000000011 -36.798057999999997,174.416655999999989 -36.784171999999998,174.409697999999992 -36.771385000000002,174.406096999999988 -36.765006999999997,174.390533000000005 -36.740279999999998,174.344299000000007 -36.679336999999997,174.301085999999998 -36.62722,174.284973000000008 -36.612777999999999,174.267486999999988 -36.599167,174.236908 -36.568061999999998,174.208862000000011 -36.535277999999998,174.187744000000009 -36.496948000000003,174.17804000000001 -36.467498999999997,174.177764999999994 -36.458336000000003,174.178864000000004 -36.449997000000003,174.181091000000009 -36.442497000000003,174.184417999999994 -36.436110999999997,174.189972000000012 -36.431389000000003,174.196930000000009 -36.427779999999998,174.20495600000001 -36.428612,174.24383499999999 -36.440834000000002,174.251923000000005 -36.443610999999997,174.257751000000013 -36.448051,174.300262000000004 -36.515839,174.348846000000009 -36.601944000000003,174.367919999999998 -36.629165999999998,174.370728000000014 -36.6325,174.422484999999995 -36.667220999999998,174.430542000000003 -36.668059999999997,174.453033000000005 -36.651108,174.456359999999989 -36.644722000000002,174.465515000000011 -36.582779000000002,174.465515000000011 -36.532218999999998,174.442474000000004 -36.414718999999998,174.422211000000004 -36.366112,174.41885400000001 -36.370834000000002,174.391937000000013 -36.395004,174.384978999999987 -36.398887999999999,174.377166999999986 -36.401665,174.303864000000004 -36.395279000000002,174.296935999999988 -36.391669999999998,174.285247999999996 -36.3825,174.276916999999997 -36.370552000000004,174.26998900000001 -36.357779999999998,174.268585000000002 -36.349442000000003,174.268585000000002 -36.342224000000002,174.292205999999993 -36.316947999999996,174.299988000000013 -36.314163,174.308013999999986 -36.316947999999996,174.325531000000012 -36.330283999999999,174.334686000000005 -36.332222000000002,174.36883499999999 -36.331673000000002,174.376891999999998 -36.330832999999998,174.421248999999989 -36.310611999999999,174.50692699999999 -36.267220000000002,174.518311000000011 -36.258057,174.521636999999998 -36.251396,174.519135000000006 -36.245834000000002,174.505248999999992 -36.231383999999998,174.413299999999992 -36.263061999999998,174.378296000000006 -36.286667,174.364685000000009 -36.294167000000002,174.346619000000004 -36.298057999999997,174.336365 -36.298889000000003,174.305237000000005 -36.287506,174.365233999999987 -36.260002,174.442200000000014 -36.169724000000002,174.396087999999992 -36.144447,174.396362000000011 -36.151938999999999,174.394135000000006 -36.159163999999997,174.373290999999995 -36.206389999999999,174.369965000000008 -36.213057999999997,174.358856000000003 -36.222220999999998,174.345245000000006 -36.229720999999998,174.337463000000014 -36.232773000000002,174.33273299999999 -36.229163999999997,174.307738999999998 -36.176949,174.282745000000006 -36.121108999999997,174.274993999999992 -36.118332000000002,174.239409999999992 -36.111389000000003,174.229126000000008 -36.112502999999997,174.195251000000013 -36.131110999999997,174.188568000000004 -36.144165,174.185790999999995 -36.171944000000003,174.191345000000013 -36.176392,174.19830300000001 -36.18,174.217743000000013 -36.182502999999997,174.226898000000006 -36.182502999999997,174.236084000000005 -36.180557,174.244110000000006 -36.183059999999998,174.287749999999988 -36.210281000000002,174.312468999999993 -36.236663999999998,174.314696999999995 -36.243889000000003,174.267212 -36.270279000000002,174.259430000000009 -36.273055999999997,174.251373 -36.272499000000003,174.065796000000006 -36.168334999999999,173.999114999999989 -36.121108999999997,173.994415000000004 -36.115836999999999,173.99105800000001 -36.109444000000003,173.931091000000009 -35.981940999999999,173.938568000000004 -35.934998,173.947478999999987 -35.923889000000003,173.948577999999998 -35.915550000000003,173.946075000000008 -35.908051,173.913879000000009 -35.86972,173.908324999999991 -35.874442999999999,173.903870000000012 -35.879997000000003,173.904967999999997 -35.888336000000002,173.921356000000003 -36.003059,173.980804000000006 -36.121383999999999,173.987731999999994 -36.134171000000002,173.992461999999989 -36.139724999999999,174.124390000000005 -36.263618,174.176085999999998 -36.276947,174.180542000000003 -36.282501000000003,174.198853000000014 -36.343887000000002,174.199982000000006 -36.352226000000002,174.198028999999991 -36.368606999999997,174.194702000000007 -36.375275000000002,174.189147999999989 -36.379722999999998,174.115233999999987 -36.40361,174.089966000000004 -36.411385000000003,174.080811000000011 -36.409438999999999,174.06942699999999 -36.400275999999998,174.065796000000006 -36.393889999999999,174.057465000000008 -36.374718,174.049133000000012 -36.353614999999998,174.044433999999995 -36.338889999999999,174.039703000000003 -36.323334000000003,174.031096999999988 -36.293059999999997,174.020537999999988 -36.273887999999999,173.82607999999999 -36.032501000000003,173.737457000000006 -35.933608999999997,173.727172999999993 -35.923614999999998,173.590515000000011 -35.778053,173.398865 -35.573891000000003,173.395537999999988 -35.567504999999997,173.398865 -35.553612,173.446625000000012 -35.440277000000002,173.465789999999998 -35.429169000000002,173.501923000000005 -35.419724000000002,173.506378000000012 -35.425277999999999,173.540253000000007 -35.430832000000002,173.629943999999995 -35.356667000000002,173.65554800000001 -35.322502,173.65554800000001 -35.313332000000003,173.564147999999989 -35.278053,173.556091000000009 -35.280830000000002,173.551636000000002 -35.286391999999999,173.549712999999997 -35.302779999999998,173.549712999999997 -35.321114,173.551909999999992 -35.328612999999997,173.566924999999998 -35.344161999999997,173.568024000000008 -35.361671,173.566924999999998 -35.36972,173.559143000000006 -35.372771999999998,173.439696999999995 -35.376106,173.416077 -35.384444999999999,173.410247999999996 -35.388893000000003,173.391356999999999 -35.423057999999997,173.39498900000001 -35.449722,173.396087999999992 -35.458053999999997,173.392761000000007 -35.482773000000002,173.386382999999995 -35.523330999999999,173.380524000000008 -35.528053,173.37384 -35.524169999999998,173.306915000000004 -35.449165,173.237731999999994 -35.370277000000002,173.154144000000002 -35.276665,173.103302000000014 -35.226104999999997,173.09191899999999 -35.216942000000003,173.087463000000014 -35.211387999999999,173.09191899999999 -35.1875,173.098846000000009 -35.183608999999997,173.119110000000006 -35.185555,173.12802099999999 -35.1875,173.134704999999997 -35.191108999999997,173.14498900000001 -35.191940000000002,173.152771 -35.189163,173.163879000000009 -35.179169000000002,173.168578999999994 -35.173614999999998,173.18081699999999 -35.156104999999997,173.187468999999993 -35.143332999999998,173.191924999999998 -35.128334000000002,173.196349999999995 -35.104446000000003,173.197478999999987 -35.09639,173.198577999999998 -35.078887999999999,173.198577999999998 -35.051108999999997,173.193848000000003 -35.027222000000002,173.189423000000005 -35.012779000000002,173.179413000000011 -34.993332000000002,173.175812000000008 -34.986946000000003,173.159149000000014 -34.958336000000003,173.151093000000003 -34.946663,173.137755999999996 -34.93,172.947204999999997 -34.716942000000003,172.828033000000005 -34.584442000000003,172.812468999999993 -34.568893000000003,172.722473000000008 -34.495277000000002,172.739136000000002 -34.435555,172.900817999999987 -34.414718999999998,172.911925999999994 -34.414718999999998,173.020813000000004 -34.422226000000002,173.038879000000009 -34.436942999999999,173.043304000000006 -34.517775999999998,173.039977999999991 -34.522224,173.033324999999991 -34.525832999999999,173.024414000000007 -34.527779000000002,173.016662999999994 -34.52861,173.007476999999994 -34.526947,172.997467 -34.498336999999999,172.984130999999991 -34.472771000000002,172.961914000000007 -34.465279000000002,172.955230999999998 -34.468887000000002,172.908324999999991 -34.544167000000002,172.912749999999988 -34.549728000000002,172.923858999999993 -34.558891000000003,172.936095999999992 -34.567222999999998,172.973021999999986 -34.581116000000002,173.053314 -34.665550000000003,173.057738999999998 -34.680283000000003,173.110503999999992 -34.791389000000002,173.120789000000002 -34.810555,173.128570999999994 -34.822502,173.133026 -34.828055999999997,173.13857999999999 -34.832504,173.151916999999997 -34.839995999999999,173.213593000000003 -34.871941,173.242737000000005 -34.884726999999998,173.273314999999997 -34.940834000000002,173.268859999999989 -34.946387999999999,173.262206999999989 -34.959167,173.259978999999987 -34.966659999999997,173.258881000000002 -34.974716,173.259978999999987 -34.983055,173.264709000000011 -35.014449999999997,173.269135000000006 -35.019722000000002,173.317474000000004 -35.018889999999999,173.328583000000009 -35.009444999999999,173.358856000000003 -34.98111,173.36300700000001 -34.975555,173.366364000000004 -34.968887000000002,173.373259999999988 -34.936774999999997,173.371246000000014 -34.927444,173.400817999999987 -34.863334999999999,173.426085999999998 -34.82,173.450806 -34.807777000000002,173.500274999999988 -34.864722999999998,173.499114999999989 -34.871108999999997,173.492461999999989 -34.874718,173.452453999999989 -34.887779000000002,173.443297999999999 -34.889724999999999,173.433319000000012 -34.890555999999997,173.413025000000005 -34.888893000000003,173.405243000000013 -34.892502,173.399719000000005 -34.897224,173.399719000000005 -34.906387000000002,173.402190999999988 -34.913887000000003,173.411590999999987 -34.931778,173.419128 -34.945830999999998,173.426909999999992 -34.957779000000002,173.431641000000013 -34.963332999999999,173.44165000000001 -34.973328000000002,173.454131999999987 -34.981667000000002,173.467467999999997 -34.988892,173.475525000000005 -34.991669000000002,173.493286000000012 -34.995277000000002,173.541655999999989 -34.988608999999997,173.561645999999996 -34.958893000000003,173.562468999999993 -34.950836000000002,173.566924999999998 -34.936110999999997,173.572478999999987 -34.931389000000003,173.579131999999987 -34.927779999999998,173.589416999999997 -34.928612,173.83914200000001 -35.004173000000002,174.101074000000011 -35.121108999999997,174.098297000000002 -35.161667,174.091644000000002 -35.158051,174.056641000000013 -35.155555999999997,174.021911999999986 -35.164161999999997,174.008026 -35.207504,174.008026 -35.215004,174.011382999999995 -35.221381999999998,174.018311000000011 -35.224997999999999,174.093841999999995 -35.225273,174.100525000000005 -35.228881999999999,174.143585000000002 -35.328612999999997,174.208008000000007 -35.323334000000003,174.218018 -35.322226999999998,174.247741999999988 -35.27861,174.319976999999994 -35.232773000000002,174.383881000000002 -35.337775999999998,174.461638999999991 -35.445273999999998,174.491913000000011 -35.485275,174.575806 -35.601944000000003,174.577179 -35.610000999999997,174.577147999999994 -35.618088,174.569976999999994 -35.648055999999997,174.563292999999987 -35.651665,174.530272999999994 -35.649445,174.520263999999997 -35.648612999999997,174.513306 -35.645004,174.505248999999992 -35.642502,174.479126000000008 -35.641945,174.47357199999999 -35.646393000000003,174.474975999999998 -35.654716,174.518311000000011 -35.724167,174.523041000000006 -35.729438999999999,174.554137999999995 -35.750281999999999,174.561919999999986 -35.753059,174.583862000000011 -35.764724999999999,174.60244800000001 -35.844444000000003,174.596924 -35.849167,174.58914200000001 -35.851944000000003,174.577758999999986 -35.852226000000002,174.560790999999995 -35.847777999999998,174.554961999999989 -35.843330000000002,174.538574000000011 -35.819450000000003,174.523314999999997 -35.796669,174.519713999999993 -35.790283000000002,174.49105800000001 -35.769447,174.361908 -35.723328000000002,174.357451999999995 -35.72361,174.34857199999999 -35.734726000000002,174.346924 -35.833061,174.350525000000005 -35.839438999999999,174.35522499999999 -35.845001000000003,174.360779000000008 -35.849442000000003,174.381348000000003 -35.851112,174.384704999999997 -35.844718999999998,174.385528999999991 -35.828887999999999,174.391083000000009 -35.824173000000002,174.398865 -35.821387999999999,174.437468999999993 -35.822777000000002,174.476074000000011 -35.824173000000002,174.486358999999993 -35.824722,174.519713999999993 -35.844718999999998,174.525542999999999 -35.849167,174.524414000000007 -35.855559999999997,174.521362000000011 -35.862220999999998,174.501373 -35.889999000000003,174.496917999999994 -35.895553999999997,174.487182999999987 -35.915000999999997,174.495513999999986 -35.988608999999997,174.498016000000007 -35.994163999999998,174.514160000000004 -36.008614,174.56942699999999 -36.037224000000002,174.578583000000009 -36.038894999999997,174.587738000000002 -36.038894999999997,174.596619000000004 -36.036667,174.606902999999988 -36.037506,174.612731999999994 -36.042228999999999,174.622192000000013 -36.053055,174.62912 -36.065834000000002,174.629394999999988 -36.075004999999997,174.616364000000004 -36.100861000000002)),((171.185241999999988 -44.938332000000003,171.182129000000003 -44.94173,171.175017999999994 -44.949902000000002,171.167923000000002 -44.959850000000003,171.165436 -44.966599000000002,171.164703000000003 -44.970275999999998,171.163299999999992 -44.978332999999999,171.149719000000005 -44.996665999999998,171.07995600000001 -45.067222999999998,171.02664200000001 -45.103332999999999,170.975525000000005 -45.151108,170.966063999999989 -45.163055,170.961914000000007 -45.169167000000002,170.921630999999991 -45.243057,170.873566000000011 -45.358055,170.873290999999995 -45.367218,170.876891999999998 -45.373885999999999,170.871338000000009 -45.424171,170.859955000000014 -45.487502999999997,170.855804000000006 -45.493889000000003,170.750274999999988 -45.61972,170.674682999999987 -45.745002999999997,170.616913000000011 -45.839438999999999,170.55886799999999 -45.881667999999998,170.554413000000011 -45.888053999999997,170.555542000000003 -45.896110999999998,170.591063999999989 -45.894165,170.600525000000005 -45.891669999999998,170.608582000000013 -45.888053999999997,170.658600000000007 -45.858612,170.718018 -45.817504999999997,170.724670000000003 -45.813057,170.773314999999997 -45.782775999999998,170.781096999999988 -45.786391999999999,170.790802000000014 -45.806946000000003,170.790802000000014 -45.84639,170.788879000000009 -45.863892,170.783051 -45.878334000000002,170.776366999999993 -45.882773999999998,170.699982000000006 -45.911667,170.664429000000013 -45.908332999999999,170.57330300000001 -45.916663999999997,170.550536999999991 -45.919167000000002,170.484406000000007 -45.926949,170.452453999999989 -45.931946000000003,170.424408 -45.939438000000003,170.382721000000004 -45.956108,170.342467999999997 -45.97361,170.315246999999999 -45.991385999999999,170.309692000000013 -45.996948000000003,170.294433999999995 -46.013893000000003,170.281646999999992 -46.029442000000003,170.263610999999997 -46.051940999999999,170.256378000000012 -46.065551999999997,170.253051999999997 -46.081947,170.252472000000012 -46.09111,170.254424999999998 -46.107779999999998,170.252777000000009 -46.115836999999999,170.240783999999991 -46.146949999999997,170.237731999999994 -46.154167,170.226623999999987 -46.165000999999997,170.214416999999997 -46.174720999999998,170.193848000000003 -46.188048999999999,170.169433999999995 -46.198608,170.067748999999992 -46.246665999999998,169.911925999999994 -46.340279000000002,169.863585999999998 -46.371383999999999,169.858001999999999 -46.376663,169.849396000000013 -46.389442000000003,169.848021999999986 -46.416946000000003,169.849975999999998 -46.433326999999998,169.852172999999993 -46.440834000000002,169.853850999999992 -46.457504,169.850799999999992 -46.464722000000002,169.845245000000006 -46.469994,169.701904000000013 -46.558052000000004,169.631348000000003 -46.581947,169.458008000000007 -46.623328999999998,169.266388000000006 -46.656387000000002,169.133026 -46.670836999999999,169.107727000000011 -46.669167000000002,169.097197999999992 -46.666946000000003,169.084411999999986 -46.657501000000003,169.067200000000014 -46.635002,169.061919999999986 -46.675002999999997,169.053864000000004 -46.678612,169.008026 -46.680832000000002,168.883330999999998 -46.667777999999998,168.878296000000006 -46.661942000000003,168.861908 -46.628334000000002,168.862457000000006 -46.619446000000003,168.864409999999992 -46.611114999999998,168.864959999999996 -46.603889000000002,168.844970999999987 -46.563614,168.835784999999987 -46.560555,168.823853000000014 -46.561110999999997,168.733306999999996 -46.577499000000003,168.640533000000005 -46.603889000000002,168.633605999999986 -46.606392,168.614685000000009 -46.611114999999998,168.593018 -46.614165999999997,168.568848000000003 -46.615004999999996,168.516937000000013 -46.614165999999997,168.492737000000005 -46.613334999999999,168.442138999999997 -46.601500999999999,168.436630000000008 -46.599666999999997,168.446625000000012 -46.584003000000003,168.442200000000014 -46.575004999999997,168.454407000000003 -46.574447999999997,168.490509000000003 -46.573059,168.502472000000012 -46.574173000000002,168.506103999999993 -46.578887999999999,168.499114999999989 -46.583328000000002,168.505553999999989 -46.588051,168.551636000000002 -46.594444000000003,168.561371000000008 -46.591942000000003,168.566924999999998 -46.586661999999997,168.563599000000011 -46.580002,168.550812000000008 -46.570557,168.541655999999989 -46.567504999999997,168.391356999999999 -46.540000999999997,168.361908 -46.544449,168.353577 -46.547783000000003,168.351623999999987 -46.556106999999997,168.352172999999993 -46.564444999999999,168.362731999999994 -46.583885000000002,168.348236000000014 -46.582165000000003,168.352904999999993 -46.584499,168.359267999999986 -46.585830999999999,168.365082 -46.592666999999999,168.367248999999987 -46.596668,168.367599000000013 -46.601497999999999,168.364928999999989 -46.605331,168.35775799999999 -46.604500000000002,168.351409999999987 -46.603164999999997,168.275269000000009 -46.557777000000002,168.269135000000006 -46.535561,168.268311000000011 -46.529167,168.27664200000001 -46.525832999999999,168.286102 -46.523330999999999,168.307738999999998 -46.520553999999997,168.318297999999999 -46.520836000000003,168.318848000000003 -46.529167,168.321075000000008 -46.536667,168.328856999999999 -46.540557999999997,168.339416999999997 -46.539169,168.386658000000011 -46.497779999999999,168.392486999999988 -46.492226000000002,168.395537999999988 -46.485000999999997,168.396087999999992 -46.477775999999999,168.394135000000006 -46.470275999999998,168.37384 -46.421944000000003,168.36883499999999 -46.416106999999997,168.359679999999997 -46.415000999999997,168.350249999999988 -46.417503000000004,168.250274999999988 -46.400832999999999,168.211090000000013 -46.355277999999998,168.206085000000002 -46.351394999999997,168.194702000000007 -46.345551,168.185516000000007 -46.342498999999997,168.174988000000013 -46.340279000000002,168.116364000000004 -46.343612999999998,168.063873 -46.351669,167.955535999999995 -46.371383999999999,167.893035999999995 -46.387222,167.850799999999992 -46.399445,167.832184000000012 -46.398612999999997,167.824401999999992 -46.394447,167.753875999999991 -46.333885000000002,167.776916999999997 -46.312775000000002,167.781372000000005 -46.306389000000003,167.783600000000007 -46.298340000000003,167.781372000000005 -46.290840000000003,167.778045999999989 -46.284171999999998,167.701904000000013 -46.209442000000003,167.596924 -46.166389000000002,167.556641000000013 -46.156387000000002,167.546356000000003 -46.154167,167.534424 -46.152779000000002,167.483032000000009 -46.149726999999999,167.471069 -46.149994,167.460236000000009 -46.151389999999999,167.451904000000013 -46.154716,167.446075000000008 -46.159996,167.415526999999997 -46.204720000000002,167.356628 -46.254447999999996,167.280272999999994 -46.273055999999997,167.261108000000007 -46.267775999999998,167.238555999999988 -46.263893000000003,167.086638999999991 -46.240555,167.001373 -46.229163999999997,166.966063999999989 -46.224716,166.949982000000006 -46.223885000000003,166.915253000000007 -46.226104999999997,166.883026 -46.229996,166.836365 -46.232498,166.823028999999991 -46.231667000000002,166.768035999999995 -46.22361,166.726348999999999 -46.214165,166.717467999999997 -46.210830999999999,166.705230999999998 -46.201110999999997,166.670806999999996 -46.161667,166.67025799999999 -46.15361,166.684417999999994 -46.145004,166.693848000000003 -46.142775999999998,166.709411999999986 -46.135277000000002,166.738861000000014 -46.119163999999998,166.761230000000012 -46.093612999999998,166.784911999999991 -46.064945000000002,166.804748999999987 -46.033279,166.82995600000001 -46.003891000000003,166.854674999999986 -45.994163999999998,166.886932000000002 -45.990279999999998,166.943297999999999 -45.956108,166.949127000000004 -45.950836000000002,166.946930000000009 -45.945273999999998,166.939147999999989 -45.944716999999997,166.929687999999999 -45.947220000000002,166.836365 -45.981383999999998,166.828033000000005 -45.984444000000003,166.791350999999992 -46.005004999999997,166.785797000000002 -46.010283999999999,166.781096999999988 -46.016396,166.759308000000004 -46.035553,166.762969999999996 -46.038387,166.764969000000008 -46.042392999999997,166.763656999999995 -46.047221999999998,166.760162000000008 -46.050392000000002,166.740982000000002 -46.066059000000003,166.737793000000011 -46.066558999999998,166.670532000000009 -46.087218999999997,166.615783999999991 -46.090836000000003,166.613585999999998 -46.086387999999999,166.617461999999989 -46.059722999999998,166.621062999999992 -46.052498,166.640807999999993 -46.015006999999997,166.661652000000004 -45.991942999999999,166.625792999999987 -45.967216,166.492461999999989 -46.013061999999998,166.484406000000007 -46.014449999999997,166.474975999999998 -46.002785000000003,166.467194000000006 -45.990555,166.465239999999994 -45.983055,166.464690999999988 -45.839438999999999,166.468841999999995 -45.823059,166.472473000000008 -45.815834000000002,166.476898000000006 -45.809722999999998,166.537475999999998 -45.798889000000003,166.613861000000014 -45.801108999999997,166.652190999999988 -45.800277999999999,166.699982000000006 -45.798889000000003,166.881348000000003 -45.779998999999997,166.890807999999993 -45.777779000000002,166.974120999999997 -45.735000999999997,166.987182999999987 -45.709724,166.923034999999999 -45.705832999999998,166.912475999999998 -45.705275999999998,166.887482000000006 -45.705002,166.854126000000008 -45.707779000000002,166.825806 -45.714722000000002,166.809417999999994 -45.721381999999998,166.787475999999998 -45.689995000000003,166.775817999999987 -45.662773,166.81153900000001 -45.617942999999997,166.811217999999997 -45.613109999999999,166.812531000000007 -45.608111999999998,166.816710999999998 -45.605606000000002,166.869689999999991 -45.588779000000002,166.881026999999989 -45.586112999999997,166.88736 -45.585278000000002,166.895203000000009 -45.585608999999998,166.901366999999993 -45.587108999999998,166.912871999999993 -45.590946000000002,166.980255 -45.578612999999997,166.991913000000011 -45.580002,167.0 -45.576949999999997,167.005829000000006 -45.571671000000002,167.032470999999987 -45.527779000000002,167.041350999999992 -45.501396,166.989685000000009 -45.519165,166.891693000000004 -45.544724000000002,166.796875 -45.569389,166.791199000000006 -45.570720999999999,166.784836000000013 -45.571556,166.777023000000014 -45.571219999999997,166.710509999999999 -45.579445,166.704407000000003 -45.574447999999997,166.697204999999997 -45.554718,166.699127000000004 -45.546669,166.757476999999994 -45.425277999999999,166.801361000000014 -45.353614999999998,166.821625000000012 -45.320557,166.86883499999999 -45.279724000000002,166.880797999999999 -45.279167,167.008330999999998 -45.341667,167.038299999999992 -45.357779999999998,167.146941999999996 -45.427222999999998,167.16885400000001 -45.472496,167.205230999999998 -45.477775999999999,167.211914000000007 -45.475273,167.21414200000001 -45.467216,167.209411999999986 -45.461387999999999,167.173584000000005 -45.422775,167.158019999999993 -45.406661999999997,167.134978999999987 -45.386116,167.12912 -45.381385999999999,167.115509000000003 -45.372222999999998,167.097747999999996 -45.366112,167.087463000000014 -45.363616999999998,167.061645999999996 -45.345001000000003,167.051085999999998 -45.333328000000002,167.081421000000006 -45.325333,167.08407600000001 -45.321666999999998,167.092407000000009 -45.316498000000003,167.097243999999989 -45.314498999999998,167.114227 -45.310333,167.163574000000011 -45.302833999999997,167.169922000000014 -45.302998000000002,167.173584000000005 -45.305999999999997,167.176422000000002 -45.309330000000003,167.17756700000001 -45.313834999999997,167.212738000000002 -45.313332000000003,167.218841999999995 -45.318336000000002,167.232178000000005 -45.327224999999999,167.239685000000009 -45.331116000000002,167.248566000000011 -45.334167,167.260254000000003 -45.335830999999999,167.270813000000004 -45.334442000000003,167.301636000000002 -45.329445,167.309692000000013 -45.326110999999997,167.307738999999998 -45.318610999999997,167.300262000000004 -45.314444999999999,167.19464099999999 -45.271445999999997,167.138290000000012 -45.268943999999998,167.099471999999992 -45.272114000000002,167.094146999999992 -45.271278000000002,167.08964499999999 -45.268776000000003,167.002196999999995 -45.201110999999997,166.996917999999994 -45.145836000000003,167.146362000000011 -45.001671000000002,167.198577999999998 -44.956108,167.204407000000003 -44.951110999999997,167.228302000000014 -44.930832000000002,167.24105800000001 -44.921387000000003,167.260528999999991 -44.907501000000003,167.267486999999988 -44.903053,167.312744000000009 -44.875,167.320800999999989 -44.871383999999999,167.393462999999997 -44.862999000000002,167.398987000000005 -44.861496000000002,167.404312000000004 -44.863498999999997,167.421798999999993 -44.894168999999998,167.422974000000011 -44.898665999999999,167.420638999999994 -44.908496999999997,167.417968999999999 -44.912166999999997,167.440796000000006 -44.928612,167.439972000000012 -44.9375,167.441924999999998 -44.945,167.459686000000005 -44.99472,167.497741999999988 -45.003891000000003,167.507202000000007 -45.001396,167.508224000000013 -45.0,167.511658000000011 -44.995277000000002,167.511108000000007 -44.986946000000003,167.47908000000001 -44.903446000000002,167.465912000000003 -44.876441999999997,167.462752999999992 -44.867947,167.461578000000003 -44.863444999999999,167.460097999999988 -44.853946999999998,167.459411999999986 -44.843944999999998,167.459914999999995 -44.838444000000003,167.448577999999998 -44.795279999999998,167.453033000000005 -44.788894999999997,167.458587999999992 -44.783614999999998,167.59970100000001 -44.683883999999999,167.743010999999996 -44.611671,167.838866999999993 -44.498610999999997,167.850249999999988 -44.488052000000003,167.949982000000006 -44.40361,167.963593000000003 -44.395004,168.034973000000008 -44.353614999999998,168.12802099999999 -44.316947999999996,168.141662999999994 -44.308052000000004,168.144713999999993 -44.300834999999999,168.144135000000006 -44.292503000000004,168.124099999999999 -44.251404,168.143311000000011 -44.253059,168.153594999999996 -44.251396,168.169708000000014 -44.24472,168.288299999999992 -44.172775,168.29385400000001 -44.167503000000004,168.336638999999991 -44.123885999999999,168.339966000000004 -44.116661,168.337738000000002 -44.109169,168.334411999999986 -44.102783000000002,168.336365 -44.094444000000003,168.369689999999991 -44.043334999999999,168.374968999999993 -44.037781000000003,168.383026 -44.034447,168.402771 -44.029724000000002,168.672211000000004 -43.987777999999999,168.676909999999992 -43.993614,168.683043999999995 -43.998336999999999,168.690246999999999 -44.002228000000002,168.715239999999994 -44.012222,168.723021999999986 -44.012504999999997,168.753875999999991 -44.010002,168.764160000000004 -44.008614,168.824401999999992 -43.988334999999999,168.858582000000013 -43.976661999999997,168.866364000000004 -43.973328000000002,168.879669000000007 -43.964447,168.885254000000003 -43.959167,168.961914000000007 -43.90361,169.080765000000014 -43.848472999999998,169.142212 -43.794167000000002,169.224396000000013 -43.743332000000002,169.271636999999998 -43.722496,169.387482000000006 -43.679169000000002,169.491318000000007 -43.643467,169.539153999999996 -43.633614,169.62661700000001 -43.613892,169.64498900000001 -43.608893999999999,169.652771 -43.605559999999997,169.660521999999986 -43.601944000000003,169.721619000000004 -43.573334000000003,169.728302000000014 -43.568893000000003,169.739136000000002 -43.558052000000004,169.767486999999988 -43.522773999999998,169.790526999999997 -43.496665999999998,169.871062999999992 -43.406661999999997,169.884154999999993 -43.397781000000002,169.961638999999991 -43.371941,170.021911999999986 -43.352500999999997,170.028594999999996 -43.347777999999998,170.033874999999995 -43.342498999999997,170.038025000000005 -43.336112999999997,170.049408 -43.306946000000003,170.111358999999993 -43.254173000000002,170.288299999999992 -43.107779999999998,170.418029999999987 -43.052498,170.523041000000006 -43.010559,170.531921000000011 -43.008057,170.583037999999988 -42.990555,170.674347000000012 -42.958739999999999,170.704407000000003 -42.945830999999998,170.750549000000007 -42.924720999999998,170.781096999999988 -42.910553,170.794128 -42.901389999999999,171.065796000000006 -42.648055999999997,171.108306999999996 -42.608055,171.149719000000005 -42.563614,171.153594999999996 -42.55722,171.196075000000008 -42.476661999999997,171.225799999999992 -42.433608999999997,171.230255 -42.40889,171.235779000000008 -42.394165,171.247467 -42.375,171.260254000000003 -42.366112,171.270537999999988 -42.355003000000004,171.297760000000011 -42.310279999999999,171.304413000000011 -42.296669,171.309692000000013 -42.281944000000003,171.31665000000001 -42.249724999999998,171.321075000000008 -42.224716,171.322754000000003 -42.207222000000002,171.324401999999992 -42.18972,171.326355000000007 -42.172226000000002,171.329131999999987 -42.155830000000002,171.343841999999995 -42.110832000000002,171.361084000000005 -42.067779999999999,171.461638999999991 -41.859726000000002,171.51080300000001 -41.764449999999997,171.533051 -41.766396,171.557738999999998 -41.766663,171.569121999999993 -41.766112999999997,171.650817999999987 -41.761391000000003,171.663025000000005 -41.757781999999999,171.685790999999995 -41.746948000000003,171.790526999999997 -41.696387999999999,171.85522499999999 -41.652779000000002,171.886658000000011 -41.629997000000003,171.942200000000014 -41.550277999999999,172.02276599999999 -41.443053999999997,172.053864000000004 -41.417503000000004,172.064972000000012 -41.40361,172.122192000000013 -41.277779000000002,172.111633000000012 -41.236114999999998,172.10522499999999 -41.153053,172.106078999999994 -40.911385000000003,172.10635400000001 -40.893059,172.108856000000003 -40.885559,172.113861000000014 -40.879997000000003,172.186645999999996 -40.813332000000003,172.218567000000007 -40.785834999999999,172.22470100000001 -40.781109,172.255248999999992 -40.776947,172.263884999999988 -40.774169999999998,172.271362000000011 -40.770553999999997,172.299408 -40.755004999999997,172.348297000000002 -40.727493000000003,172.382721000000004 -40.698334000000003,172.426909999999992 -40.657775999999998,172.478302000000014 -40.613892,172.513320999999991 -40.598441999999999,172.517639000000003 -40.596783000000002,172.523482999999999 -40.597946,172.522644000000014 -40.602943000000003,172.521132999999992 -40.607277000000003,172.520813000000004 -40.625,172.519440000000003 -40.631385999999999,172.525542999999999 -40.6325,172.534149000000014 -40.631667999999998,172.571899000000002 -40.617775000000002,172.596343999999988 -40.601394999999997,172.62802099999999 -40.573891000000003,172.631621999999993 -40.567222999999998,172.631621999999993 -40.559998,172.608582000000013 -40.556946000000003,172.601348999999999 -40.558891000000003,172.597014999999999 -40.553333000000002,172.589690999999988 -40.558838000000002,172.583862000000011 -40.560004999999997,172.581024000000014 -40.556671,172.581848000000008 -40.551665999999997,172.589843999999999 -40.541172000000003,172.627166999999986 -40.511947999999997,172.633330999999998 -40.509171000000002,172.661376999999987 -40.502785000000003,172.712188999999995 -40.495552000000004,172.817748999999992 -40.504173000000002,172.861358999999993 -40.507781999999999,172.981628 -40.527222000000002,172.991332999999997 -40.529167,172.989959999999996 -40.53389,172.978026999999997 -40.53389,172.945251000000013 -40.530830000000002,172.895263999999997 -40.524445,172.797211000000004 -40.516112999999997,172.739959999999996 -40.516945,172.731628 -40.519722000000002,172.656921000000011 -40.653328000000002,172.701355000000007 -40.748336999999999,172.855804000000006 -40.853057999999997,172.865509000000003 -40.853057999999997,172.875244000000009 -40.851112,172.907195999999999 -40.828887999999999,172.930266999999986 -40.802222999999998,172.935241999999988 -40.796669,172.976623999999987 -40.781944000000003,172.985229000000004 -40.781112999999998,173.002196999999995 -40.786667,173.008330999999998 -40.791114999999998,173.013306 -40.796669,173.020537999999988 -40.809722999999998,173.051085999999998 -40.869446000000003,173.059692000000013 -40.962775999999998,173.059692000000013 -40.971938999999999,173.056091000000009 -40.978606999999997,173.031646999999992 -41.027495999999999,173.075806 -41.291114999999998,173.079680999999994 -41.297500999999997,173.085784999999987 -41.302222999999998,173.105529999999987 -41.313332000000003,173.168029999999987 -41.316108999999997,173.188873 -41.313332000000003,173.198853000000014 -41.311385999999999,173.207184000000012 -41.308608999999997,173.272217000000012 -41.274445,173.278320000000008 -41.269722000000002,173.32607999999999 -41.222496,173.340515000000011 -41.205832999999998,173.351623999999987 -41.195549,173.377166999999986 -41.178055,173.426085999999998 -41.150275999999998,173.598021999999986 -41.053612,173.606628 -41.052498,173.639709000000011 -41.073616,173.672760000000011 -41.070557,173.720519999999993 -41.060279999999999,173.727753000000007 -41.056389000000003,173.739959999999996 -41.047226000000002,173.744689999999991 -41.032501000000003,173.743286000000012 -41.024169999999998,173.738281 -41.018608,173.72744800000001 -41.019447,173.718841999999995 -41.022499000000003,173.696930000000009 -41.033614999999998,173.690796000000006 -41.038338000000003,173.682189999999991 -41.041114999999998,173.676085999999998 -41.036391999999999,173.673584000000005 -41.029167,173.674682999999987 -41.020836000000003,173.678314 -41.014449999999997,173.696625000000012 -41.000281999999999,173.751373 -40.976944000000003,173.800262000000004 -40.969161999999997,173.913299999999992 -40.931671,173.984679999999997 -40.896949999999997,173.994415000000004 -40.896667,174.02276599999999 -40.913055,174.027771 -40.91861,174.030272999999994 -40.925834999999999,174.03054800000001 -40.935271999999998,174.02941899999999 -40.943610999999997,174.022217000000012 -40.947220000000002,173.929961999999989 -40.992226000000002,173.832184000000012 -40.995002999999997,173.821075000000008 -40.994163999999998,173.782195999999999 -41.009171000000002,173.778594999999996 -41.015555999999997,173.769713999999993 -41.09861,173.778594999999996 -41.114449,173.794433999999995 -41.109444000000003,173.822204999999997 -41.080832999999998,173.821899000000002 -41.062218,173.836638999999991 -41.055,173.846343999999988 -41.053055,173.93081699999999 -41.049446000000003,173.946625000000012 -41.055832000000002,173.953033000000005 -41.060555,173.917755 -41.087502,173.887482000000006 -41.103332999999999,173.848846000000009 -41.144165,173.820526 -41.245834000000002,173.763306 -41.267502,173.76080300000001 -41.273055999999997,173.775817999999987 -41.289726000000002,173.788025000000005 -41.290557999999997,173.806365999999997 -41.289444000000003,174.03720100000001 -41.218330000000002,174.09970100000001 -41.198334000000003,174.128845000000013 -41.187218,174.133605999999986 -41.181671,174.133605999999986 -41.176108999999997,174.126068000000004 -41.174171,174.008605999999986 -41.175277999999999,174.001099000000011 -41.178885999999999,174.001373 -41.186385999999999,174.000274999999988 -41.194716999999997,173.993010999999996 -41.198334000000003,173.981902999999988 -41.199440000000003,173.932738999999998 -41.199997000000003,173.908324999999991 -41.199997000000003,173.899719000000005 -41.197495000000004,173.893585000000002 -41.192771999999998,173.887206999999989 -41.169724000000002,173.88580300000001 -41.161667,173.888031000000012 -41.154167,173.89776599999999 -41.133614,173.902466000000004 -41.128334000000002,174.032745000000006 -40.999724999999998,174.084411999999986 -41.021385000000002,174.094116000000014 -41.023330999999999,174.246338000000009 -41.044724000000002,174.258330999999998 -41.035277999999998,174.299408 -41.003616,174.315246999999999 -41.000557,174.323853000000014 -41.003334000000002,174.323853000000014 -41.010834000000003,174.321625000000012 -41.018059,174.209960999999993 -41.197495000000004,174.161376999999987 -41.225555,174.152771 -41.226661999999997,174.114685000000009 -41.231383999999998,174.052185000000009 -41.235000999999997,174.02664200000001 -41.236114999999998,174.053864000000004 -41.254173000000002,174.206359999999989 -41.269447,174.214966000000004 -41.266663,174.291655999999989 -41.238892,174.303588999999988 -41.229720999999998,174.320800999999989 -41.220275999999998,174.326904000000013 -41.222771000000002,174.288574000000011 -41.276947,174.249114999999989 -41.322502,174.241637999999995 -41.326110999999997,174.231902999999988 -41.328055999999997,174.208587999999992 -41.329445,174.193572999999986 -41.320281999999999,174.155243000000013 -41.305,174.148041000000006 -41.308608999999997,174.111633000000012 -41.336661999999997,174.052764999999994 -41.421112,174.049133000000012 -41.427779999999998,174.044433999999995 -41.442497000000003,174.045806999999996 -41.450836000000002,174.049988000000013 -41.466392999999997,174.063873 -41.493057,174.084136999999998 -41.526108,174.097473000000008 -41.519447,174.096069 -41.511116,174.100799999999992 -41.505561999999998,174.108306999999996 -41.509171000000002,174.114685000000009 -41.513893000000003,174.125792999999987 -41.523887999999999,174.151093000000003 -41.551392,174.176085999999998 -41.578612999999997,174.178864000000004 -41.586112999999997,174.179961999999989 -41.594444000000003,174.179137999999995 -41.602783000000002,174.174133000000012 -41.608336999999999,174.163299999999992 -41.618606999999997,174.157195999999999 -41.623328999999998,174.193024000000008 -41.685555,174.287749999999988 -41.734444000000003,174.291655999999989 -41.740836999999999,174.289153999999996 -41.748336999999999,174.283324999999991 -41.762222,174.236358999999993 -41.837218999999997,174.212188999999995 -41.865279999999998,174.201355000000007 -41.875557,174.184143000000006 -41.890555999999997,174.17804000000001 -41.895004,174.164703000000003 -41.90361,174.157195999999999 -41.907218999999998,174.143585000000002 -41.915832999999999,174.088561999999996 -41.957779000000002,174.009154999999993 -42.027495999999999,173.979674999999986 -42.061110999999997,173.965239999999994 -42.086945,173.959136999999998 -42.100838000000003,173.954407000000003 -42.115555,173.953307999999993 -42.123885999999999,173.953583000000009 -42.133330999999998,173.956359999999989 -42.166389000000002,173.933319000000012 -42.196944999999999,173.928314 -42.202499000000003,173.884154999999993 -42.243614,173.87802099999999 -42.248055,173.870513999999986 -42.251944999999999,173.86300700000001 -42.255561999999998,173.834686000000005 -42.271385000000002,173.801361000000014 -42.293059999999997,173.794983000000002 -42.297500999999997,173.568572999999986 -42.476944000000003,173.558593999999999 -42.487777999999999,173.541350999999992 -42.511947999999997,173.533874999999995 -42.525002,173.531372000000005 -42.532218999999998,173.500823999999994 -42.599724000000002,173.480804000000006 -42.621941,173.466063999999989 -42.656944000000003,173.459960999999993 -42.670836999999999,173.448853000000014 -42.690277000000002,173.387755999999996 -42.793616999999998,173.351623999999987 -42.840836000000003,173.328033000000005 -42.898887999999999,173.328033000000005 -42.906387000000002,173.325806 -42.913612,173.285521999999986 -42.958053999999997,173.106902999999988 -43.057777000000002,173.099396000000013 -43.061385999999999,173.090515000000011 -43.064444999999999,173.026366999999993 -43.081947,172.975799999999992 -43.09111,172.953033000000005 -43.092773,172.935516000000007 -43.098334999999999,172.92025799999999 -43.105834999999999,172.838012999999989 -43.148055999999997,172.818024000000008 -43.160828000000002,172.797760000000011 -43.183059999999998,172.772217000000012 -43.219718999999998,172.76080300000001 -43.239165999999997,172.758026 -43.246665999999998,172.726944000000003 -43.415539000000003,172.726593000000008 -43.423355,172.775817999999987 -43.612220999999998,172.894135000000006 -43.61972,172.90554800000001 -43.620834000000002,173.059692000000013 -43.653053,173.100525000000005 -43.697220000000002,173.105529999999987 -43.703612999999997,173.114409999999992 -43.741385999999999,173.116913000000011 -43.762504999999997,173.116913000000011 -43.769996999999996,173.112182999999987 -43.825004999999997,173.110779000000008 -43.833328000000002,173.091644000000002 -43.856392,173.058593999999999 -43.871108999999997,173.006088000000005 -43.869498999999998,173.002242999999993 -43.868999000000002,172.999236999999994 -43.865668999999997,172.990905999999995 -43.849670000000003,172.965239999999994 -43.802222999999998,172.961365 -43.764449999999997,172.958862000000011 -43.756950000000003,172.951355000000007 -43.755279999999999,172.939972000000012 -43.756110999999997,172.927185000000009 -43.766112999999997,172.921906000000007 -43.771667,172.920532000000009 -43.824173000000002,172.920532000000009 -43.833328000000002,172.917572000000007 -43.869221000000003,172.923584000000005 -43.875884999999997,172.931243999999992 -43.881390000000003,172.937408000000005 -43.887886000000002,172.938904000000008 -43.892384,172.938247999999987 -43.896220999999997,172.870789000000002 -43.904442000000003,172.861633000000012 -43.901389999999999,172.811919999999986 -43.882216999999997,172.804413000000011 -43.878334000000002,172.745789000000002 -43.837775999999998,172.740783999999991 -43.832222000000002,172.736908 -43.825836000000002,172.715239999999994 -43.808334000000002,172.642761000000007 -43.772224,172.513031000000012 -43.729438999999999,172.495238999999998 -43.723885000000003,172.483582000000013 -43.722771000000002,172.472197999999992 -43.72361,172.424988000000013 -43.733612,172.413299999999992 -43.743614,172.390258999999986 -43.763893000000003,172.384978999999987 -43.77861,172.382445999999987 -43.795006,172.383330999999998 -43.8125,172.384704999999997 -43.820838999999999,172.394713999999993 -43.850281000000003,172.393311000000011 -43.858612,172.386932000000002 -43.863334999999999,172.367461999999989 -43.867775000000002,172.297211000000004 -43.881110999999997,172.286925999999994 -43.883057,172.275542999999999 -43.883887999999999,172.189696999999995 -43.909163999999997,172.050812000000008 -43.965279000000002,171.978577 -43.995834000000002,171.955230999999998 -44.006667999999998,171.941070999999994 -44.015006999999997,171.782470999999987 -44.076949999999997,171.654694000000006 -44.122498,171.583587999999992 -44.153885000000002,171.547211000000004 -44.173889000000003,171.538483000000014 -44.178775999999999,171.355559999999997 -44.285491999999998,171.346465999999992 -44.292186999999998,171.342467999999997 -44.295555,171.319976999999994 -44.316391000000003,171.293578999999994 -44.343612999999998,171.285521999999986 -44.356392,171.278594999999996 -44.369995000000003,171.271911999999986 -44.383887999999999,171.269135000000006 -44.391112999999997,171.275542999999999 -44.395836000000003,171.279144000000002 -44.402495999999999,171.278594999999996 -44.420836999999999,171.277190999999988 -44.428885999999999,171.275542999999999 -44.437218,171.26998900000001 -44.451942000000003,171.263306 -44.465553,171.254974000000004 -44.478332999999999,171.214966000000004 -44.533057999999997,171.208313000000004 -44.537506,171.200531000000012 -44.541114999999998,171.196075000000008 -44.560279999999999,171.192200000000014 -44.645836000000003,171.193024000000008 -44.663330000000002,171.20495600000001 -44.700279000000002,171.21414200000001 -44.739165999999997,171.215239999999994 -44.747498,171.207184000000012 -44.851112,171.198577999999998 -44.919998,171.195800999999989 -44.927498,171.185241999999988 -44.938332000000003)))'));
+INSERT INTO geoapp_country (`name`, `mpoly`) VALUES ('Texas', GeomFromText('MULTIPOLYGON (((-103.00243399999998 36.500397,-102.90421904194784 36.500393342967676,-102.8402359524855 36.500390960558398,-102.840235952479716 36.500390960558398,-102.840235952474345 36.500390960558398,-102.840235952468362 36.500390960558398,-102.840235952461725 36.500390960558398,-102.840235952455885 36.500390960558398,-102.792077446284736 36.500389167377229,-102.643207699865854 36.500383624214699,-102.366462330167067 36.500373319605465,-102.250452999999979 36.500368999999999,-102.24499 36.500703999999999,-102.162463000000002 36.500326,-102.12545 36.500323999999999,-102.124752896301885 36.500398159967887,-102.122066000000004 36.500684,-101.930244999999999 36.500526,-101.925344139375468 36.500484781341967,-101.914929315957153 36.500397187533892,-101.826564999999988 36.499653999999992,-101.826498 36.499535000000002,-101.81449312121488 36.499579719643286,-101.788110000000003 36.499678000000003,-101.783359000000004 36.499709000000003,-101.781987 36.499718,-101.780609999999982 36.499727,-101.779435000000007 36.499733999999997,-101.773235954788092 36.499732939140301,-101.709314000000006 36.499721999999998,-101.698684999999998 36.499507999999999,-101.653707999999995 36.499572999999998,-101.649966000000006 36.499572999999998,-101.623914999999997 36.499527999999998,-101.414793008557069 36.499417763984319,-101.392608849457574 36.499406069885133,-101.340061173170298 36.499378370041477,-101.085155999999984 36.499243999999997,-101.052418000000003 36.499562999999995,-101.04533099999999 36.499540000000003,-100.977087999999995 36.499594999999999,-100.936058000000003 36.499602000000003,-100.918513000000004 36.499620999999998,-100.884174000000002 36.499682,-100.884079999999997 36.499682,-100.859656999999984 36.499687000000002,-100.850840000000005 36.49969999999999,-100.824235999999999 36.499617999999998,-100.824218000000002 36.499617999999998,-100.80619 36.499673999999999,-100.806172000000004 36.499634,-100.802909 36.499620999999998,-100.802886 36.499620999999998,-100.761810999999994 36.499617999999998,-100.761810999999994 36.499580000000002,-100.724361999999999 36.499580000000002,-100.724361000000002 36.499558,-100.708625999999995 36.499552999999999,-100.708628000000004 36.499520999999994,-100.657762999999989 36.499482999999991,-100.657762999999989 36.499499999999998,-100.648342999999997 36.499495000000003,-100.648343999999994 36.499462999999999,-100.592613999999998 36.499468999999998,-100.592555999999988 36.499468999999998,-100.592551 36.499428999999999,-100.583539000000002 36.499482999999991,-100.583378999999994 36.499442999999999,-100.578113999999999 36.499462999999999,-100.578113999999999 36.499439000000002,-100.546144999999996 36.499343000000003,-100.531215000000003 36.499341,-100.531215000000003 36.499290000000002,-100.530478000000002 36.49924,-100.530314000000004 36.499357000000003,-100.522227 36.499290999999999,-100.441064999999995 36.499490000000002,-100.441063999999997 36.499462,-100.433959000000002 36.499456000000002,-100.421327999999988 36.499447000000004,-100.421300999999985 36.499487999999999,-100.413634000000002 36.499443999999997,-100.41355 36.499468999999998,-100.378634000000005 36.499516999999997,-100.378591999999998 36.499445,-100.35185199999998 36.499487000000002,-100.351841999999991 36.499473000000002,-100.334463999999997 36.49942,-100.334440999999998 36.49944,-100.324150000000003 36.499679,-100.311244999999985 36.499631,-100.311018000000004 36.499687999999999,-100.310642999999985 36.499642,-100.253572851827684 36.499638031344489,-100.181220999999994 36.499633000000003,-100.090020999999993 36.499634,-100.000405999999984 36.499701999999999,-100.0004059967807 36.499497793115623,-100.00040222345956 36.260147946939995,-100.000399000000002 36.055677000000003,-100.000396170268971 35.879197994164429,-100.000394020347557 35.745115995014778,-100.000391999999991 35.619115,-100.000390396259149 35.519130234823749,-100.000386875554753 35.299632926398459,-100.000386874882437 35.299591010324292,-100.000386852473085 35.298193905884737,-100.000384999999994 35.182701999999999,-100.000381972929958 34.852568985943549,-100.000381605014198 34.812443999872983,-100.000381000000004 34.746460999999996,-100.000381000000004 34.570853999999997,-100.000381000000004 34.570647,-100.000381000000004 34.560509000000003,-99.998254592787575 34.560446149085699,-99.997501461048799 34.560423888524269,-99.985833 34.560079000000002,-99.974761999999998 34.561317999999993,-99.971554999999995 34.562179,-99.965608000000003 34.565843999999998,-99.958898000000005 34.571271000000003,-99.957540999999992 34.572708999999996,-99.95755299999999 34.574168999999998,-99.956716999999998 34.576523999999992,-99.954566999999997 34.578195,-99.94571999999998 34.579273,-99.930492488760507 34.576894921075187,-99.930189904388058 34.576847666503667,-99.929333999999997 34.576714000000003,-99.923210999999995 34.574551999999997,-99.921801000000002 34.570253,-99.915771000000007 34.565975000000002,-99.914151070156151 34.564995899308187,-99.898943000000003 34.555804000000002,-99.896006999999997 34.555529999999997,-99.89376 34.554219000000003,-99.887146999999999 34.549047000000002,-99.885392392967745 34.547401436342639,-99.884583851343237 34.546643143067669,-99.87806651563541 34.540530839522475,-99.87650823800611 34.539069404005723,-99.874403 34.537095,-99.873254000000003 34.535350999999999,-99.872356999999994 34.532096000000003,-99.868953000000005 34.52761499999999,-99.867217250163094 34.525864500605081,-99.853065999999998 34.511592999999998,-99.832903999999985 34.500067999999999,-99.825324999999992 34.497596,-99.818185999999997 34.487839999999991,-99.818738999999979 34.484975999999996,-99.814544624457952 34.476663062301249,-99.814312999999984 34.476204000000003,-99.793683999999999 34.453893999999998,-99.783787954821193 34.445078397966533,-99.782985999999994 34.444364,-99.775743000000006 34.444225000000003,-99.774224411180043 34.443216449834381,-99.765598999999995 34.437488000000002,-99.764825999999999 34.436433999999998,-99.764881999999986 34.435265999999999,-99.767647999999994 34.431854,-99.767234000000002 34.430501999999997,-99.754248000000004 34.421288999999994,-99.740907000000007 34.414763,-99.735679661059166 34.413018903486261,-99.730348000000006 34.411239999999992,-99.720258999999999 34.406295,-99.719721039768913 34.405807854123296,-99.716415999999995 34.402814999999997,-99.715089000000006 34.400753999999999,-99.714231999999996 34.397821999999998,-99.714838 34.394523999999997,-99.712682 34.390928000000002,-99.707900999999993 34.387538999999997,-99.696461999999997 34.381036000000002,-99.678282999999979 34.379798999999998,-99.672337448339604 34.378003970284972,-99.671377000000007 34.377713999999997,-99.666676988468737 34.374633899592595,-99.665992000000003 34.374184999999997,-99.665404581506792 34.374094751646162,-99.662705000000003 34.373679999999993,-99.659863615570984 34.374283464835351,-99.659362000000002 34.374389999999998,-99.654194000000004 34.376519000000002,-99.649662000000006 34.379885000000002,-99.630904999999998 34.376007,-99.628541546335526 34.375150829397036,-99.624196999999995 34.373576999999997,-99.600026 34.374687999999999,-99.596322999999998 34.377136999999998,-99.587595999999991 34.385866999999998,-99.587235087741874 34.386377538370702,-99.585718954359294 34.388522226586467,-99.585441999999986 34.388914,-99.584530999999984 34.391204999999999,-99.585306000000003 34.398122,-99.584479999999985 34.407673000000003,-99.580059999999989 34.416652999999997,-99.574366999999995 34.418281,-99.569695999999993 34.418418000000003,-99.563067665646059 34.417445690943012,-99.562203999999994 34.417318999999999,-99.561530791054494 34.417028950664999,-99.555986000000004 34.414639999999999,-99.549242000000007 34.412714999999992,-99.529786 34.411451999999997,-99.528744576810823 34.411579971493573,-99.523649999999989 34.412205999999998,-99.517623999999998 34.414493999999991,-99.514279999999999 34.414034999999998,-99.499874999999989 34.409607999999999,-99.497090999999983 34.407730999999991,-99.494103999999993 34.404755000000002,-99.490425999999999 34.399693999999997,-99.487218999999982 34.397955000000003,-99.477547 34.396355,-99.477019613816751 34.396364300212412,-99.474810232095294 34.396403261641368,-99.472297823530695 34.396447566809115,-99.470968999999997 34.396470999999991,-99.463286816319666 34.393024688790533,-99.452647999999996 34.388252,-99.445020999999983 34.379891999999998,-99.440759999999997 34.374122999999997,-99.430994999999982 34.373413999999997,-99.43081720973791 34.373532661492725,-99.420432000000005 34.380464000000003,-99.408847999999992 34.372776000000002,-99.407167999999999 34.372605,-99.406018176721332 34.372844364351735,-99.404336527339453 34.373194441551952,-99.402959999999979 34.373480999999998,-99.399602999999999 34.375078999999999,-99.397253000000006 34.377870999999999,-99.396160718377317 34.383134276834824,-99.391492 34.405631,-99.393918999999997 34.415273999999989,-99.396488000000005 34.417290999999999,-99.396901999999997 34.418688000000003,-99.397009999999995 34.424002999999999,-99.395768462359129 34.43494110377263,-99.394955999999993 34.442098999999999,-99.381011 34.456935999999999,-99.376037841709419 34.458617501802458,-99.375365000000002 34.458844999999997,-99.369609999999994 34.458699000000003,-99.358795 34.455862999999994,-99.354671999999994 34.451856999999997,-99.35478257092818 34.450383391084422,-99.354837000000003 34.449657999999999,-99.356770999999995 34.446542,-99.357101999999998 34.444915000000002,-99.356712999999999 34.442143999999999,-99.350407000000004 34.437083,-99.342020261837703 34.431514649700844,-99.341336999999996 34.431061,-99.341016600261696 34.430906286427735,-99.334036999999995 34.427536000000003,-99.331050066208874 34.424666026137302,-99.328674000000007 34.422383000000004,-99.325094009617374 34.416010263301388,-99.324222000000006 34.414458000000003,-99.321411663781888 34.411055277053073,-99.319798627189357 34.409102230797522,-99.319605999999979 34.408869000000003,-99.318363000000005 34.408295999999993,-99.316372999999999 34.408204999999995,-99.308273999999997 34.410013999999997,-99.299098 34.414227999999994,-99.294647999999981 34.415373000000002,-99.289922000000004 34.414731000000003,-99.287844819286008 34.413958196831629,-99.264167 34.405149000000002,-99.261320999999981 34.403498999999996,-99.261255940568432 34.403158389836314,-99.260996786434447 34.401801622187399,-99.259199386422964 34.392391568987605,-99.258998120407611 34.391337867029385,-99.258979999999994 34.391243000000003,-99.259239630132384 34.391043961974496,-99.260703756811225 34.389921531074158,-99.261190999999997 34.389547999999998,-99.262646013804954 34.388906249865343,-99.264243556741917 34.388201635660714,-99.264508000000006 34.388084999999997,-99.271031915197597 34.387722560266795,-99.271781628057255 34.38768090955238,-99.273607516746409 34.387579471291865,-99.273957999999993 34.38756,-99.27534 34.386598999999997,-99.274925999999994 34.384903999999999,-99.271845396288441 34.382114976063626,-99.271280999999988 34.381603999999996,-99.258696 34.372633999999998,-99.254722 34.372405,-99.251407999999984 34.375079999999997,-99.248969000000002 34.375984000000003,-99.242944999999992 34.372667999999997,-99.239138083830497 34.366035888164781,-99.237232999999989 34.362716999999996,-99.237183660287812 34.362563767173611,-99.235448627455725 34.357175329079247,-99.234251999999984 34.353459,-99.233273999999994 34.344101000000002,-99.23260599999999 34.342379999999999,-99.229993999999991 34.340538000000002,-99.226152999999982 34.339725999999999,-99.221975 34.340020000000003,-99.219768999999999 34.341377,-99.217335000000006 34.341520000000003,-99.213134999999994 34.340369000000003,-99.210957832415772 34.336710386428308,-99.210716000000005 34.336303999999998,-99.20972399999998 34.324934999999996,-99.211600000000004 34.313969999999998,-99.213476 34.310671999999997,-99.213233598142949 34.308226764636807,-99.211647999999997 34.292231999999991,-99.211468055040228 34.291676209875057,-99.209990337717599 34.287112032604114,-99.209742000000006 34.286344999999997,-99.209514950796304 34.286049346749877,-99.207560999999998 34.283504999999998,-99.203681000000003 34.281925999999999,-99.200221999999997 34.281151999999999,-99.196259999999995 34.281463000000002,-99.196052113016066 34.281264951942028,-99.19571031750732 34.280939333014615,-99.195605 34.280839,-99.194569999999985 34.272424,-99.196926000000005 34.260928999999997,-99.197153 34.244298,-99.19555299999999 34.24006,-99.191138999999993 34.23234,-99.190145999999984 34.229660000000003,-99.190036000000006 34.227186000000003,-99.192076 34.222192,-99.192683000000002 34.218825000000002,-99.192104 34.216693999999997,-99.189758414718312 34.214539281858485,-99.189510999999996 34.214312,-99.188483307800709 34.214128939694163,-99.159015999999994 34.20888,-99.143985 34.214762999999998,-99.138220000000004 34.219158999999998,-99.130609000000007 34.219408,-99.128513999999996 34.218766000000002,-99.127549000000002 34.217986000000003,-99.126614000000004 34.21532899999999,-99.127525000000006 34.213771,-99.130089999999996 34.212192000000002,-99.131552999999997 34.209352000000003,-99.131884999999997 34.207382000000003,-99.129791999999995 34.204402999999999,-99.126566999999994 34.203004,-99.119203999999996 34.201746999999997,-99.108757999999995 34.203400999999999,-99.102001344898341 34.205813362825268,-99.092190999999985 34.209316,-99.08119261238302 34.211229594305671,-99.079534999999993 34.211517999999991,-99.075978000000006 34.211221000000002,-99.06646499999998 34.208404000000002,-99.060343999999986 34.204760999999991,-99.059158999999994 34.202928999999997,-99.058800000000005 34.201256,-99.058083999999994 34.200569000000002,-99.048792000000006 34.198208999999999,-99.043470999999997 34.198208,-99.040961999999993 34.200842000000002,-99.039004000000006 34.204667,-99.037458999999998 34.206454,-99.036272999999994 34.206912000000003,-99.013074999999986 34.203221999999997,-99.005790000000005 34.206646999999997,-99.002916243275195 34.208781598893673,-99.002945441244265 34.209102775846141,-99.003147197273819 34.211322087284138,-99.003432988816769 34.214465787333673,-99.000760999999997 34.217643000000002,-98.99085199999999 34.221632999999997,-98.987293999999991 34.221223000000002,-98.981363999999999 34.217582999999991,-98.978684999999984 34.210231,-98.976586999999995 34.206291,-98.974131999999983 34.203566000000002,-98.969003 34.201298999999999,-98.966301999999999 34.201323000000002,-98.962469999999996 34.204667999999998,-98.962085000000002 34.206386000000002,-98.962306999999981 34.211312,-98.960791 34.213029999999996,-98.958474999999993 34.213854999999995,-98.952512999999982 34.212649999999996,-98.950395999999984 34.21168,-98.940219999999997 34.203685999999998,-98.928145 34.192689,-98.927456000000006 34.191155000000002,-98.923128999999989 34.185977999999999,-98.920704 34.183435000000003,-98.918333000000004 34.181831000000003,-98.909348999999992 34.177498999999997,-98.892677318093561 34.17250349095427,-98.87651287834953 34.167659972141138,-98.872921999999988 34.166584,-98.871543000000003 34.165026999999995,-98.871211000000002 34.163012000000002,-98.872229000000004 34.160446,-98.874954999999986 34.157031000000003,-98.874871999999996 34.155656999999998,-98.873271000000003 34.153596,-98.868116 34.149635000000004,-98.862549999999999 34.149110999999998,-98.860124999999996 34.149912999999998,-98.858418999999998 34.152732,-98.8579 34.159627,-98.857321999999982 34.161093999999999,-98.855585000000005 34.161620999999997,-98.854264541670545 34.16164976192438,-98.831114999999983 34.162154,-98.812953999999991 34.158444000000003,-98.806809999999984 34.155901,-98.804411553093104 34.153928907629435,-98.792015000000006 34.143735999999997,-98.779288744496085 34.140194111533035,-98.773070373738221 34.138463455122455,-98.767587610783494 34.136937528280072,-98.765569999999983 34.136375999999998,-98.764702233233265 34.135780085954792,-98.763778343962841 34.135145631382905,-98.761796999999987 34.133785000000003,-98.760558000000003 34.132387999999999,-98.759485999999995 34.128881999999997,-98.759653 34.126911999999997,-98.757118934362524 34.12470437936247,-98.757036999999983 34.124633000000003,-98.753813984496389 34.124468645349353,-98.749290999999999 34.124237999999998,-98.741966000000005 34.125529999999998,-98.740191287161664 34.126850584722824,-98.739461000000006 34.127394000000002,-98.737231999999992 34.130991999999999,-98.736819999999994 34.133374000000003,-98.735471000000004 34.135207999999999,-98.734286999999995 34.135758000000003,-98.730242646678789 34.1359250861193,-98.717536999999993 34.136450000000004,-98.716104 34.135947000000002,-98.70640034274598 34.134745066348501,-98.696517999999998 34.133521000000002,-98.690291400890658 34.133167457450512,-98.690072 34.133155000000002,-98.688275858887323 34.134465065675442,-98.685589983550884 34.136424083851644,-98.676900633591032 34.14276190388366,-98.676457484208683 34.143085127260051,-98.670573548505118 34.147376740066704,-98.655654999999982 34.158257999999996,-98.650582999999997 34.163113000000003,-98.648072999999997 34.164440999999997,-98.643223000000006 34.164530999999997,-98.635729999999995 34.161617999999997,-98.634085211037615 34.161100728840964,-98.630950281399748 34.160114822001631,-98.621666000000005 34.157195000000002,-98.620507214282355 34.157012478916968,-98.617663812339856 34.156564612849806,-98.616732999999996 34.156418000000002,-98.615748434938936 34.156446107485429,-98.612133570686254 34.156549305078279,-98.611829 34.156557999999997,-98.610173632571488 34.157093658210222,-98.610154152422197 34.157099961766605,-98.608852999999996 34.157521000000003,-98.603977999999998 34.160249,-98.599789 34.160570999999997,-98.577135999999996 34.148961999999997,-98.572451 34.145091,-98.560191000000003 34.133201999999997,-98.558593000000002 34.128253999999998,-98.550916999999998 34.119334000000002,-98.536257000000006 34.107343,-98.530610999999993 34.099843,-98.528199999999998 34.094960999999998,-98.504182 34.072370999999997,-98.487068052145446 34.063003092954936,-98.486783271268621 34.06284720836274,-98.486328 34.062598,-98.483944186894661 34.06241565608709,-98.482821069121968 34.062329745958955,-98.482039999999998 34.062269999999998,-98.475065999999998 34.064269000000003,-98.449033999999983 34.073461999999999,-98.446378999999993 34.075429999999997,-98.445784000000003 34.076827000000002,-98.445590305319797 34.079232123390703,-98.445584999999994 34.079298,-98.445259148452962 34.079797720749731,-98.443724000000003 34.082152,-98.442807999999999 34.083143999999997,-98.442148160210323 34.083427517317581,-98.441104460406791 34.083875970068213,-98.440092000000007 34.084311,-98.439068026005657 34.084479541105658,-98.434822808733685 34.08517828308225,-98.432126999999994 34.085622,-98.43151641213494 34.085605425226575,-98.43092946822253 34.085589492282431,-98.428479999999993 34.085523000000002,-98.425229999999999 34.084798999999997,-98.422252999999998 34.083036999999997,-98.419995 34.082487999999998,-98.419161945519861 34.082694545588339,-98.41804644206556 34.082971120917755,-98.417812999999995 34.083029000000003,-98.414426000000006 34.085073999999999,-98.400747497198822 34.098985940284976,-98.399776999999986 34.099972999999999,-98.398505572550647 34.104180252359392,-98.39838899999998 34.104565999999998,-98.398160000000004 34.121395999999997,-98.400493999999995 34.121777999999999,-98.400966999999994 34.122236,-98.398441000000005 34.128456,-98.384381000000005 34.146317000000003,-98.381237999999996 34.149453999999999,-98.367493999999994 34.156190999999993,-98.366862955318183 34.156357896864854,-98.364023000000003 34.157108999999998,-98.34173552164826 34.153594120579292,-98.339428832109121 34.153230340726623,-98.331172907733077 34.151928328079421,-98.326986688030772 34.151268134169193,-98.325445000000002 34.151024999999997,-98.324621914768684 34.150650086831803,-98.323612587945547 34.150190341106089,-98.322580000000002 34.149720000000002,-98.320651676675396 34.148059023851737,-98.318749999999994 34.146420999999997,-98.315432139066189 34.144301906683673,-98.312023538956254 34.142124858924547,-98.300208999999995 34.134579000000002,-98.299345719035045 34.134365643147696,-98.29862570169189 34.134187693395319,-98.293901000000005 34.133020000000002,-98.280321 34.130749999999999,-98.258217018239392 34.129574098564007,-98.256467 34.129480999999998,-98.254901718278489 34.129708262798985,-98.247953999999993 34.13071699999999,-98.241012999999995 34.133102999999998,-98.225282000000007 34.127245000000002,-98.223600000000005 34.125093,-98.216463000000005 34.121820999999997,-98.203710999999998 34.117676000000003,-98.200074999999998 34.116782999999998,-98.191455000000005 34.115752999999998,-98.169120000000007 34.114170999999999,-98.157411999999994 34.120466999999998,-98.154353999999998 34.122734,-98.142753999999996 34.136358999999999,-98.136769999999999 34.144992000000002,-98.130815999999996 34.150531999999998,-98.123377000000005 34.154539999999997,-98.114506000000006 34.154727,-98.109461999999979 34.154110999999993,-98.107064999999992 34.152531000000003,-98.101937000000007 34.146829999999994,-98.092021474678845 34.132735952269094,-98.090223999999992 34.130181,-98.089754999999982 34.128211,-98.090659999999986 34.12198,-98.092421000000002 34.116917,-98.095117999999999 34.11119,-98.096177285423778 34.109455137055363,-98.096466125075011 34.108982084942461,-98.099327999999986 34.104295,-98.101378023037029 34.101786489578267,-98.103538246996251 34.099143131812454,-98.104308999999986 34.098199999999999,-98.119416999999999 34.084474,-98.121038999999996 34.081265999999999,-98.120207999999991 34.072127000000002,-98.11802999999999 34.067064999999999,-98.114587 34.06228,-98.100919767943822 34.050244792175462,-98.099096110217346 34.048638900093685,-98.096177018664264 34.044625138601674,-98.096541898037387 34.040976263553816,-98.09727167092565 34.038969381040054,-98.097731364247636 34.038509687718062,-98.098001443813914 34.038239608151798,-98.102015208841422 34.03732738850595,-98.104022094890695 34.036232725638037,-98.104083244997014 34.036133356900422,-98.105481647738245 34.033860956680144,-98.105481647738245 34.032444902147553,-98.105481647738245 34.031306746267951,-98.103616999999986 34.029206999999992,-98.088202999999993 34.005481000000003,-98.085260000000005 34.003259,-98.082839000000007 34.002412,-98.055197000000007 33.995840999999999,-98.050169864666017 33.994989457544634,-98.041117 33.993456000000002,-98.027671999999981 33.993357000000003,-98.019485000000003 33.993803999999997,-98.018481521828946 33.993960861546498,-98.005667000000003 33.995964,-97.987387999999996 33.999822999999999,-97.982805999999997 34.001949000000003,-97.978243000000006 34.005386999999999,-97.974597608872358 34.00657735007583,-97.974172999999993 34.006715999999997,-97.973934144800623 34.006593661859519,-97.971670000000003 34.005434,-97.968339999999998 34.000529999999998,-97.965354903485249 33.996992503283089,-97.963375425210828 33.994646717187933,-97.96302799999998 33.994235000000003,-97.962715090700769 33.994009516348072,-97.958325000000002 33.990845999999998,-97.955849999999998 33.990136,-97.952687999999995 33.990113999999998,-97.947571999999994 33.991053,-97.946472999999997 33.990731999999994,-97.945729999999998 33.989839000000003,-97.945949999999982 33.988395999999995,-97.952184120103468 33.971402949359636,-97.95307606469359 33.968971674482539,-97.95691699999999 33.958502000000003,-97.960351000000003 33.951928000000002,-97.965737000000004 33.947392,-97.972662 33.944527,-97.974172999999993 33.942832000000003,-97.974062000000004 33.940289,-97.972493999999998 33.937907000000003,-97.971175000000002 33.937128999999999,-97.965952999999999 33.936191,-97.963425 33.936236999999998,-97.955511 33.938186000000002,-97.954466999999994 33.937773999999997,-97.953395 33.936444999999999,-97.952679000000003 33.929482,-97.953694999999996 33.924373000000003,-97.957155 33.914453999999999,-97.960615000000004 33.910353999999998,-97.961188664141474 33.909913087050903,-97.963139679674441 33.908413554571595,-97.964461 33.907398,-97.964803587866868 33.907309441163022,-97.9693952279504 33.906122503898267,-97.969873000000007 33.905999,-97.970298415583201 33.906261144464871,-97.973142999999993 33.908014,-97.976962999999998 33.912548999999999,-97.978803999999997 33.912548,-97.979984999999999 33.911402000000002,-97.983551999999989 33.904001999999991,-97.984539999999996 33.900703,-97.984566 33.899076999999998,-97.984416725907181 33.89872544733722,-97.984025057628415 33.897803036597892,-97.98383498894799 33.897355409354304,-97.983768999999995 33.897199999999991,-97.977858999999995 33.889929000000002,-97.974177999999995 33.886642999999999,-97.967776999999998 33.882429999999999,-97.958438 33.879179,-97.951215000000005 33.878424000000003,-97.946463999999992 33.878883000000002,-97.942729999999997 33.879845000000003,-97.938801999999995 33.879891,-97.936743000000007 33.879204,-97.933120450042608 33.877388671138185,-97.918328311832767 33.869976048610916,-97.905467000000002 33.863530999999995,-97.896737999999985 33.857984999999999,-97.877386999999999 33.850236000000002,-97.871447000000003 33.849001,-97.865764999999982 33.849392999999999,-97.835425213046037 33.857383352392631,-97.834333 33.857671000000003,-97.833886750888084 33.857971936447115,-97.833218553718808 33.858422547723912,-97.806802470257153 33.876236728393856,-97.805423000000005 33.877167,-97.803472999999997 33.880189999999999,-97.801578000000006 33.885137999999998,-97.784656999999982 33.890631999999997,-97.78061799999999 33.895533,-97.779683000000006 33.899242999999998,-97.780339999999995 33.904833000000004,-97.783716999999996 33.910559999999997,-97.772672 33.914382000000003,-97.765445999999997 33.913531999999989,-97.763769999999994 33.914240999999997,-97.762914903547767 33.914953098088951,-97.761142192227695 33.916429357685161,-97.760223999999994 33.917194000000002,-97.759399000000002 33.91881999999999,-97.759833999999984 33.92521,-97.762660999999994 33.930846000000003,-97.762767999999994 33.934396,-97.752956999999995 33.937049000000002,-97.738478 33.937421,-97.736553999999998 33.936574999999998,-97.735919542935619 33.936533987763056,-97.734773489745407 33.936459905200778,-97.733722999999998 33.936391999999998,-97.732266999999993 33.936691000000003,-97.725289000000004 33.941045000000003,-97.720699142354164 33.94461309292862,-97.716772000000006 33.947665999999998,-97.714693355370301 33.94981590741822,-97.712051708440285 33.952548118711093,-97.709683999999996 33.954996999999999,-97.708350195107343 33.95701014009046,-97.70415899999999 33.963335999999998,-97.69792099999998 33.977331,-97.69310999999999 33.983699,-97.688023 33.986606999999999,-97.671772000000004 33.991370000000003,-97.661489000000003 33.990817999999997,-97.656210000000002 33.989488,-97.633778000000007 33.981256999999999,-97.609091000000006 33.968093000000003,-97.589597999999995 33.953553999999997,-97.588828000000007 33.951881999999998,-97.591270649549756 33.930345579062646,-97.591514000000004 33.928199999999997,-97.595084 33.922953999999997,-97.596154999999996 33.922105999999999,-97.59697899999999 33.920228000000002,-97.597115000000002 33.917867999999999,-97.596955673755872 33.917077348335745,-97.596288999999985 33.913769000000002,-97.593782375104212 33.910260437761373,-97.589253999999997 33.903922,-97.587440999999984 33.902479,-97.582744000000005 33.900784999999999,-97.578907598302408 33.900207204108142,-97.558269999999993 33.897098999999997,-97.555002000000002 33.897281999999997,-97.551541 33.897947000000002,-97.543245999999996 33.901288999999998,-97.533617322522971 33.906127586572126,-97.532723000000004 33.906576999999999,-97.525277000000003 33.911750999999995,-97.519170999999986 33.913637999999999,-97.504870374844515 33.918353570482601,-97.500960000000006 33.919643,-97.495648860558163 33.919307898609453,-97.494857999999979 33.919257999999999,-97.492061582842766 33.918500058129531,-97.487115891787269 33.917159576320657,-97.48650499999998 33.916993999999995,-97.484158940985964 33.915822631562747,-97.460375999999982 33.903948,-97.458068999999995 33.901634999999999,-97.451065249608234 33.891558064966901,-97.450953999999996 33.891398000000002,-97.451469000000003 33.87093,-97.452287410342421 33.86882620086994,-97.455665873415143 33.860141550511862,-97.457616999999999 33.855125999999998,-97.459565999999995 33.853316,-97.461485999999994 33.849559999999997,-97.462857 33.841771999999999,-97.459067999999988 33.834581,-97.453056999999987 33.828536,-97.444192999999999 33.823773000000003,-97.426492999999994 33.819398,-97.410387 33.818845000000003,-97.403235695189224 33.818961304668854,-97.384901622687948 33.819259479377855,-97.372940999999997 33.819454,-97.368744000000007 33.821471000000003,-97.365506999999994 33.823762999999992,-97.358512999999988 33.830018000000003,-97.348337999999984 33.843876000000002,-97.340900078515631 33.860236176367188,-97.339391593410966 33.867629740388111,-97.337846311291798 33.870430566802547,-97.336524008254173 33.872827243260353,-97.33293952159849 33.874440259476913,-97.329175814777756 33.874440259476913,-97.327562805507441 33.873902588562437,-97.326564370247013 33.872737756024428,-97.326487449786001 33.872648016149064,-97.324157539016809 33.866016724171544,-97.322365295688968 33.864941382342593,-97.318243141591921 33.865120602507631,-97.31654836796514 33.865642075591225,-97.315913230822716 33.865837504006514,-97.314412999999988 33.866988999999997,-97.310479256695203 33.873361218982971,-97.307489695517361 33.878203969770759,-97.302471419756401 33.880175433263638,-97.299245387323282 33.880175433263638,-97.295170524880618 33.877119286431629,-97.294227111562321 33.876411726442917,-97.286921603026471 33.869423850720118,-97.28598279642199 33.868525862052032,-97.284253187903744 33.867526845294535,-97.279107999999979 33.864555000000003,-97.275347999999994 33.863225,-97.271531999999993 33.862560000000002,-97.257971626565464 33.863220416657512,-97.256624999999985 33.863286000000002,-97.255635999999996 33.863697999999999,-97.254234999999994 33.865322999999997,-97.249208999999993 33.875100999999994,-97.246418496348156 33.898356425448434,-97.246179999999981 33.900343999999997,-97.245398270620598 33.902084836575838,-97.245057441245748 33.90284383100218,-97.244945999999999 33.903092,-97.242092 33.906277000000003,-97.241794392023195 33.906436890220043,-97.238755934556053 33.908069304909361,-97.226522000000003 33.914642,-97.210920999999999 33.916063999999999,-97.210512235443105 33.915911440173737,-97.206141000000002 33.914279999999998,-97.185457999999997 33.9007,-97.180845000000005 33.895203999999993,-97.179608999999999 33.892249999999997,-97.170773789281327 33.861660975771436,-97.166629 33.847310999999998,-97.166824000000005 33.840395,-97.171627 33.835335,-97.180939422624874 33.831550006302521,-97.181369999999987 33.831375,-97.186254000000005 33.830894,-97.193690000000004 33.831307000000002,-97.195830999999998 33.830803000000003,-97.197477000000006 33.829794999999997,-97.199700000000007 33.827322000000002,-97.203513999999998 33.821824999999997,-97.204994999999997 33.81886999999999,-97.205652 33.809823999999999,-97.205556910941183 33.806237292333442,-97.205445103342427 33.802019970418343,-97.205431000000004 33.801487999999999,-97.205114487332324 33.800890302957832,-97.203236000000004 33.797342999999998,-97.194785999999993 33.785344000000002,-97.190397000000004 33.781153000000003,-97.187792000000002 33.769702000000002,-97.181842999999986 33.755869999999994,-97.173532726140948 33.740090726508434,-97.172577000695028 33.738276026602087,-97.172191999999995 33.737544999999997,-97.168438536634085 33.734131892706188,-97.163454368039083 33.729599677915004,-97.163149000000004 33.729322000000003,-97.162807288850388 33.729115696596551,-97.155066000000005 33.724442000000003,-97.152609597300682 33.723370138808036,-97.150103410774264 33.72227655424301,-97.149393999999987 33.721966999999999,-97.137529999999998 33.718663999999997,-97.126102000000003 33.716940999999998,-97.121101999999993 33.717174,-97.119522126797463 33.717502594273334,-97.114921749218269 33.718459416457094,-97.113264999999998 33.718803999999999,-97.112398501853761 33.719102240295193,-97.110065570752283 33.719905212653977,-97.108936 33.720294000000003,-97.108097026518521 33.720734123472262,-97.106518853348803 33.721562029324609,-97.104524999999995 33.722608,-97.097154000000003 33.727809,-97.094085000000007 33.730992,-97.092697209381924 33.732891057656268,-97.092130098039192 33.733667094850453,-97.091071999999983 33.735115,-97.089936943375889 33.737167271747261,-97.087911027802278 33.740830286618703,-97.086195000000004 33.743932999999998,-97.084820762198987 33.752363244406453,-97.084693 33.753146999999998,-97.08461299999999 33.759993,-97.085217999999998 33.765512,-97.087362453285593 33.77250304797397,-97.087851999999998 33.774099,-97.093101265647221 33.787040841586602,-97.093917000000005 33.789051999999998,-97.094675961767678 33.791977368936216,-97.095047178759813 33.793408200769441,-97.095235999999986 33.794136000000002,-97.095080023591905 33.79561056406444,-97.094877682854474 33.797523445530629,-97.094770999999994 33.798532000000002,-97.093897185962049 33.800360798466031,-97.09266432242093 33.802941048788071,-97.092111999999986 33.804096999999999,-97.087998999999982 33.808746999999997,-97.078589999999991 33.812755999999993,-97.067977124183287 33.814475679891196,-97.064604445188394 33.815487484896828,-97.062631847535258 33.816079264957295,-97.058622892638837 33.818751903281317,-97.055415722506638 33.823829921794093,-97.055412197115942 33.8238546000754,-97.055148464371385 33.82570077017467,-97.055682980641905 33.830778788687446,-97.057821087157734 33.834520485448607,-97.058282726048489 33.836367011192308,-97.058622892638837 33.837727655580807,-97.057553829022481 33.840133030590344,-97.055415722506638 33.841202089027483,-97.052208542016004 33.841736615656437,-97.048734113748537 33.840934820533782,-97.045339940802535 33.839496399893775,-97.041245000000004 33.837761,-97.038858000000005 33.838264000000002,-97.023899 33.844213000000003,-97.017857000000006 33.850141999999998,-97.010381749407998 33.858564100233409,-96.999664164722446 33.87063922351804,-96.985567000000003 33.886521999999999,-96.983970999999997 33.892082999999992,-96.984938999999997 33.904865999999991,-96.985275905099471 33.906070041818985,-96.988744999999994 33.918467999999997,-96.993996999999979 33.928978999999998,-96.995022999999989 33.932034999999999,-96.995140238436761 33.933014648420269,-96.996024643022366 33.940404763634284,-96.996183000000002 33.941727999999998,-96.996167702736543 33.941832622020257,-96.995421139189489 33.946938567064805,-96.995367999999999 33.947302,-96.994947208134789 33.948043840473474,-96.994456760007211 33.948908482357652,-96.994287999999983 33.949205999999997,-96.990835000000004 33.952700999999998,-96.988126301178397 33.954514162310069,-96.987892000000002 33.954670999999998,-96.982723774786024 33.956016867344054,-96.981537499896135 33.956325787441237,-96.981336999999982 33.956377999999994,-96.979415000000003 33.956178,-96.979347000000004 33.955129999999997,-96.980675999999988 33.951813999999999,-96.981031000000002 33.949159999999999,-96.97981799999998 33.941588000000003,-96.976955000000004 33.937452999999998,-96.973806999999979 33.935696999999998,-96.97254199999999 33.935794999999999,-96.952313000000004 33.944581999999997,-96.944610999999995 33.949216999999997,-96.933309804512817 33.955134148312766,-96.932252000000005 33.955688000000002,-96.924267999999998 33.959159,-96.922113999999979 33.959578999999998,-96.921429967464036 33.959451233053208,-96.919039990098355 33.959004821377064,-96.918617999999995 33.958925999999998,-96.91833921313939 33.958790334953079,-96.917063225391544 33.958169405626251,-96.916299999999993 33.957797999999997,-96.91417790611122 33.956157267456653,-96.911732563120111 33.95426660943896,-96.911336000000006 33.953960000000002,-96.910857206749995 33.953482904168467,-96.908421363636307 33.951055696608989,-96.907387 33.950024999999997,-96.905252999999988 33.947218999999997,-96.902433999999985 33.942017999999997,-96.901946611333699 33.940667581536225,-96.899441999999993 33.933728000000002,-96.896468999999996 33.91331799999999,-96.897193999999999 33.902954,-96.895728000000005 33.896414,-96.887761838797758 33.878628251663962,-96.883009999999999 33.868018999999997,-96.875280999999987 33.860505000000003,-96.87198767019855 33.857765462058182,-96.866438000000002 33.853149000000002,-96.85608999999998 33.84749,-96.850593000000003 33.847211,-96.845895999999996 33.848974999999996,-96.841592000000006 33.852893999999999,-96.840818999999996 33.863644999999998,-96.839777999999995 33.868395999999997,-96.837412999999984 33.871349000000002,-96.833926235310372 33.873661568818115,-96.832156999999995 33.874834999999997,-96.812777999999994 33.872646000000003,-96.794275999999996 33.868886000000003,-96.786859371055769 33.865207582975678,-96.783484999999999 33.863533999999994,-96.780568999999986 33.860098,-96.779588000000004 33.857939000000002,-96.777202000000003 33.848162000000002,-96.776765999999995 33.841976000000003,-96.770675999999995 33.829621000000003,-96.769378000000003 33.827477000000002,-96.766316855179326 33.825510582121247,-96.766234999999995 33.825457999999998,-96.761588000000003 33.824406000000003,-96.754041 33.824657999999999,-96.746233969152598 33.825673509073113,-96.746037999999984 33.825699,-96.741799282455162 33.826447231494264,-96.71318112067361 33.831498997677379,-96.712421999999989 33.831632999999997,-96.708134 33.833060000000003,-96.704457000000005 33.835020999999998,-96.700318655907978 33.838434731313264,-96.699573999999998 33.839049000000003,-96.695480719177567 33.844085960723298,-96.693127324791789 33.84698191524042,-96.690708 33.849958999999998,-96.688190999999989 33.854613,-96.687524326814838 33.85620885855986,-96.684726999999995 33.862904999999998,-96.682762564556768 33.871464102957781,-96.682209 33.873876000000003,-96.682102999999998 33.876645000000003,-96.683464 33.884217,-96.681051007513375 33.895708672998403,-96.680947000000003 33.89620399999999,-96.675306000000006 33.909114000000002,-96.673449000000005 33.912278,-96.670618000000005 33.914913999999996,-96.667186999999998 33.916939999999997,-96.665308436653305 33.917161206414967,-96.66440999999999 33.917267000000002,-96.659896000000003 33.916665999999999,-96.65150600931733 33.910998546998165,-96.644049999999979 33.905962000000002,-96.630116999999998 33.895422000000003,-96.628293999999997 33.894477000000002,-96.616355751891987 33.894625565889051,-96.614680358047494 33.89464641537834,-96.611821556077771 33.89468199182577,-96.607562 33.894734999999997,-96.592948000000007 33.895615999999997,-96.588319642127203 33.894847991673281,-96.587934000000004 33.894784,-96.58760387584924 33.894318075382706,-96.585452000000004 33.891280999999999,-96.585359999999994 33.888947999999999,-96.587494000000007 33.884250999999999,-96.590112000000005 33.880665,-96.597347999999982 33.875100999999994,-96.601685999999987 33.872822999999997,-96.611969999999999 33.869016000000002,-96.625399000000002 33.856541999999997,-96.628968999999998 33.852406999999999,-96.629746999999995 33.850866000000003,-96.630021999999983 33.847541,-96.629842405402627 33.847037300944812,-96.629577623992816 33.846294683138318,-96.629289999999997 33.845488000000003,-96.627812273090953 33.844523322531259,-96.626623854929747 33.84374750920842,-96.623154999999997 33.84148299999999,-96.622548607895212 33.841284829387497,-96.620258613641042 33.840536452948584,-96.605267599881515 33.835637348301233,-96.601258 33.834327000000002,-96.599141379811712 33.83346048638235,-96.597030984690946 33.832596521217091,-96.595164098773168 33.831832245189069,-96.592925999999991 33.830916000000002,-96.587067000000005 33.828009000000002,-96.573054340771023 33.81917200025552,-96.572936999999996 33.819097999999997,-96.568822993124115 33.818734252140963,-96.566549213959448 33.818533211567136,-96.566298000000003 33.818511,-96.551222999999993 33.81912899999999,-96.541502252916899 33.82118138128849,-96.537683599711926 33.821987629236112,-96.532865 33.823005000000002,-96.532141353898353 33.822830017549641,-96.529233999999988 33.822127000000002,-96.526655000000005 33.820891000000003,-96.526331240434345 33.820568979830284,-96.523863000000006 33.818114,-96.519910999999993 33.811346999999998,-96.517492044660074 33.805400310572544,-96.516583999999995 33.803167999999999,-96.515958999999995 33.798933999999996,-96.515952403498957 33.797370629253059,-96.5159410675722 33.794684014612457,-96.515912 33.787795000000003,-96.51191399999999 33.781477999999993,-96.502285999999998 33.773459999999993,-96.500268000000005 33.772582999999997,-96.486059999999995 33.773009999999999,-96.459153999999998 33.775232000000003,-96.456254 33.776035,-96.450509999999994 33.780588000000002,-96.448044999999993 33.781030999999999,-96.436454999999995 33.780050000000003,-96.430214000000007 33.778654000000003,-96.423664429058576 33.776393528613141,-96.422642999999994 33.776040999999999,-96.422322840041474 33.775682043625913,-96.420980388055867 33.774176915691271,-96.419961 33.773034000000003,-96.419583102042878 33.772404537625398,-96.417562000000004 33.769038000000002,-96.416145999999998 33.76609899999999,-96.413408000000004 33.757714,-96.411885201063754 33.755703128434462,-96.408468999999997 33.751191999999996,-96.403507000000005 33.746288999999997,-96.384116000000006 33.730141000000003,-96.383299027856694 33.729391180874664,-96.380090129695702 33.726446045924753,-96.379450023740389 33.7258585550397,-96.370956555983966 33.718063228581727,-96.370761536889887 33.717884239557762,-96.369590000000002 33.716808999999998,-96.369084597701828 33.715741445126696,-96.366945 33.711221999999999,-96.363253 33.701050000000002,-96.363143372320295 33.69469995601051,-96.363135 33.694215,-96.362964209763192 33.693778090504111,-96.362198000000006 33.691817999999998,-96.356236230636398 33.68737146600408,-96.355945999999989 33.687154999999997,-96.355455421824701 33.68710517164083,-96.352724507664888 33.686827790830883,-96.348305999999994 33.686378999999995,-96.346643697131185 33.686554630652331,-96.344174978865311 33.686815463144171,-96.342664999999997 33.686974999999997,-96.337175125435976 33.689043696356201,-96.321102999999994 33.695099999999996,-96.318759999999997 33.696753,-96.318590686098233 33.696960051986665,-96.318010443675675 33.697669623646739,-96.316924999999998 33.698996999999999,-96.314798583555884 33.702507526903553,-96.309963999999994 33.710489000000003,-96.308342766341951 33.715746247280322,-96.307034999999985 33.719987000000003,-96.307001890234133 33.720499786556005,-96.306595999999999 33.726785999999997,-96.307389 33.735005,-96.3061 33.741002000000002,-96.30525491425243 33.743702118680943,-96.304087485467235 33.747432149959735,-96.303009000000003 33.750878,-96.301705999999982 33.753756000000003,-96.294866999999996 33.764771000000003,-96.292482000000007 33.766418999999999,-96.277269000000004 33.769734999999997,-96.269895999999989 33.768405,-96.251497151236435 33.760405611313516,-96.248231999999987 33.758986,-96.23960043273749 33.754058875473291,-96.229595766085112 33.748347949873668,-96.229022999999998 33.748021,-96.220521000000005 33.747390000000003,-96.1999 33.752116999999998,-96.196336040977513 33.753254070097242,-96.186553999999987 33.756374999999998,-96.178059000000005 33.760517999999998,-96.174632999999986 33.763699000000003,-96.169932696734321 33.769534234627457,-96.169452000000007 33.770130999999999,-96.167888847884015 33.774482610028038,-96.162756999999985 33.788769000000002,-96.162122572851359 33.796140263149638,-96.162213638666273 33.796174412747511,-96.166837334419654 33.79790829445497,-96.170373408451042 33.799381659586444,-96.173025461119408 33.800560352833699,-96.175150000000002 33.801951000000003,-96.17734 33.805117000000003,-96.17895107878303 33.810509748931381,-96.178963999999993 33.810552999999999,-96.176910000000007 33.813934000000003,-96.175889999999981 33.814627000000002,-96.164217431250009 33.817001137011715,-96.150765000000007 33.816986999999997,-96.148792 33.819197000000003,-96.151629999999983 33.831945999999995,-96.150147000000004 33.835856,-96.148457006953691 33.837436961236868,-96.14806999999999 33.83779899999999,-96.147446683377808 33.837891494337825,-96.138904999999994 33.839159000000002,-96.128108733462625 33.839703753325978,-96.122951 33.839963999999995,-96.118168999999995 33.837883999999995,-96.109992999999989 33.832396000000003,-96.104074999999995 33.830730000000003,-96.099360000000004 33.830469999999998,-96.097448 33.832724999999996,-96.097637999999989 33.837935000000002,-96.099152999999987 33.842409000000004,-96.100785000000002 33.844230000000003,-96.101348999999999 33.845720999999998,-96.101472999999999 33.846708999999997,-96.100094999999996 33.847971,-96.084626 33.846656000000003,-96.063924 33.841522999999995,-96.055357999999984 33.838262,-96.049381559404907 33.836618570443349,-96.048833999999999 33.836468000000004,-96.044074587870469 33.838420736557822,-96.037191000000007 33.841245,-96.031783693249977 33.849934429642978,-96.031271075997878 33.850758194920559,-96.029462717056688 33.852402158173604,-96.025188419607474 33.852073366797306,-96.022229284477689 33.850922593794486,-96.021900493101384 33.849114234853282,-96.022507000000004 33.846130000000002,-96.022064891975305 33.843195970965255,-96.021407302851145 33.841880802274289,-96.019950829321616 33.840821548098475,-96.019598947095744 33.84056563358331,-96.005296 33.845505000000003,-96.000534603789163 33.849305889934179,-95.998351 33.851049000000003,-95.997709 33.852181999999992,-95.997673906338932 33.852568581878202,-95.997405462294296 33.855525685805766,-95.9977342536706 33.860950759443568,-95.997376655326022 33.862202357114477,-95.996747879541701 33.864403078452035,-95.993624351909531 33.866211440579008,-95.991487204777812 33.866869023331596,-95.988856861024331 33.866869023331596,-95.984753921632091 33.864671017651808,-95.984253769013037 33.864403078452035,-95.980965842506947 33.859306796190523,-95.9735403792467 33.856832331211713,-95.972155999999998 33.856371000000003,-95.971744371228908 33.856383941655046,-95.951609000000005 33.857016999999999,-95.945502988542614 33.859346036998218,-95.944283999999982 33.859811,-95.943359355023844 33.860365112733476,-95.941777921153459 33.861312819872232,-95.941266999999996 33.861618999999997,-95.936631000000006 33.870615,-95.93550004724635 33.874497995518659,-95.935325000000006 33.875098999999999,-95.935308000000006 33.878723999999998,-95.935637 33.880370999999997,-95.936817000000005 33.882385999999997,-95.937201999999999 33.884652000000003,-95.936131999999986 33.886825999999999,-95.935198 33.887100999999994,-95.922712000000004 33.883758,-95.915960999999996 33.881148000000003,-95.905343000000002 33.875629000000004,-95.893305999999995 33.868161,-95.887490999999997 33.863855999999998,-95.881292000000002 33.860627,-95.859469000000004 33.852455999999997,-95.849863999999997 33.844951999999999,-95.843772999999999 33.838949,-95.841300369514457 33.837329726167006,-95.840012000000002 33.836486,-95.839442445999168 33.836292954052603,-95.838335071878717 33.835917618112738,-95.837515999999994 33.835639999999998,-95.831947999999997 33.835160999999999,-95.828244999999995 33.836053999999997,-95.827967044704152 33.836191602640042,-95.826538854622555 33.836898632614485,-95.822787000000005 33.838755999999989,-95.821905415666805 33.839551758599306,-95.821112514659319 33.840267467546653,-95.820784000000003 33.840564,-95.819357999999994 33.842784999999999,-95.818975999999992 33.844456,-95.819524999999999 33.848438999999999,-95.820676999999989 33.850750999999995,-95.821665999999979 33.855443,-95.821665999999979 33.856633000000002,-95.82138191533943 33.857119395418813,-95.820824189768416 33.858074304994595,-95.820595999999995 33.858464999999995,-95.820256321913618 33.858527429344676,-95.805149 33.861303999999997,-95.800842000000003 33.861212000000002,-95.790314669347865 33.857829825250164,-95.789867 33.857685999999994,-95.789358977006231 33.85733891951336,-95.788304168820886 33.85661827626933,-95.787891000000002 33.856335999999999,-95.776255000000006 33.845145000000002,-95.773281999999995 33.843834,-95.772067000000007 33.843817,-95.763621999999984 33.847954,-95.758311274366889 33.849968021173019,-95.758015999999998 33.850079999999998,-95.757640875431136 33.850475976069447,-95.754310000000004 33.853991999999998,-95.753512999999984 33.856464000000003,-95.753688987366843 33.856976705401074,-95.75729390188404 33.867478931648478,-95.757457999999986 33.86795699999999,-95.758009454152003 33.868443703186436,-95.760805000000005 33.870911,-95.762558999999996 33.874366999999992,-95.76194240701966 33.883030946465368,-95.761915999999999 33.883401999999997,-95.758343999999994 33.890610999999993,-95.756366999999997 33.892625000000002,-95.747335000000007 33.895755999999999,-95.737508000000005 33.895966999999999,-95.729445045960333 33.893952819075864,-95.728448999999998 33.893704,-95.723226300470785 33.890698381785455,-95.717160861060378 33.887207774089354,-95.713910181462765 33.885337036216413,-95.713539999999981 33.885123999999998,-95.710877999999994 33.884551999999999,-95.696961999999999 33.885218000000002,-95.684831000000003 33.890231999999997,-95.676924999999983 33.897236999999997,-95.669978 33.905844000000002,-95.665338000000006 33.908132000000002,-95.659818 33.909092,-95.647272999999998 33.905976000000003,-95.636977999999999 33.906613,-95.609439392746168 33.923623282239362,-95.603656999999998 33.927194999999998,-95.599677999999983 33.934246999999999,-95.585944999999981 33.93448,-95.570311428427317 33.932892416047835,-95.564667905744443 33.932319318211334,-95.563423999999998 33.932192999999998,-95.562724847986416 33.932007581530534,-95.561592737930383 33.931707340510293,-95.561007000000004 33.931551999999996,-95.560415995740641 33.931042615914556,-95.559931936825777 33.930625407571753,-95.559414000000004 33.930179000000003,-95.558286100391328 33.928753215740784,-95.557777967458279 33.928110882033096,-95.556914999999989 33.927019999999999,-95.551147999999984 33.914566,-95.549144999999996 33.90795,-95.549475 33.901310999999993,-95.552330999999981 33.894419999999997,-95.55209457427955 33.888655441173519,-95.552085000000005 33.888421999999998,-95.551943532854764 33.888208369560985,-95.548485831718622 33.882986873004867,-95.548324999999991 33.882744000000002,-95.547838962671932 33.882363312195096,-95.545708294665019 33.880694470565629,-95.545197000000002 33.880293999999999,-95.54352178779898 33.880173169084813,-95.541265054919734 33.880010393826282,-95.539789999999996 33.879904000000003,-95.537358049249164 33.88037416967029,-95.534038375697051 33.881015963020303,-95.533282999999997 33.881161999999996,-95.531798241123994 33.881968630089013,-95.525321999999989 33.885486999999998,-95.521418133191162 33.888379988113826,-95.520137966641357 33.88932866459119,-95.515301759339067 33.891142240377064,-95.510062536063273 33.890134704348199,-95.506233872599807 33.886306036979761,-95.506495 33.878588999999998,-95.506084999999999 33.87639,-95.502407477038815 33.874787101867227,-95.502303999999995 33.874741999999998,-95.492028000000005 33.874822000000002,-95.480004545492946 33.87882505156746,-95.478574999999992 33.879300999999998,-95.477829321179073 33.879890044047791,-95.469962325642697 33.886104525088022,-95.467351237093553 33.886417854985297,-95.464924614258621 33.886709049048328,-95.462909526581015 33.885903021006229,-95.461498966768687 33.883686425341857,-95.46277824472287 33.878821065729895,-95.464211000000006 33.873372000000003,-95.463346 33.872312999999998,-95.461127233926518 33.871832054399569,-95.447370000000006 33.868850000000002,-95.418546279096461 33.866998581211959,-95.411345060268999 33.866536029139695,-95.407794999999979 33.866307999999989,-95.406882133018115 33.866362247208706,-95.404325916920058 33.866514150597617,-95.375232999999994 33.868243,-95.352338000000003 33.867789000000002,-95.339561303488324 33.868836967540759,-95.339121999999989 33.868873,-95.339014688391742 33.869073090388603,-95.33835013321854 33.870312202400832,-95.334854000000007 33.876830999999996,-95.334836460323601 33.877305631062114,-95.334523000000004 33.885787999999998,-95.333451999999994 33.886285999999998,-95.325571999999994 33.885703999999997,-95.310579050797429 33.880679668661742,-95.294789354523203 33.875388337067108,-95.287864786488143 33.87494634339312,-95.28344485260331 33.877745636185885,-95.281676877907344 33.882902226669891,-95.281529544303439 33.887616824907447,-95.281317419351268 33.889260797911334,-95.280350898312903 33.896751357029835,-95.279761569607459 33.899108654721076,-95.277846267017765 33.900876629417048,-95.275341635722626 33.901760616765031,-95.272542342929853 33.902055281117747,-95.267212735027385 33.900338966530455,-95.263849803053915 33.899255988324974,-95.261050510261143 33.899992642069066,-95.255746586173245 33.902939265610648,-95.253094626984378 33.90544389690578,-95.250884657186859 33.913105118684925,-95.250737329293145 33.917083057468233,-95.251326652288412 33.924154956252103,-95.253020000000006 33.927236999999998,-95.253623000000005 33.92971,-95.252905999999982 33.933647999999998,-95.250453815364224 33.936614470603772,-95.23166760862577 33.959340626388752,-95.231194814374604 33.959912577712174,-95.230491 33.960763999999998,-95.226393000000002 33.961953999999999,-95.219358 33.961567000000002,-95.184075000000007 33.950353,-95.174181557651636 33.944707625858101,-95.173657196254922 33.944408415920272,-95.168745999999999 33.941605999999993,-95.166685999999984 33.939728000000002,-95.161108999999982 33.937598,-95.149462 33.936335999999997,-95.131725657216535 33.936903570678005,-95.131056 33.936924999999995,-95.130760550144942 33.936820411866918,-95.124700000000004 33.934674999999991,-95.121184 33.931306999999997,-95.121974867397924 33.925542192115131,-95.122499622273722 33.921717137430115,-95.122365486317321 33.918632002634986,-95.119951031304154 33.915815139752631,-95.110963896232136 33.912998276870283,-95.103318123323447 33.913668959251616,-95.10214780889666 33.912991409673538,-95.100769532353866 33.912193461131935,-95.098489218495843 33.909913139475762,-95.095001673232161 33.904815960136006,-95.095247706914634 33.899772255341666,-95.095269945144935 33.899316370327696,-95.09392858558104 33.895962961020395,-95.090441035118587 33.893280234094433,-95.084002493615529 33.893280234094433,-95.079139333602001 33.898143394107954,-95.078905311676394 33.898377416033576,-95.074957661870556 33.900039583313315,-95.073630040977179 33.900598581227868,-95.071259538767663 33.901596686785098,-95.065491679645973 33.899584642240477,-95.06106518008815 33.895292278639054,-95.058834000000004 33.886812999999997,-95.049025 33.864089999999997,-95.046567999999994 33.862564999999996,-95.038661112238941 33.860609605793528,-95.037206999999995 33.86025,-95.033518790033554 33.860141698175291,-95.03143098776043 33.86008039125462,-95.030255193062573 33.860045864827867,-95.022324999999995 33.859813000000003,-95.016999191469623 33.861237606415294,-95.016422000000006 33.861392000000002,-95.008375999999984 33.866088999999995,-95.000223000000005 33.862504999999999,-94.995524000000003 33.857438000000002,-94.992810330111539 33.852698351540766,-94.992671 33.852454999999999,-94.992523097811741 33.852403566519136,-94.990494037024106 33.851697953840834,-94.988486999999992 33.850999999999999,-94.98739725328582 33.851074415574232,-94.983303000000006 33.851354,-94.981650000000002 33.852283999999997,-94.976208 33.859846999999995,-94.973410999999999 33.861730999999999,-94.971435 33.862122999999997,-94.968895000000003 33.860916000000003,-94.965888000000007 33.848421999999999,-94.964400999999995 33.837020999999993,-94.957676000000006 33.835003999999998,-94.949533421399437 33.825707838785306,-94.949112883549958 33.821754768331147,-94.948729542346143 33.818151347643564,-94.948715939727023 33.818023482549535,-94.944301522854289 33.81213759866646,-94.939560116480934 33.810502632153295,-94.935799688114457 33.810339132650462,-94.932366255585293 33.810993121156741,-94.928442330884351 33.812628087669893,-94.92451840618341 33.812791587172725,-94.924196338046286 33.812670811231236,-94.921902464831703 33.811810605997493,-94.919450010309433 33.810175636315982,-94.917815040627914 33.808704169305649,-94.917091634856007 33.805689966907131,-94.916834062621035 33.804616745101868,-94.916997555787162 33.801510305241678,-94.91961350347556 33.794152948011565,-94.920034399525505 33.790224602097751,-94.920103995647338 33.789575041141042,-94.920095560257593 33.789518805381888,-94.91961350347556 33.786305103362189,-94.913003475392784 33.779908559849432,-94.912450337640749 33.77937328682863,-94.911427000000003 33.778382999999998,-94.906244999999998 33.778191999999997,-94.902276 33.776288999999998,-94.89497736748055 33.771540270803243,-94.89019868072495 33.768431100796676,-94.888367999999986 33.76724,-94.887910246679809 33.766674529711281,-94.886225692565191 33.764593571999796,-94.885411379435553 33.764756432942491,-94.881447983999394 33.765549103837166,-94.879218389137634 33.764912090842074,-94.876033253179955 33.760771407616105,-94.875653319149677 33.757021753168047,-94.875534806260347 33.755852122792213,-94.875497398046861 33.755482932714841,-94.877080000000007 33.75222,-94.874668 33.749164,-94.870299604394191 33.746484207390097,-94.869443369718425 33.745958950164457,-94.869299999999996 33.745871,-94.8570941233355 33.742035460072337,-94.849295999999981 33.739584999999991,-94.841633779899112 33.739430990835892,-94.830804318260235 33.740068022348083,-94.828875382311935 33.74092532536806,-94.827937698058648 33.741342073027738,-94.826026615866809 33.743890180559411,-94.824752565187154 33.749304914465036,-94.82447272313469 33.749460382205008,-94.821885938813196 33.750897483986968,-94.817426749089677 33.752171534666616,-94.815635414888177 33.752066164468857,-94.813744972719192 33.751954964523563,-94.81275807295215 33.751896912919612,-94.812012015184067 33.751853028169073,-94.80914539498248 33.749304914465036,-94.798634446013509 33.744527205899239,-94.789716054221742 33.746119775421171,-94.777638928565466 33.753471071068567,-94.775064434371529 33.755038154868203,-94.770923763490302 33.754401129528375,-94.768057130944001 33.753445597691005,-94.766464573766783 33.750897483986968,-94.766146067269247 33.748030863785381,-94.766818924318841 33.746124416643802,-94.768057130944001 33.742616129879757,-94.767738636791165 33.737519908644046,-94.767244154304578 33.736926531576607,-94.76296091588064 33.731786662068515,-94.759138751496963 33.729557067206756,-94.758159820145337 33.729557067206756,-94.753087004596253 33.729557067206756,-94.750011775433265 33.728811557489699,-94.742576055627282 33.727008959675082,-94.742176780415733 33.726449974997927,-94.739390916583417 33.72254976995157,-94.737479828219207 33.716179498036198,-94.737788227808608 33.71500758055268,-94.73907239774114 33.71012773879076,-94.73746132453816 33.705563045258067,-94.73716130937693 33.704713004885136,-94.732383613155861 33.700253815161624,-94.728242929929891 33.699616789821789,-94.725694828570582 33.702483410023376,-94.724525908047042 33.704821269192259,-94.724102271393392 33.705668549067234,-94.721872664186904 33.707261118589173,-94.719006043985303 33.708216656598914,-94.714865360759347 33.707261118589173,-94.711043208720398 33.705668549067234,-94.709450639198465 33.699616789821789,-94.710289486124168 33.697309952648205,-94.710724689878106 33.696113138108018,-94.710724689878106 33.691653948384499,-94.710106194192988 33.688252279047049,-94.71008765219355 33.688150299756906,-94.707858069676533 33.686876245991066,-94.691547961569825 33.685092048879412,-94.684792000000002 33.684353000000002,-94.659166999999997 33.692138,-94.652265035786613 33.690979104454883,-94.649628372726468 33.688049476940073,-94.649099284135872 33.686462209886628,-94.648456523423718 33.684533926193204,-94.64818493525776 33.682632803768527,-94.647928021538007 33.680834402751707,-94.647870600191638 33.680432452214262,-94.648456523423718 33.673401362074948,-94.647827859209684 33.672301196274027,-94.646112824818204 33.669299876741562,-94.642890235687361 33.668420997570671,-94.635273213800133 33.669885811328072,-94.631328876730365 33.67284406472757,-94.630585813750528 33.673401362074948,-94.627656194751552 33.677795791992715,-94.62121101648988 33.681018386800773,-94.616816575217669 33.679553573043371,-94.614284398758912 33.677302743466427,-94.611543254774574 33.674866164477912,-94.611424034353576 33.674789522931938,-94.607441775118403 33.672229504256364,-94.60304734520065 33.671350625085473,-94.596895128555005 33.671350625085473,-94.593672545101384 33.673987285307021,-94.590449961647764 33.677502836053897,-94.590316660066918 33.67755410593854,-94.586641449284855 33.678967649811298,-94.579620000000006 33.677622999999997,-94.576973687569549 33.673401362074948,-94.5728722135906 33.669885811328072,-94.571305222138406 33.668005422800071,-94.569942586075811 33.666370260581196,-94.569356662843745 33.663440621711956,-94.571445361022185 33.660423619728157,-94.571993323065286 33.659632120703485,-94.572286279004103 33.656995454804722,-94.570821465246695 33.654944723492456,-94.568770728257221 33.65465176187643,-94.564669254278257 33.655823608340576,-94.563858010166513 33.65591721375597,-94.557052229552454 33.656702498865904,-94.552071876402621 33.653479904057846,-94.551192985877293 33.650257320604226,-94.551311999999982 33.644569999999995,-94.553536678805585 33.642054372646328,-94.552657799634687 33.638245860283412,-94.549142248887819 33.635902161677912,-94.543868917090279 33.635902161677912,-94.538888563940446 33.637952898667386,-94.538195599937964 33.637916426989378,-94.537583502619341 33.637884211439605,-94.533322276204103 33.637659937051346,-94.529220802225154 33.63443734792051,-94.528408204203203 33.630103504051213,-94.528341911699826 33.629749945032266,-94.52980672545722 33.627406252103981,-94.528927834931892 33.621839964367631,-94.526291174710352 33.619203298468861,-94.521363727720257 33.61686924674752,-94.520724886974008 33.61656663824732,-94.504615 33.620682000000002,-94.493418698303032 33.624467326832118,-94.492501061148843 33.624777568252533,-94.491502999999994 33.625115,-94.491295462081894 33.62531395337146,-94.487514000000004 33.628939000000003,-94.485874999999993 33.637867,-94.481313 33.638818999999998,-94.476415000000003 33.638947000000002,-94.466075000000004 33.636262000000002,-94.464185999999998 33.637655000000002,-94.461453000000006 33.643615999999994,-94.459197999999986 33.645145999999997,-94.454819999999998 33.644902999999999,-94.448637000000005 33.642766000000002,-94.446871000000002 33.640177999999999,-94.447513999999998 33.636254999999991,-94.448451000000006 33.634497000000003,-94.458816999999982 33.632444,-94.462736000000007 33.63091,-94.461129 33.625414999999997,-94.460285999999996 33.624420999999998,-94.45525499999998 33.622917,-94.452710999999994 33.622621000000002,-94.452325000000002 33.618817,-94.452961000000002 33.616985999999997,-94.454768999999999 33.615155999999992,-94.462335999999993 33.610567000000003,-94.469451000000007 33.60731599999999,-94.472166 33.604199,-94.471974000000003 33.602665000000002,-94.471151999999989 33.601588,-94.468086 33.599435999999997,-94.461794602929331 33.598691554192769,-94.458900358388505 33.598349085232492,-94.458231999999995 33.598269999999999,-94.454858239556387 33.593453869357283,-94.453995999999989 33.592222999999997,-94.453435550445548 33.592019500625121,-94.452150252013013 33.591552808439438,-94.451622 33.591360999999999,-94.449112 33.590893999999992,-94.442363999999998 33.591242999999999,-94.441536999999997 33.591501999999991,-94.439518000000007 33.594154000000003,-94.430358101189597 33.59122600196271,-94.430038999999994 33.591124,-94.429672337173542 33.590855074196774,-94.427920122643982 33.589569927010331,-94.427577999999983 33.589319000000003,-94.425982000000005 33.586424999999998,-94.413155000000003 33.569367999999997,-94.412481642075306 33.56890283335202,-94.412480771235352 33.568902231761562,-94.412480202418593 33.568901838813659,-94.412175000000005 33.568691,-94.408900999999986 33.568196999999998,-94.403341999999995 33.568424,-94.397341999999981 33.571607999999998,-94.385926999999995 33.581887999999999,-94.382886999999997 33.58326799999999,-94.379649 33.580607,-94.378075999999993 33.577019,-94.377759999999981 33.574609000000002,-94.378561000000005 33.571328999999999,-94.380090999999993 33.568942999999997,-94.382534000000007 33.567056999999998,-94.388052000000002 33.565511,-94.392357000000004 33.565286999999998,-94.394655618773015 33.564059042448399,-94.397398454287298 33.562313601959417,-94.399227012370631 33.559903231990447,-94.399393244337958 33.557077279687135,-94.399143896386974 33.555498071165481,-94.397957000000005 33.554389999999998,-94.392572999999999 33.551141999999999,-94.389515000000003 33.546778000000003,-94.386086000000006 33.544922999999997,-94.381666999999993 33.544035,-94.373392999999993 33.544471,-94.371597999999992 33.545000999999999,-94.363297000000003 33.544956999999997,-94.361350999999999 33.544612999999998,-94.358969999999999 33.54323,-94.355945000000006 33.54318,-94.348944999999986 33.548358999999998,-94.347382999999979 33.55107799999999,-94.34729 33.552197,-94.352653000000004 33.560611000000002,-94.352433000000005 33.56217199999999,-94.345512999999997 33.567312999999999,-94.344023000000007 33.567824000000002,-94.340576999999996 33.567878,-94.340047258358467 33.56768232744934,-94.338972839399958 33.567285465504582,-94.33842199999998 33.567081999999999,-94.337996277272822 33.566655299162022,-94.334939999999989 33.563592,-94.334379999999996 33.562536,-94.333929800646288 33.557825151092565,-94.333894999999998 33.557461000000004,-94.333202999999997 33.555365999999992,-94.331833000000003 33.553348,-94.33059 33.552692,-94.323660000000004 33.549835000000002,-94.319491999999997 33.548864000000002,-94.309582000000006 33.551673,-94.30641 33.555616,-94.306214999999995 33.557676,-94.307180999999986 33.559797000000003,-94.303577000000004 33.56828,-94.301022999999986 33.573022000000002,-94.298392000000007 33.576217999999997,-94.293257999999994 33.580418999999999,-94.289129000000003 33.582143999999992,-94.287025 33.582410000000003,-94.283581999999996 33.581890999999999,-94.282647999999995 33.580978000000002,-94.280849000000003 33.577187000000002,-94.280604999999994 33.574907999999994,-94.282171999999989 33.572989,-94.290372000000005 33.567905000000003,-94.291686999999996 33.563481000000003,-94.290901000000005 33.558872,-94.289439999999999 33.557634999999998,-94.287571999999997 33.557178,-94.279089999999997 33.557026,-94.275600999999995 33.557963999999998,-94.274473 33.558652000000002,-94.271997999999996 33.561517999999992,-94.270978999999997 33.563220999999999,-94.270853000000002 33.564782999999998,-94.265668999999988 33.573588999999998,-94.262754999999999 33.577354,-94.257801 33.582507999999997,-94.257524288354617 33.582703553652586,-94.252656000000002 33.586143999999997,-94.245931999999996 33.589113999999995,-94.242777000000004 33.589708999999999,-94.240178999999998 33.589536000000003,-94.236971999999994 33.587411000000003,-94.236362999999997 33.585991999999997,-94.236835999999997 33.580914,-94.237975000000006 33.577756999999998,-94.238867999999997 33.576721999999997,-94.244365999999999 33.573549,-94.251108000000002 33.56528,-94.252330999999984 33.561855,-94.252283000000006 33.560445,-94.251569000000003 33.558188,-94.250197 33.556764999999999,-94.237903999999986 33.552675,-94.233128263729824 33.552212399803537,-94.233017493976078 33.552201670126067,-94.231843999999981 33.552087999999998,-94.226392000000004 33.552911999999999,-94.222920999999999 33.554088,-94.21922099999999 33.556095999999997,-94.213604000000004 33.563133999999998,-94.21268334130005 33.563763266722709,-94.208078 33.566910999999998,-94.205634000000003 33.567228999999998,-94.203593999999981 33.566546000000002,-94.202594978382763 33.562850001484037,-94.201237000000006 33.557825999999999,-94.199485999999993 33.556085000000003,-94.197816999999986 33.555238000000003,-94.196394999999995 33.555123000000002,-94.193247999999997 33.556153999999999,-94.191332999999986 33.55766599999999,-94.189883999999992 33.562454000000002,-94.192482999999996 33.570425,-94.194399000000004 33.573678,-94.196366991504703 33.574779501237479,-94.201105911663163 33.575851400157113,-94.204265191768783 33.575005164570705,-94.207404999999994 33.574353000000002,-94.209665 33.573509999999999,-94.211329000000006 33.573774,-94.216140999999993 33.576391999999998,-94.217408000000006 33.579259999999998,-94.217197999999982 33.580736999999999,-94.214431000000005 33.583187000000002,-94.212997 33.583486999999991,-94.210966999999997 33.583143,-94.205788416261612 33.581380140341984,-94.203588205048902 33.580815984742067,-94.199751933850294 33.581098061448763,-94.196536237091394 33.581718635888464,-94.194464999999994 33.582886000000002,-94.190890999999979 33.587474,-94.183913000000004 33.594681999999999,-94.180879999999988 33.592612000000003,-94.176327 33.591076999999999,-94.162266000000002 33.588906,-94.161081999999993 33.587972,-94.162009999999995 33.580877,-94.161276999999998 33.579270999999999,-94.156782000000007 33.575749000000002,-94.152625999999998 33.575923000000003,-94.148731999999995 33.580196999999998,-94.146047999999993 33.581975,-94.144383000000005 33.582097999999995,-94.142160000000004 33.581389999999999,-94.141852 33.579590000000003,-94.143023999999983 33.577725,-94.145668999999984 33.575599999999994,-94.149506000000002 33.573602,-94.151257 33.571793,-94.151754999999994 33.569476000000002,-94.151455999999996 33.568387,-94.148520000000005 33.565677999999991,-94.145239000000004 33.564987000000002,-94.143401999999995 33.565504999999995,-94.136863999999989 33.570999999999998,-94.136045999999993 33.571387999999999,-94.135142000000002 33.571033,-94.134308000000004 33.569209,-94.133047999999988 33.557952999999998,-94.131382000000002 33.552934,-94.128658 33.550952000000002,-94.126897999999983 33.550646999999991,-94.123897999999997 33.552100000000003,-94.122878999999983 33.553111999999999,-94.12071899999998 33.560555,-94.120354999999989 33.5655,-94.119902152897509 33.566998927274319,-94.112842999999998 33.566991000000002,-94.103176000000005 33.570349999999998,-94.100106999999994 33.57256799999999,-94.097439999999992 33.573718999999997,-94.088943 33.575322,-94.082640999999995 33.575491999999997,-94.072670000000002 33.572234000000002,-94.072231491265512 33.572605318678747,-94.072031926011121 33.573523317998088,-94.072031926011121 33.573846369634623,-94.072031926011121 33.574161925883949,-94.071815412538413 33.574459631515609,-94.071712621294751 33.574600969288895,-94.071353404455635 33.574840447439463,-94.070395493400298 33.574561056392717,-94.069534727631535 33.574169799087244,-94.069517406590393 33.574161925883949,-94.068559493988133 33.573563230894273,-94.068280102941401 33.571966710019424,-94.06782332144887 33.570215714974232,-94.067801146640278 33.570130711574109,-94.066845999999998 33.568908999999998,-94.061283000000003 33.568804999999998,-94.056597999999994 33.567824999999999,-94.056095999999997 33.567252000000003,-94.055662999999996 33.561886999999999,-94.056442000000004 33.560997999999991,-94.059849999999997 33.559249,-94.061179999999993 33.559159,-94.066685000000007 33.560953999999995,-94.067984999999993 33.560960999999999,-94.071719999999999 33.559682000000002,-94.073744000000005 33.558284999999998,-94.073825999999997 33.555833999999997,-94.072156000000007 33.553863999999997,-94.069091999999998 33.553406000000003,-94.06547999999998 33.550908999999997,-94.061896000000004 33.549764000000003,-94.056095999999997 33.550725999999997,-94.051882000000006 33.552585,-94.050211999999988 33.551082999999998,-94.046040000000005 33.551321000000002,-94.043449999999993 33.552253,-94.043428000000006 33.551424999999995,-94.043374999999997 33.542315000000002,-94.043020107474533 33.494534442391668,-94.043008999999998 33.493039000000003,-94.043278999999998 33.491029999999995,-94.043271947583932 33.489425304099555,-94.043188 33.470323999999991,-94.043130608695648 33.460424000000003,-94.043089437732434 33.453322008844353,-94.043061045958495 33.448424427841935,-94.043010021810147 33.439622762252007,-94.042987999999994 33.435823999999997,-94.042987999999994 33.434442436873745,-94.042987999999994 33.431023999999994,-94.042886999999993 33.420225000000002,-94.042890126641851 33.419424334827802,-94.042891364631132 33.419107312620362,-94.042967439944888 33.399626074590046,-94.043053 33.377715999999999,-94.042868999999996 33.371169999999999,-94.043127999999996 33.358756999999997,-94.043066999999979 33.352097,-94.043066999999979 33.347351000000003,-94.043066999999979 33.339614667914582,-94.043066999999979 33.330497999999999,-94.042990000000003 33.271227000000003,-94.043049999999994 33.260903999999996,-94.043003999999996 33.250127999999997,-94.042730000000006 33.241822999999997,-94.042876000000007 33.215218999999998,-94.042891999999995 33.202666,-94.042874999999995 33.199784999999999,-94.042718999999991 33.160290999999994,-94.043184999999994 33.143476,-94.043076999999982 33.138162,-94.043007000000003 33.13389,-94.042951563372725 33.117233519058104,-94.042869999999994 33.092726999999996,-94.043036 33.079484999999998,-94.042963999999998 33.019219,-94.042986850316112 33.007494023677346,-94.043068075862834 32.965815492539427,-94.043087999999997 32.955592000000003,-94.043066999999979 32.937902999999999,-94.043092 32.910021,-94.042884999999998 32.898910999999998,-94.042859000000007 32.892771000000003,-94.042885999999996 32.880965000000003,-94.043025 32.880445999999999,-94.042784999999995 32.871485999999997,-94.042921087938623 32.829694015190334,-94.043025999999983 32.797476000000003,-94.042747000000006 32.786973000000003,-94.042828999999998 32.785277,-94.042937999999992 32.780557999999999,-94.043026999999995 32.776862999999999,-94.042946999999998 32.767991000000002,-94.042974715046569 32.757603400545236,-94.04314699999999 32.693030999999998,-94.042912999999999 32.655126999999993,-94.042779999999993 32.643465999999997,-94.042823999999996 32.640304999999998,-94.042925999999994 32.622014999999998,-94.042929 32.618259999999992,-94.042918999999998 32.610142000000003,-94.042939007208048 32.604544739553475,-94.043082999999996 32.564261000000002,-94.043142000000003 32.559502000000002,-94.043081 32.513612999999999,-94.042884999999998 32.505144999999999,-94.042911000000004 32.492851999999999,-94.043088999999995 32.486561000000002,-94.043071999999995 32.48429999999999,-94.042955000000006 32.480260999999999,-94.042995000000005 32.478003999999999,-94.042901999999998 32.472905999999995,-94.042874999999995 32.471347999999992,-94.042902999999981 32.470385999999998,-94.042907999999997 32.439890999999996,-94.042985999999999 32.435507,-94.042898999999991 32.400658999999997,-94.042923000000002 32.399918,-94.042900999999986 32.392282999999999,-94.042762999999994 32.373331999999998,-94.042738999999997 32.363559000000002,-94.042733519218956 32.277818574933548,-94.042732999999998 32.269696000000003,-94.042732 32.269620000000003,-94.042671451745775 32.225096273752321,-94.042662000000007 32.218145999999997,-94.042600205901905 32.185155675879351,-94.042565999999994 32.166893999999999,-94.042538999999991 32.166826,-94.042591000000002 32.158096999999998,-94.042681000000002 32.137956000000003,-94.042751999999993 32.125163,-94.042337000000003 32.119914,-94.042699999999996 32.056012000000003,-94.042717288248511 32.00695918811028,-94.042720000000003 31.999265,-94.042490448495869 31.997488887291052,-94.042251674184627 31.995641414801661,-94.041832999999997 31.992401999999998,-94.038411999999994 31.992436999999999,-94.029282999999992 31.995864999999998,-94.027080554152732 31.994823406342874,-94.018664 31.990842999999998,-94.011671046736083 31.979908989829021,-94.008352361284565 31.974719974671689,-94.002944198469422 31.966263903968002,-93.995504541226836 31.954631438414648,-93.994147015257326 31.952508844111783,-93.977461000000005 31.926418999999996,-93.971711999999982 31.920383999999995,-93.953546000000003 31.910562999999996,-93.943541310721315 31.908563758569336,-93.938002035663573 31.906916949339585,-93.935007833635339 31.903773037645127,-93.932462763507019 31.895538979891644,-93.931327794714704 31.894581351390723,-93.92767203678045 31.891496810199779,-93.923929283519882 31.889849995167665,-93.919587694495533 31.890748256066246,-93.915948999999998 31.892861000000003,-93.909557114944889 31.893143619429534,-93.905252294448232 31.890856686636408,-93.90476638821832 31.890598549301192,-93.901173350426333 31.885957535142037,-93.901888 31.880063,-93.898135577976262 31.874953416991548,-93.896981462364707 31.873381885463036,-93.889196542313442 31.867692899288475,-93.888241004857136 31.85786451213389,-93.888148571748644 31.856913771406646,-93.887306164689562 31.854968889155742,-93.884117000000003 31.847605999999995,-93.880377455095243 31.844791786271248,-93.879654915472827 31.84424803536659,-93.874821999999995 31.840611000000003,-93.874804231839249 31.835091218914506,-93.874787826198073 31.829994712349503,-93.874761000000007 31.821660999999999,-93.870917000000006 31.816836999999996,-93.868473098390325 31.815251608244314,-93.853390000000005 31.805467,-93.846187999999998 31.802021,-93.839950728453459 31.798597132180646,-93.836868453653821 31.794158659336233,-93.836868453653821 31.791454071635616,-93.836868453653821 31.788733862378688,-93.834649214842401 31.783309060642711,-93.831197070889573 31.780226788232302,-93.827450999999996 31.777740999999999,-93.823442999999997 31.775098,-93.822597999999985 31.773558999999995,-93.826519525540022 31.761832440276638,-93.827342999999999 31.759369999999997,-93.830112066651125 31.754555168030393,-93.830647423185951 31.745811043570992,-93.824579 31.734396999999998,-93.819048075401312 31.72885814427071,-93.818932598107111 31.728523867973351,-93.815657495541259 31.719043310199801,-93.815835943108667 31.711905251886723,-93.815525624652665 31.710796971318612,-93.814600367558683 31.707492480599399,-93.814586782471608 31.707443962415162,-93.811060073548262 31.705827553684028,-93.810303944025605 31.705480994217723,-93.807270273132957 31.704231833580664,-93.806045429297654 31.703104120446881,-93.803419352361757 31.700686292667093,-93.802693549340276 31.697783082925291,-93.802451615781152 31.693186330065117,-93.804479 31.685663999999999,-93.812820813246589 31.676953615984285,-93.81562111199878 31.674029590143711,-93.817425 31.672146,-93.821829497696953 31.673879806810671,-93.822051000000002 31.673966999999998,-93.822341750589956 31.673502431839047,-93.826462000000006 31.666919,-93.8257324849111 31.66154827530681,-93.825660999999997 31.661021999999996,-93.825228912080746 31.660277861177896,-93.81803699999999 31.647891999999999,-93.817707248836442 31.6409111211136,-93.816838000000004 31.622509,-93.818717000000007 31.614555999999997,-93.823976999999999 31.614227999999997,-93.825414416100287 31.615089707767993,-93.827851999999993 31.616550999999998,-93.838056999999992 31.606795000000002,-93.839382999999998 31.599074999999999,-93.837534908858984 31.593743346167731,-93.834924 31.586210999999999,-93.822958 31.568129999999996,-93.822219025006859 31.564792487143556,-93.820763999999997 31.558221000000003,-93.818582000000006 31.554825999999998,-93.798086999999995 31.534044000000002,-93.787687000000005 31.527343999999996,-93.781574079702807 31.525595412174177,-93.780834999999996 31.525383999999999,-93.777170583402579 31.525128039451072,-93.760062000000005 31.523933,-93.753860000000003 31.525331,-93.751899169046524 31.525601857922521,-93.749869902733366 31.526210635456998,-93.746826003263621 31.526007705679731,-93.743376259969125 31.525196002300419,-93.742401241878753 31.523787647735123,-93.74154991556837 31.522557958452786,-93.741111000000004 31.520101,-93.740752889151466 31.518711098615515,-93.740332360499409 31.517078940980245,-93.739317727342822 31.515049678599539,-93.734411826534469 31.513527159467717,-93.733432858180635 31.513223342063657,-93.726736285639134 31.511599931372594,-93.725924582259807 31.504091651519342,-93.728765551952293 31.496786301443361,-93.730997740177827 31.492118989316349,-93.733996137544537 31.48847587643743,-93.737167999999997 31.484621999999998,-93.741884999999982 31.483535,-93.745608448194673 31.481972669547908,-93.746355058504165 31.481633300507966,-93.747840636420193 31.480958036391328,-93.749869902733366 31.478928770078173,-93.749869902733366 31.475276095040186,-93.749626709600278 31.47120988033301,-93.749476 31.468689999999999,-93.709416000000004 31.442995,-93.706857276389258 31.44142369846492,-93.700929751125955 31.437783629836048,-93.697919763270235 31.429300939077926,-93.697603150134782 31.428408665937056,-93.704678 31.418899999999997,-93.704697874245824 31.418107106580852,-93.704878999999991 31.410881,-93.701611 31.409333999999998,-93.695865999999995 31.409391999999997,-93.689953513429003 31.406208353384852,-93.678362516190631 31.399967047179565,-93.675064666986117 31.398191282223291,-93.674659331220113 31.397973024503138,-93.674116999999981 31.397680999999995,-93.671643999999986 31.393352,-93.670181999999983 31.387184,-93.668532759396427 31.379357124595749,-93.668145986696857 31.37510269235548,-93.669064113561134 31.373151679996884,-93.669693055010129 31.371815184369147,-93.669512094168894 31.370548454097019,-93.668919524600994 31.366400452767671,-93.667402247962755 31.365414223393856,-93.665051865060306 31.363886475190469,-93.663891561951601 31.361952641672623,-93.663698175601809 31.360018811902275,-93.664665092360735 31.357698213179859,-93.665825387974422 31.355184231855155,-93.668439000000006 31.353011999999996,-93.669515978941746 31.350266666374935,-93.673736148309771 31.339509006758242,-93.677277000000004 31.330482999999997,-93.687850999999995 31.309835,-93.686922292404276 31.305369360695714,-93.686880000000002 31.305166,-93.686723586265984 31.304979085312567,-93.684737187533131 31.30260533533086,-93.684038999999999 31.301770999999995,-93.683824154244718 31.301752735987076,-93.675439999999995 31.30104,-93.668927999999994 31.297974999999997,-93.657003999999986 31.281735999999999,-93.647719584117951 31.27389987096868,-93.642516 31.269508000000002,-93.632650200244299 31.270182983909681,-93.620343000000005 31.271025000000002,-93.615257056394739 31.261768439618621,-93.61394199999998 31.259374999999995,-93.614287999999988 31.251631,-93.616308000000004 31.244595000000004,-93.616007481020262 31.233959925788763,-93.613835693061347 31.232449117569455,-93.609977782626956 31.229765355202261,-93.609827614285464 31.229660890324059,-93.608033931702224 31.227867209671889,-93.60740940488401 31.227242683526022,-93.605259887151632 31.224152751460338,-93.604319472818304 31.220794125122111,-93.604319472818304 31.215285983654958,-93.607287999999997 31.205403,-93.602442999999994 31.182541,-93.600307999999998 31.176157999999997,-93.598827999999997 31.174679,-93.595531708436056 31.171774432382691,-93.588772842417583 31.16581877494577,-93.588502999999989 31.165581,-93.588046655571759 31.165671453282986,-93.583339301771971 31.166604510813709,-93.579215000000005 31.167421999999995,-93.578993496784307 31.167654977688123,-93.574136071231791 31.172764031170193,-93.569563000000002 31.177574,-93.560942999999995 31.182481999999997,-93.552649000000002 31.185575,-93.548930999999996 31.186601,-93.535096999999993 31.185614,-93.533756450961803 31.184752004501149,-93.533306999999994 31.184463,-93.5330935917342 31.183965183917415,-93.531744000000003 31.180816999999998,-93.533193520062923 31.174490811082034,-93.53417786817559 31.170194787673282,-93.536829999999981 31.158620000000003,-93.540253000000007 31.156578999999997,-93.544009577425854 31.153014849431809,-93.544887639546317 31.148844041597808,-93.544887639546317 31.143136612291205,-93.544701999999987 31.135888999999999,-93.540277800652078 31.128868068802213,-93.539619249807799 31.121843550568837,-93.541375382556595 31.113501939154769,-93.541635919885238 31.113241401693255,-93.548470239502265 31.106407078590973,-93.549716998224596 31.105160319232844,-93.55112206776522 31.099540038044921,-93.551692642249563 31.097257738879012,-93.551034091405285 31.091111287020031,-93.546643772295099 31.082989189009115,-93.540128999999993 31.078002999999995,-93.53104031045666 31.074698717981779,-93.527873992025093 31.072210897922254,-93.526043656150705 31.070772777782928,-93.524020490083288 31.067083472240864,-93.523009982318626 31.065240780256033,-93.523659621286654 31.063941504256789,-93.525329858273139 31.060601035263321,-93.529255791555698 31.057567354514948,-93.532069000000007 31.055264,-93.531218761655126 31.051678447674814,-93.523247999999995 31.037841999999998,-93.516942620821894 31.032584114108545,-93.516407263768343 31.029550433360171,-93.516883288197775 31.024314186160638,-93.516942620821894 31.023661529978199,-93.539525999999995 31.008497999999999,-93.540062152267268 31.008345085566372,-93.540618575989114 31.008186389569964,-93.555580999999989 31.003918999999996,-93.562626264226125 31.00599480945781,-93.566016847371429 31.004567194682853,-93.567979815741779 31.001533515663564,-93.569764334642755 30.996715319472376,-93.571101253513504 30.991033414001794,-93.571905755076102 30.987614282198351,-93.567971999999997 30.977981,-93.560533000000007 30.971285999999999,-93.55046299120518 30.967360467203815,-93.549841 30.967117999999996,-93.539153617393822 30.956968324013513,-93.532549000000003 30.950695999999997,-93.526524876707626 30.939912016599852,-93.526293050708773 30.939497017171423,-93.526245000000003 30.939411,-93.526242458076936 30.939167805401102,-93.526231146824912 30.938085618677029,-93.526146999999995 30.930035,-93.526269219450654 30.929894609689271,-93.530935999999983 30.924533999999998,-93.542488999999989 30.920064,-93.54502991280485 30.920837107400992,-93.546884259495414 30.92151141825828,-93.549244331161987 30.921005686748707,-93.550358562122057 30.920030731622223,-93.551941554990407 30.918645608548566,-93.555650241837967 30.911228247920597,-93.555751501305451 30.910053639118178,-93.555774257662236 30.909789665608852,-93.556493125509377 30.9014508058257,-93.562447641167196 30.896531852982324,-93.563812214002311 30.895404595987301,-93.564247644832776 30.895044891882932,-93.567787752332634 30.888301832311882,-93.567450600170787 30.878524390216981,-93.566008182600839 30.875519355165832,-93.565853452041281 30.875197,-93.565427680666076 30.874309976760035,-93.563763247930751 30.87311591407202,-93.559394659034922 30.869981891957959,-93.55904186947815 30.86972880101742,-93.558616999999984 30.869423999999999,-93.558608112367665 30.868835818489011,-93.558593354020289 30.867859114376206,-93.558393833586933 30.854654896933653,-93.558352334289978 30.851908482785802,-93.558231866260058 30.843935935637496,-93.558171999999999 30.839973999999998,-93.553625999999994 30.835139999999999,-93.55374115920948 30.832414921630001,-93.554057 30.824940999999995,-93.561666000000002 30.807738999999998,-93.563243 30.806218000000005,-93.564501487304341 30.805543276361082,-93.569303000000005 30.802969,-93.578395 30.802046999999998,-93.584264999999988 30.796662999999995,-93.588934854633479 30.787551489258888,-93.589380999999989 30.786681000000002,-93.589895999999996 30.77776,-93.591925627378814 30.768225181611253,-93.592827999999997 30.763985999999996,-93.607757000000007 30.757656999999995,-93.611581311334461 30.752392350515215,-93.615058988962588 30.747604886281291,-93.619129 30.742001999999996,-93.617688 30.738479000000005,-93.609908791486006 30.729403419430973,-93.609718999999998 30.729181999999998,-93.609544 30.723138999999996,-93.61030547238029 30.720788970554505,-93.611192000000003 30.718053,-93.61618399999999 30.713980000000003,-93.616977218405893 30.712276394979256,-93.620773999999997 30.704122000000005,-93.621061387132315 30.696047232392139,-93.621092999999988 30.695159,-93.62235785978659 30.692974242186811,-93.629903999999996 30.679939999999995,-93.632922525899005 30.677439880221801,-93.638212999999993 30.673057999999997,-93.646373493696458 30.671658473870171,-93.653439445062318 30.670446661945991,-93.654970999999989 30.670183999999999,-93.666219386787546 30.661299653678171,-93.670353999999989 30.658033999999997,-93.670860468306827 30.657347728689221,-93.683099999999996 30.640763000000003,-93.685120999999981 30.625201,-93.684323003112922 30.617258061147268,-93.683396999999985 30.608040999999997,-93.680812614601606 30.602993111696524,-93.680648411741274 30.602453589051585,-93.679828117977763 30.599758343304948,-93.681234543283509 30.596101640780542,-93.683902548646543 30.593069810094963,-93.684328672415049 30.59258557751615,-93.684347894395486 30.592579170189346,-93.687282162286593 30.59160108089231,-93.689533999999995 30.592759,-93.692869000000002 30.594382000000003,-93.712453999999994 30.588479,-93.72107859525056 30.580404159651369,-93.727657631584904 30.574244488790981,-93.727844000000005 30.574069999999995,-93.727840097341868 30.573768021870688,-93.72780696123904 30.571204031383882,-93.727747245613443 30.566583382517752,-93.727745999999996 30.566486999999999,-93.725846999999987 30.556978,-93.728764326223569 30.546403128121515,-93.729195000000004 30.544841999999999,-93.736587760607577 30.541316766984647,-93.740252999999996 30.539569,-93.738909526480768 30.537838512460276,-93.732793 30.529960000000003,-93.727721000000003 30.525671000000003,-93.718711305261792 30.520890798500346,-93.714321999999996 30.518561999999996,-93.710116999999997 30.506399999999996,-93.713193644304937 30.50058809182816,-93.716678000000002 30.494005999999995,-93.71365216083376 30.483878530555742,-93.711446941284677 30.476497671106777,-93.710595424186792 30.473647647388944,-93.709703157003446 30.47066123332699,-93.708899372668625 30.467970970942378,-93.705844999999997 30.457747999999999,-93.697828 30.443837999999996,-93.6978 30.440583,-93.698862234241474 30.438260713588438,-93.702220303997905 30.430919206922557,-93.702664999999996 30.429947000000002,-93.722313999999997 30.420729,-93.729486046484141 30.413342592858086,-93.738025291703323 30.404548123662593,-93.738321805525445 30.404242747530638,-93.745333000000002 30.397022,-93.751243378615428 30.396311282781173,-93.751436999999996 30.396287999999998,-93.754787283332149 30.393127406185759,-93.75746720581121 30.390599218098316,-93.757654000000002 30.390422999999995,-93.757872622462301 30.389610210267922,-93.758470934573069 30.387385818798332,-93.75855399999999 30.387077,-93.758091991038413 30.3842338214119,-93.758032188807945 30.383865801664729,-93.757931393201204 30.383245510859378,-93.75589426835937 30.370709152880856,-93.756044740613035 30.365928314513319,-93.75610723110799 30.3639428524199,-93.756352000000007 30.356166000000002,-93.758519945992674 30.350935458285047,-93.760658351649255 30.34577618769989,-93.763244572034736 30.339536487238696,-93.765822 30.333317999999995,-93.764264999999995 30.330222999999997,-93.760690955159149 30.32995156504764,-93.760328 30.329923999999998,-93.747921244232074 30.314935395431327,-93.743830002049762 30.309992764786195,-93.741160171732417 30.306767342150266,-93.738698999999997 30.303793999999996,-93.734966161369201 30.301561360829975,-93.729390287632427 30.298226388348422,-93.724220000000003 30.295133999999997,-93.718684474451791 30.295009979388311,-93.714319430116035 30.294282471059141,-93.71311219174963 30.293184979315004,-93.711118400234781 30.291372437742464,-93.709949692759622 30.289928741213533,-93.708644873043468 30.288316906143507,-93.708448001046747 30.287627854154977,-93.707590519980414 30.284626670422831,-93.706607851977495 30.281187332412603,-93.706635817233519 30.280914670488997,-93.707189856385114 30.275512775340033,-93.709131999999997 30.271826999999995,-93.707538803456245 30.253087036355307,-93.707271000000006 30.249936999999996,-93.705637767078656 30.244573755694763,-93.705083000000002 30.242751999999996,-93.707646217538425 30.23733474070027,-93.713358999999997 30.225261,-93.71802168481895 30.219915738218987,-93.719219999999993 30.218541999999999,-93.720945999999998 30.209852,-93.717397000000005 30.193439,-93.710467999999992 30.180670999999997,-93.706634735424259 30.17682001000631,-93.705927274531248 30.176109277739844,-93.705791510460429 30.175972885881706,-93.703764000000007 30.173936,-93.703646997347349 30.173527735424756,-93.702964616901454 30.171146663230584,-93.701744610591902 30.166889619937699,-93.701686103512344 30.166685467574972,-93.697748000000004 30.152943999999998,-93.696083741705934 30.150925109485563,-93.688211999999979 30.141376,-93.69286799999999 30.135216999999997,-93.69498 30.135185,-93.698276000000007 30.138608000000005,-93.700984936503929 30.137486558544058,-93.701251999999997 30.137376,-93.7012922571502 30.136537706048752,-93.701585086407604 30.130439981942867,-93.701656556414648 30.128951727699913,-93.701742498922442 30.127162105630983,-93.701985639262489 30.122099077688652,-93.702366286953335 30.114172668214064,-93.702403861450691 30.11339023643033,-93.702436000000006 30.112720999999997,-93.70268530105453 30.112503701678254,-93.704703872918159 30.110744253531749,-93.710410303455276 30.105770356484715,-93.714491639657382 30.10221294069715,-93.723764999999986 30.094129999999996,-93.727140999999989 30.092110594495406,-93.7293848599641 30.090768395691203,-93.72996305770063 30.09042253796256,-93.732484999999997 30.088913999999995,-93.734084999999979 30.086129999999997,-93.731705540540531 30.081478540540548,-93.731605000000002 30.081282000000002,-93.729179922109864 30.079341937687897,-93.727017487667368 30.077611990133899,-93.71640499999998 30.069121999999997,-93.716151269697463 30.069056930886212,-93.707507094464489 30.066840132907302,-93.702179999999998 30.065473999999995,-93.700580000000002 30.063666,-93.699479012508235 30.0595596142199,-93.699395999999993 30.059249999999995,-93.699786698153744 30.05843348475733,-93.700658293446523 30.056611948527472,-93.700819999999993 30.056273999999998,-93.702099264262131 30.055460929156467,-93.703267223154896 30.054718601437116,-93.703940000000003 30.054290999999999,-93.704473210548429 30.054251542735575,-93.709782747672762 30.053858640136632,-93.710785394684464 30.05378444485228,-93.720804999999999 30.053042999999995,-93.729054152595779 30.045230570163486,-93.729990027439044 30.044344241966268,-93.737446000000006 30.037282999999999,-93.739158000000003 30.032626999999998,-93.739733999999999 30.023987000000002,-93.741078000000002 30.021571000000002,-93.744068611359822 30.019549890100706,-93.74834924745744 30.01665695787004,-93.753252045558341 30.013343557169065,-93.766227014667976 30.004574835541469,-93.782835629207284 29.993350429819579,-93.786934999999986 29.990579999999998,-93.789430999999993 29.987812000000002,-93.803328792953494 29.962666096659486,-93.807814999999991 29.954549,-93.813734999999994 29.935126,-93.816550000000007 29.920725999999995,-93.818997999999993 29.914822,-93.830374000000006 29.894358999999998,-93.838374000000002 29.882854999999999,-93.853129483564672 29.866348149842587,-93.854474509531912 29.864843479256791,-93.855140000000006 29.864098999999996,-93.857517787207271 29.862146563102172,-93.862474802662518 29.858076283033213,-93.863569999999996 29.857177,-93.864820388168837 29.856398395289631,-93.872445999999997 29.851650000000003,-93.890679000000006 29.843159000000004,-93.900728 29.836967,-93.911111176241661 29.828996955749506,-93.916359999999997 29.824967999999998,-93.922743999999994 29.818808,-93.927992000000003 29.809640000000002,-93.929208000000003 29.802952,-93.928808000000004 29.79708,-93.926503999999994 29.789559999999998,-93.922407000000007 29.785048,-93.898470000000003 29.771576999999997,-93.893861999999999 29.767289000000002,-93.890820999999988 29.761672999999995,-93.891780610698319 29.758916671398389,-93.892526767476923 29.756773455119472,-93.893828999999997 29.753032999999999,-93.891732576672823 29.744984915009951,-93.891637000000003 29.744618000000003,-93.891484462723341 29.744488863328282,-93.888820999999993 29.742234000000003,-93.873941000000002 29.737770000000005,-93.870019999999997 29.735482,-93.863203999999996 29.724059,-93.837970999999982 29.690618999999998,-93.852868 29.675885,-93.866980999999996 29.673085,-93.889989999999997 29.674012999999999,-93.930999999999997 29.679611999999999,-93.955443390383635 29.680262610936268,-93.955453232202885 29.68026287289646,-93.991585827226885 29.681224615973395,-94.000169999999997 29.681453101326589,-94.000222586816207 29.681454501032487,-94.001406000000003 29.681486,-94.010062765207763 29.679864152681674,-94.056505999999999 29.671163,-94.132576999999984 29.646217,-94.354166823921716 29.561457673765378,-94.370794193562546 29.555097613439198,-94.391123278008692 29.54732162684321,-94.45341877657637 29.523493256060661,-94.456196753642018 29.522430664556182,-94.45805240375158 29.521720868184531,-94.499046371673685 29.506040450016997,-94.499089575343746 29.506023924375612,-94.500455432020999 29.505501476685335,-94.500806999999995 29.505367,-94.552043946167103 29.48495633977835,-94.552044379602123 29.484956167115939,-94.568074121423052 29.478570587212708,-94.593696728539513 29.46836361027578,-94.594852999999986 29.467903,-94.599458690353401 29.465813271763974,-94.62931993394271 29.452264405230761,-94.631084 29.451464,-94.634656044789836 29.449584234717392,-94.661528069434993 29.435443006940758,-94.670389 29.430779999999999,-94.674924987623086 29.427889211977174,-94.680871144138621 29.42409972235215,-94.694158000000002 29.415631999999999,-94.708472999999998 29.403049000000003,-94.723958999999979 29.383268000000005,-94.730956033155138 29.369322304827527,-94.731047000000004 29.369140999999996,-94.731324722869132 29.369141342444962,-94.731537324603394 29.369141604592603,-94.742750849251038 29.369155431380086,-94.744595216508316 29.369157705569055,-94.744833999999997 29.369157999999999,-94.761491000000007 29.361882999999999,-94.772184717669788 29.3616343088914,-94.778690999999995 29.361483,-94.780073439975141 29.362532749099824,-94.782355999999993 29.364266,-94.782645420567292 29.368514320481975,-94.783130999999997 29.375641999999996,-94.766847999999996 29.393488999999999,-94.754099999999994 29.400999999999996,-94.743385419572206 29.410035318862811,-94.73704402931665 29.415382843516582,-94.727822669267709 29.423158969605012,-94.723817999999994 29.426535999999995,-94.716270519001597 29.430976788539081,-94.706539419927282 29.436702374764607,-94.706364999999991 29.436804999999996,-94.686385999999999 29.466508999999995,-94.681540999999996 29.471388999999999,-94.672399999999996 29.476842999999999,-94.665852999999998 29.478401000000002,-94.656737000000007 29.478032999999996,-94.645948000000004 29.473769,-94.628217000000006 29.475986000000002,-94.608557000000005 29.483344999999996,-94.594211 29.492127,-94.595122262498009 29.503650874486677,-94.595439999999996 29.507669,-94.591407000000004 29.513857999999999,-94.580274000000003 29.525295,-94.566674000000006 29.531987999999995,-94.553989999999985 29.529558999999999,-94.546993999999998 29.524379,-94.532347999999999 29.5178,-94.511044999999996 29.519649999999995,-94.495024999999984 29.525030999999998,-94.503428999999997 29.543249999999997,-94.509486999999993 29.542589999999997,-94.523742999999996 29.545987,-94.523871183237745 29.546315590042923,-94.5261306113389 29.55210749848424,-94.526336 29.552633999999998,-94.542531999999994 29.568999999999999,-94.546193009360195 29.571896121601313,-94.546385 29.572047999999995,-94.546803832691651 29.57214903106096,-94.55398799999999 29.573882,-94.570006000000006 29.572232,-94.578210999999982 29.567281,-94.593518000000003 29.561319,-94.625889999999998 29.552807999999999,-94.634988842169335 29.550728838088908,-94.643914431984982 29.54868926579681,-94.666855093063802 29.543447131924982,-94.691625000000002 29.537787000000002,-94.693243673136905 29.537529479678042,-94.718275999999989 29.533546999999995,-94.740699000000006 29.525857999999999,-94.757688999999999 29.524616999999999,-94.768675999999999 29.525659,-94.780938000000006 29.531093000000002,-94.785987568065153 29.540133852805589,-94.789123822994313 29.545749069554745,-94.789562096440733 29.546533763545689,-94.78971899677407 29.546814681200559,-94.790604999999999 29.548400999999998,-94.779438999999996 29.549472000000002,-94.772471009935998 29.548613672580952,-94.771052999999995 29.548438999999995,-94.762972090755014 29.555767305595641,-94.75523699999998 29.562781999999999,-94.750081379755628 29.56810096117977,-94.734626000000006 29.584046,-94.731874420576986 29.588423440241069,-94.724443803393115 29.600244680945409,-94.708741000000003 29.625226,-94.705273448792255 29.640626536822896,-94.703938528752261 29.6465553563269,-94.702680930363101 29.65214076491651,-94.702542126991759 29.652757236398369,-94.699660909360375 29.665553672721437,-94.69780371146922 29.673802100155214,-94.694887994254785 29.686751760487848,-94.693153999999993 29.694452999999999,-94.692434000000006 29.70361,-94.692611750388934 29.704808689927841,-94.695098387970873 29.721577752663908,-94.695317000000003 29.723051999999999,-94.695611486157915 29.72357178078331,-94.697558868014866 29.727008993840069,-94.705700105090941 29.741378628781629,-94.713878412983604 29.755813695314995,-94.714586470042065 29.757063446593907,-94.722078339612551 29.770286919851305,-94.724615999999983 29.774766,-94.735270999999997 29.785433,-94.738125273271791 29.786265833277604,-94.740919000000005 29.787080999999997,-94.749144589762409 29.783534045463153,-94.75591801041729 29.780613280409739,-94.771512 29.773888999999997,-94.792237999999998 29.767432999999997,-94.798897371247961 29.764438558858895,-94.816085 29.756710000000002,-94.81943931055217 29.753325616252695,-94.823987131664666 29.748737021482022,-94.851107999999996 29.721373000000003,-94.856932183541645 29.710462974624775,-94.860426638443812 29.703917062844585,-94.864167858487249 29.696908903620852,-94.865007000000006 29.695336999999999,-94.865123196353878 29.694545038919138,-94.867438000000007 29.678768000000002,-94.872550999999987 29.67125,-94.893107 29.661335999999999,-94.915413 29.656613999999998,-94.921317999999999 29.658177999999999,-94.928410408640929 29.669495826038883,-94.930071799099807 29.672147016790593,-94.930110565443542 29.672208878811933,-94.930656833967475 29.673080595662611,-94.931474856161643 29.67438596783704,-94.934166999999988 29.678681999999998,-94.935264231405057 29.686686879688732,-94.935319060033862 29.687086883348073,-94.935997030967087 29.692033037575822,-94.936088999999996 29.692703999999999,-94.936280063994801 29.692851065945039,-94.941277009519624 29.696697319220664,-94.942680999999993 29.697778,-94.942922907078852 29.697804516058127,-94.95311095436017 29.698921254167477,-94.965343618259496 29.700262107971746,-94.965962999999988 29.70033,-94.972666000000004 29.684869999999997,-94.980123280315652 29.679059463608382,-94.986438191421769 29.674139034277729,-94.988580124776774 29.672470090483102,-95.001800051879343 29.662169436052462,-95.002396227716986 29.661704909944582,-95.005398 29.659365999999995,-95.011683000000005 29.649802000000005,-95.013860566469219 29.644103309100927,-95.014229369455222 29.643138151779844,-95.015636 29.639457,-95.015582911847446 29.639202042718885,-95.014543866006605 29.634211997110764,-95.013498999999996 29.629193999999998,-95.006633444897872 29.623869765921089,-95.00056235200779 29.61916163683599,-95.000370188745762 29.619012614335521,-94.997782627529062 29.617005962082896,-94.997731096758997 29.616965999999998,-94.995478872439179 29.615219401320278,-94.993499353954022 29.613684285860323,-94.988871000000003 29.610095,-94.988045541621688 29.608923290953985,-94.982835617337045 29.60152798723708,-94.982705999999993 29.601344000000005,-94.982886347998431 29.601051719777942,-94.983895794498991 29.599415764569699,-94.98693593300419 29.594488776939745,-94.988992999999994 29.591155,-94.991605757589539 29.588791109774153,-94.991811610459919 29.588604864563266,-94.992208959522046 29.588245363334387,-95.006677600766466 29.575154872369662,-95.007235451984087 29.574650156950938,-95.007670000000005 29.574256999999996,-95.00815781845921 29.573398130166158,-95.016627 29.558487,-95.018253 29.554884999999999,-95.016926355758628 29.548485488141377,-95.015164999999996 29.539988999999998,-95.012091452887788 29.536262245236642,-95.011587670186657 29.535651395780732,-95.011086587278399 29.535043819893005,-95.001666768519442 29.523622047865974,-94.999580999999992 29.521093,-94.989064037839412 29.515168017977793,-94.982063906682782 29.511224326765198,-94.981915999999998 29.511140999999995,-94.981645984265953 29.511070508097891,-94.961088181447877 29.505703566689924,-94.958443000000003 29.505013000000002,-94.958183821928699 29.504969740154092,-94.957844913785792 29.504913172428417,-94.95747910332102 29.504852114391142,-94.955724072517796 29.504559179260749,-94.952845264169682 29.504078672538427,-94.930551536860648 29.500357589179547,-94.927405495678158 29.499832478177321,-94.909464999999997 29.496837999999997,-94.913072085311995 29.488019044482122,-94.913385000000005 29.487254,-94.917178632618899 29.481741136316387,-94.925104227340569 29.470223752399235,-94.925293406029382 29.469948840084836,-94.925914000000006 29.469047,-94.930860999999993 29.450503999999999,-94.923011455799639 29.448810114938265,-94.920334997737442 29.448232551169699,-94.919400999999993 29.448030999999997,-94.916063708203708 29.446327523795176,-94.890799999999984 29.433432,-94.888257132054065 29.420136433311271,-94.887299999999996 29.415132,-94.887087039327696 29.40154064293051,-94.886938304445962 29.392048238229908,-94.886925408340758 29.391225196262944,-94.886904215833582 29.389872669858736,-94.886764190565785 29.380936121184895,-94.886591910643261 29.369941049100753,-94.886536208040312 29.366386054846032,-94.886982892003275 29.364738908620176,-94.888420210858001 29.359438798199445,-94.888544709543254 29.358979709544975,-94.888781730376067 29.358105695694917,-94.894234145274325 29.337999926591962,-94.894147383920654 29.327241695272729,-94.894002695197727 29.309300588032027,-94.893993580875261 29.308170430590454,-94.891329624021282 29.304475264201969,-94.888683946869179 29.30080545353194,-94.886599269217157 29.297913803549264,-94.886536208040312 29.297826331584119,-94.885816422022174 29.297499155955627,-94.884216982863776 29.296772137788121,-94.876917125093229 29.293454018939102,-94.875951551627523 29.293015121686942,-94.86617837453683 29.293883848703121,-94.865126326153927 29.293977364132552,-94.861112574100105 29.294855372432302,-94.849730461009372 29.297345209778594,-94.825607939204673 29.30577638202961,-94.824952733476934 29.30600538596191,-94.823862547308252 29.313200608971236,-94.822547126780194 29.321882377573708,-94.82230657170463 29.344254498409398,-94.810695999999993 29.353434999999998,-94.797913847039041 29.344567105809805,-94.79693012269928 29.343884625840758,-94.784895000000006 29.335535,-94.779995 29.334935000000002,-94.777063999999996 29.336811,-94.773074869484503 29.336485139838025,-94.745528999999991 29.334235,-94.744945 29.33641,-94.731319999999997 29.338066,-94.722529999999992 29.331445999999996,-94.731082 29.331833,-94.769694999999999 29.304936,-94.780304129101268 29.295750693651897,-94.786095000000003 29.290737,-94.793321795438203 29.286014946162535,-94.795651468635626 29.284492716516493,-94.803695000000005 29.279236999999998,-94.809348860129617 29.275904173901317,-94.81020919937113 29.275397022855465,-94.819018398045671 29.270204194137058,-94.82210781776098 29.268383049216432,-94.825036245866656 29.266656805306088,-94.825782574142963 29.266216861214712,-94.826962003659688 29.265521613475173,-94.833188167130103 29.261851427154124,-94.844390135018429 29.255248113651685,-94.870677905110114 29.23975205180561,-94.881596387366812 29.233315846843187,-94.896165027201874 29.224727954332334,-94.925556066041452 29.207402583865772,-94.927613957028456 29.206189502425392,-94.940693735267132 29.198479261054111,-94.968741214129224 29.181945889621023,-94.978383546115566 29.176261947153485,-94.981700088962569 29.174306918145966,-95.026218999999998 29.148064000000002,-95.076832914261459 29.114498139229923,-95.081772999999998 29.111222,-95.084611040272236 29.108948681405003,-95.100241410561338 29.096428488590096,-95.110484 29.088224,-95.116308293211759 29.081343778536318,-95.119264367911811 29.077851775668329,-95.119484217932538 29.077592067446851,-95.122403192505772 29.074143890856067,-95.122524999999996 29.074000000000002,-95.122638295373392 29.073709965581063,-95.125134000000003 29.067321,-95.183550616106302 29.028323983126334,-95.191390999999996 29.023089999999996,-95.192301227546167 29.02243038040822,-95.237672480263356 28.989550945676651,-95.238923999999997 28.988644,-95.240558404572027 28.987315672512366,-95.251568580535192 28.978367386619187,-95.251619678822578 28.978325857575001,-95.272266000000002 28.961545999999995,-95.29656403895315 28.934716691525271,-95.297146999999981 28.934073,-95.309703999999996 28.928262,-95.334686660244515 28.911063042846731,-95.353450999999993 28.898145,-95.376979000000006 28.876159999999999,-95.377903963555724 28.874482723635413,-95.38239 28.866347999999999,-95.416173999999998 28.859482,-95.436326577581042 28.85908617652915,-95.439594 28.859022000000003,-95.449516932572138 28.854239851149391,-95.480746000949352 28.839189657836059,-95.485144835951402 28.837069731735976,-95.486768999999995 28.836286999999995,-95.506945757563287 28.824808612805594,-95.536465934189138 28.808014833314715,-95.564052739104355 28.79232093268277,-95.564094788066555 28.792297011382839,-95.564132228771385 28.792275711681647,-95.568135999999981 28.789997999999997,-95.576201168007842 28.785870627961152,-95.606319447682353 28.770457515020929,-95.613122366343802 28.766976102576891,-95.695711236705606 28.724711019702028,-95.715243498124195 28.714715330888584,-95.812504000000004 28.664942,-95.854124934570734 28.646410960033691,-95.884026000000006 28.633098,-95.920915435374582 28.618912188118028,-95.97832748198536 28.596834417485056,-96.000681999999983 28.588238,-96.000998496292368 28.588108377001081,-96.024040703743012 28.578671299526803,-96.035336417502748 28.574045070633311,-96.05294532761279 28.566833233429691,-96.077867999999995 28.556625999999998,-96.194412 28.502223999999998,-96.220123346321373 28.492065891861738,-96.220376184174313 28.491966,-96.226882700448613 28.487451845000788,-96.241923733725443 28.477016528665938,-96.244750999999994 28.475055,-96.270391000000004 28.461929999999999,-96.303212000000002 28.441870999999999,-96.321560000000005 28.425148,-96.328817 28.423658999999997,-96.341616999999999 28.417333999999997,-96.371116999999998 28.397660999999999,-96.372100999999986 28.393874999999998,-96.370716999999985 28.387667,-96.378616389014681 28.383909329746462,-96.379349732835649 28.386024690464755,-96.381702691108558 28.392811896356477,-96.381863685354148 28.393276290946375,-96.375880899310658 28.401794149460329,-96.37413840285555 28.404274990018202,-96.340801887331921 28.432913073072363,-96.338559687910475 28.434839257985413,-96.335119195902806 28.437794848703732,-96.312964581561445 28.451131053409146,-96.280819757359396 28.470480970729877,-96.274497619264608 28.474286648703266,-96.268341347214189 28.477992481854848,-96.252027698910211 28.484249764669329,-96.250247000000002 28.484932771712327,-96.223824788704931 28.495067307260509,-96.218978121459415 28.500382701101032,-96.21505000939203 28.509679222336811,-96.145447855080619 28.544740658174199,-96.10473518795402 28.559498996555909,-96.046210731424992 28.586980036018211,-96.032979113622659 28.589015683181284,-96.007533711461477 28.59970275682273,-95.986159544454679 28.60631857558586,-95.982088289576367 28.614461085342473,-95.98565064745685 28.621076904105603,-95.983106103295938 28.641942154390655,-95.97852589224803 28.650593590730978,-95.986065974637228 28.655467849280154,-95.996337701374344 28.658736120211515,-96.002953500413568 28.656191585912577,-96.006515878017979 28.648049056432036,-96.010005951759737 28.648641710656278,-96.010506546843942 28.648726717396318,-96.011440067305529 28.648885239790378,-96.014343010193883 28.649378192516537,-96.026200716522851 28.65139176594381,-96.03348799089656 28.652629228032097,-96.039323368019012 28.651170385770797,-96.047737442142406 28.649066870151618,-96.049244844336243 28.648218956037223,-96.052682972641108 28.646285007998213,-96.05836686193534 28.643087818836001,-96.072165030584017 28.635326345489485,-96.092812363862251 28.627145317384699,-96.098878916233431 28.624741586366319,-96.099137163186526 28.624639261986079,-96.099760206508392 28.62447226081035,-96.102639895829256 28.623700385909448,-96.141413249033207 28.613307536255487,-96.148501276515404 28.611407654045699,-96.187178316202875 28.593595864643298,-96.198374286842139 28.586980055742131,-96.221784081288092 28.580364246840958,-96.228908787187095 28.580873158631725,-96.233997875508891 28.596649310733014,-96.233997875508891 28.601738394123839,-96.222292978285921 28.607336389305434,-96.214150448805384 28.613443281484855,-96.212623728226021 28.62260364440889,-96.2309444244882 28.64143324753087,-96.208552463485731 28.662298487953962,-96.214659365527126 28.665351929112688,-96.192267404524671 28.68774389011514,-96.1912495908051 28.694359708878277,-96.195829762405154 28.698939880478335,-96.202445561444364 28.700975507917487,-96.208747675276499 28.700187749031503,-96.21684000834783 28.699176214258408,-96.221467818495611 28.69859774191346,-96.222801895007663 28.698430983480506,-96.223384071149837 28.698294,-96.224163927167865 28.698110503315906,-96.227000018566372 28.697443183508955,-96.229623268039219 28.696825944469072,-96.231453341209956 28.69639533631743,-96.233964222112746 28.695240331316239,-96.23422531976 28.695120226420762,-96.234426397558138 28.695027730650764,-96.243315632596989 28.690938683290845,-96.256898753233088 28.684690448956413,-96.263514562134276 28.683672635236839,-96.268603640594122 28.688761723558645,-96.287942160437836 28.68316371851509,-96.304227224329892 28.671458831154069,-96.305245042980445 28.660262850652849,-96.303866760710434 28.646480081370939,-96.303718312539132 28.644995605411349,-96.322902111893882 28.641863561491792,-96.322903115546453 28.641863397630402,-96.328654788116609 28.640924350533034,-96.373438710121519 28.626674919011112,-96.376492171004159 28.620059100247982,-96.384634680760783 28.615987845369677,-96.473693647496702 28.573239550803915,-96.48794308888057 28.569677192923439,-96.482854000558774 28.580364266564878,-96.480309456397848 28.596649335387912,-96.485907441717487 28.60784531588914,-96.490487633041468 28.610898766909834,-96.510843966604781 28.614970031650095,-96.510335069606953 28.617514575811001,-96.497612348802434 28.625148188569788,-96.496594535082863 28.630746183751381,-96.49964797624159 28.635835272073191,-96.506263795004728 28.638379806372129,-96.513590449607946 28.639711925390898,-96.518002756430107 28.640514162994929,-96.524548246905439 28.641704252172264,-96.541744210187403 28.644830790950802,-96.545449731689985 28.645504522133091,-96.555118991611849 28.64601343885484,-96.5632615210924 28.64448670841351,-96.564664053901609 28.647882315216158,-96.572092291837293 28.665866475800886,-96.572930781014264 28.667896502859467,-96.570386236853366 28.674003385176928,-96.559190266214102 28.687235002979271,-96.559699163211917 28.6913062775815,-96.561225893653244 28.696395346179383,-96.566823878972883 28.697922096344637,-96.575158129308363 28.702846874961025,-96.578019859474111 28.704537895383844,-96.57828826199534 28.705826226653553,-96.579938546079447 28.713747585140421,-96.580564403635009 28.716751699466613,-96.584126761515478 28.722858581784067,-96.584439828543964 28.722940967911413,-96.591359183115401 28.724761852179114,-96.593796021437342 28.725403125944972,-96.611342043876562 28.720366765465901,-96.616906294097589 28.718769618875786,-96.625254999999996 28.716373230030175,-96.632357663078409 28.714334501780041,-96.638120426114043 28.71268037463507,-96.643733366943522 28.711069252030907,-96.64589364157122 28.710449172933409,-96.648758110223909 28.709626963981723,-96.65548660082564 28.704200766225345,-96.664534272187169 28.696904262901135,-96.657918463285995 28.687743919701024,-96.642136214348383 28.67476740345478,-96.635017595423747 28.668914316579048,-96.634564255386636 28.662567599984854,-96.634358790297441 28.659691108644115,-96.634304719917793 28.658934128568227,-96.633999771842213 28.654664885057134,-96.627892869800831 28.650084693733149,-96.626425176648581 28.649921620227584,-96.623312698200763 28.64957579673532,-96.621378075676532 28.648286046719594,-96.615940371111847 28.64466090565978,-96.615679075580019 28.64448670841351,-96.614055987266909 28.642701311583636,-96.613585709918453 28.642184006591457,-96.613038272810982 28.641581825879328,-96.612716570908134 28.641227953848528,-96.611999586497333 28.640439271135588,-96.610589997120172 28.638888723093881,-96.610589997120172 28.638695619081329,-96.610589997120172 28.63634418879494,-96.61975034032028 28.62769274259265,-96.620390401117646 28.626519297452973,-96.620672695530928 28.626001757543317,-96.621575870071126 28.624345937066781,-96.622336527533278 28.62295139797671,-96.622803791340985 28.622094747411062,-96.621924089240224 28.619379144726071,-96.621515564809087 28.618118047314677,-96.621338841511317 28.617572510068054,-96.620571817957583 28.61520474122884,-96.620437729127232 28.614790814755992,-96.617253050911174 28.604959849584038,-96.615239196090883 28.598743166058551,-96.614649885719274 28.596923990196654,-96.613008078443599 28.591855801497097,-96.611528402529856 28.587288105363601,-96.611113505533794 28.586007336117376,-96.611098903979951 28.585962261746474,-96.608298572876635 28.583628658523324,-96.608045443097311 28.583417717585569,-96.607377235577218 28.583437664220053,-96.600365219155734 28.58364697962633,-96.593251058093557 28.583859344147964,-96.573948594733835 28.584435541167107,-96.565297148531556 28.582399903865994,-96.564279334811971 28.57629300182461,-96.563658896232639 28.575155527088082,-96.562968608029692 28.573889994257026,-96.561225893653244 28.570695006643017,-96.557566061723506 28.569051817003789,-96.543745727976315 28.562846769979732,-96.536289388489891 28.559499026141786,-96.535271536438941 28.559346348925885,-96.526111211846271 28.557972305562419,-96.524846286909124 28.55686549700842,-96.523547686998668 28.555729222873186,-96.522039937244045 28.554409942750958,-96.516783301381025 28.541093122164042,-96.514406314623301 28.535071417976255,-96.512075206364955 28.532603188828926,-96.505754868421008 28.525911074776143,-96.496773944100411 28.520225902118948,-96.493684489370622 28.518270192113103,-96.482894459981281 28.511439806078794,-96.464303363514816 28.49967112954555,-96.450283853050735 28.49079639296917,-96.41974938229167 28.46738661824714,-96.410828816467941 28.459457253614527,-96.410588999643707 28.459244083835621,-96.409758652296418 28.458206146634446,-96.408886828651134 28.457116363910039,-96.40506625078595 28.452340627696451,-96.402446489887097 28.449065917053971,-96.402758256176753 28.447714917044181,-96.403973200604497 28.442450108152798,-96.407195206365273 28.441281062045864,-96.417343901660857 28.437598792799108,-96.461479843413926 28.421584870195201,-96.476120924474287 28.411702150055138,-96.481836236149007 28.407844318412668,-96.504737094149291 28.397666161492985,-96.511137484289378 28.396220910815867,-96.520513236388609 28.394103803612502,-96.534249520963641 28.388796609353736,-96.542905217114992 28.385452367272176,-96.559699173073881 28.377818734789468,-96.57038624671533 28.368658381727396,-96.577905378446388 28.364719789411506,-96.5917603939982 28.357462401226169,-96.600411840200493 28.354408960067438,-96.650793747525029 28.34677533744669,-96.672676831253582 28.335579347083499,-96.688452973492915 28.347284234444516,-96.694559875534281 28.347284234444516,-96.698122233414779 28.342704062844462,-96.705246949175717 28.348810964885843,-96.700157860853906 28.369676195446971,-96.705755865897487 28.400210705653887,-96.710336037497541 28.406826524417021,-96.710425531143088 28.406841439843959,-96.711757514930511 28.407063434453107,-96.711949596522956 28.407095447664108,-96.71209813364915 28.407120203551969,-96.7125191933293 28.40719037931537,-96.712878460543081 28.407250256459115,-96.722549831718325 28.408862132132249,-96.749013067323034 28.408862132132249,-96.762244685125353 28.411915593014903,-96.76554491144303 28.411090543097366,-96.768351577304784 28.410388882297497,-96.775985199925543 28.405808690973519,-96.777118787058129 28.404067826336821,-96.778115367638478 28.402537364460464,-96.780337941159374 28.399124129135416,-96.780820705165937 28.398382742114745,-96.790234641309425 28.383925636830853,-96.794392274787313 28.366371177405831,-96.794814812909479 28.364587126849088,-96.794810066932399 28.364444747076842,-96.79477772408616 28.363474458555832,-96.794305906049686 28.349319871745632,-96.794064195689629 28.347593374049037,-96.792754716842737 28.338239980125699,-96.790743538307225 28.323874459722486,-96.791161640090152 28.319066463411133,-96.791737095961722 28.312448960638157,-96.791761391474679 28.312169572361466,-96.791798306096766 28.312130020933203,-96.806010803272656 28.29690232711997,-96.809573161153153 28.290286508356836,-96.806010803272656 28.282143978876302,-96.799480493673911 28.2729662335258,-96.799349781293685 28.272782529381054,-96.787181219874626 28.255680743271615,-96.787181219874626 28.250082757951983,-96.800412817953031 28.224128419345121,-96.810027933605966 28.21709297064087,-96.81015126416365 28.217002728792142,-96.823379937963566 28.207323213817581,-96.836184503007971 28.197954022244446,-96.84100213695676 28.194428925121734,-96.842143298799229 28.193593928862132,-96.847274602334139 28.190686192954498,-96.857267971405633 28.185023289193378,-96.872677809006134 28.176291056181483,-96.877474270970822 28.171878306563691,-96.886067200578026 28.1639728030657,-96.898123211167331 28.152881261735526,-96.906497631141988 28.149042991548708,-96.910337015250093 28.147283276415891,-96.926704620510804 28.131597659113019,-96.934764623415617 28.123873491831901,-96.962356663895278 28.123371819605953,-96.962754569737697 28.123364584972112,-96.979717515560068 28.129783000626698,-96.995398793779131 28.135716460690723,-97.000413785843605 28.137614026355994,-97.007520616950742 28.136091128354632,-97.007538501604586 28.136087295914667,-97.009222611239821 28.135094102666635,-97.00939982996681 28.134989589017771,-97.027385928308092 28.12438239869169,-97.028912648887456 28.117257682930727,-97.025203084589847 28.111384210119862,-97.023365428929196 28.108474590635566,-97.022805746846075 28.107588427939849,-97.02290356380766 28.107197159145706,-97.023379876854563 28.105291902342927,-97.02382356056566 28.10351716319958,-97.025496807419856 28.101530180660298,-97.031966099908146 28.09384788848477,-97.033883146887263 28.088918342142531,-97.035528457788629 28.084687545284659,-97.035528457788629 28.083043098067591,-97.035528457788629 28.081818766572983,-97.035528457788629 28.074000471643224,-97.033022532693735 28.061470870449408,-97.032801767679686 28.060367047518316,-97.031459273912688 28.053654591691117,-97.031457183186404 28.053644138079921,-97.025859197866765 28.041939250718904,-97.030948266464648 28.033287814378582,-97.03239348781301 28.032603236465789,-97.040617526386512 28.028707642778524,-97.041168915404441 28.028259640036232,-97.046718327422383 28.023750751173218,-97.048760075590963 28.022091833877354,-97.050263648357429 28.019142519014494,-97.059727497080047 28.000578821719444,-97.061991693393324 27.99613751499442,-97.06790259446116 27.99219690579767,-97.073772658186698 27.988283521554418,-97.075732208193486 27.986977152070377,-97.083740513918784 27.975854507337193,-97.090858162154831 27.965968886660271,-97.094600599978094 27.960771057335059,-97.101378519421061 27.951357282114685,-97.101544336287489 27.951126980954953,-97.101629253046639 27.951009041034034,-97.112670327945679 27.935674217691009,-97.118292397880069 27.927865788706086,-97.121533983365822 27.923363587495643,-97.122089895488358 27.923104160785101,-97.123659587861624 27.92237163470331,-97.129167576400675 27.91980122961516,-97.134800331352182 27.902469771509406,-97.13578341488774 27.899444915775788,-97.139044920333077 27.897526377912126,-97.141761509630356 27.895928379836029,-97.144434841366106 27.894355827453982,-97.155121915007527 27.880615312653809,-97.156735458496229 27.877916799393841,-97.171211094589736 27.85370753808861,-97.17159000749372 27.853073838716419,-97.18273536107327 27.834434189625789,-97.184638591770963 27.831251199324921,-97.187183135931861 27.824126483563962,-97.18941247112663 27.823657146727278,-97.196852395853725 27.822090836400886,-97.201135366472329 27.822090836400886,-97.208766105658313 27.822090836400886,-97.209575096934316 27.822090836400886,-97.21103842611052 27.822356897891609,-97.21191517248603 27.822516307306422,-97.214117494684729 27.822916731993345,-97.215541825234411 27.823175702780983,-97.217387510601711 27.823511284007832,-97.220771087297493 27.824126483563962,-97.222189700736266 27.82464074101355,-97.223091414240102 27.824967618564596,-97.225175600069406 27.825723150734085,-97.225442194074731 27.826156365185522,-97.225555528799433 27.826340533769983,-97.225696025109201 27.826568839847944,-97.22598639723725 27.82704069367685,-97.227317456819009 27.829203661466853,-97.227317456819009 27.832884543697009,-97.227317456819009 27.832951908184537,-97.22711696094737 27.834288541284948,-97.22651425924083 27.838306534493725,-97.227537582741903 27.841230302974814,-97.228388390382094 27.843661171179477,-97.233100025453197 27.847817700825228,-97.234045759551762 27.848652012430087,-97.234511621821596 27.849062988727319,-97.238500481248579 27.854279199579018,-97.239439164419366 27.855506710708827,-97.241127420860792 27.857714434929608,-97.24139627838295 27.858969111470945,-97.242350826195675 27.863423696705052,-97.242654131578206 27.86483913096664,-97.243132066142749 27.865496290124597,-97.244364366034702 27.867190700237273,-97.250796680782656 27.876035121329831,-97.263010484865433 27.88010639593206,-97.267085449659064 27.88068852838779,-97.272090543185925 27.881403535150675,-97.273697558506882 27.881633106649463,-97.276628649874411 27.881144591421538,-97.283916343274228 27.879929975854907,-97.291452123510041 27.878674012482271,-97.291709327200167 27.878631145200583,-97.295071705789752 27.87807074876898,-97.29826066531912 27.876989746639367,-97.302276298241679 27.875628516526195,-97.30641171632756 27.874226681314273,-97.315889353880934 27.871013926092836,-97.325097299274915 27.867892591849294,-97.326845878314657 27.866807265961079,-97.334190606350404 27.862248465187459,-97.346213303335873 27.854786094892546,-97.354613966176373 27.849571885725148,-97.359768343966266 27.850509060182219,-97.360211961357962 27.850589719168646,-97.360654441244435 27.850290746360063,-97.363614400263117 27.848290774636723,-97.376904444631478 27.839311017562139,-97.379041564479934 27.837867018088055,-97.379057154646048 27.837837708581311,-97.379081675001302 27.837791610322164,-97.37968928125764 27.836649310776913,-97.391764280353456 27.813948316782309,-97.391812130016405 27.812975373996721,-97.391812459346511 27.812968677620422,-97.39203202611381 27.808504155006624,-97.392068018906713 27.807772301822137,-97.392095751995882 27.807208395884746,-97.393123788240075 27.786304999999999,-97.393168763213623 27.785390509210199,-97.393291005863816 27.782904909577571,-97.393142269808052 27.782564941361908,-97.39298939956177 27.782215523565412,-97.390949955785928 27.777553936582201,-97.390465068726371 27.776445623015572,-97.390185233729682 27.775805999999999,-97.389524844304646 27.774296538065283,-97.38835420640342 27.771620793596586,-97.388306220610531 27.771511111755789,-97.388011229692253 27.770836846624743,-97.38704242749894 27.768622441036733,-97.386166290102864 27.766619840754537,-97.385225495384532 27.765302728148875,-97.378862356737287 27.756394334042721,-97.375764970087644 27.752057992733249,-97.373069654276961 27.748284550598278,-97.368354500700462 27.741683335591173,-97.365855345900911 27.739779218033028,-97.354970329043653 27.731485873530172,-97.352272255056832 27.729430198526604,-97.34997871774064 27.727682741876539,-97.347507961666906 27.725800261438444,-97.346980343555629 27.725398266768138,-97.343485766084669 27.723942192633796,-97.323096068004702 27.715446484002907,-97.316445853072636 27.712675560756566,-97.312489136070184 27.711663774861414,-97.307771479065892 27.710457406346261,-97.30518751069485 27.709796650788128,-97.285725857752936 27.704820043684109,-97.259850586867117 27.698203387982087,-97.253955150197811 27.696695845323848,-97.254014647303208 27.696526337654994,-97.255455364792269 27.692421723465429,-97.259957004258851 27.67959652118169,-97.261636792970123 27.679316557300702,-97.26241778482418 27.679186392412099,-97.266063906300232 27.678578707462119,-97.266172011465457 27.678349884642419,-97.272736281666539 27.664455499360063,-97.273042341106247 27.663807672923248,-97.273584380560237 27.662660354976065,-97.276535709391737 27.656413369610792,-97.277059923980644 27.655303780997631,-97.278846463786479 27.651522268106756,-97.280071982275985 27.648928251476995,-97.280889132874719 27.647198614380269,-97.282300269490932 27.644211705671331,-97.282869528026779 27.64300677394548,-97.287959956150573 27.632232024058997,-97.288756326795195 27.630546371240786,-97.290370933329072 27.627128784125372,-97.290610159422798 27.626622421740255,-97.291264204229464 27.625238025568656,-97.291996439564016 27.623688125953898,-97.292910903535031 27.621752508687905,-97.293983233844585 27.619482740684056,-97.29528946695001 27.616717877953022,-97.296598377059297 27.613947348891728,-97.297587499071795 27.609496333379006,-97.298634024222366 27.60478700569162,-97.29761621050281 27.598680093788271,-97.294053852622326 27.594099922188217,-97.294182769084571 27.593971005725969,-97.300049926927869 27.588103847882682,-97.302196382102863 27.585957392707677,-97.311120578488044 27.579146819865922,-97.321534901946578 27.571199044464009,-97.325080504595888 27.561034984604785,-97.336802147188081 27.527432946040641,-97.343417965951204 27.517763686118776,-97.347489240553443 27.503005347737066,-97.350542661988243 27.478577729709574,-97.359194108190536 27.458221396146271,-97.365809926953673 27.450587783387487,-97.371916828995055 27.425142361502377,-97.369881181831957 27.412419660421783,-97.372934622990698 27.401223670058592,-97.379550422029908 27.390027689557368,-97.399397858595393 27.344734850830708,-97.401942402756291 27.335574497768633,-97.404995863638931 27.329976512448997,-97.413138393119482 27.321325066246711,-97.42026310888042 27.317253791644482,-97.430441285524054 27.313691423902039,-97.450797599363412 27.313691423902039,-97.482858840011673 27.297915271800758,-97.508304242172855 27.275014394076553,-97.532222933616623 27.278576761818989,-97.544436737699399 27.284174747138625,-97.546981281860297 27.290790556039799,-97.536803105216677 27.289263825598471,-97.526624948296998 27.291808369759369,-97.524589320857856 27.297915271800758,-97.51746460509689 27.305039987561717,-97.504741884292372 27.305039987561717,-97.498126085253162 27.308602345442196,-97.502706237129289 27.322342870104325,-97.499143898972747 27.327940855423961,-97.483876634007316 27.33862793892736,-97.483876634007316 27.351350640007954,-97.486930094889971 27.358984272490666,-97.501688443133645 27.366617904973374,-97.514411144214236 27.361528796927644,-97.520518046255617 27.352877370449281,-97.538329835658018 27.335574478044709,-97.570899973304094 27.315727061203152,-97.584131581244463 27.309620159161771,-97.609068086407831 27.285192570720163,-97.621790807212349 27.287228188297352,-97.63146005727225 27.286210384439741,-97.63654914066305 27.282139109837512,-97.636657939024673 27.281797172172649,-97.640111498543547 27.270943129336285,-97.639093679892994 27.253131339933887,-97.635022415152719 27.247024437892502,-97.628915513111338 27.242953173152234,-97.597363199046811 27.242444266292445,-97.5826048606651 27.240408628991332,-97.573953414462821 27.238881903480983,-97.56123071338223 27.232775006370584,-97.542910007258072 27.229212648490105,-97.520009129533875 27.231248285791217,-97.509830972614182 27.235319550531486,-97.503215153851045 27.23989972213154,-97.500161712692318 27.244479898662579,-97.485148876501881 27.25084127385778,-97.467082638600573 27.253640266517596,-97.45843119239828 27.259492710198106,-97.450288657986775 27.262546171080761,-97.424079880742951 27.264072891660124,-97.422298701802717 27.257711541119829,-97.434766954384401 27.202240525749552,-97.444945121166043 27.144733882940127,-97.443672849085587 27.116235010034327,-97.452324285425917 27.115217201245734,-97.455886653168363 27.110382571284802,-97.456650008527049 27.09969549764336,-97.46173908698691 27.095624227972113,-97.475479621510999 27.098423220631929,-97.480568699970846 27.102494490303176,-97.491510231973166 27.101222218222723,-97.495835955074313 27.09409750739275,-97.4932914109134 27.078066891999608,-97.477515248950155 27.066107546277717,-97.479041969529504 27.06279964182713,-97.482256963728076 27.061942305056665,-97.48693005051112 27.057710553505324,-97.487693415731783 27.053639288765055,-97.486675602012198 27.034809685643079,-97.477515248950141 27.032519589981089,-97.473952881207694 27.029211690461484,-97.473443984209865 27.022850330059228,-97.478300083716704 27.000269498406993,-97.478533072531675 26.999186101907302,-97.480568690108868 26.997659376396957,-97.483967678435022 27.000330000000002,-97.484131057851314 27.000458369056773,-97.492988547644813 27.000330000000002,-97.49889841702128 27.000244349959733,-97.533497176854453 26.999742920066073,-97.536803065768822 26.999695008767091,-97.549271318350492 26.995878197456715,-97.555378215460905 26.990280207206101,-97.551052502221722 26.980865400714134,-97.549525776711377 26.965343697111763,-97.552324769371197 26.95211208177491,-97.555378205598956 26.947277449348487,-97.555378205598956 26.938880461507075,-97.540874325578116 26.906310323861007,-97.540110950495503 26.900966796902246,-97.547999041339082 26.895114353221743,-97.552324764440229 26.888498544320569,-97.552324764440229 26.875332999999998,-97.552324764440229 26.873831771434514,-97.552324764440229 26.871753101924,-97.552324764440229 26.867633303897481,-97.555396527456509 26.865969429990074,-97.558431656619632 26.864325399446898,-97.558453748966258 26.864224239771101,-97.559853702000524 26.857813929560987,-97.562641307980527 26.845049630589628,-97.563266286580571 26.842187886943357,-97.552579212939136 26.827938454188693,-97.547744582978211 26.824630549738107,-97.537566416196555 26.824885004400745,-97.509830908511418 26.8035108521869,-97.48438549155729 26.763561555211936,-97.478024141017002 26.757200199740662,-97.471662790476714 26.758726925251008,-97.468609339456009 26.740915130917632,-97.467337057513589 26.710126182073765,-97.444945096511148 26.633535472850511,-97.445708451869848 26.609362327976836,-97.441206258760758 26.5999011976768,-97.435205432977895 26.587290766879221,-97.432741093635642 26.582112082834445,-97.429217375703914 26.574707168454967,-97.428151110966368 26.572466467229631,-97.418145193925739 26.555638334425574,-97.416955130465126 26.553636864107652,-97.41864075483771 26.543121778291471,-97.42039414733226 26.532183948458435,-97.422284917775215 26.520389141863415,-97.422298667285844 26.520303371102887,-97.425861015304378 26.516741008291426,-97.430695645265303 26.506562841509776,-97.430695645265303 26.494603495787885,-97.42802638225659 26.488322868889494,-97.42636993202612 26.484425333937217,-97.429168909893022 26.478063961207511,-97.43553026043331 26.470175880225888,-97.441382709044788 26.466613522345408,-97.441382709044788 26.455417541844177,-97.43756589773443 26.449819546662585,-97.425861005442428 26.446002740283195,-97.421026375481503 26.446766095641895,-97.417209564171131 26.449819546662585,-97.411611568989528 26.447275002501684,-97.412883841069984 26.433025580841726,-97.421789740702152 26.417249413947498,-97.419499649971158 26.413178149207234,-97.406013578738921 26.409106884466965,-97.398125502688274 26.410888063407203,-97.394308686446919 26.414450416356704,-97.395072051667569 26.417249413947498,-97.382484933201752 26.411326066613285,-97.377769169124974 26.409106884466965,-97.369626639644437 26.394602999515151,-97.374461259743413 26.38086247238753,-97.388965149626202 26.365849678110436,-97.392018610508856 26.339386444971247,-97.391000786927322 26.332261729210284,-97.38794734576858 26.330480545339064,-97.376242448545611 26.336332993950553,-97.372171183805335 26.339895346900054,-97.36937219114553 26.348546788171358,-97.358176200782339 26.356434874083959,-97.343417852538664 26.35923386920927,-97.342332537534404 26.358759043566288,-97.335275323058127 26.355671510096041,-97.335020017473738 26.355402767481841,-97.331108052904881 26.351284911668415,-97.330440693097202 26.350582427937965,-97.333762617526986 26.340749518544904,-97.336802038706509 26.331752819885011,-97.343786761143846 26.325987658774913,-97.344677525679145 26.325252425399061,-97.352414066956698 26.31886671611711,-97.352832659030639 26.318521211944631,-97.354359379610003 26.313941040344577,-97.348998828460125 26.312092573442666,-97.347821984790102 26.311686765063648,-97.346980205488165 26.311396496183672,-97.34736083223585 26.297503848546928,-97.347437236753805 26.2947151295396,-97.347489122209922 26.292821341560611,-97.347051378510429 26.289694600417153,-97.344137846000223 26.268883651035111,-97.343926764329439 26.267375924606483,-97.342629246748771 26.266550231912309,-97.341127771669619 26.265594748131736,-97.335282658907644 26.265594748131736,-97.331967408745584 26.265594748131736,-97.330307576264516 26.266747410222209,-97.323817586106017 26.271254350355399,-97.322807065545476 26.271956101137519,-97.313207351206557 26.273518846137112,-97.312102101648151 26.273698770576502,-97.311865543405119 26.273737280077761,-97.307030913444194 26.253126493084562,-97.308048727163751 26.249055213551365,-97.321280340035131 26.236078054109896,-97.321280340035131 26.228698889850026,-97.304486359421333 26.202490107675235,-97.296598288301666 26.200708923804015,-97.294817109361432 26.192311940893585,-97.296089381441874 26.182388227541828,-97.303096384204423 26.167373221160254,-97.305986772892751 26.161179530923267,-97.306776455083323 26.159487354748606,-97.300965235160419 26.149753561518516,-97.296881711355638 26.142913659244432,-97.296598288301666 26.14243892563589,-97.285549237329036 26.12861437636975,-97.28536038956149 26.128378090441405,-97.284582435540926 26.126454238998875,-97.282094393487881 26.120301403270393,-97.282839179410786 26.118439442973433,-97.28311220967295 26.117756868971455,-97.285501587752023 26.116923364107649,-97.294053737977038 26.113940052730097,-97.295071554162092 26.108342057548505,-97.292023254217796 26.105090538920617,-97.291924538345086 26.104985242032239,-97.291541272704407 26.104576425513905,-97.287190793518263 26.099935916255493,-97.286650074642992 26.099359149688052,-97.286603231473521 26.09930918366079,-97.283195451762182 26.095674220102872,-97.282639002190891 26.095080674133143,-97.282108002623801 26.094514274823585,-97.280435495761154 26.092730268223651,-97.279905974795895 26.09216544608875,-97.27980430522237 26.092056998587434,-97.27089841052117 26.086459003405839,-97.267086875013263 26.085485845069449,-97.24859983335169 26.080765747704277,-97.246979719077387 26.080352101364454,-97.229515030031649 26.08000965739204,-97.220290685310772 26.079828788368793,-97.208048240752987 26.079588741074772,-97.205005053278043 26.078666562185607,-97.199651252911579 26.077044196913871,-97.199152512570265 26.073220535461079,-97.199134106850465 26.073079425477676,-97.198725011196004 26.069943037351702,-97.198302051934135 26.066700361972018,-97.196018989165054 26.049196947106083,-97.195939794821285 26.0485897927724,-97.195071061587612 26.04192952989985,-97.204994779870347 26.030224637607851,-97.214918488291119 26.030733549398622,-97.224842206573854 26.027425644948035,-97.226114478654296 26.024372193927345,-97.219244211392265 25.99612778184791,-97.216954125592238 25.993837693582392,-97.208557137750816 25.991802058746771,-97.195834416946283 25.993074335758202,-97.174460269663413 26.000071824804216,-97.167208324722026 26.007069313850227,-97.162755377371425 26.014575709756024,-97.16262814819099 26.023481604457221,-97.172042954682937 26.044728528107019,-97.178658763584124 26.045491893327686,-97.182730028324386 26.053125515948434,-97.164981847348457 26.063876207878327,-97.152009000000007 26.062107999999998,-97.152012551274964 26.062039393270581,-97.15321 26.038906,-97.151921999999999 26.017652999999999,-97.14747181118706 25.985075937251509,-97.145567 25.971132,-97.146880999999993 25.969781,-97.146293999999997 25.955606,-97.147784999999985 25.953132,-97.156608000000006 25.949021999999999,-97.160293999999993 25.950243,-97.168198638692317 25.959262149012673,-97.178362000000007 25.962114,-97.187583000000004 25.958174,-97.206945000000005 25.960899,-97.214339285966162 25.960186817526893,-97.227626420907342 25.958907063854085,-97.229225999999997 25.958753000000002,-97.239867000000004 25.954974,-97.244841570811701 25.950784663302475,-97.248032999999992 25.948097,-97.255343503388133 25.949129556975723,-97.276707000000002 25.952147,-97.28138899999999 25.948036999999996,-97.277163000000002 25.935438,-97.284201820237172 25.935775045516863,-97.290083634347766 25.936056689174489,-97.293963761326751 25.936242484429805,-97.303601999999998 25.936703999999999,-97.316138101068788 25.931602038234757,-97.320560999999984 25.929801999999999,-97.324914000000007 25.924040999999999,-97.332235861490744 25.923541683060932,-97.33463605770983 25.923378000829199,-97.338346 25.923124999999999,-97.339310160867683 25.923294280152341,-97.350397999999998 25.925241,-97.367642000000004 25.915679999999998,-97.369283543255307 25.913688286645449,-97.373641276386991 25.908400972256459,-97.374430000000004 25.907443999999998,-97.372365000000002 25.905015999999996,-97.365976000000003 25.902446999999999,-97.365883578347024 25.900015396466173,-97.365521 25.890476,-97.364300486696564 25.885628504434479,-97.362421560218849 25.878165998501085,-97.360082000000006 25.868874000000002,-97.364783621478566 25.852096838905283,-97.36542 25.849826,-97.372864000000007 25.840116999999996,-97.394513000000003 25.837377,-97.422635999999997 25.840377999999998,-97.42853949246836 25.842912007889609,-97.434188204901034 25.845336654308195,-97.441181027463472 25.848338244915578,-97.445113000000006 25.850026,-97.445601387363794 25.851485440010176,-97.447179184935308 25.856200346812667,-97.448271000000005 25.859463000000002,-97.449172000000004 25.871677999999996,-97.452166849899044 25.875807172885114,-97.453724626189043 25.87795496921364,-97.454727000000005 25.879337,-97.45488774919265 25.879394304385261,-97.462586893331732 25.882138919861518,-97.468261999999982 25.884162,-97.468599721544905 25.884059457735212,-97.481532785459223 25.880132596436578,-97.486059999999995 25.878758,-97.490359999998347 25.879275544671589,-97.494739403174762 25.879802646248233,-97.496860999999996 25.880057999999998,-97.519591990380178 25.88590026892226,-97.521761999999995 25.886458,-97.52344767329889 25.891064017588189,-97.524375103029939 25.893598172727145,-97.528116959024402 25.903822606212749,-97.528119935206945 25.903830738482007,-97.52812430798204 25.903842686870224,-97.528627999999998 25.905218999999999,-97.528849446448064 25.906732522417784,-97.530321999999998 25.916796999999999,-97.530415259581318 25.916820899843632,-97.539878370214808 25.919246032588486,-97.542957 25.920034999999999,-97.545169999999999 25.923974999999999,-97.545468770003851 25.926387609575503,-97.545470694802859 25.92640315259677,-97.546397824784293 25.933889856891241,-97.546420999999995 25.934076999999998,-97.546611329705271 25.934141994258589,-97.555160182125618 25.937061277530951,-97.555378999999988 25.937135999999999,-97.555477252221124 25.937015705749829,-97.559364000000002 25.932257,-97.582565000000002 25.937856999999997,-97.580418999999992 25.945115999999995,-97.583044 25.955442999999999,-97.598043000000004 25.957556,-97.5981230356591 25.957681442330628,-97.607733999999994 25.972745,-97.60783562843973 25.973457509771446,-97.607844088251909 25.973516820913719,-97.608283 25.976593999999999,-97.609461531117333 25.977846566488182,-97.613191727531174 25.981811093986448,-97.613466053312663 25.982102652924251,-97.616041456343709 25.984839842874308,-97.624938181905222 25.994295461083137,-97.627225999999993 25.996727,-97.634804000000003 25.999508999999996,-97.635072411453706 25.99971613545971,-97.639164724998494 26.00287420951236,-97.642117661027001 26.005153015998879,-97.644011365977178 26.006614404624422,-97.643848619841975 26.01214811069886,-97.643707610985203 26.016942704231127,-97.649175518723894 26.021499311673544,-97.65096419129361 26.02118629315062,-97.659123404318109 26.019758427116106,-97.661326460130226 26.019372891335045,-97.66298585459532 26.019511685247039,-97.668297999999993 26.019955999999997,-97.669519566971061 26.021667429940447,-97.671350987084779 26.024233271429612,-97.671567999996611 26.024226704244594,-97.691453959129774 26.023624920821636,-97.697068999999999 26.023454999999998,-97.703247203861338 26.030308742132775,-97.706066818770353 26.031284762516545,-97.709294717923569 26.032402112038366,-97.711145328137576 26.033042707775564,-97.719920000000002 26.030837999999999,-97.723585926686539 26.030959832537771,-97.729354247932832 26.031151535557555,-97.735180242251758 26.031345155270547,-97.758837769919694 26.032131383932391,-97.76309059882324 26.033650253079866,-97.763351431657455 26.034258862745556,-97.76491324062286 26.037903081983409,-97.769788888528993 26.041344719068825,-97.770077387482857 26.041548365582649,-97.776788595669075 26.042443189872706,-97.779190602367677 26.042763456191249,-97.784050976575529 26.040637041739476,-97.789822674626535 26.0424596835391,-97.792252861730461 26.04428232533872,-97.793102878401371 26.047342389307317,-97.793537334820812 26.048906434437896,-97.794638769549053 26.052871604582215,-97.795290594138677 26.055218176136449,-97.801344 26.060016999999998,-97.803973303988229 26.059548218630308,-97.8082126910423 26.058792373859696,-97.819424117916668 26.056793476786609,-97.820997703829306 26.056512920501468,-97.825546000000003 26.055702,-97.826721102251625 26.055271667399982,-97.830409376527257 26.053920989485444,-97.836607999999984 26.051650999999996,-97.848759348822554 26.052295281844582,-97.85186756815483 26.052460084066457,-97.859824237628374 26.052881958029587,-97.860225497621784 26.05290323340671,-97.860503999999992 26.052917999999998,-97.861874999990562 26.053580848914272,-97.869705222636284 26.057366592615971,-97.871187000000006 26.058082999999996,-97.876982999999996 26.064482999999999,-97.886529999999993 26.066338999999999,-97.901546631929207 26.060958662441269,-97.905109129229899 26.05968224852101,-97.913882 26.056539,-97.935419999999993 26.052687999999996,-97.944344999999984 26.059620999999996,-97.950095000000005 26.061827999999998,-97.96210735288345 26.054793018383155,-97.96735799999999 26.051718,-97.971403108419892 26.054550391225565,-97.978769 26.059707999999997,-97.979877702655912 26.062937323324391,-97.981335 26.067181999999995,-98.010970999999998 26.063862999999998,-98.015122209308288 26.064471399070538,-98.026123959861238 26.06608380989196,-98.028288992822496 26.066401115993269,-98.028758999999994 26.066469999999999,-98.029241090705753 26.065867136858621,-98.033102 26.061039,-98.034402999999998 26.051375,-98.034479464439173 26.051215303797409,-98.034525269179767 26.051119640464091,-98.039238999999981 26.041274999999995,-98.054365285842039 26.044575736209502,-98.070020999999997 26.047992,-98.070022345126233 26.049160242153427,-98.070025 26.051466,-98.071425788568789 26.055027814897404,-98.076094939927231 26.066900165398668,-98.076139697069991 26.067013970337847,-98.076205751241318 26.067181927684643,-98.076543999999998 26.068041999999998,-98.076994427275579 26.068371469710563,-98.080289992888041 26.070782045417982,-98.080494999999999 26.070931999999999,-98.080906883185932 26.070920010911959,-98.084755 26.070808,-98.085506402845155 26.069709056167966,-98.085848999999982 26.069208,-98.085628527723046 26.069048386721494,-98.081567000000007 26.066108,-98.081855064865067 26.063941606819231,-98.081884000000002 26.063724,-98.082307152201508 26.063513440869801,-98.091037999999998 26.059169,-98.093593108176947 26.058759459973995,-98.094431999999998 26.058624999999996,-98.095078111969258 26.058956205325877,-98.096949561841043 26.059915534659098,-98.097643000000005 26.060270999999997,-98.105504999999994 26.067537000000002,-98.122952624574893 26.063250384797335,-98.12786358062813 26.062043837809401,-98.128331000000003 26.061928999999999,-98.142925292417388 26.051941751725515,-98.14645163947533 26.049528582072455,-98.146621999999994 26.049412,-98.146852932570667 26.049588146033326,-98.149462999999997 26.051579,-98.149462999999997 26.055813,-98.151730999999998 26.058187,-98.158277994458601 26.062311711597108,-98.16142849281799 26.064296576133319,-98.161911645017582 26.064600969774318,-98.167608590156348 26.068190136655492,-98.172071527808072 26.071001859012309,-98.177897000000002 26.074672,-98.179863281323136 26.072661506851002,-98.189059999999998 26.063257999999998,-98.191534000000004 26.057117999999999,-98.197046 26.056152999999998,-98.200871000000006 26.059161,-98.203328791159265 26.063523594334541,-98.204415309491765 26.065452171017675,-98.20496 26.066419,-98.205720285634712 26.066905180236589,-98.2057544964389 26.066927057036718,-98.220672999999991 26.076467,-98.228363119990576 26.077028417928002,-98.230097 26.077155,-98.231072909449267 26.07694353295701,-98.240214327563166 26.074962705064888,-98.248806000000002 26.073101,-98.250234708208026 26.074229377516481,-98.260964088277859 26.082703320039151,-98.264514000000005 26.085506999999996,-98.272091468517374 26.0934369782697,-98.272527821536428 26.09389363077193,-98.277218000000005 26.098801999999999,-98.277020629370639 26.099144109090908,-98.272932087266241 26.106230915405163,-98.272897999999998 26.10629,-98.272099931737145 26.106512924095771,-98.270258188934392 26.107027377392626,-98.270033999999995 26.107089999999999,-98.269661374787887 26.108231250649609,-98.268046405073434 26.113177467856264,-98.266755660647689 26.117130670341034,-98.265753950746401 26.120198637935399,-98.265698 26.12037,-98.266046753689267 26.120369439652073,-98.268388964369507 26.120365676386069,-98.271048543344023 26.120361403199535,-98.2713587738927 26.120360904747326,-98.279433560913844 26.12034793086255,-98.289509742149562 26.120331741306838,-98.296194999999997 26.120321,-98.299522999999979 26.11749,-98.299575546893735 26.117376878214852,-98.299577897643644 26.117371817572689,-98.299619756950364 26.117281703787395,-98.301477861619162 26.113281617347607,-98.302978999999993 26.110049999999998,-98.307788398559808 26.112633359128559,-98.31093219000293 26.114322040617914,-98.314784784069062 26.116391454064445,-98.31781148535309 26.118017240801439,-98.323055746360907 26.120834185452331,-98.323827999999992 26.121248999999995,-98.324165904650499 26.121735183484471,-98.335204000000004 26.137616999999999,-98.337914801547555 26.149187638321976,-98.338210450252006 26.150449569219312,-98.338419999999999 26.151344000000002,-98.338123748811455 26.151776768193923,-98.337139471603692 26.153214615149455,-98.336278203634194 26.154472768358826,-98.335109254490916 26.156180386856505,-98.334230366689056 26.157464279382136,-98.333315999999996 26.158799999999999,-98.333279392301918 26.159609030127591,-98.333194378655719 26.161487831708563,-98.333156000000002 26.162336,-98.33332593363771 26.162525092143447,-98.336569396995017 26.166134227137082,-98.336837000000003 26.166432,-98.337709251548077 26.166391430160555,-98.345513373134324 26.166028447761192,-98.345781000000002 26.166015999999999,-98.345955918391979 26.165759937155421,-98.34781294946896 26.163041431373035,-98.354645000000005 26.15304,-98.380009845764519 26.156864235849298,-98.386243919298991 26.157804141722139,-98.386694000000006 26.157872,-98.386714843024777 26.157901012682096,-98.387178289965661 26.158546112849205,-98.389418830831929 26.161664858836595,-98.394322667090904 26.168490808715738,-98.402249554153599 26.179524728065878,-98.404432999999997 26.182563999999999,-98.41082579547016 26.183537375155975,-98.418120000000002 26.184647999999999,-98.44253599999999 26.199151,-98.444302622216625 26.201317032456906,-98.444376000000005 26.201407,-98.444366742625562 26.201566115583965,-98.444174812576264 26.204865005795593,-98.443681770155465 26.213339409994948,-98.45054565332704 26.219516919037407,-98.450975699346984 26.219903961344286,-98.465077324681431 26.222335272645303,-98.467962758220992 26.221802674698019,-98.47639547470331 26.220246150374404,-98.481645999999998 26.219277000000002,-98.483269000000007 26.216439,-98.496684404575589 26.212853148677059,-98.500574513964963 26.213825676024403,-98.503492081872309 26.214798198660183,-98.504399410834864 26.216045775617395,-98.509275818143593 26.222750833698164,-98.509327236533252 26.222821533963195,-98.516621175147847 26.223550930651591,-98.520846190978133 26.222726536052498,-98.524733007990875 26.221968131567948,-98.526589565145571 26.221605875956907,-98.528323413163747 26.222421776495104,-98.535240999999999 26.225677,-98.538016739096946 26.231331135295655,-98.538505426714039 26.231595841236214,-98.543851889046309 26.23449184328507,-98.556093449912439 26.231976454911809,-98.561600478976516 26.23084487397777,-98.564343479612191 26.231667774301364,-98.575891642961039 26.235132223865481,-98.57618836327309 26.235221239973473,-98.581780384919284 26.243001439905978,-98.583095590242166 26.247416774401941,-98.585184223567666 26.254428618568909,-98.588002268837087 26.255070784392117,-98.599153999999999 26.257611999999998,-98.610401443364651 26.253223367217647,-98.613465000000005 26.252027999999999,-98.617434734670965 26.252082931217494,-98.618976176235122 26.252104260920568,-98.625299999997523 26.252191766854153,-98.626653663614832 26.252210498179227,-98.633391522135483 26.243617562727948,-98.63418 26.242612,-98.636673745354344 26.241784277127035,-98.654221000000007 26.235959999999999,-98.669397000000004 26.236319999999996,-98.675206000000003 26.239989,-98.678410535728389 26.244637915883345,-98.679041999999995 26.245553999999998,-98.678977427258005 26.246060764449961,-98.677766000000005 26.255568,-98.679196310064967 26.258571609080832,-98.681167000000002 26.262709999999998,-98.687156000000002 26.26512,-98.698855915315121 26.265619481498664,-98.707451416076225 26.272152066874316,-98.710601999999994 26.279018,-98.709170532219119 26.284185773270103,-98.710647239525585 26.288123668959596,-98.711233447604599 26.289686894290245,-98.722550749196131 26.295571625529284,-98.729196000000002 26.299026999999999,-98.73263614407044 26.29899082409209,-98.734613221934339 26.298970033513189,-98.745271658069271 26.303095890935232,-98.745297595683382 26.304159357241051,-98.745599830797417 26.316551278053844,-98.745615470637418 26.317192526042046,-98.748245116157776 26.32061106368975,-98.74905366960931 26.321662182706675,-98.754840366886953 26.324877004144408,-98.755242435754027 26.32510037501579,-98.766685638772316 26.325769085950686,-98.779858354339893 26.326538865087553,-98.779911999999996 26.326541999999996,-98.779946859358333 26.326559704051515,-98.789821999999987 26.331575,-98.796251999999996 26.349104,-98.797592059971961 26.356670995104565,-98.798210999999995 26.360166,-98.807348000000005 26.369420999999999,-98.808280016253249 26.369491024329768,-98.813413043374013 26.369876679389535,-98.81818280466733 26.370235041528161,-98.81932575812273 26.370320914010964,-98.824571000000006 26.370715,-98.828353477559162 26.367368473620303,-98.832909 26.363337999999999,-98.838554497099707 26.360957856802237,-98.842229804437778 26.359408346173527,-98.844057000000006 26.358637999999999,-98.847707 26.359594999999999,-98.853132332741467 26.364754198689674,-98.853414999999998 26.365023,-98.853852117327648 26.365076242531281,-98.854321671505204 26.365133435992636,-98.861354000000006 26.365989999999996,-98.861661690067152 26.365902494757481,-98.869113443480302 26.363783259984523,-98.874117355796216 26.362360176799562,-98.876164212939671 26.361778062685843,-98.882912762903771 26.359858814831277,-98.890964919192157 26.357568829017531,-98.895015448091129 26.359360408468842,-98.900432100164338 26.361756234493352,-98.900829697862818 26.361932094951143,-98.905559653818443 26.364024190108832,-98.91296803413384 26.372226331500926,-98.915344992389564 26.37485796579432,-98.921277034399395 26.381425588572444,-98.922831447878195 26.38166472803821,-98.923508557916591 26.381768898347495,-98.924925720775448 26.381986922427696,-98.926689551972586 26.38116380140492,-98.934437533628781 26.377548077521784,-98.937555770591459 26.376092900630621,-98.942046463189357 26.375531566775365,-98.950185820407469 26.380302920861933,-98.952073083609605 26.383491745197549,-98.952938578460817 26.384954133189183,-98.953327659277917 26.385611545667039,-98.958325183064531 26.394055638388448,-98.960041959595969 26.394835991082342,-98.96758721887106 26.398265653180793,-98.981979903868819 26.396488780147621,-98.98323657723455 26.396333635432413,-98.985344372930967 26.396073413984297,-98.99032130527651 26.395458978465552,-99.008003378826189 26.395458978465552,-99.014739404125635 26.398826987036053,-99.018845438188137 26.404005475794783,-99.021934999999999 26.407902,-99.025336792347318 26.409271761295809,-99.030462148109507 26.411335530401477,-99.031104888479149 26.411594335405351,-99.032315999999994 26.412082000000002,-99.033086386506682 26.412180127570064,-99.037216923343138 26.412706252494743,-99.039107 26.412946999999999,-99.039645291109963 26.412681959983438,-99.045466000000005 26.409815999999999,-99.053184999999999 26.402006,-99.062093000000004 26.397371,-99.082001999999989 26.396509999999996,-99.085125999999988 26.398782,-99.089412999999979 26.408099999999997,-99.092044248326658 26.410330707587079,-99.0977332288968 26.415153685331873,-99.099649490160544 26.416778244479925,-99.110855 26.426278,-99.113807999999992 26.434002,-99.110485406379198 26.436329519428725,-99.103082999999998 26.441514999999999,-99.097481906444941 26.458865277747179,-99.094712087984234 26.467445230774196,-99.091634999999997 26.476977000000002,-99.105030999999997 26.500335,-99.114051328117867 26.510193091438737,-99.123438026388797 26.520451579672599,-99.126618350727256 26.523927276756307,-99.127319211298612 26.524693229780183,-99.127781999999996 26.525199,-99.128040494672888 26.525242991472329,-99.131554903978838 26.52584108518932,-99.136510932879688 26.526684518463242,-99.143658999999985 26.527901,-99.157083944984777 26.532657279516766,-99.166741999999985 26.536078999999997,-99.170704 26.540316,-99.171403999999995 26.549848,-99.167459686682065 26.559874693319248,-99.167410000000004 26.560001,-99.168618869529794 26.566870928153797,-99.16946034016965 26.571652951934592,-99.178064000000006 26.620546999999998,-99.200522000000007 26.656442999999999,-99.209947999999997 26.693937999999999,-99.208906999999982 26.724761,-99.240022999999979 26.745850999999998,-99.242444000000006 26.788262,-99.243132825912184 26.78921716914337,-99.262208 26.815667999999999,-99.268613000000002 26.843212999999999,-99.274832961326339 26.850997131057774,-99.280470999999991 26.858053000000002,-99.295146000000003 26.86544,-99.316753000000006 26.865831,-99.328801222539823 26.879647723469141,-99.328900000000004 26.879760999999998,-99.328852280051947 26.879943529980665,-99.328653604395157 26.88070346927794,-99.326247644284351 26.88990632616278,-99.321819000000005 26.906846000000002,-99.324684000000005 26.915973,-99.337297000000007 26.922758999999999,-99.361143999999996 26.928920999999999,-99.367053999999996 26.929033999999998,-99.379148999999998 26.934489999999997,-99.388253000000006 26.944216999999998,-99.393748000000002 26.960730000000002,-99.390189000000007 26.966348,-99.377312000000003 26.973818999999999,-99.376593 26.977716999999998,-99.378434999999996 26.980034,-99.385448615007036 26.981891053234623,-99.387366999999998 26.982399,-99.403694000000002 26.997355999999996,-99.407320999999996 27.005808999999999,-99.415475999999998 27.017239999999997,-99.420446999999996 27.016567999999999,-99.429379999999981 27.010833000000002,-99.432154999999995 27.010698999999995,-99.438721 27.01463,-99.445682828533535 27.022104842939122,-99.446523999999997 27.023008,-99.446589518313687 27.0234513503828,-99.446929167151652 27.025749691622671,-99.446969999999979 27.026026000000002,-99.446787747918748 27.026353589968604,-99.444062000000002 27.031253,-99.443973 27.036457999999996,-99.447729715193731 27.048260380671568,-99.452315999999996 27.062668999999996,-99.450282 27.067705,-99.439210578806851 27.075275465844946,-99.434470000000005 27.078517000000002,-99.429209 27.090981999999997,-99.430274999999995 27.094871999999999,-99.437646 27.100442,-99.442122999999995 27.106839,-99.441108999999997 27.110041999999996,-99.433369999999982 27.119218,-99.430581000000004 27.126611999999998,-99.431354999999996 27.13758,-99.438264999999987 27.144791999999995,-99.439971 27.151071999999996,-99.437950999999998 27.154121,-99.42998399999999 27.159148999999999,-99.426616441133064 27.174998569551711,-99.42634799999999 27.176261999999998,-99.426389092127664 27.176475083747437,-99.428025433058153 27.184960350328335,-99.432794999999999 27.209693,-99.441928000000004 27.217984999999995,-99.442101400955139 27.218265584747954,-99.445237999999989 27.223341,-99.443121431464945 27.230753685991843,-99.441406999999998 27.236757999999998,-99.441548999999995 27.249919999999999,-99.452207395848959 27.263806782859465,-99.452390999999992 27.264046,-99.452635348600225 27.264144272092288,-99.454218033886534 27.264780796280988,-99.462735864984637 27.268206496624611,-99.463308999999981 27.268436999999995,-99.463731957038988 27.268231398925973,-99.480688 27.259988999999997,-99.487909999999999 27.260721,-99.492407 27.264118,-99.496069429210138 27.270723950024919,-99.496615000000006 27.271707999999997,-99.496412995851571 27.272119287725655,-99.490870463706145 27.283404082904614,-99.487572835142558 27.290118173493504,-99.487513000000007 27.29024,-99.487552182270463 27.290674424182523,-99.487937000000002 27.294941,-99.493651777311726 27.30231355132117,-99.494603999999995 27.303542,-99.494999311050705 27.30367917804087,-99.501697839297435 27.306003653868146,-99.502036000000004 27.306121,-99.50260564894451 27.305998370990778,-99.511531000000005 27.304076999999999,-99.522353224815092 27.304131436852781,-99.523657999999983 27.304137999999995,-99.527521386758664 27.305370598210363,-99.529216737576675 27.305911493159478,-99.529653999999994 27.306051,-99.533911450776046 27.310119063512179,-99.536090758332008 27.312201427353024,-99.536443000000006 27.312538,-99.537771000000006 27.316072999999996,-99.53137599999998 27.323809,-99.52136037329538 27.324774325824137,-99.521259999999998 27.324784,-99.520793197388144 27.325167862222077,-99.515101491997058 27.329848278790703,-99.509737777509301 27.334258981108004,-99.504836999999995 27.338289,-99.507830999999996 27.348637,-99.507785758525344 27.353517859091919,-99.507778999999999 27.354247,-99.505884699626023 27.358359262089539,-99.503847413823948 27.362781925614613,-99.502763417847504 27.36513512979511,-99.502013099315448 27.366763966750881,-99.499076000000002 27.373139999999999,-99.492143999999996 27.380516999999998,-99.488110785984318 27.408328989964531,-99.487887470616073 27.409868914391197,-99.487633320470721 27.411621467383494,-99.487521 27.412396,-99.487591555014376 27.412624523015491,-99.489856740583164 27.419961308946796,-99.495313182879073 27.437634363915539,-99.495699000000002 27.438884000000002,-99.495681276107845 27.439260342274874,-99.495103999999998 27.451518,-99.489866073767956 27.458841813736395,-99.48498035355378 27.465673163249864,-99.484933241276849 27.465739036942171,-99.483818999999997 27.467296999999995,-99.483170086267094 27.470026063960816,-99.480813109028745 27.479938539705284,-99.480418999999998 27.481595999999996,-99.480219000000005 27.485795999999997,-99.483519 27.491095999999999,-99.494943552274876 27.498766770813134,-99.497518999999997 27.500495999999998,-99.501722168778215 27.500229993495459,-99.502529258718056 27.500178915086504,-99.513319999999993 27.499496,-99.516119999999361 27.498282666666942,-99.519319999999979 27.496896,-99.525819999999982 27.496696,-99.528319999999994 27.498895999999998,-99.525855930815595 27.516294999999385,-99.525849791073696 27.516338353233991,-99.525316190784537 27.520106149807926,-99.523876376642917 27.530272798702207,-99.522431296340699 27.540476632400054,-99.521918999999997 27.544094,-99.518818999999993 27.553194,-99.514319 27.556994,-99.511118999999994 27.564493999999996,-99.512219000000002 27.568093999999995,-99.515978000000004 27.572130999999999,-99.51621006287597 27.572263354504685,-99.516956092136581 27.572688844074506,-99.522907946893667 27.576083418863931,-99.530137999999994 27.580207,-99.536560517954015 27.595669560441458,-99.539721999999998 27.603280999999999,-99.549741780062789 27.610632655019803,-99.554405160028892 27.614054243170667,-99.554950000000005 27.614453999999999,-99.555217670042637 27.614437037021997,-99.556811999999994 27.614335999999998,-99.559466999999998 27.609075999999998,-99.562869000000006 27.607264,-99.580005999999997 27.602250999999995,-99.584175941853502 27.603675176957196,-99.584843000000006 27.603902999999999,-99.584876722760043 27.604178863233781,-99.585148000000004 27.606397999999999,-99.578360965974085 27.610254799100861,-99.578159999999983 27.610368999999999,-99.578158133228257 27.610639131051315,-99.578098999999995 27.619195999999999,-99.584782000000004 27.622006999999996,-99.591372000000007 27.627464,-99.592626330929548 27.632690692534315,-99.594037999999998 27.638573,-99.596231000000003 27.639857999999997,-99.603532999999999 27.641991999999998,-99.612907806834755 27.638651258855042,-99.615318942915422 27.637792043123689,-99.624515000000002 27.634515,-99.625321999999997 27.631136999999999,-99.638929000000005 27.626757999999999,-99.654323999999988 27.629615999999999,-99.665948 27.635967999999998,-99.665422000000007 27.640274999999999,-99.660175716081199 27.644678795569117,-99.659499999999994 27.645246,-99.659300532255756 27.646059100049566,-99.658294999999995 27.650158,-99.661845 27.655753,-99.668942 27.659973999999998,-99.672015651285406 27.660163655087903,-99.685812999999982 27.661014999999999,-99.699355999999995 27.655417,-99.704600999999997 27.654953999999996,-99.711511000000002 27.658365,-99.721518999999986 27.666154999999996,-99.723715999999996 27.673328,-99.727277746539684 27.678262316066267,-99.732288643517421 27.685204233237535,-99.732448000000005 27.685424999999999,-99.732610774853441 27.685596448480599,-99.757538999999994 27.711853,-99.758533999999997 27.717071,-99.770740000000004 27.732133999999999,-99.774900999999986 27.73354,-99.785365999999996 27.730354999999999,-99.788844999999981 27.730718,-99.796341999999981 27.735586,-99.801651000000007 27.741771,-99.805670000000006 27.758687999999999,-99.813085999999998 27.773952,-99.817390803736785 27.775433523363962,-99.819091999999998 27.776019000000002,-99.822192999999999 27.766855,-99.825793000000004 27.764373999999997,-99.835127 27.762881,-99.841707999999997 27.766463999999999,-99.843346625073153 27.773142384459568,-99.844736999999981 27.778808999999999,-99.849281022020321 27.790032142335203,-99.850876999999997 27.793973999999999,-99.857944055165163 27.794214491272228,-99.870065999999994 27.794626999999998,-99.877441689362087 27.799278597548025,-99.877677000000006 27.799427,-99.877679299916537 27.799779028327777,-99.877693551047656 27.801960325692491,-99.877840000000006 27.824375999999997,-99.876677795668783 27.832975173255242,-99.876002999999997 27.837968,-99.877201999999997 27.842179000000002,-99.882014999999996 27.850391999999996,-99.89364999999998 27.856193,-99.901486000000006 27.864162,-99.904385000000005 27.875283999999997,-99.901231999999993 27.884405999999995,-99.894091000000003 27.892949999999999,-99.893456 27.899208000000002,-99.895827999999995 27.904177999999998,-99.900080000000003 27.912141999999999,-99.905861237749605 27.914081496997749,-99.917461000000003 27.917973,-99.925935042520848 27.927688375003317,-99.93714199999998 27.940536999999999,-99.938541 27.954059,-99.932160999999979 27.96771,-99.931811999999994 27.980967,-99.962768999999994 27.983536,-99.984922999999995 27.990729000000002,-99.991446999999994 27.99456,-99.998749958954292 28.00705628754028,-100.000278657311796 28.009672084008166,-100.008630999999994 28.023963999999999,-100.012838999999985 28.037203000000002,-100.014975394500183 28.048814882934586,-100.016570970484992 28.057487270710915,-100.017914000000005 28.064786999999999,-100.028724999999994 28.073118,-100.046108000000004 28.079067999999999,-100.053122999999985 28.08473,-100.056983000000002 28.094207,-100.05559599999998 28.101140999999998,-100.056492999999989 28.104185999999995,-100.064147158981442 28.110644603904401,-100.067651999999995 28.113602,-100.075474 28.124881999999999,-100.083393 28.144034999999999,-100.090288999999984 28.148312999999998,-100.119627999999992 28.155588000000002,-100.12658652988236 28.159659080291213,-100.141098 28.168149,-100.159890345070792 28.168159605160877,-100.160589999999999 28.16816,-100.1644540887186 28.169825181963088,-100.168437999999995 28.171541999999999,-100.173949604741296 28.178834844700365,-100.174413 28.179448,-100.17569869464343 28.180169771489844,-100.185693999999998 28.185780999999999,-100.195825662217615 28.189941498404405,-100.196499000000003 28.190218000000002,-100.19841872968675 28.190245400986015,-100.202449991411854 28.190302940621361,-100.208059000000006 28.190382999999997,-100.21208061434919 28.196473071951928,-100.212104999999994 28.196509999999996,-100.212111438897693 28.196576571978802,-100.212136678181992 28.196837521783539,-100.213449999999995 28.210415999999999,-100.217564999999993 28.226934,-100.220284000000007 28.232209999999995,-100.22363 28.235223999999995,-100.227575000000002 28.235856999999999,-100.246200000000002 28.234092,-100.251633999999996 28.236177,-100.261135590980771 28.244561246718906,-100.267604000000006 28.250268999999999,-100.280518 28.267969,-100.289383999999998 28.273491,-100.293468000000004 28.278475,-100.294296000000003 28.284381,-100.287553999999986 28.301093000000002,-100.286470999999992 28.312295999999996,-100.288638999999989 28.316977999999995,-100.314198000000005 28.345859,-100.317245999999997 28.357382,-100.320392999999996 28.362116999999998,-100.341869000000003 28.384952999999996,-100.344399999999979 28.389662,-100.34934096344108 28.4019924953441,-100.349585999999988 28.402603999999997,-100.349394820211828 28.402858691740477,-100.345766407828719 28.407692501181913,-100.343945000000005 28.410119000000002,-100.337058999999996 28.427150999999995,-100.336185999999998 28.430180999999997,-100.337474638078888 28.440402915586755,-100.337648113426326 28.441778981052359,-100.337796999999995 28.442959999999999,-100.338752462381066 28.444650728533539,-100.341532999999998 28.449570999999995,-100.350785999999999 28.459246,-100.353875644654778 28.461269551534915,-100.357498000000007 28.463642,-100.35795880406117 28.464220845064407,-100.358193534884933 28.464515705266944,-100.367961112704847 28.47678537623738,-100.368288000000007 28.477195999999999,-100.368051363629903 28.477598261305609,-100.365982000000002 28.481116,-100.356642877924983 28.482149981508559,-100.352234999999979 28.482638,-100.344180999999992 28.486249,-100.337140000000005 28.491728999999999,-100.33381399999999 28.499251999999998,-100.338517999999993 28.501833,-100.362147999999991 28.508399,-100.379079000000004 28.511638999999999,-100.388859999999994 28.515747999999995,-100.405057999999983 28.535779999999999,-100.411413999999994 28.551898999999999,-100.40430324537553 28.563833042228197,-100.397270000000006 28.575637,-100.396799999999999 28.580400999999998,-100.398385000000005 28.584883999999999,-100.403243426032972 28.586668145075244,-100.425819035320046 28.594958517689108,-100.429856 28.596440999999995,-100.431892715674053 28.597943579291371,-100.447320000000005 28.609324999999998,-100.448648000000006 28.616773999999999,-100.447280739633683 28.625703494601449,-100.445528999999993 28.637143999999996,-100.44560646842767 28.637394606891831,-100.447014715516048 28.641950223113035,-100.447091 28.642196999999999,-100.447325484276334 28.642184618041064,-100.447599559425257 28.642170145483281,-100.456522261830528 28.641698981546444,-100.462866000000005 28.641363999999999,-100.474494000000007 28.647071,-100.479445543783555 28.654922981332383,-100.479495071011698 28.655001519842354,-100.479635999999999 28.655225000000002,-100.481416494659797 28.655591917738484,-100.492493911747701 28.657874710783531,-100.493322226012125 28.658045406716248,-100.495863 28.658568999999996,-100.496129521434568 28.658770241190073,-100.500353999999987 28.661960000000004,-100.502122125123847 28.667202406240314,-100.505211969634487 28.676363647108229,-100.509438609439442 28.688895431533517,-100.510054999999994 28.690722999999995,-100.510127443340068 28.69126843161186,-100.510538898440004 28.694366309458967,-100.51077198772829 28.696121257064849,-100.511998000000006 28.705352,-100.511351260759739 28.706743032691019,-100.510646631791559 28.708258576930099,-100.509872363628347 28.709923903942272,-100.509406561254394 28.710925770365975,-100.508636802312012 28.712581398765199,-100.507069450532313 28.715952521820881,-100.506701000000007 28.716745000000003,-100.506745928327234 28.717920131927187,-100.506786973330165 28.718993692782757,-100.507152057645129 28.728542729239727,-100.507513721430456 28.738002299344281,-100.507590113222051 28.740000380261673,-100.507613000000006 28.740599,-100.507694735304739 28.740708529390524,-100.51442566685138 28.749728313832868,-100.519226000000003 28.756160999999999,-100.533017 28.763279999999998,-100.537772000000004 28.780775999999996,-100.534846642084489 28.786410367511117,-100.532431000000003 28.791062999999998,-100.535830000000004 28.805887999999999,-100.546431879116881 28.824270186264151,-100.546968759195195 28.825201061771438,-100.547323999999989 28.825817,-100.548186025546428 28.826178082695296,-100.553129999999982 28.828249,-100.561442999999997 28.829174000000002,-100.570509999999999 28.826317,-100.574698999999995 28.828786999999998,-100.576846000000003 28.836168000000004,-100.572991999999999 28.848463999999996,-100.580501999999996 28.856007999999999,-100.591040000000007 28.863054000000002,-100.598061272695219 28.874286065303028,-100.598877000000002 28.875590999999996,-100.602654 28.887660000000004,-100.602394435759351 28.893839359355621,-100.602053999999995 28.901944,-100.615584686670886 28.902906942475386,-100.627205999999987 28.903734,-100.631611000000007 28.902838999999997,-100.633502414453218 28.905240591668694,-100.640568000000002 28.914211999999999,-100.639169999999979 28.916288999999999,-100.638857000000002 28.927621999999996,-100.651511999999997 28.943431999999998,-100.64789859018552 28.954344193790252,-100.646992999999995 28.957078999999997,-100.646600907687997 28.967547400926616,-100.64647463428885 28.970918751315974,-100.645893999999998 28.986421,-100.647406325643686 28.99295674936236,-100.647835962928511 28.994813493392339,-100.648681241069511 28.998466493719445,-100.65094599999999 29.008254000000004,-100.653757999999996 29.015356,-100.656109999999998 29.017223999999999,-100.660207999999997 29.031497000000002,-100.663212 29.048041999999995,-100.662508000000003 29.058106999999996,-100.664064999999994 29.073205999999999,-100.666359117032755 29.07896154562156,-100.668483863047285 29.084292168447689,-100.674655999999999 29.099777000000003,-100.684472 29.110657,-100.692326999999992 29.115227999999995,-100.70996599999998 29.119684000000003,-100.727461999999989 29.129122999999996,-100.737795000000006 29.139078999999999,-100.739115999999996 29.141658,-100.737590999999995 29.147406999999998,-100.739681000000004 29.150486000000004,-100.746139999999997 29.154149000000004,-100.752330696165359 29.155516457617566,-100.759726 29.157149999999998,-100.76337082361762 29.160348915845475,-100.772648999999987 29.168492,-100.775904999999995 29.173344,-100.772154104961558 29.17809434863841,-100.766030999999998 29.185848999999997,-100.767059000000003 29.195287,-100.768348510582513 29.197581465531123,-100.775064591152173 29.209531592641572,-100.785521000000003 29.228136999999997,-100.791371999999996 29.225944999999999,-100.795681000000002 29.227729999999998,-100.79704599999998 29.235585999999998,-100.795234211471239 29.241421249558652,-100.795010188783237 29.242142762180318,-100.794911999999997 29.242459,-100.795310930062826 29.24310735172228,-100.797670999999994 29.246943000000002,-100.805332448258866 29.251327106905226,-100.815767091023289 29.257298117587734,-100.823532999999998 29.261742000000002,-100.834039999999987 29.261399999999998,-100.839016 29.263259,-100.841581161127962 29.265429071012271,-100.848663999999999 29.271420999999997,-100.856469000000004 29.275663999999999,-100.864659000000003 29.276076,-100.874739696506666 29.279181633366278,-100.876048999999995 29.279585,-100.876625364221198 29.280115401513385,-100.878513170701353 29.281852663087207,-100.878882999999988 29.282193000000003,-100.879105716359817 29.283377353454046,-100.880504361011205 29.290815018226784,-100.882051999999987 29.299044999999996,-100.886842 29.307848,-100.895590728097048 29.309871687341737,-100.904835000000006 29.31201,-100.906461302333199 29.313095095005444,-100.914770068080642 29.318638836799305,-100.916744062319239 29.319955917421627,-100.92203960930695 29.323489191321695,-100.922232587658954 29.323617949573855,-100.924041970395777 29.324825198761538,-100.926468967605715 29.326444530233299,-100.926628772437255 29.326551154580446,-100.926677999999981 29.326584,-100.92692137104487 29.32669794102517,-100.927819078352698 29.327118228044156,-100.92782883100196 29.32712279402223,-100.930446231588661 29.328348203997709,-100.940614999999994 29.333109,-100.941560773525751 29.336361493535293,-100.943196 29.341985,-100.945807189162338 29.344363370184055,-100.948971999999998 29.347245999999998,-100.95603875001359 29.347290187325033,-100.964324999999988 29.347342,-100.971743000000004 29.351370999999997,-100.972915999999998 29.354545000000005,-100.995606999999993 29.363403000000005,-101.004206999999994 29.364771999999999,-101.010614000000004 29.368669,-101.010768998319776 29.36895846820963,-101.014103165002794 29.375185214807839,-101.024016000000003 29.393697999999997,-101.036603999999997 29.406107999999996,-101.038600000000002 29.410713999999999,-101.037642000000005 29.414681000000002,-101.043363999999997 29.42988,-101.056956999999983 29.440773,-101.06011415724447 29.458454662113137,-101.060150999999991 29.458660999999999,-101.063843258270609 29.460131584976065,-101.087148999999997 29.469414,-101.103699000000006 29.470549999999999,-101.115253999999993 29.468458999999996,-101.130037999999985 29.47842,-101.137502999999995 29.473541999999998,-101.144336999999993 29.473246,-101.151876999999999 29.477004999999998,-101.163854997623304 29.493316894569897,-101.168923969306405 29.50021992913986,-101.171662999999995 29.503950000000003,-101.173821000000004 29.514566000000002,-101.192719999999994 29.520285,-101.227418999999998 29.522349999999996,-101.235274999999987 29.524854,-101.254895000000005 29.520341999999996,-101.260836999999981 29.529933,-101.261174999999994 29.536777,-101.252755240314642 29.553001111955531,-101.244355179006547 29.569187266927752,-101.24384013276574 29.574337712700849,-101.242022713082847 29.59251185083151,-101.251352546644355 29.604174135250076,-101.252152766968493 29.604494220898598,-101.259127443101093 29.607284069726152,-101.265347312053251 29.607284069726152,-101.274677145614746 29.602619152945408,-101.277624046978673 29.599940160672645,-101.283229510623855 29.594844301688571,-101.297224215766221 29.587069435365102,-101.30733154801338 29.587846934050759,-101.312894947857018 29.594028488101586,-101.314328915651188 29.595621785307589,-101.313192213312618 29.602947206633093,-101.31110792457288 29.616379301091623,-101.30733154801338 29.640715970810437,-101.311218981175116 29.64849082206727,-101.316661381574889 29.655488204771718,-101.325213716450733 29.657820655628775,-101.350093282659174 29.654710721152696,-101.353062961800887 29.655502634567405,-101.361755552011104 29.657820655628775,-101.364595571422868 29.66106639883844,-101.367197952410862 29.664040554714198,-101.371300910394638 29.676075888592084,-101.372874548462477 29.680691889931673,-101.378860251896057 29.698249939417508,-101.396947999999995 29.713947,-101.398362000000006 29.717000000000002,-101.396293999999997 29.727055,-101.397008999999997 29.733962999999999,-101.400635999999992 29.738078999999999,-101.410024000000007 29.741498,-101.415583999999996 29.746534,-101.415509877418046 29.750619769974676,-101.415402087456428 29.756561346443686,-101.424731921017937 29.758116313681725,-101.430388403484372 29.756500180308258,-101.441059122217254 29.75345141196761,-101.446501522617027 29.755006409338922,-101.451652003139955 29.758440048234313,-101.453498905321467 29.759671311053037,-101.455223999999987 29.771874,-101.467493655663716 29.779885945414083,-101.475268506920557 29.780663444099741,-101.503223000000006 29.764581999999997,-101.522695143280473 29.759671311053037,-101.526552276219391 29.761451532447605,-101.532802460460985 29.764336242900427,-101.53746737724174 29.782995910023434,-101.53804719015173 29.783865628452077,-101.546797210803248 29.796990645299058,-101.56156944476453 29.794658179375361,-101.572592853930203 29.778735448896484,-101.575564187573463 29.774443514881042,-101.582561562744587 29.771333610538232,-101.598573641854728 29.773657690388074,-101.603680999999995 29.774398999999999,-101.607256216824311 29.773863608191139,-101.625957999999997 29.771063000000002,-101.630319 29.768729,-101.632632680380155 29.763891873249722,-101.63512799999998 29.758675,-101.646417999999997 29.754303999999998,-101.652400999999983 29.758794999999996,-101.65328091488901 29.761368862201802,-101.654578 29.765162999999998,-101.662452999999985 29.77128,-101.689992000000004 29.771212999999996,-101.706636000000003 29.762736999999998,-101.714223999999987 29.767659999999999,-101.735201999999987 29.771591999999998,-101.754322999999999 29.777661999999999,-101.760919284561496 29.782457957985276,-101.763273999999981 29.784169999999996,-101.776796131253491 29.789191504347542,-101.777161000000007 29.789327,-101.777360180704861 29.789301830227139,-101.785668 29.788251999999996,-101.791002820423358 29.783037559970925,-101.796869557069002 29.782618516634159,-101.806507764952315 29.786389987871868,-101.809441149516488 29.790161459109573,-101.813855730843954 29.79253854440006,-101.814888826583982 29.793094827432377,-101.818909248247508 29.792167038125061,-101.830044431332681 29.789597381341238,-101.831231874027822 29.789323356194672,-101.852603555202364 29.801894932400803,-101.862241763085706 29.800218726571018,-101.866487373818487 29.79821962567333,-101.875399999999985 29.794022999999999,-101.878152615094365 29.794637055896249,-101.892739000000006 29.797891,-101.912406000000004 29.797849999999997,-101.917556726002999 29.792675767854249,-101.917942403066036 29.792482929945557,-101.922585359733716 29.790161459109573,-101.929709258872364 29.789323356194672,-101.932572380438657 29.791613852338052,-101.938090312383324 29.796028195755184,-101.946471365894325 29.797704401584976,-101.952535620779244 29.796990962273608,-101.953595265032959 29.796866298670082,-101.959462001678588 29.799380623656123,-101.965427194081556 29.806464275410743,-101.966166845299441 29.8073426094683,-101.970357372054934 29.81027599403247,-101.974547898810414 29.81027599403247,-101.982165144097308 29.804870201524977,-101.987538526473998 29.801056829485908,-101.993568005272067 29.802652866652032,-102.001318622543394 29.804704498914084,-102.001786318660763 29.804828300723614,-102.021918999999997 29.802490999999996,-102.032489182844799 29.803756293694118,-102.034758999999994 29.804027999999999,-102.039012999999997 29.802655,-102.041088000000002 29.799609999999998,-102.038411999999994 29.792831999999997,-102.039226999999997 29.790977000000002,-102.041308736499772 29.78984019520162,-102.048982832584102 29.785649487466547,-102.050044 29.785069999999997,-102.053123037129694 29.785312127485501,-102.073645999999982 29.786926,-102.076299925656656 29.790865308882584,-102.077348 29.792421,-102.084438999999989 29.794962000000002,-102.091420021879856 29.792967151942147,-102.091815999999994 29.792853999999995,-102.098789196918744 29.792718427915432,-102.115682000000007 29.792389999999997,-102.142325999999997 29.802854,-102.159600999999995 29.814355999999997,-102.161673999999991 29.819486999999999,-102.181894 29.846033999999996,-102.182859740836193 29.846584944255238,-102.18326563789924 29.846816503951921,-102.184058205433814 29.847268654791659,-102.186149999999998 29.848461999999998,-102.187393471220204 29.848699156882201,-102.188384798592551 29.848888224473839,-102.188671999999997 29.848942999999998,-102.189026115519184 29.848805138880103,-102.189342793483831 29.848681852617602,-102.205381000000003 29.842438,-102.216284162639099 29.842976962035557,-102.227553 29.843533999999995,-102.261388999999994 29.853283,-102.264041000000006 29.855964,-102.261776999999995 29.864001999999999,-102.264954000000003 29.867805999999998,-102.268816999999984 29.867990999999996,-102.276754999999994 29.862977999999998,-102.281249000000003 29.863116999999999,-102.297330999999986 29.875194,-102.301381000000006 29.877673999999995,-102.315388999999996 29.879919999999998,-102.320618999999994 29.878979999999995,-102.320667125014978 29.878900015386019,-102.320698585434869 29.878847727619664,-102.324634000000003 29.872306999999996,-102.333383999999995 29.868046,-102.341032999999996 29.869305000000004,-102.349861000000004 29.862316999999997,-102.361383773688715 29.849029038788231,-102.364542 29.845386999999995,-102.363642671554629 29.839963091609825,-102.362514000000004 29.833155999999995,-102.369522000000003 29.820395,-102.377253999999994 29.800163,-102.377312999999987 29.789971,-102.385270832882995 29.770348713937391,-102.386677616883858 29.766879890389689,-102.391739211722737 29.765814289574276,-102.392906191083 29.765568609270456,-102.402175111261812 29.766775086101941,-102.412062000000006 29.768061999999997,-102.433301 29.776608,-102.460890018677347 29.77909171043791,-102.468946430597143 29.779816991558327,-102.469957868267898 29.780012383523857,-102.481595292961757 29.782260529257879,-102.490330613701886 29.783948039559665,-102.492674483475767 29.783853017496881,-102.508312776666344 29.783219030534834,-102.508509848222559 29.783087649355906,-102.512686811979108 29.780303003853621,-102.512942156326147 29.774953626291172,-102.513380999999995 29.76576,-102.526400256170959 29.758693706517125,-102.535832205630967 29.753574449155192,-102.539417050278132 29.751628749336795,-102.545492105079163 29.750899740311965,-102.551081152293932 29.752357753652575,-102.556670813570321 29.757783010503054,-102.559343229460382 29.760376824671383,-102.565661280990938 29.761591836573395,-102.572255912443325 29.757095496286663,-102.57574472309652 29.754716761401177,-102.57635337725236 29.754301769870359,-102.585948674897452 29.751239442391949,-102.587774480184081 29.750656738873374,-102.597160000000002 29.751608,-102.612879000000007 29.748181999999996,-102.622534000000002 29.736632,-102.630150999999984 29.734314999999999,-102.64566499999998 29.733910000000002,-102.661251958261417 29.736122779697027,-102.66726872436665 29.739732837494621,-102.670971460158171 29.741954477821469,-102.677191937153026 29.738261067251376,-102.678467215476147 29.736427653943998,-102.6852530581628 29.72667193704833,-102.688163999999986 29.722486999999997,-102.690237999999979 29.707481999999999,-102.695507594622001 29.699754690880447,-102.698346999999984 29.695590999999997,-102.699316999999994 29.685029,-102.693466 29.676507,-102.697798916570122 29.672550546488289,-102.711337549653422 29.6601882100483,-102.724231000000003 29.648415000000004,-102.736947999999984 29.641537999999997,-102.742030999999997 29.632142000000002,-102.74048425929719 29.62775763619268,-102.738427999999999 29.621928999999998,-102.739991000000003 29.599041,-102.746201999999997 29.592875000000003,-102.757065999999995 29.597798999999998,-102.761810999999994 29.598396999999999,-102.768340999999992 29.594733999999999,-102.766929734823805 29.591197739636346,-102.762241000000003 29.579448999999997,-102.766124000000005 29.572347999999998,-102.768792219428661 29.572598581791439,-102.773961 29.573084,-102.776343296957975 29.562015327831393,-102.777530999999996 29.556497,-102.77572499999998 29.552188999999995,-102.771428999999998 29.548545999999998,-102.79216136048494 29.533953841063816,-102.807296321997939 29.523301326891541,-102.808565712504773 29.522407885546979,-102.808691999999979 29.522319000000003,-102.808681334358837 29.522097795383676,-102.808577631171161 29.519946998869006,-102.807327 29.494009000000002,-102.813953999999995 29.482805999999997,-102.814096473430837 29.482483316434472,-102.814383778328263 29.481832608662831,-102.822314986984821 29.463869465126457,-102.82537225240516 29.456945161410285,-102.827007089548758 29.453242470491304,-102.830969999999979 29.444267,-102.832538999999997 29.433109000000002,-102.830570753051859 29.427471931628293,-102.827354999999983 29.418261999999995,-102.825211066354328 29.40389180477127,-102.824564449740322 29.399557712155943,-102.831802092379931 29.389471209449322,-102.832669213065941 29.388262775214326,-102.84047188579207 29.377388836904565,-102.840778422425643 29.376961642203423,-102.841560439245441 29.370344567434586,-102.842457529677418 29.362753791491347,-102.843015380341285 29.358033509958585,-102.843020777220957 29.357987843989019,-102.861629999999991 29.351638999999995,-102.871857000000006 29.352092999999996,-102.876866000000007 29.354058999999996,-102.879534000000007 29.353326999999997,-102.883721999999992 29.348058999999999,-102.881857488401977 29.34363024944906,-102.879805000000005 29.338754999999999,-102.890489000000002 29.309498999999995,-102.88922161316745 29.299205074185686,-102.888328 29.291947,-102.891022000000007 29.287113000000002,-102.902604999999994 29.279440999999998,-102.90311226801488 29.27677066200776,-102.906295999999998 29.260010999999995,-102.903188999999983 29.254028999999999,-102.887901999999997 29.245611999999998,-102.881135 29.246022,-102.871347 29.241624999999999,-102.870795537867835 29.239589944231255,-102.86823682221636 29.230147538772215,-102.866845999999995 29.225014999999999,-102.878020000000006 29.214697999999999,-102.890063999999995 29.208813999999997,-102.899231 29.208863,-102.908656596973657 29.219194069767902,-102.908787000000004 29.219336999999996,-102.909098471667448 29.219296482603067,-102.910575587951939 29.219104333804097,-102.912131000000002 29.218902,-102.912650757516516 29.218481184275788,-102.915803535402844 29.215928573746115,-102.915865999999994 29.215877999999996,-102.915845750043147 29.215583596781208,-102.915608148145267 29.212129230727648,-102.915554 29.211341999999998,-102.915202931298523 29.21076702044931,-102.914525807203304 29.209658028088604,-102.912447999999998 29.206254999999999,-102.91453363655873 29.20019781620671,-102.917367531146525 29.191967513425833,-102.917805 29.190697,-102.922897000000006 29.192704085059273,-102.925481999999988 29.193722999999995,-102.932612000000006 29.194113000000005,-102.944911000000005 29.188819999999996,-102.947155999999993 29.180776999999999,-102.95089 29.176834999999997,-102.953474999999997 29.176307999999995,-102.977266 29.186226,-102.981742305424802 29.185103060319207,-102.989431999999994 29.183174,-102.98978258837333 29.182935350109393,-102.991725524817895 29.181612768970929,-102.994653 29.17962,-102.994906329461855 29.17910907354543,-102.99809599999999 29.172675999999996,-102.995688 29.161218999999999,-103.00243399999998 29.150260999999997,-103.0050672680876 29.149386797638936,-103.008362000000005 29.148292999999995,-103.010324999999995 29.137821999999996,-103.015028 29.125769999999996,-103.016945338084582 29.124525732477775,-103.024896087692937 29.119366048020158,-103.032982999999987 29.114118,-103.033302941039096 29.107355634443419,-103.034095953658579 29.105913798143234,-103.035682683422891 29.103028844591982,-103.04044215980575 29.099351067768175,-103.049126083320303 29.097714968852063,-103.055369601981923 29.096538655622457,-103.061557539334615 29.093936906572154,-103.06671291432167 29.091769303506382,-103.074407490743866 29.088534080562461,-103.076354546596249 29.085721668416742,-103.076667707631657 29.079576983004682,-103.076847 29.076059,-103.091926967746744 29.064237268591206,-103.100265999999991 29.057699999999997,-103.101359249603803 29.049403674773888,-103.102531654124817 29.040506667933872,-103.100975335951205 29.030701853789079,-103.100368259199087 29.026877266486249,-103.101607999999999 29.018122999999999,-103.107810999999998 29.013812,-103.117237999999986 29.000208999999998,-103.113922000000002 28.988546999999997,-103.115062910480361 28.985887850893185,-103.115327999999991 28.98527,-103.115773294260094 28.985147329619764,-103.126748000000006 28.982123999999995,-103.134930999999995 28.983525,-103.143274000000005 28.978073999999999,-103.156645999999995 28.972830999999999,-103.163865 28.972099,-103.165923000000006 28.974001999999999,-103.166234999999986 28.978836000000005,-103.174329720990258 28.980505274886987,-103.182663652045193 28.982223879127538,-103.194928465619142 28.984753100989199,-103.195705106971403 28.984913258196226,-103.207825367468075 28.987412670652219,-103.227338454203803 28.991436614861634,-103.227579101883322 28.991486240676846,-103.227800999999999 28.991532000000003,-103.228011662384262 28.991347921912006,-103.228737472224623 28.990713704806197,-103.239108999999985 28.981650999999996,-103.245121150470112 28.980239630911282,-103.2474464632202 28.980649978816817,-103.249155161185584 28.980951512720708,-103.25190330878641 28.984768118238364,-103.253285000000005 28.986686999999996,-103.26030800838916 28.989731411362609,-103.266003072061508 28.990206003834011,-103.270357000000004 28.988113999999996,-103.270725571428585 28.987466542857135,-103.27232562100086 28.984655789108508,-103.273357000000004 28.982844,-103.273647076585334 28.982817854078331,-103.281189929980513 28.982137982403092,-103.282424051550748 28.983865752282551,-103.284749352823042 28.987121173462914,-103.285935817906974 28.994002716014545,-103.289257951411443 28.999697788883793,-103.296614077237592 29.004443676810233,-103.302399476821606 29.006455988366771,-103.312987409437454 29.010138745081029,-103.315449022736544 29.011725838031147,-103.323993942362023 29.017235063099889,-103.331021803791103 29.021766184756,-103.332920159881368 29.026986669752301,-103.332783823258595 29.028827200289001,-103.332445567409962 29.033393619832523,-103.334818511373186 29.039800579109659,-103.341462759988346 29.041224342728523,-103.347869719265475 29.037427630547988,-103.350815999999995 29.028566999999999,-103.355428000000003 29.021529,-103.355590463621823 29.021464336016578,-103.361777791205157 29.019001647792766,-103.361998 29.018913999999999,-103.382125000000002 29.024248999999998,-103.386095607142025 29.025822707722725,-103.399799910010643 29.031254261761571,-103.402689272115182 29.032399429564627,-103.427474921518822 29.04222295692054,-103.427754276336316 29.042333676218103,-103.430481680804888 29.047455485683194,-103.434668000000002 29.055316999999995,-103.439550459717495 29.058547821156772,-103.449722032594721 29.065278554178825,-103.453029264571228 29.067467015663059,-103.457386392383299 29.068596640465525,-103.460381908910477 29.067681344107211,-103.463195887793432 29.066821517562918,-103.469166763983068 29.069242141692889,-103.471264639062966 29.073115142802621,-103.471299587628792 29.074897490538035,-103.471426016715213 29.08134526859719,-103.474814887995407 29.086670637304994,-103.484429000000006 29.094524,-103.49531945696836 29.1087608679228,-103.500928937954981 29.116094025764934,-103.503236 29.119109999999996,-103.506163032831353 29.119368513261239,-103.513192088151087 29.119989313955617,-103.524613000000002 29.120998,-103.524225442342612 29.124905426308125,-103.523383999999993 29.133389,-103.525026999999994 29.137353999999998,-103.539240927934515 29.144791265038371,-103.551909954693073 29.151420179312847,-103.558678999999984 29.154961999999998,-103.579462000000007 29.149964999999998,-103.592359999999999 29.150259999999999,-103.598960126757959 29.155019048637598,-103.606437999999997 29.160411,-103.607894091053709 29.162314354517299,-103.610539999999986 29.165772999999998,-103.624537921955991 29.163185608071569,-103.629433693714475 29.1622806680118,-103.638195234739996 29.160661174732635,-103.645634999999999 29.159286000000002,-103.653180000000006 29.162863999999995,-103.656807999999984 29.169098999999999,-103.660202999999996 29.170933999999999,-103.667724667668963 29.172878689431396,-103.669696386484915 29.173388467437,-103.688670000000002 29.178293999999998,-103.688830238367032 29.178273608722382,-103.690116124218548 29.178109972160996,-103.697314000000006 29.177194,-103.699305464408098 29.178139630948273,-103.713769999999997 29.185008,-103.724743000000004 29.191469999999999,-103.73193762439729 29.198544108660482,-103.742175000000003 29.20861,-103.750912464183997 29.219357091602017,-103.755265634411842 29.22471149629115,-103.75594348727293 29.225545256136954,-103.768569999999997 29.227360999999995,-103.777623396259372 29.232265264832392,-103.780085146052983 29.242351446713872,-103.780352362214714 29.243446273985068,-103.781659908552058 29.248803500057083,-103.789034484601103 29.257501704713096,-103.792700821322356 29.259284649416337,-103.795120675584712 29.260461427946989,-103.80876361213285 29.267096007175422,-103.816641821688407 29.27092719156084,-103.818617217853202 29.271599921312173,-103.838302999999982 29.278303999999999,-103.854966933859771 29.281484400071786,-103.856892999999999 29.281852,-103.880606 29.284961999999997,-103.896615144488038 29.284634799403065,-103.910231251371073 29.284356508561018,-103.916269383748329 29.284233099060927,-103.91710599999999 29.284215999999997,-103.91776286712728 29.284516760669142,-103.918698764585329 29.284945281345607,-103.918909999999997 29.285042,-103.918905327188597 29.285488562070029,-103.918900778480648 29.285923264066316,-103.918857000000003 29.290106999999995,-103.924975999999987 29.293913000000003,-103.943697999999983 29.294945999999996,-103.965795999999983 29.298586999999998,-103.975234999999998 29.296016999999999,-103.983459597310627 29.299165977024781,-103.998789342279238 29.305035323921498,-104.012357062242771 29.310230038851625,-104.018558084893087 29.312604243583909,-104.038281999999995 29.320155999999997,-104.047006656168747 29.325575022319434,-104.055595999999994 29.330909999999996,-104.056467149578211 29.334496091467582,-104.057243999999997 29.337694000000003,-104.068917843404819 29.342306667996301,-104.075923999999986 29.345075,-104.082149999999999 29.345922999999996,-104.091021999999995 29.353691999999995,-104.093326000000005 29.359926000000002,-104.098377999999983 29.366755999999999,-104.106466999999981 29.373127,-104.122882935723638 29.379859019095424,-104.125474999999994 29.380922000000002,-104.132831527553293 29.381873417846823,-104.136236243923818 29.382313748953422,-104.143691999999987 29.383277999999997,-104.1467332019064 29.385415391432094,-104.148888696362661 29.386930297552944,-104.151718842950046 29.388919356896473,-104.157422367906094 29.392927859373117,-104.166562999999996 29.399352,-104.180069999999986 29.412763999999999,-104.181273000000004 29.426265,-104.182051945448123 29.427144615030393,-104.195989999999995 29.442884000000003,-104.208194000000006 29.448201,-104.212529153241931 29.452438774515159,-104.213947876032222 29.456222068892099,-104.21370324326665 29.462011765001886,-104.213238514637069 29.473010445135856,-104.218538498245692 29.476600759818915,-104.220568643482977 29.477976020723915,-104.227547514371139 29.480496161448666,-104.229081071868791 29.481049944541308,-104.233824999999996 29.486544999999996,-104.233486999999997 29.492733999999995,-104.235847000000007 29.496744,-104.238313284768751 29.498023301020304,-104.246870092866089 29.50246185307569,-104.254473621536903 29.506405923975272,-104.260293266516271 29.50942466611497,-104.26168489846043 29.511073814728768,-104.264155000000002 29.514001,-104.271046277211582 29.51559593462645,-104.274575430964404 29.516412730896519,-104.293481117436073 29.520788310787555,-104.306646311930564 29.523835296697214,-104.308812834933008 29.524336722260216,-104.311570786550874 29.52540915148019,-104.318073989469781 29.527937921306467,-104.320711000000003 29.526326414398167,-104.326090351466348 29.523039031981277,-104.327483437129615 29.522187701603762,-104.334811000000002 29.519462999999998,-104.338113000000007 29.519967,-104.353150868059984 29.530471948300562,-104.369085650105362 29.541603450512167,-104.37074044290263 29.542759433043344,-104.371174999999994 29.543062999999997,-104.371454921502831 29.543072731712495,-104.371996954766473 29.543091575966443,-104.375901661123379 29.543227326450971,-104.381040999999996 29.543405999999997,-104.394588999999982 29.556087000000002,-104.394583075653415 29.556197720561212,-104.394577025204526 29.556310797858156,-104.394552364240909 29.55677168847231,-104.394503136758885 29.55769170460702,-104.394351 29.560534999999998,-104.39571704642303 29.563607040276512,-104.39636925661604 29.56507376640522,-104.397848504811165 29.56840038104859,-104.399550133070164 29.572227096202102,-104.399591 29.572319,-104.399981791506633 29.572551361916329,-104.452301000000006 29.60366,-104.466520000000003 29.609296,-104.483502 29.627740999999997,-104.486693164979016 29.629712817604439,-104.493658999999994 29.634016999999997,-104.503232654335022 29.63787621670291,-104.507568060311556 29.63962385355849,-104.51068846437596 29.64315687341222,-104.513969549435132 29.646871821353749,-104.51818442992635 29.651644041921735,-104.53325150001281 29.668703453669117,-104.535568725458901 29.671327089370656,-104.539761023554547 29.676073741438437,-104.540155514025756 29.678572204873163,-104.540559188867974 29.681128836544634,-104.537934834631798 29.684482179324355,-104.535770155740693 29.687248158943191,-104.536302269386866 29.690440851131939,-104.537991394981006 29.693268523024599,-104.544269904764263 29.703779029587054,-104.545505621253113 29.70584767433138,-104.552240999999995 29.717122999999997,-104.555600999999996 29.731220999999998,-104.554914970831931 29.738152096413199,-104.554660236582549 29.740725729903364,-104.557361904757329 29.745049367744027,-104.565950999999998 29.758794999999996,-104.565687999999994 29.770461999999998,-104.571279565966023 29.778773775962186,-104.586447318468245 29.801320404476364,-104.592472 29.810276000000002,-104.594023000000007 29.809220999999997,-104.599148999999997 29.811007,-104.610166000000007 29.819117999999996,-104.610205623651026 29.819231101342197,-104.610356932717465 29.819662996386217,-104.613081011852316 29.827438579869643,-104.615248982559379 29.833626813172685,-104.619039 29.844444999999997,-104.624350000000007 29.845221999999996,-104.629290740007292 29.852171499068138,-104.629713747950376 29.852766489555783,-104.630103000000005 29.853313999999997,-104.630111961493199 29.853664893019587,-104.630290851730521 29.860669455113747,-104.630338938536084 29.862552324858758,-104.630359999999996 29.863376999999996,-104.630588419131911 29.86393398222631,-104.633274999999998 29.870484999999999,-104.63616345635748 29.872800876528242,-104.645854762904364 29.880571071602066,-104.65678299999999 29.889332999999997,-104.658422170930251 29.891285606400047,-104.65864999999998 29.891556999999999,-104.658665881124946 29.891956296855856,-104.659041999999999 29.901413000000002,-104.661965712024596 29.903547518850328,-104.666224133352003 29.906656470935726,-104.672326999999996 29.911111999999996,-104.679772 29.924658999999998,-104.680850906343153 29.932111041680564,-104.684321999999995 29.956085999999999,-104.679660999999982 29.975271999999997,-104.680379178583593 29.977083,-104.685479 29.989943,-104.689640999999995 30.014949999999999,-104.693591999999995 30.019077000000003,-104.701242868742796 30.021046973658397,-104.702310999999995 30.021321999999998,-104.702447580064685 30.021555813412469,-104.7030116881661 30.022521518330599,-104.703997999999999 30.02421,-104.703882705803636 30.024660825787098,-104.703121214098445 30.027638426639932,-104.701101999999992 30.035533999999998,-104.706873999999999 30.050685,-104.706630611705322 30.051708605996314,-104.703831250551389 30.063481739403372,-104.703581999999997 30.06453,-104.699792220462342 30.065066336345112,-104.698848962238912 30.065199827927678,-104.698233000000002 30.065286999999998,-104.697787990647399 30.065651654776563,-104.69277799999999 30.069756999999996,-104.687313590037505 30.080921966773531,-104.685080632167896 30.08548438075637,-104.685002999999995 30.085643,-104.685554782105299 30.093963293324606,-104.685687 30.095957000000002,-104.686861171517634 30.098036494960315,-104.692093999999983 30.107303999999996,-104.693655813605488 30.119154117533654,-104.695366000000007 30.13213,-104.692122999999995 30.138662999999998,-104.690080458880587 30.149079251722458,-104.687506999999997 30.162202999999998,-104.687296000000003 30.179464000000003,-104.702787999999998 30.211735999999995,-104.707897632633845 30.218501061672534,-104.711235999999985 30.222920999999999,-104.713166 30.237956999999998,-104.722357186598074 30.248308653999679,-104.724410584274111 30.250621311025988,-104.72532436157617 30.251650460675243,-104.73347160041142 30.260826359409911,-104.733822000000004 30.261220999999999,-104.734059376092361 30.261231667834558,-104.737359999999995 30.261379999999996,-104.740448 30.259454000000002,-104.749663999999996 30.26126,-104.751566999999994 30.263643999999999,-104.754655151309422 30.272796681105522,-104.757893999999993 30.282395999999999,-104.761634 30.301147999999998,-104.779356000000007 30.313188,-104.790279572675416 30.323632238875831,-104.797291 30.330335999999999,-104.809794338457337 30.334925849121163,-104.810755485390246 30.338091979227556,-104.81211787963197 30.342579864771171,-104.813478341684558 30.347061385458392,-104.814379749150064 30.356375955470707,-104.814778573671205 30.360497153782266,-104.817595751374526 30.365914799658352,-104.824313633436745 30.370465624210016,-104.837492999999995 30.373909,-104.849824017938076 30.383147747051474,-104.859521 30.390413000000002,-104.857439999999997 30.408957,-104.852419999999995 30.418792,-104.861074000000002 30.428896999999996,-104.86474141169117 30.441297336779865,-104.865463293164552 30.443738179024677,-104.868454614768496 30.453852504447951,-104.869872 30.458644999999997,-104.86871099999999 30.463229999999996,-104.866118999999983 30.46479,-104.866094000000004 30.467379999999999,-104.870137228360662 30.483875070981508,-104.873288503237063 30.496731258693877,-104.873335488188886 30.496922942181985,-104.876786999999979 30.511004000000003,-104.878566789651714 30.514416830422793,-104.880108146577356 30.517372454871531,-104.88208573587417 30.521164575423189,-104.889375999999999 30.535143999999995,-104.890392881954469 30.540947215529823,-104.892228000000003 30.551419999999997,-104.895440150997459 30.560421421221292,-104.899000999999998 30.570399999999996,-104.909330873116318 30.584188648619556,-104.909747767935556 30.584745133303247,-104.918689620637082 30.596681007395873,-104.924796 30.604831999999998,-104.927016167130404 30.604700501077968,-104.934922481779466 30.604232215677584,-104.939873000000006 30.603939,-104.953391370086464 30.606003357240429,-104.967167000000003 30.608106999999997,-104.971627504383378 30.61006529240159,-104.972071 30.61026,-104.972794851616513 30.611297344530712,-104.980135850742045 30.621817657146149,-104.980290999999994 30.622039999999995,-104.982191641583043 30.62882153037463,-104.983981 30.635206,-104.985513855292751 30.652294791670293,-104.9863 30.661059000000002,-105.001239999999996 30.672583000000003,-105.002056999999994 30.680971999999997,-105.006614566555172 30.685839873047019,-105.006800999999996 30.686039,-105.007528432885024 30.6859080282745,-105.007959930235828 30.685830338698263,-105.020141999999993 30.683637,-105.035888798004834 30.686138071331488,-105.042930223005172 30.687256464175281,-105.044973600167665 30.685364445024991,-105.049769587265445 30.680923708581364,-105.049884734287517 30.6808170907847,-105.050688284649809 30.681171184306308,-105.054688384336032 30.682933873306403,-105.062333999999993 30.686302999999995,-105.062477471553692 30.692159292631892,-105.062625999999995 30.698222,-105.084504902225902 30.710918832086001,-105.098281999999998 30.718914000000002,-105.108075999999997 30.730049999999995,-105.110705999999993 30.737749999999995,-105.110681999999983 30.743366000000002,-105.113815999999986 30.746001,-105.119547104826722 30.748125675649064,-105.123265000000004 30.749504000000005,-105.140207000000004 30.752502,-105.152361999999982 30.751451999999997,-105.157640215066564 30.754007791997694,-105.16015278062757 30.757058756266805,-105.160271207191187 30.758203550015399,-105.161229588477383 30.767467931854636,-105.164076390339474 30.771453450048199,-105.164818961888187 30.77249304906519,-105.164868027003308 30.772491740665838,-105.170370203038615 30.772345016388588,-105.178279098267282 30.772134113115257,-105.183436 30.776644999999995,-105.185930999999997 30.784391999999997,-105.195143999999999 30.792138,-105.195988495740664 30.791702299374609,-105.203522176185984 30.787815448176353,-105.206160999999994 30.786453999999996,-105.212916518294108 30.785414778041517,-105.215967484302155 30.786491589369188,-105.216685356202021 30.789542555377231,-105.215888956387687 30.792967070566242,-105.214890669496626 30.797259699168034,-105.218659510882389 30.801566944478708,-105.222008841883465 30.801829013843189,-105.231580057313238 30.802577916338681,-105.238364256021057 30.803108747911697,-105.249792715464977 30.799033957074698,-105.255416052233826 30.797028969328842,-105.261224946310648 30.798054073736733,-105.261360733612406 30.798078036329223,-105.27276013440985 30.808707209360072,-105.27887297001547 30.814407016614517,-105.283004544196217 30.818259431108679,-105.287237620233441 30.822206489243744,-105.289317685342255 30.822206489243744,-105.295630129130572 30.822206489243744,-105.300778681061615 30.818848737795758,-105.303672944509898 30.816961174571279,-105.314862960890409 30.816961174571279,-105.316949659843416 30.82296045428,-105.31766045482081 30.825003996727105,-105.320108268786385 30.827451797139727,-105.322675464925993 30.828439452154051,-105.330102631610075 30.831296841312803,-105.347695000000002 30.838065,-105.353219571709047 30.842032277683753,-105.358103536812379 30.84553952616983,-105.359771122039604 30.846737044096301,-105.360672052753856 30.84738401593513,-105.36720323988537 30.847875849249167,-105.377416999999994 30.848644999999998,-105.387780492422849 30.851314552204784,-105.394242074789418 30.852979003795937,-105.396689881978517 30.855426817761515,-105.396237319899697 30.858492407966825,-105.394628539050657 30.86939005724841,-105.394248999999988 30.871960999999999,-105.395681745186749 30.87649980844607,-105.399608999999998 30.888940999999996,-105.399828021807267 30.889112280223049,-105.402824820246408 30.891455847338634,-105.413505 30.899808,-105.430088999999995 30.905791999999998,-105.44547819369545 30.915748838601054,-105.448693870984556 30.917829388134351,-105.452149246331331 30.920065022782566,-105.4597280766598 30.924968540917344,-105.469954295993247 30.931584924947412,-105.472488639470896 30.933224650164071,-105.476269681741059 30.935670991952524,-105.488027000000002 30.943277999999999,-105.495516502166126 30.9493992090351,-105.4968561000139 30.950494069316512,-105.497422439936116 30.953962910943051,-105.497963910074574 30.957279424722472,-105.502256687477072 30.962680017552614,-105.507558525965123 30.966493977230062,-105.533087999999992 30.984859,-105.541468808393844 30.984769556162778,-105.543675999999991 30.984745999999998,-105.557430349577899 30.990228688381027,-105.570063935625512 31.008532833135739,-105.575218046011173 31.016000355201566,-105.578084306850855 31.020153131231776,-105.578407858220658 31.020621907958049,-105.57911399999999 31.021644999999999,-105.580554486932016 31.024917232759986,-105.581339666024604 31.026700857930102,-105.581404000000006 31.026847000000004,-105.581361569643192 31.027041810483581,-105.581235244876609 31.027621805343596,-105.579823718925667 31.034102543987302,-105.579541999999989 31.035395999999995,-105.579765234089464 31.036249085539566,-105.579847333127134 31.036562825712579,-105.585323000000002 31.057487999999996,-105.592709163135751 31.0626132919136,-105.595921000000004 31.064841999999999,-105.598772999999994 31.074925999999998,-105.60333 31.082624999999997,-105.627348999999995 31.098545,-105.641890000000004 31.098321999999996,-105.646730999999988 31.113907999999999,-105.647031366805422 31.114192798578223,-105.648833999999994 31.115902000000002,-105.662869191777489 31.12063916934996,-105.673930643060629 31.124372639388369,-105.709491 31.136374999999997,-105.717005999999998 31.141438,-105.717653520299876 31.143411480377267,-105.719539999999995 31.149160999999996,-105.742677999999998 31.164897,-105.763531 31.164121000000005,-105.773256999999987 31.166896999999999,-105.774148788612138 31.168976038235485,-105.780021000000005 31.182666,-105.779878030009812 31.18682806893737,-105.779724999999999 31.191282999999995,-105.782894999999996 31.197562999999999,-105.790659746923424 31.200723362140888,-105.794386000000003 31.20224,-105.818835000000007 31.230680999999997,-105.825806058218902 31.23733997673531,-105.835722000000004 31.246811999999995,-105.851073632158958 31.265902599748792,-105.86604427072389 31.284519412988434,-105.869353000000004 31.288633999999998,-105.869862116496506 31.288859823963843,-105.876014999999981 31.291588999999995,-105.890871999999987 31.290013999999996,-105.895034999999993 31.290977999999999,-105.903460999999993 31.306768999999999,-105.908770999999987 31.312773999999997,-105.914613899052299 31.312859252963214,-105.93196564998388 31.313112430054005,-105.932552999999999 31.313120999999995,-105.933375187723101 31.313903465142818,-105.938451999999984 31.318735,-105.948091000000005 31.340069,-105.945903 31.352809999999998,-105.953942999999995 31.364749,-105.970101 31.365936999999995,-105.997579969562565 31.386863626037869,-106.00418474278807 31.391893495117941,-106.004925999999998 31.392457999999998,-106.006143777923754 31.392558937255828,-106.022866323827969 31.393945009265412,-106.080091217088636 31.398688175961098,-106.080258 31.398702,-106.080335505244278 31.398768097394733,-106.096409750603954 31.412476405141465,-106.100621535494 31.416068265421309,-106.102641400977276 31.417790830744398,-106.10264993125142 31.41779810546371,-106.106876999999997 31.421403000000005,-106.112168999999994 31.423577999999996,-106.132782000000006 31.425367000000005,-106.143572676566535 31.431101721097118,-106.158218000000005 31.438885000000003,-106.175305198785026 31.455910533348611,-106.175674999999998 31.456278999999995,-106.17677981450808 31.456634312625521,-106.182946895641223 31.45861766980741,-106.20560859826729 31.465905761156737,-106.205826999999999 31.465975999999998,-106.205998876707866 31.466165148890862,-106.212686244283063 31.473524541419071,-106.218538531147885 31.479964934554566,-106.218843000000007 31.480299999999996,-106.218893022078106 31.480498686193428,-106.223908999999992 31.500422,-106.236804000000006 31.513376,-106.242649095206133 31.530650094003715,-106.245874455325477 31.540182047193959,-106.246202999999994 31.541153,-106.246406806009631 31.541315626597875,-106.254779999999997 31.547997000000002,-106.280345588488331 31.561810530102129,-106.280548572587122 31.561920205925162,-106.280811 31.562061999999997,-106.287785 31.584444999999999,-106.292254713772053 31.594651759250389,-106.295141086978958 31.601242900860864,-106.303535999999994 31.620412999999996,-106.308594276522342 31.627497440426588,-106.330970256390501 31.658836434185069,-106.33473699999999 31.664111999999999,-106.338265602146336 31.671883697950737,-106.346992532059133 31.691104641686092,-106.349537999999995 31.696711,-106.357472918704602 31.702103016258707,-106.368303742040567 31.709462886938788,-106.370138999999995 31.710709999999999,-106.373839000000004 31.714809999999996,-106.378039 31.72831,-106.381039 31.732109999999999,-106.38595139194058 31.734759025425479,-106.394642915450532 31.739445961452269,-106.404086535473255 31.744538468290354,-106.417940000000002 31.752009,-106.421739999999616 31.752623660686648,-106.431540999999996 31.754208999999996,-106.434644983693715 31.755853956158482,-106.444263765046571 31.76095142933643,-106.451540999999992 31.764807999999999,-106.467641999999998 31.759607999999997,-106.470742 31.753508,-106.472156160715315 31.752506597443457,-106.47367184987327 31.751433300058491,-106.475016438009845 31.750481163584279,-106.475542000000004 31.750108999999998,-106.48261401078824 31.748321568701869,-106.484641999999994 31.747809000000004,-106.486162292248409 31.747994847970777,-106.488078402545341 31.748229082678503,-106.489542 31.748407999999998,-106.507341999999994 31.761208,-106.509102011460428 31.762827435120251,-106.511609062807707 31.765134242258316,-106.523643000000007 31.776206999999996,-106.528643000000002 31.781807,-106.528542999999999 31.783906999999996,-106.528542999999999 31.784407000000002,-106.527996999999999 31.786944999999999,-106.527623000000006 31.789119000000003,-106.527737999999985 31.789760999999995,-106.527942999999993 31.790507000000002,-106.530514999999994 31.792103,-106.532480000000007 31.791913999999998,-106.533 31.791829,-106.533043000000006 31.791906999999995,-106.534743000000006 31.796106999999999,-106.535154000000006 31.797088999999996,-106.535342999999997 31.797507,-106.535842999999986 31.798607,-106.542096999999998 31.802145999999997,-106.542143999999993 31.802106999999996,-106.544713999999999 31.804286999999999,-106.545344 31.805007,-106.546561898485905 31.806561850400339,-106.546615562760394 31.806630361790774,-106.547143999999989 31.807304999999996,-106.551861034152338 31.808599471053657,-106.558443999999994 31.810406,-106.560680020141419 31.810752754512048,-106.560847305685968 31.810778696593822,-106.562944999999999 31.811104,-106.56344399999999 31.812605999999995,-106.566844000000003 31.813305999999997,-106.569123704016391 31.811582321353455,-106.570943999999997 31.810205999999997,-106.577243999999993 31.810406,-106.581344 31.813905999999996,-106.582144 31.815505999999999,-106.588044999999994 31.822105999999998,-106.589044999999984 31.822705999999997,-106.593826000000007 31.824901,-106.602727000000002 31.825023999999996,-106.605266999999998 31.827911999999998,-106.603310537982878 31.834798487166189,-106.601945 31.839604999999999,-106.60204499999999 31.844404999999998,-106.605244999999982 31.845904999999998,-106.605845000000002 31.846304999999997,-106.614637000000002 31.846489999999996,-106.621857000000006 31.852854,-106.625763000000006 31.856276,-106.627808000000002 31.860592999999998,-106.629708357956787 31.861913746439043,-106.635925999999998 31.866235,-106.635879999999986 31.871514,-106.634872999999999 31.874477999999996,-106.630798999999996 31.879696999999997,-106.629271361585637 31.8835303997664,-106.629197000000005 31.883717000000004,-106.629948941610351 31.885072003811555,-106.630443527558498 31.88596325099838,-106.630530381920593 31.886119763139838,-106.630691999999982 31.886410999999999,-106.633926999999986 31.889183999999997,-106.635073463799642 31.889856364267651,-106.636317332120683 31.890585853164694,-106.638154 31.891662999999998,-106.638364165758659 31.89171923904625,-106.642899999999983 31.892932999999999,-106.645296000000002 31.894859,-106.645645999999999 31.895648999999995,-106.645478999999995 31.898669999999999,-106.640839999999997 31.904598,-106.63512839833713 31.908732779117901,-106.633668 31.90979,-106.633408736085542 31.909871832166754,-106.625946999999996 31.912227,-106.62344499999999 31.914034,-106.618336531290581 31.916262323146238,-106.614677480394235 31.917858407661853,-106.614345999999998 31.918002999999995,-106.611846 31.920003,-106.616063629645311 31.921863544491501,-106.623932999999994 31.925334999999997,-106.624022586877501 31.92530240401349,-106.628663000000003 31.923614,-106.629746999999995 31.926570000000002,-106.625321999999983 31.930053000000004,-106.622529 31.934863000000004,-106.622117000000003 31.936620999999999,-106.622377 31.940863,-106.623659000000004 31.945509999999995,-106.616135999999983 31.948439,-106.614701999999994 31.956,-106.617707999999993 31.956008,-106.622819000000007 31.952891,-106.625123000000002 31.954530999999999,-106.625534999999985 31.957475999999996,-106.624298999999993 31.961054,-106.620453999999981 31.963402999999996,-106.619370999999987 31.964777000000005,-106.618745000000004 31.966954999999995,-106.619568999999998 31.971578,-106.621872999999994 31.972933,-106.623215999999999 31.972909999999999,-106.626465999999994 31.97069,-106.630114000000006 31.971257999999999,-106.638186000000005 31.976819999999996,-106.639528999999996 31.980347999999996,-106.63649199999999 31.985719,-106.631181999999995 31.989809,-106.629494617643616 31.990072722748106,-106.628337072326531 31.990253636712819,-106.62822051159516 31.990271854111079,-106.626910882874782 31.990476537349483,-106.623567999999992 31.990998999999999,-106.619448000000006 31.994733,-106.618486000000004 32.000494999999994,-106.599096000000003 32.000731000000002,-106.598639000000006 32.000753999999993,-106.595332999999997 32.000777999999997,-106.587971999999979 32.000748999999999,-106.582805114232855 32.000751357586125,-106.566056000000003 32.000759000000002,-106.565141999999994 32.000736000000003,-106.564298514026802 32.00073927393025,-106.562131862706067 32.000747683631808,-106.55942760630407 32.000758180008894,-106.517043115844388 32.000922692365819,-106.411074999999983 32.001334,-106.409326934223301 32.001349629127162,-106.409108574114072 32.001351581443814,-106.394297999999992 32.001483999999998,-106.376861000000005 32.001171999999997,-106.32356972407176 32.001457096670784,-106.313306999999995 32.001511999999998,-106.205915000000005 32.001761999999999,-106.200699 32.001784999999998,-106.18183999999998 32.002049999999997,-106.125534000000002 32.002532999999993,-106.05045734599986 32.002412317859424,-105.998002999999997 32.002327999999999,-105.900599999999997 32.002099999999992,-105.886159000000006 32.001969999999993,-105.854061000000002 32.00235,-105.750527000000005 32.002206,-105.731362000000004 32.001564000000002,-105.563520259526442 32.001015604709174,-105.429281000000003 32.000577,-105.428582000000006 32.000599999999999,-105.427048999999997 32.000638000000002,-105.390395999999981 32.000607000000002,-105.340142768272344 32.000583616714373,-105.200871148394683 32.000518812363367,-105.153993999999997 32.000497000000003,-105.150310000000005 32.000497000000003,-105.14824 32.000484999999998,-105.132915999999994 32.000518,-105.131377 32.000523999999999,-105.118039999999993 32.000484999999998,-105.078604999999996 32.000532999999997,-105.077045999999996 32.000578999999995,-104.918272000000002 32.000495999999991,-104.643525999999994 32.000442999999997,-104.640917999999999 32.000396000000002,-104.531936999999999 32.000311000000004,-104.531756 32.000117000000003,-104.024520999999993 32.000010000000003,-103.980179000000007 32.000124999999997,-103.875476000000006 32.000554,-103.748317 32.000197999999997,-103.72373965094468 32.000208021677786,-103.713395184678689 32.000212239744897,-103.713395184670219 32.000212239744904,-103.713395184654971 32.000212239744911,-103.713395184639609 32.000212239744918,-103.60161412595366 32.000257819670985,-103.326500999999993 32.00036999999999,-103.278520999999998 32.000419,-103.270382999999995 32.000326,-103.267707999999999 32.000323999999992,-103.267633000000004 32.000475000000002,-103.215641000000005 32.000512999999998,-103.133028835827503 32.000473953106116,-103.088697999999994 32.000452999999993,-103.085875999999985 32.000464999999998,-103.064422999999991 32.000518,-103.064344000000006 32.087051000000002,-103.064347999999995 32.123041,-103.064421999999993 32.145006000000002,-103.064695999999998 32.522193,-103.064761000000004 32.587983,-103.064787999999993 32.600397,-103.064761000000004 32.601863000000002,-103.064814999999996 32.624536999999997,-103.064633 32.646419999999992,-103.064864 32.682647000000003,-103.064797999999996 32.690761000000002,-103.064798999999994 32.708694,-103.064826999999994 32.726627999999998,-103.064807000000002 32.777302999999996,-103.064698000000007 32.783602000000002,-103.064711000000003 32.784593,-103.064699000000005 32.827531,-103.064672000000002 32.828470000000003,-103.064888999999994 32.849359,-103.064915999999982 32.857259999999997,-103.064807000000002 32.857695999999997,-103.064862000000005 32.868346000000003,-103.064700999999985 32.879354999999997,-103.064569000000006 32.900013999999999,-103.064656999999997 32.959097,-103.064678999999998 32.964373000000002,-103.064625000000007 32.999898999999999,-103.064452000000003 33.010289999999998,-103.06398 33.038693000000002,-103.063904999999991 33.042054999999998,-103.063382198608849 33.066417104805645,-103.0628188509327 33.092668632365545,-103.062136190569035 33.12448003074244,-103.060102999999984 33.219225000000002,-103.059719999999999 33.256262,-103.059241999999998 33.260370999999992,-103.057856 33.315233999999997,-103.057486999999995 33.32947699999999,-103.056655000000006 33.388437999999994,-103.052609999999987 33.570599,-103.051664000000002 33.629489,-103.051362999999995 33.64195,-103.051535 33.650486999999998,-103.051086999999981 33.658186,-103.050532000000004 33.672407999999997,-103.050147999999993 33.701971,-103.049608000000006 33.737766,-103.049096000000006 33.746270000000003,-103.047346000000005 33.824674999999999,-103.046907000000004 33.850299999999997,-103.045643999999996 33.901536999999998,-103.045698000000002 33.90629899999999,-103.044893000000002 33.945616999999999,-103.043949999999981 33.974629,-103.043616999999998 34.003633,-103.043531000000002 34.018014,-103.043554999999984 34.032713999999991,-103.043745999999999 34.037294000000003,-103.043771000000007 34.041538000000003,-103.043720999999991 34.042319999999997,-103.043767000000003 34.043544999999995,-103.043744000000004 34.049985999999997,-103.04368599999998 34.063077999999997,-103.043515999999983 34.079382000000003,-103.043569000000005 34.087947,-103.043571175003294 34.092846731402311,-103.043572866326429 34.096656853966635,-103.04358003846437 34.112813863799865,-103.043644 34.256903,-103.043718999999982 34.289440999999997,-103.043935999999988 34.302584999999993,-103.043978999999979 34.312763999999994,-103.043947553639484 34.376410480771497,-103.043947499824213 34.37651940122479,-103.043946000000005 34.379555000000003,-103.043943999999982 34.37966,-103.043919000000002 34.380915999999992,-103.043693000000005 34.383578,-103.043629999999993 34.384689999999999,-103.043614000000005 34.384968999999998,-103.043612999999993 34.388679000000003,-103.043612999999993 34.390442,-103.043606047260084 34.391254973944719,-103.043584999999993 34.393715999999998,-103.043610999999999 34.397105000000003,-103.043582999999998 34.400677999999999,-103.043537999999998 34.405462999999997,-103.043582 34.455657000000002,-103.043587999999986 34.459662000000002,-103.043588999999997 34.459774000000003,-103.043593999999985 34.46266,-103.043434927764125 34.510540742996007,-103.043071999999981 34.619782,-103.043277851519235 34.65183038816317,-103.0432796163159 34.65210514391012,-103.043285999999995 34.653098999999997,-103.042827000000003 34.671187999999994,-103.042768999999993 34.747360999999998,-103.042770000000004 34.792223999999997,-103.042781000000005 34.850242999999999,-103.042520999999979 34.899546,-103.0425974544018 35.032467348285799,-103.042641999999987 35.109912999999999,-103.043261 35.125058000000003,-103.042519999999996 35.135596,-103.042599999999993 35.142766000000002,-103.042710999999997 35.144734999999997,-103.042568000000003 35.159317999999999,-103.042394999999999 35.178573,-103.042338999999984 35.181922,-103.042366 35.182786,-103.042377000000002 35.183149,-103.042496999999997 35.211862000000004,-103.042775000000006 35.241236999999998,-103.042366 35.250056,-103.041554000000005 35.622487,-103.041484634909168 35.651235429903174,-103.041145999999998 35.791583000000003,-103.041916999999998 35.796441000000002,-103.041715999999994 35.814072000000003,-103.042186 35.825216999999995,-103.04130499999998 35.837693999999999,-103.040823999999986 36.055230999999992,-103.041387523024824 36.229129564686382,-103.041674 36.317534000000002,-103.041745000000006 36.318266999999999,-103.041923999999995 36.500439,-103.00243399999998 36.500397)),((-96.818513748151517 28.172441936006489,-96.816443421354066 28.174808025412563,-96.791958210781445 28.188687337716829,-96.733036581469989 28.190913261798631,-96.70383764358462 28.198245729538105,-96.697421731775194 28.2029594609741,-96.702659211994316 28.211208487181011,-96.703313894801497 28.216445964862743,-96.686815839850283 28.218410020896432,-96.662461568376486 28.227313732447904,-96.66062845144161 28.228884976259902,-96.663116248646261 28.233205895474203,-96.651855673914184 28.251275190431315,-96.607991796426646 28.277069769155677,-96.608122730450688 28.280081317680857,-96.611527096272326 28.281390688369981,-96.610479598706064 28.283092866206033,-96.592934048725994 28.296972182316367,-96.581018783574592 28.302209665072866,-96.553260151988255 28.302340591484768,-96.546975176740276 28.305614018207578,-96.542130508742858 28.315958034472228,-96.528905880514458 28.322504882843088,-96.476269225261575 28.330753906512612,-96.45099839278295 28.337038879223222,-96.434107525610045 28.344764159184386,-96.418918843885365 28.35484630740093,-96.415252604940861 28.362833452872817,-96.417216660974546 28.367154372087118,-96.412895739222876 28.36951123780511,-96.403206408302779 28.371475291301415,-96.401242352269094 28.366892498964241,-96.400558825492723 28.362187299887704,-96.398667286465624 28.349166496619617,-96.397846 28.343512999999998,-96.413700000000006 28.327342999999999,-96.439098999999999 28.319051999999999,-96.495600517783487 28.293964130304811,-96.547774000000004 28.270797999999999,-96.587113635820756 28.248878526668094,-96.611036668198281 28.235548960715661,-96.621533999999983 28.229699999999998,-96.694665999999998 28.18212,-96.758140999999995 28.136872999999998,-96.830820125734775 28.079724674840076,-96.849624000000006 28.064938999999999,-96.854049189790473 28.060788472935577,-96.855594496383262 28.059339080448503,-96.859762278796424 28.055429983997605,-96.896530613737951 28.020943786452513,-96.898080497387397 28.019490100997579,-96.929052999999996 27.990439999999996,-96.96699599999998 27.950531000000002,-97.001440999999986 27.911442,-97.031660000000002 27.869974999999997,-97.041798999999997 27.852925999999997,-97.045408776308051 27.837452569961062,-97.045409609838757 27.837448997003069,-97.04598 27.835004,-97.050599498412936 27.830109781194331,-97.058265753683145 27.821987615677948,-97.076304165860961 27.802876463727326,-97.079565315161531 27.799421374709375,-97.083535350812468 27.795215242050556,-97.085211615730273 27.793439290085495,-97.085394999999991 27.793244999999999,-97.11422230692618 27.755303327915222,-97.116276999999997 27.752599,-97.117304906633777 27.751048809529347,-97.118830196202964 27.748748513687826,-97.139140047561696 27.718119138409879,-97.139351757288111 27.717799858049549,-97.143807202733072 27.711080581371732,-97.165547551982726 27.678293865995041,-97.166583141799606 27.676732088482499,-97.166681999999994 27.676583,-97.184850261879149 27.644709535797791,-97.192144670654784 27.631912600211269,-97.198729900630283 27.620359811436909,-97.201865999999995 27.614857999999998,-97.211651066704889 27.596044174137351,-97.213608899397855 27.592279833590187,-97.221943360361436 27.576255098965802,-97.265194083077162 27.493096589152017,-97.265746568141566 27.492034321708481,-97.276090999999994 27.472145,-97.304469999999995 27.407734,-97.326522999999995 27.347611999999998,-97.347445832595042 27.277936119324231,-97.350397999999998 27.268104999999998,-97.363400999999996 27.210366,-97.370941000000002 27.161165999999998,-97.377001000000007 27.101020999999999,-97.379130000000004 27.047996,-97.378361999999996 26.992877,-97.370730999999992 26.909706,-97.365301177044699 26.875333999999995,-97.365282052674758 26.875212938438843,-97.364726000000005 26.871692999999997,-97.363633430415348 26.866515420001111,-97.352028350385282 26.811520085064032,-97.35141299999998 26.808603999999999,-97.350529648372714 26.805138580575584,-97.333027999999999 26.736478999999996,-97.304204860681779 26.646364129642233,-97.300690000000003 26.635375,-97.297812715808362 26.627503004299889,-97.297022484076606 26.625340999999999,-97.287871455917369 26.600304594305239,-97.275119000000004 26.565415000000002,-97.269391999999982 26.554046,-97.269132970349304 26.553256905349773,-97.257954534248029 26.519203490608863,-97.229844 26.433568999999999,-97.223724090442104 26.411478908273114,-97.206682644704898 26.34996703527348,-97.194643999999997 26.306512999999999,-97.185844000000003 26.267102999999995,-97.177979856301576 26.220346386353309,-97.177168840972797 26.215524458900923,-97.173264999999986 26.192314,-97.170387765328073 26.167037808112223,-97.169872392484734 26.162510314053797,-97.167099005951158 26.138146416702778,-97.161470999999992 26.088705,-97.158662630175101 26.080176913346069,-97.154270970414501 26.066840900880429,-97.161462285840642 26.067639941946975,-97.169842256221145 26.077853024187579,-97.171781452365479 26.102521767945923,-97.179531587141199 26.146202099560895,-97.178745972847352 26.177103221942961,-97.183983445454302 26.214289306886101,-97.194458400817808 26.271639686993655,-97.214884565299002 26.353606215503973,-97.226930759399721 26.385554824668418,-97.240286324189555 26.405980989149626,-97.240845398636537 26.411470089808617,-97.243166933615896 26.434263367616055,-97.247618791929028 26.456260775909261,-97.254165635225121 26.471187589585856,-97.262545605605609 26.482971915638458,-97.27642492679071 26.521729238684483,-97.292399243108349 26.528014213932472,-97.310730412457033 26.556558470596535,-97.308111681228326 26.5712234060755,-97.308635417324538 26.576722756880109,-97.317015387705027 26.597672667607057,-97.318434072834165 26.60022630157264,-97.324871601690262 26.611813856840271,-97.338489044677715 26.647428701777493,-97.33639404954522 26.666021744249065,-97.345821512417203 26.700589103038251,-97.363105189274393 26.710540307081217,-97.370437657013895 26.723895871871047,-97.370961403259614 26.736203954318924,-97.367557047587525 26.740393934434408,-97.364152671616353 26.758986971196869,-97.364646278833362 26.767121661774897,-97.368866408127118 26.774699404876429,-97.370437646864346 26.781508126370166,-97.368342661881371 26.795649318140761,-97.373056398392137 26.808481136684847,-97.387459455673451 26.820789208983193,-97.383531343606066 26.875520854055946,-97.385626348888096 26.88887641440536,-97.391649435788921 26.901970109878395,-97.389554460955466 26.945964918852653,-97.390340075249313 27.05228571820243,-97.389816329003565 27.067212531879022,-97.386411973331462 27.083186832972341,-97.387459455673422 27.090519300711819,-97.390601943297412 27.094185534581555,-97.390078197051665 27.156511519247964,-97.377508246555678 27.199458835730731,-97.379865109736301 27.202863196477598,-97.386673841379576 27.204696313412462,-97.382221972916923 27.229050589961044,-97.37488951532697 27.25026236588155,-97.373318276589728 27.276449754290233,-97.372896734486858 27.277942715507475,-97.367033301341749 27.298709035706306,-97.36467643816114 27.302637142698917,-97.359962701650375 27.304732132756659,-97.357605838469766 27.307874620380655,-97.362319574980518 27.32672953597509,-97.366771423144115 27.333276389420721,-97.36179581858525 27.359987519000377,-97.346607126710992 27.390364889744752,-97.336132171347501 27.402411088920228,-97.331156576938184 27.412362295500575,-97.329585328051422 27.418123524502818,-97.330894688591016 27.425455992242295,-97.329847196099536 27.434359703793774,-97.317277255753083 27.463689574751687,-97.293708603647858 27.497209429631152,-97.282971770086746 27.521563701104967,-97.267627232015485 27.541048841138782,-97.26651977444007 27.542455137362143,-97.266473727822444 27.542513609294531,-97.257831889393842 27.556392930479635,-97.261144559602045 27.562355746269706,-97.261759991311692 27.563463525096239,-97.260450620622564 27.56739163716362,-97.260303240478223 27.567589679048492,-97.252732825146552 27.577762415194865,-97.252070650242061 27.578652211895708,-97.247885553160842 27.581360217573209,-97.247618802078478 27.581532821322067,-97.236881968517352 27.598292751933528,-97.24107194863285 27.602482732049012,-97.241084821027414 27.602523494839662,-97.242643187370078 27.607458346757408,-97.231683715414945 27.631671123728168,-97.231553918442799 27.631957884363242,-97.231382612637987 27.632336350521356,-97.221955159915538 27.632860099304484,-97.221711030183002 27.632638163711842,-97.219074540339648 27.630241360463614,-97.217418907944051 27.630677052710489,-97.214098935780783 27.631550728615359,-97.200743370990949 27.650143776161688,-97.197339005169326 27.664546838517776,-97.19760088336696 27.678426154628117,-97.203474366386629 27.684532651921231,-97.20308902068453 27.688000774441392,-97.200450811776179 27.688974477466285,-97.190006537429824 27.692829222058965,-97.188284576858237 27.695272543577584,-97.170627865440125 27.720325976082009,-97.166176017276527 27.732372180332245,-97.161200407642937 27.734074342943998,-97.153606061705801 27.733288721037997,-97.147321086457822 27.735383711095739,-97.130823034043985 27.751619892924076,-97.127942424617643 27.75580987303956,-97.127680546420009 27.759999858229808,-97.125046985317312 27.763143140340585,-97.103326269871417 27.789067861139614,-97.102999946318647 27.791923200131116,-97.10255066693685 27.795854405604921,-97.102495980878558 27.796332909939515,-97.102278777379922 27.798233445813956,-97.100865886772965 27.802472121847156,-97.098874421707819 27.808446522979796,-97.095168997779496 27.812151946908138,-97.092851314507953 27.81446963017968,-97.092589446459854 27.819183356540908,-97.098874421707819 27.822849590410645,-97.104263831428213 27.822227735056668,-97.126109297533233 27.819707102786651,-97.130299287798252 27.820492727230029,-97.134489267913736 27.825206463740791,-97.132394272781227 27.827301438574235,-97.10670775348396 27.832389859144307,-97.087681973298601 27.836158807756469,-97.056712719518927 27.842293721800239,-97.055822986229373 27.843403727743151,-97.04322620548075 27.859119113080268,-97.013634476624247 27.906780143237341,-97.017955395838555 27.911493874673329,-97.016384146951765 27.917255079570445,-96.985744902767337 27.954048356415132,-96.977888688782102 27.976438572489602,-96.978805242174786 27.978271691961854,-96.980900237307296 27.978271691961854,-96.986006780964971 27.976176699366729,-96.986661461234775 27.980759491703903,-96.978281501003806 28.001709402430844,-96.967806540565562 28.020040576854303,-96.966759042999328 28.020367911280101,-96.965187799187319 28.013297317932185,-96.962569062883844 28.012380759464751,-96.952617853766114 28.01643980428749,-96.946987563862692 28.02652194996665,-96.932453562407773 28.035425661518129,-96.926430465357427 28.043412814602167,-96.929572952981431 28.051399967686208,-96.927085150701998 28.057292130712504,-96.906004298338829 28.076147047258459,-96.890946545563423 28.076801730065643,-96.886232814127425 28.084396073465374,-96.88832780925992 28.086622002621937,-96.889113433703315 28.099453823703399,-96.886887499471996 28.117130312782294,-96.879424092633712 28.131402425890027,-96.874972236857971 28.133235547899659,-96.87078225420511 28.13127149186597,-96.86462821551855 28.126295887307109,-96.857164811217643 28.115559058820768,-96.845380482627661 28.108881273888468,-96.830128556765757 28.111822717849165,-96.827049318353744 28.112416571196771,-96.816574357915513 28.119618104912195,-96.810420321766344 28.126034014184238,-96.810944073086844 28.136378030448888,-96.816836228500989 28.158048094801106,-96.820248352517055 28.163388807027481,-96.822859330626116 28.167475552598326,-96.818513748151517 28.172441936006489)))')); \ No newline at end of file
diff --git a/django/contrib/gis/tests/geoapp/sql/country.postgresql_psycopg2.sql b/django/contrib/gis/tests/geoapp/sql/country.postgresql_psycopg2.sql
new file mode 100644
index 0000000000..01c9e73379
--- /dev/null
+++ b/django/contrib/gis/tests/geoapp/sql/country.postgresql_psycopg2.sql
@@ -0,0 +1,4 @@
+-- New Zealand bondary courtesy of 'world_borders.shp', which was assembled from public domain sources by Schuyler Erle. See: http://mappinghacks.com/data/
+-- Texas boundary data is a data product from the U.S. Census Bureau. See 'state.sql' for more information.
+INSERT INTO geoapp_country ("name", "mpoly") VALUES ('New Zealand', 'SRID=4326;MULTIPOLYGON (((174.616364000000004 -36.100861000000002,174.634978999999987 -36.124718,174.708862000000011 -36.205559,174.781096999999988 -36.266945,174.812744000000009 -36.339165,174.768311000000011 -36.34639,174.710784999999987 -36.525832999999999,174.708587999999992 -36.533332999999999,174.70773299999999 -36.541671999999998,174.714690999999988 -36.595832999999999,174.717194000000006 -36.603057999999997,174.774414000000007 -36.730277999999998,174.808319000000012 -36.805275000000002,174.854400999999996 -36.847777999999998,174.896636999999998 -36.878334000000002,175.011658000000011 -36.871941,175.020813000000004 -36.873610999999997,175.055542000000003 -36.880279999999999,175.076629999999994 -36.890839,175.082458000000003 -36.895279000000002,175.087463000000014 -36.900832999999999,175.091644000000002 -36.925559999999997,175.161652000000004 -36.955559,175.221069 -36.937775000000002,175.230255 -36.939438000000003,175.278320000000008 -36.965279000000002,175.310516000000007 -36.995002999999997,175.319976999999994 -37.005836000000002,175.323853000000014 -37.012222,175.328856999999999 -37.026947,175.330261000000007 -37.035277999999998,175.330535999999995 -37.044449,175.321899000000002 -37.06472,175.31942699999999 -37.095275999999998,175.317748999999992 -37.144165,175.319121999999993 -37.152495999999999,175.328856999999999 -37.168892,175.373290999999995 -37.216659999999997,175.385254000000003 -37.225830000000002,175.404967999999997 -37.228050000000003,175.579131999999987 -37.244446000000003,175.58914200000001 -37.169449,175.551636000000002 -37.024718999999997,175.547484999999995 -37.009171000000002,175.542480000000012 -36.994446000000003,175.536102 -36.980826999999998,175.524993999999992 -36.961669999999998,175.498566000000011 -36.927222999999998,175.484406000000007 -36.920279999999998,175.476348999999999 -36.917777999999998,175.464416999999997 -36.90889,175.435241999999988 -36.866942999999999,175.46691899999999 -36.809998,175.509430000000009 -36.776108,175.486358999999993 -36.679726000000002,175.463593000000003 -36.621383999999999,175.378296000000006 -36.570557,175.366364000000004 -36.561667999999997,175.361633000000012 -36.556389000000003,175.356628 -36.541671999999998,175.353850999999992 -36.525002,175.35244800000001 -36.489998,175.353577 -36.481940999999999,175.360229000000004 -36.478050000000003,175.538025000000005 -36.514724999999999,175.542755 -36.519996999999996,175.604950000000002 -36.622771999999998,175.631072999999986 -36.710555999999997,175.763610999999997 -36.713614999999997,175.840789999999998 -36.754173000000002,175.733582000000013 -36.805832000000002,175.701629999999994 -36.844161999999997,175.707458000000003 -36.869995000000003,175.709960999999993 -36.875275000000002,175.714690999999988 -36.880828999999999,175.720519999999993 -36.885277000000002,175.735779000000008 -36.891387999999999,175.74383499999999 -36.893889999999999,175.758330999999998 -36.876106,175.761382999999995 -36.869446000000003,175.757751000000013 -36.863059999999997,175.753051999999997 -36.857779999999998,175.749114999999989 -36.851394999999997,175.75 -36.843055999999997,175.752196999999995 -36.835555999999997,175.756378000000012 -36.830002,175.765533000000005 -36.828055999999997,175.808013999999986 -36.824173000000002,175.817200000000014 -36.825836000000002,175.833587999999992 -36.830832999999998,175.845519999999993 -36.839722000000002,175.849120999999997 -36.846107000000003,175.878570999999994 -36.914444000000003,175.881072999999986 -36.921669,175.918304000000006 -37.067504999999997,175.917480000000012 -37.075836000000002,175.915253000000007 -37.083061,175.898314999999997 -37.115004999999996,175.884154999999993 -37.168892,175.883330999999998 -37.176949,175.887206999999989 -37.244163999999998,175.892212 -37.249724999999998,175.921082000000013 -37.251671000000002,175.927185000000009 -37.256110999999997,175.93081699999999 -37.262504999999997,175.936371000000008 -37.278885000000002,175.940093999999988 -37.299717,175.974396000000013 -37.418059999999997,175.976074000000011 -37.453055999999997,176.026931999999988 -37.483108999999999,176.035583000000003 -37.487282,176.059417999999994 -37.502502,176.088287000000008 -37.525557999999997,176.093291999999991 -37.531112999999998,176.165526999999997 -37.613892,176.169433999999995 -37.620277000000002,176.167205999999993 -37.625832000000003,176.160247999999996 -37.624167999999997,176.082458000000003 -37.602500999999997,176.066924999999998 -37.59639,176.061095999999992 -37.591942000000003,176.057189999999991 -37.585555999999997,176.062744000000009 -37.580832999999998,176.070800999999989 -37.577781999999999,176.088287000000008 -37.580002,176.095245000000006 -37.576110999999997,176.090239999999994 -37.570838999999999,176.062468999999993 -37.546669,176.023087000000004 -37.528221000000002,176.018767999999994 -37.526057999999999,176.013931000000014 -37.524554999999999,176.007598999999999 -37.524222999999999,175.955535999999995 -37.521110999999998,175.946349999999995 -37.523055999999997,175.940796000000006 -37.527779000000002,175.953583000000009 -37.558891000000003,175.994415000000004 -37.638893000000003,176.071899000000002 -37.655273,176.14498900000001 -37.675277999999999,176.242187999999999 -37.709442000000003,176.267486999999988 -37.676392,176.488281 -37.756667999999998,176.521636999999998 -37.769447,176.527771 -37.773887999999999,176.537475999999998 -37.784447,176.549712999999997 -37.793334999999999,176.656646999999992 -37.855559999999997,176.671082000000013 -37.862502999999997,176.686645999999996 -37.868332000000002,176.759154999999993 -37.892775999999998,176.784149000000014 -37.900275999999998,176.80304000000001 -37.903328000000002,176.819702000000007 -37.904442000000003,176.838287000000008 -37.907501000000003,176.917755 -37.926108999999997,176.943848000000003 -37.932502999999997,177.08273299999999 -37.967216,177.107468000000011 -37.987220999999998,177.159424 -38.013336000000002,177.415253000000007 -37.982498,177.47357199999999 -37.962502,177.545806999999996 -37.919167000000002,177.552459999999996 -37.915000999999997,177.571625000000012 -37.902222000000002,177.599120999999997 -37.878051999999997,177.603577 -37.872498,177.646941999999996 -37.805,177.732178000000005 -37.682502999999997,177.738861000000014 -37.678336999999999,177.746917999999994 -37.675277999999999,177.791931000000005 -37.666946000000003,177.849396000000013 -37.657218999999998,177.858856000000003 -37.656661999999997,177.868010999999996 -37.654442000000003,177.875792999999987 -37.651389999999999,178.0 -37.592224000000002,178.006653 -37.588332999999999,178.012206999999989 -37.583328000000002,178.018004999999988 -37.550831000000002,178.05581699999999 -37.542777999999998,178.064972000000012 -37.542228999999999,178.187744000000009 -37.546951,178.281921000000011 -37.560828999999998,178.306915000000004 -37.568061999999998,178.311919999999986 -37.573334000000003,178.312468999999993 -37.578887999999999,178.306915000000004 -37.583610999999998,178.321075000000008 -37.602500999999997,178.336365 -37.618332000000002,178.34970100000001 -37.626944999999999,178.367737000000005 -37.630828999999999,178.448028999999991 -37.645279000000002,178.457458000000003 -37.646667,178.468018 -37.646949999999997,178.488861000000014 -37.644165,178.497192000000013 -37.646667,178.504424999999998 -37.649994,178.550536999999991 -37.6875,178.555542000000003 -37.692497000000003,178.559692000000013 -37.698883000000002,178.56552099999999 -37.713332999999999,178.562468999999993 -37.719994,178.483306999999996 -37.826393000000003,178.455230999999998 -37.860000999999997,178.449982000000006 -37.865004999999996,178.429687999999999 -37.876944999999999,178.419983000000002 -37.887779000000002,178.350525000000005 -38.004722999999998,178.347473000000008 -38.011116,178.347197999999992 -38.019722000000002,178.348846000000009 -38.027779000000002,178.354950000000002 -38.032218999999998,178.360229000000004 -38.037506,178.364136000000002 -38.043616999999998,178.375792999999987 -38.072777000000002,178.378296000000006 -38.089995999999999,178.377746999999999 -38.09861,178.353850999999992 -38.185555,178.319976999999994 -38.248055,178.318024000000008 -38.255561999999998,178.317474000000004 -38.263893000000003,178.320800999999989 -38.398612999999997,178.302459999999996 -38.528885000000002,178.300536999999991 -38.536391999999999,178.296356000000003 -38.541946000000003,178.158874999999995 -38.649169999999998,178.074982000000006 -38.713889999999999,178.068297999999999 -38.717773,178.060241999999988 -38.721107000000003,178.050812000000008 -38.721381999999998,178.044433999999995 -38.717216,177.928864000000004 -38.722220999999998,177.941070999999994 -38.793616999999998,177.923858999999993 -38.918334999999999,177.917786000000007 -38.942802,177.909697999999992 -38.969718999999998,177.897705000000002 -39.047942999999997,177.893859999999989 -39.064776999999999,177.906708000000009 -39.064278000000002,177.923034999999999 -39.089165,177.942200000000014 -39.091942000000003,177.967743000000013 -39.098334999999999,177.991332999999997 -39.115004999999996,177.996612999999996 -39.120277000000002,177.999390000000005 -39.127495000000003,177.909973000000008 -39.256950000000003,177.898865 -39.267502,177.874968999999993 -39.286118000000002,177.868010999999996 -39.290283000000002,177.861908 -39.285834999999999,177.844970999999987 -39.251396,177.839416999999997 -39.236946000000003,177.824127000000004 -39.193053999999997,177.823577999999998 -39.183883999999999,177.826629999999994 -39.177222999999998,177.841644000000002 -39.152779000000002,177.822021000000007 -39.114445000000003,177.823195999999996 -39.110115,177.82351700000001 -39.105110000000003,177.82119800000001 -39.101275999999999,177.816696000000007 -39.099274,177.680266999999986 -39.075279000000002,177.628845000000013 -39.071114,177.426085999999998 -39.064163,177.387755999999996 -39.077781999999999,177.246917999999994 -39.128334000000002,177.206085000000002 -39.143616000000002,177.149138999999991 -39.165000999999997,177.054961999999989 -39.204445,176.935790999999995 -39.349997999999999,176.931365999999997 -39.355559999999997,176.903870000000012 -39.398055999999997,176.898865 -39.412216,176.89776599999999 -39.438048999999999,176.899414000000007 -39.446387999999999,176.946625000000012 -39.664444000000003,177.01080300000001 -39.654998999999997,177.107178000000005 -39.660828000000002,177.116913000000011 -39.662216,177.120789000000002 -39.66861,177.119110000000006 -39.676108999999997,177.115783999999991 -39.682502999999997,177.08273299999999 -39.729996,177.073577999999998 -39.741385999999999,177.068024000000008 -39.746108999999997,177.059692000000013 -39.749167999999997,177.050262000000004 -39.751396,177.033874999999995 -39.757506999999997,177.028045999999989 -39.762504999999997,177.023590000000013 -39.768059,177.020263999999997 -39.774718999999997,176.894713999999993 -40.034728999999999,176.890533000000005 -40.049728000000002,176.889983999999998 -40.058052000000004,176.89498900000001 -40.082779000000002,176.893035999999995 -40.090279000000002,176.874114999999989 -40.121383999999999,176.834136999999998 -40.181671,176.808319000000012 -40.216659999999997,176.796935999999988 -40.226387000000003,176.687195000000003 -40.321387999999999,176.644135000000006 -40.379997000000003,176.628296000000006 -40.421944000000003,176.539977999999991 -40.495002999999997,176.521362000000011 -40.513893000000003,176.500823999999994 -40.535004,176.441924999999998 -40.600281000000003,176.405243000000013 -40.643889999999999,176.386108000000007 -40.675002999999997,176.35522499999999 -40.688606,176.349396000000013 -40.693610999999997,176.288574000000011 -40.793892,176.239136000000002 -40.90889,176.22079500000001 -40.931671,176.195526 -40.941665999999998,176.172760000000011 -40.952224999999999,176.158600000000007 -40.959999000000003,176.152771 -40.964722000000002,176.142212 -40.975273,176.134154999999993 -40.987502999999997,176.120789000000002 -41.013618,176.11300700000001 -41.035277999999998,176.098297000000002 -41.087218999999997,176.087463000000014 -41.116112,176.080811000000011 -41.129165999999998,176.062195000000003 -41.151938999999999,175.984679999999997 -41.231383999999998,175.955230999999998 -41.255279999999999,175.819121999999993 -41.347220999999998,175.743561 -41.392226999999998,175.736358999999993 -41.396110999999998,175.557738999999998 -41.485000999999997,175.471069 -41.541389000000002,175.427459999999996 -41.564444999999999,175.323028999999991 -41.614449,175.313292999999987 -41.616394,175.230804000000006 -41.620834000000002,175.222197999999992 -41.618332000000002,175.21691899999999 -41.612777999999999,175.184692000000013 -41.535834999999999,175.181915000000004 -41.519447,175.181091000000009 -41.500838999999999,175.188568000000004 -41.461112999999997,175.193024000000008 -41.446106,175.193848000000003 -41.437775000000002,175.191070999999994 -41.430557,175.186095999999992 -41.425002999999997,175.080261000000007 -41.385559,175.063018999999997 -41.380279999999999,175.05304000000001 -41.378608999999997,175.045532000000009 -41.378608999999997,175.027190999999988 -41.381667999999998,174.993286000000012 -41.393332999999998,174.985779000000008 -41.397224,174.972747999999996 -41.405830000000002,174.960509999999999 -41.415275999999999,174.949982000000006 -41.425559999999997,174.944976999999994 -41.431114,174.94165000000001 -41.437775000000002,174.936919999999986 -41.443328999999999,174.918578999999994 -41.448051,174.908600000000007 -41.448334000000003,174.872467 -41.429442999999999,174.86605800000001 -41.425002999999997,174.861084000000005 -41.419724000000002,174.861633000000012 -41.347496,174.863861000000014 -41.340279000000002,174.870789000000002 -41.327224999999999,174.87912 -41.315002,174.883881000000002 -41.309441,174.894440000000003 -41.290000999999997,174.89776599999999 -41.282501000000003,174.899993999999992 -41.275002,174.901916999999997 -41.258338999999999,174.901916999999997 -41.251114,174.898865 -41.234444000000003,174.89498900000001 -41.228050000000003,174.887482000000006 -41.224442000000003,174.827179 -41.218887000000002,174.818848000000003 -41.221938999999999,174.787475999999998 -41.244446000000003,174.778045999999989 -41.255836000000002,174.774414000000007 -41.262222,174.771087999999992 -41.278053,174.778594999999996 -41.281387000000002,174.796082000000013 -41.286949,174.818024000000008 -41.284728999999999,174.824127000000004 -41.289169,174.829407000000003 -41.294724000000002,174.833313000000004 -41.301108999999997,174.832184000000012 -41.309441,174.82995600000001 -41.316665999999998,174.826355000000007 -41.323334000000003,174.821625000000012 -41.328887999999999,174.815796000000006 -41.333610999999998,174.807189999999991 -41.336387999999999,174.744689999999991 -41.347496,174.700531000000012 -41.344444000000003,174.671906000000007 -41.338332999999999,174.654694000000006 -41.333061,174.648314999999997 -41.328612999999997,174.629669000000007 -41.315002,174.59191899999999 -41.27861,174.591644000000002 -41.271385000000002,174.594116000000014 -41.263893000000003,174.601074000000011 -41.250838999999999,174.608306999999996 -41.237777999999999,174.61300700000001 -41.232216,174.619110000000006 -41.23111,174.627746999999999 -41.233887000000003,174.637482000000006 -41.235557999999997,174.648590000000013 -41.234444000000003,174.666931000000005 -41.229720999999998,174.681365999999997 -41.221938999999999,174.694702000000007 -41.213614999999997,174.712738000000002 -41.199440000000003,174.718567000000007 -41.194716999999997,174.800812000000008 -41.100281000000003,174.844421000000011 -41.041671999999998,174.874390000000005 -41.018059,174.882721000000004 -41.015006999999997,174.892486999999988 -41.013061999999998,174.901093000000003 -41.010283999999999,174.908324999999991 -41.006393000000003,174.932189999999991 -40.987502999999997,174.94165000000001 -40.976387000000003,174.945251000000013 -40.969718999999998,174.947478999999987 -40.962218999999997,175.014983999999998 -40.84861,175.09857199999999 -40.755836000000002,175.112731999999994 -40.738892,175.120789000000002 -40.726944000000003,175.127746999999999 -40.713614999999997,175.164153999999996 -40.631943,175.169708000000014 -40.616942999999999,175.171906000000007 -40.609726000000002,175.187468999999993 -40.530830000000002,175.23800700000001 -40.329726999999998,175.23135400000001 -40.280830000000002,175.201629999999994 -40.181671,175.196349999999995 -40.166946000000003,175.178314 -40.134171000000002,175.15554800000001 -40.095832999999999,175.071625000000012 -40.003059,175.055542000000003 -39.987777999999999,175.022217000000012 -39.958053999999997,174.986358999999993 -39.93,174.974120999999997 -39.920836999999999,174.960784999999987 -39.912773,174.938873 -39.902222000000002,174.923034999999999 -39.895836000000003,174.836638999999991 -39.865004999999996,174.828307999999993 -39.862502999999997,174.790802000000014 -39.854720999999998,174.781096999999988 -39.853057999999997,174.751373 -39.865555,174.740509000000003 -39.866661,174.729674999999986 -39.865836999999999,174.57607999999999 -39.829169999999998,174.558013999999986 -39.824722,174.549408 -39.822226999999998,174.542205999999993 -39.818610999999997,174.523865 -39.805,174.421356000000003 -39.726944000000003,174.410521999999986 -39.716942000000003,174.376068000000004 -39.678612,174.353577 -39.639999000000003,174.348846000000009 -39.634444999999999,174.336638999999991 -39.625557,174.316070999999994 -39.613892,174.30886799999999 -39.610283000000003,174.217194000000006 -39.579726999999998,174.208862000000011 -39.577224999999999,174.040802000000014 -39.552779999999998,173.997741999999988 -39.551392,173.986908 -39.550552000000003,173.970245000000006 -39.545279999999998,173.963012999999989 -39.541671999999998,173.871062999999992 -39.483330000000002,173.851898000000006 -39.470551,173.839966000000004 -39.461387999999999,173.810790999999995 -39.4375,173.79525799999999 -39.421944000000003,173.786652000000004 -39.409996,173.775817999999987 -39.390839,173.769713999999993 -39.376944999999999,173.762206999999989 -39.354720999999998,173.754424999999998 -39.305,173.751923000000005 -39.288612,173.751647999999989 -39.269996999999996,173.781921000000011 -39.191383000000002,173.785247999999996 -39.184998,173.800536999999991 -39.169167000000002,173.82995600000001 -39.145836000000003,173.844421000000011 -39.138336000000002,173.868010999999996 -39.128883000000002,173.892761000000007 -39.120552000000004,174.011108000000007 -39.073334000000003,174.114685000000009 -39.024445,174.187744000000009 -38.988608999999997,174.209136999999998 -38.977218999999998,174.226623999999987 -38.972496,174.248016000000007 -38.970551,174.259978999999987 -38.970275999999998,174.281372000000005 -38.969994,174.293029999999987 -38.969994,174.313292999999987 -38.972496,174.351348999999999 -38.979438999999999,174.375244000000009 -38.979163999999997,174.384704999999997 -38.977218999999998,174.392761000000007 -38.974442000000003,174.456359999999989 -38.940277000000002,174.546082000000013 -38.871941,174.557738999999998 -38.860557999999997,174.568024000000008 -38.850281000000003,174.587738000000002 -38.828887999999999,174.594421000000011 -38.815834000000002,174.603302000000014 -38.786118000000002,174.608582000000013 -38.763061999999998,174.625518999999997 -38.677779999999998,174.642486999999988 -38.590836000000003,174.681091000000009 -38.379165999999998,174.724396000000013 -38.185828999999998,174.838561999999996 -38.157218999999998,174.848021999999986 -38.156944000000003,174.85635400000001 -38.154167,174.926636000000002 -38.116112,174.932465000000008 -38.111389000000003,174.940246999999999 -38.101112,174.898590000000013 -38.075004999999997,174.877166999999986 -38.064163,174.892486999999988 -37.976387000000003,174.893585000000002 -37.969994,174.868286000000012 -37.943610999999997,174.861084000000005 -37.939995000000003,174.85522499999999 -37.944716999999997,174.834686000000005 -37.963614999999997,174.830261000000007 -37.969161999999997,174.828033000000005 -37.976661999999997,174.828583000000009 -37.995002999999997,174.822754000000003 -37.999724999999998,174.814696999999995 -38.002502,174.804137999999995 -38.001944999999999,174.797211000000004 -37.998336999999999,174.791077 -37.993614,174.786376999999987 -37.988334999999999,174.783874999999995 -37.980826999999998,174.783600000000007 -37.971663999999997,174.788025000000005 -37.868332000000002,174.788879000000009 -37.860000999999997,174.791077 -37.852783000000002,174.795532000000009 -37.846947,174.819702000000007 -37.829169999999998,174.826629999999994 -37.825279000000002,174.841339000000005 -37.818610999999997,174.872741999999988 -37.806106999999997,174.883330999999998 -37.805,174.903045999999989 -37.807502999999997,174.945251000000013 -37.810555,174.967467999999997 -37.809165999999998,174.975525000000005 -37.806389000000003,174.974975999999998 -37.75,174.974670000000003 -37.740836999999999,174.966644000000002 -37.739998,174.951355000000007 -37.743057,174.94442699999999 -37.745002999999997,174.93081699999999 -37.752502,174.906921000000011 -37.774169999999998,174.870789000000002 -37.783057999999997,174.861633000000012 -37.785004,174.848297000000002 -37.769722000000002,174.828307999999993 -37.710830999999999,174.764160000000004 -37.527779000000002,174.744415000000004 -37.487502999999997,174.724975999999998 -37.447220000000002,174.717467999999997 -37.425002999999997,174.714690999999988 -37.408607000000003,174.714690999999988 -37.399445,174.719116000000014 -37.393616000000002,174.725799999999992 -37.389999000000003,174.744415000000004 -37.385834000000003,174.760528999999991 -37.380279999999999,174.767486999999988 -37.376389000000003,174.773041000000006 -37.371665999999998,174.831635000000006 -37.308052000000004,174.840789999999998 -37.296951,174.840515000000011 -37.291389000000002,174.82995600000001 -37.290557999999997,174.821899000000002 -37.291671999999998,174.812744000000009 -37.293616999999998,174.804687999999999 -37.296393999999999,174.797760000000011 -37.300277999999999,174.766083000000009 -37.321114,174.754700000000014 -37.330559,174.751373 -37.336945,174.744965000000008 -37.359169,174.740509000000003 -37.364722999999998,174.733582000000013 -37.368606999999997,174.724120999999997 -37.368889000000003,174.717194000000006 -37.365279999999998,174.711365 -37.360557999999997,174.701629999999994 -37.349724000000002,174.69442699999999 -37.336945,174.660187000000008 -37.273311999999997,174.645813000000004 -37.236389000000003,174.639709000000011 -37.224442000000003,174.599975999999998 -37.153885000000002,174.578307999999993 -37.115555,174.569976999999994 -37.103614999999998,174.555542000000003 -37.087502,174.551909999999992 -37.080832999999998,174.549712999999997 -37.073616,174.55304000000001 -37.067222999999998,174.558593999999999 -37.0625,174.568848000000003 -37.061385999999999,174.644135000000006 -37.061110999999997,174.661376999999987 -37.065551999999997,174.664977999999991 -37.071944999999999,174.666381999999999 -37.080283999999999,174.661925999999994 -37.085830999999999,174.650542999999999 -37.095275999999998,174.646087999999992 -37.100838000000003,174.648590000000013 -37.108055,174.703856999999999 -37.197777000000002,174.733856000000003 -37.196106,174.716644000000002 -37.154167,174.72357199999999 -37.150275999999998,174.87912 -37.088889999999999,174.887482000000006 -37.059165999999998,174.795532000000009 -37.023055999999997,174.804413000000011 -36.972220999999998,174.824982000000006 -36.960830999999999,174.829407000000003 -36.955002,174.83273299999999 -36.948608,174.828033000000005 -36.943053999999997,174.818848000000003 -36.941383000000002,174.770263999999997 -36.936661,174.696625000000012 -36.93972,174.686095999999992 -36.940834000000002,174.659697999999992 -36.947495000000004,174.653045999999989 -36.951393000000003,174.641662999999994 -36.960830999999999,174.622467 -36.982216,174.619110000000006 -36.988892,174.617187999999999 -36.996108999999997,174.600525000000005 -37.022224,174.524688999999995 -37.045555,174.515533000000005 -37.045555,174.508605999999986 -37.041946000000003,174.502472000000012 -37.037506,174.498016000000007 -37.031944000000003,174.490783999999991 -37.019165,174.484679999999997 -37.005561999999998,174.459228999999993 -36.944031000000003,174.451904000000013 -36.923889000000003,174.446930000000009 -36.909163999999997,174.443024000000008 -36.893616000000002,174.439147999999989 -36.868606999999997,174.436645999999996 -36.852226000000002,174.43386799999999 -36.835555999999997,174.427764999999994 -36.812775000000002,174.422760000000011 -36.798057999999997,174.416655999999989 -36.784171999999998,174.409697999999992 -36.771385000000002,174.406096999999988 -36.765006999999997,174.390533000000005 -36.740279999999998,174.344299000000007 -36.679336999999997,174.301085999999998 -36.62722,174.284973000000008 -36.612777999999999,174.267486999999988 -36.599167,174.236908 -36.568061999999998,174.208862000000011 -36.535277999999998,174.187744000000009 -36.496948000000003,174.17804000000001 -36.467498999999997,174.177764999999994 -36.458336000000003,174.178864000000004 -36.449997000000003,174.181091000000009 -36.442497000000003,174.184417999999994 -36.436110999999997,174.189972000000012 -36.431389000000003,174.196930000000009 -36.427779999999998,174.20495600000001 -36.428612,174.24383499999999 -36.440834000000002,174.251923000000005 -36.443610999999997,174.257751000000013 -36.448051,174.300262000000004 -36.515839,174.348846000000009 -36.601944000000003,174.367919999999998 -36.629165999999998,174.370728000000014 -36.6325,174.422484999999995 -36.667220999999998,174.430542000000003 -36.668059999999997,174.453033000000005 -36.651108,174.456359999999989 -36.644722000000002,174.465515000000011 -36.582779000000002,174.465515000000011 -36.532218999999998,174.442474000000004 -36.414718999999998,174.422211000000004 -36.366112,174.41885400000001 -36.370834000000002,174.391937000000013 -36.395004,174.384978999999987 -36.398887999999999,174.377166999999986 -36.401665,174.303864000000004 -36.395279000000002,174.296935999999988 -36.391669999999998,174.285247999999996 -36.3825,174.276916999999997 -36.370552000000004,174.26998900000001 -36.357779999999998,174.268585000000002 -36.349442000000003,174.268585000000002 -36.342224000000002,174.292205999999993 -36.316947999999996,174.299988000000013 -36.314163,174.308013999999986 -36.316947999999996,174.325531000000012 -36.330283999999999,174.334686000000005 -36.332222000000002,174.36883499999999 -36.331673000000002,174.376891999999998 -36.330832999999998,174.421248999999989 -36.310611999999999,174.50692699999999 -36.267220000000002,174.518311000000011 -36.258057,174.521636999999998 -36.251396,174.519135000000006 -36.245834000000002,174.505248999999992 -36.231383999999998,174.413299999999992 -36.263061999999998,174.378296000000006 -36.286667,174.364685000000009 -36.294167000000002,174.346619000000004 -36.298057999999997,174.336365 -36.298889000000003,174.305237000000005 -36.287506,174.365233999999987 -36.260002,174.442200000000014 -36.169724000000002,174.396087999999992 -36.144447,174.396362000000011 -36.151938999999999,174.394135000000006 -36.159163999999997,174.373290999999995 -36.206389999999999,174.369965000000008 -36.213057999999997,174.358856000000003 -36.222220999999998,174.345245000000006 -36.229720999999998,174.337463000000014 -36.232773000000002,174.33273299999999 -36.229163999999997,174.307738999999998 -36.176949,174.282745000000006 -36.121108999999997,174.274993999999992 -36.118332000000002,174.239409999999992 -36.111389000000003,174.229126000000008 -36.112502999999997,174.195251000000013 -36.131110999999997,174.188568000000004 -36.144165,174.185790999999995 -36.171944000000003,174.191345000000013 -36.176392,174.19830300000001 -36.18,174.217743000000013 -36.182502999999997,174.226898000000006 -36.182502999999997,174.236084000000005 -36.180557,174.244110000000006 -36.183059999999998,174.287749999999988 -36.210281000000002,174.312468999999993 -36.236663999999998,174.314696999999995 -36.243889000000003,174.267212 -36.270279000000002,174.259430000000009 -36.273055999999997,174.251373 -36.272499000000003,174.065796000000006 -36.168334999999999,173.999114999999989 -36.121108999999997,173.994415000000004 -36.115836999999999,173.99105800000001 -36.109444000000003,173.931091000000009 -35.981940999999999,173.938568000000004 -35.934998,173.947478999999987 -35.923889000000003,173.948577999999998 -35.915550000000003,173.946075000000008 -35.908051,173.913879000000009 -35.86972,173.908324999999991 -35.874442999999999,173.903870000000012 -35.879997000000003,173.904967999999997 -35.888336000000002,173.921356000000003 -36.003059,173.980804000000006 -36.121383999999999,173.987731999999994 -36.134171000000002,173.992461999999989 -36.139724999999999,174.124390000000005 -36.263618,174.176085999999998 -36.276947,174.180542000000003 -36.282501000000003,174.198853000000014 -36.343887000000002,174.199982000000006 -36.352226000000002,174.198028999999991 -36.368606999999997,174.194702000000007 -36.375275000000002,174.189147999999989 -36.379722999999998,174.115233999999987 -36.40361,174.089966000000004 -36.411385000000003,174.080811000000011 -36.409438999999999,174.06942699999999 -36.400275999999998,174.065796000000006 -36.393889999999999,174.057465000000008 -36.374718,174.049133000000012 -36.353614999999998,174.044433999999995 -36.338889999999999,174.039703000000003 -36.323334000000003,174.031096999999988 -36.293059999999997,174.020537999999988 -36.273887999999999,173.82607999999999 -36.032501000000003,173.737457000000006 -35.933608999999997,173.727172999999993 -35.923614999999998,173.590515000000011 -35.778053,173.398865 -35.573891000000003,173.395537999999988 -35.567504999999997,173.398865 -35.553612,173.446625000000012 -35.440277000000002,173.465789999999998 -35.429169000000002,173.501923000000005 -35.419724000000002,173.506378000000012 -35.425277999999999,173.540253000000007 -35.430832000000002,173.629943999999995 -35.356667000000002,173.65554800000001 -35.322502,173.65554800000001 -35.313332000000003,173.564147999999989 -35.278053,173.556091000000009 -35.280830000000002,173.551636000000002 -35.286391999999999,173.549712999999997 -35.302779999999998,173.549712999999997 -35.321114,173.551909999999992 -35.328612999999997,173.566924999999998 -35.344161999999997,173.568024000000008 -35.361671,173.566924999999998 -35.36972,173.559143000000006 -35.372771999999998,173.439696999999995 -35.376106,173.416077 -35.384444999999999,173.410247999999996 -35.388893000000003,173.391356999999999 -35.423057999999997,173.39498900000001 -35.449722,173.396087999999992 -35.458053999999997,173.392761000000007 -35.482773000000002,173.386382999999995 -35.523330999999999,173.380524000000008 -35.528053,173.37384 -35.524169999999998,173.306915000000004 -35.449165,173.237731999999994 -35.370277000000002,173.154144000000002 -35.276665,173.103302000000014 -35.226104999999997,173.09191899999999 -35.216942000000003,173.087463000000014 -35.211387999999999,173.09191899999999 -35.1875,173.098846000000009 -35.183608999999997,173.119110000000006 -35.185555,173.12802099999999 -35.1875,173.134704999999997 -35.191108999999997,173.14498900000001 -35.191940000000002,173.152771 -35.189163,173.163879000000009 -35.179169000000002,173.168578999999994 -35.173614999999998,173.18081699999999 -35.156104999999997,173.187468999999993 -35.143332999999998,173.191924999999998 -35.128334000000002,173.196349999999995 -35.104446000000003,173.197478999999987 -35.09639,173.198577999999998 -35.078887999999999,173.198577999999998 -35.051108999999997,173.193848000000003 -35.027222000000002,173.189423000000005 -35.012779000000002,173.179413000000011 -34.993332000000002,173.175812000000008 -34.986946000000003,173.159149000000014 -34.958336000000003,173.151093000000003 -34.946663,173.137755999999996 -34.93,172.947204999999997 -34.716942000000003,172.828033000000005 -34.584442000000003,172.812468999999993 -34.568893000000003,172.722473000000008 -34.495277000000002,172.739136000000002 -34.435555,172.900817999999987 -34.414718999999998,172.911925999999994 -34.414718999999998,173.020813000000004 -34.422226000000002,173.038879000000009 -34.436942999999999,173.043304000000006 -34.517775999999998,173.039977999999991 -34.522224,173.033324999999991 -34.525832999999999,173.024414000000007 -34.527779000000002,173.016662999999994 -34.52861,173.007476999999994 -34.526947,172.997467 -34.498336999999999,172.984130999999991 -34.472771000000002,172.961914000000007 -34.465279000000002,172.955230999999998 -34.468887000000002,172.908324999999991 -34.544167000000002,172.912749999999988 -34.549728000000002,172.923858999999993 -34.558891000000003,172.936095999999992 -34.567222999999998,172.973021999999986 -34.581116000000002,173.053314 -34.665550000000003,173.057738999999998 -34.680283000000003,173.110503999999992 -34.791389000000002,173.120789000000002 -34.810555,173.128570999999994 -34.822502,173.133026 -34.828055999999997,173.13857999999999 -34.832504,173.151916999999997 -34.839995999999999,173.213593000000003 -34.871941,173.242737000000005 -34.884726999999998,173.273314999999997 -34.940834000000002,173.268859999999989 -34.946387999999999,173.262206999999989 -34.959167,173.259978999999987 -34.966659999999997,173.258881000000002 -34.974716,173.259978999999987 -34.983055,173.264709000000011 -35.014449999999997,173.269135000000006 -35.019722000000002,173.317474000000004 -35.018889999999999,173.328583000000009 -35.009444999999999,173.358856000000003 -34.98111,173.36300700000001 -34.975555,173.366364000000004 -34.968887000000002,173.373259999999988 -34.936774999999997,173.371246000000014 -34.927444,173.400817999999987 -34.863334999999999,173.426085999999998 -34.82,173.450806 -34.807777000000002,173.500274999999988 -34.864722999999998,173.499114999999989 -34.871108999999997,173.492461999999989 -34.874718,173.452453999999989 -34.887779000000002,173.443297999999999 -34.889724999999999,173.433319000000012 -34.890555999999997,173.413025000000005 -34.888893000000003,173.405243000000013 -34.892502,173.399719000000005 -34.897224,173.399719000000005 -34.906387000000002,173.402190999999988 -34.913887000000003,173.411590999999987 -34.931778,173.419128 -34.945830999999998,173.426909999999992 -34.957779000000002,173.431641000000013 -34.963332999999999,173.44165000000001 -34.973328000000002,173.454131999999987 -34.981667000000002,173.467467999999997 -34.988892,173.475525000000005 -34.991669000000002,173.493286000000012 -34.995277000000002,173.541655999999989 -34.988608999999997,173.561645999999996 -34.958893000000003,173.562468999999993 -34.950836000000002,173.566924999999998 -34.936110999999997,173.572478999999987 -34.931389000000003,173.579131999999987 -34.927779999999998,173.589416999999997 -34.928612,173.83914200000001 -35.004173000000002,174.101074000000011 -35.121108999999997,174.098297000000002 -35.161667,174.091644000000002 -35.158051,174.056641000000013 -35.155555999999997,174.021911999999986 -35.164161999999997,174.008026 -35.207504,174.008026 -35.215004,174.011382999999995 -35.221381999999998,174.018311000000011 -35.224997999999999,174.093841999999995 -35.225273,174.100525000000005 -35.228881999999999,174.143585000000002 -35.328612999999997,174.208008000000007 -35.323334000000003,174.218018 -35.322226999999998,174.247741999999988 -35.27861,174.319976999999994 -35.232773000000002,174.383881000000002 -35.337775999999998,174.461638999999991 -35.445273999999998,174.491913000000011 -35.485275,174.575806 -35.601944000000003,174.577179 -35.610000999999997,174.577147999999994 -35.618088,174.569976999999994 -35.648055999999997,174.563292999999987 -35.651665,174.530272999999994 -35.649445,174.520263999999997 -35.648612999999997,174.513306 -35.645004,174.505248999999992 -35.642502,174.479126000000008 -35.641945,174.47357199999999 -35.646393000000003,174.474975999999998 -35.654716,174.518311000000011 -35.724167,174.523041000000006 -35.729438999999999,174.554137999999995 -35.750281999999999,174.561919999999986 -35.753059,174.583862000000011 -35.764724999999999,174.60244800000001 -35.844444000000003,174.596924 -35.849167,174.58914200000001 -35.851944000000003,174.577758999999986 -35.852226000000002,174.560790999999995 -35.847777999999998,174.554961999999989 -35.843330000000002,174.538574000000011 -35.819450000000003,174.523314999999997 -35.796669,174.519713999999993 -35.790283000000002,174.49105800000001 -35.769447,174.361908 -35.723328000000002,174.357451999999995 -35.72361,174.34857199999999 -35.734726000000002,174.346924 -35.833061,174.350525000000005 -35.839438999999999,174.35522499999999 -35.845001000000003,174.360779000000008 -35.849442000000003,174.381348000000003 -35.851112,174.384704999999997 -35.844718999999998,174.385528999999991 -35.828887999999999,174.391083000000009 -35.824173000000002,174.398865 -35.821387999999999,174.437468999999993 -35.822777000000002,174.476074000000011 -35.824173000000002,174.486358999999993 -35.824722,174.519713999999993 -35.844718999999998,174.525542999999999 -35.849167,174.524414000000007 -35.855559999999997,174.521362000000011 -35.862220999999998,174.501373 -35.889999000000003,174.496917999999994 -35.895553999999997,174.487182999999987 -35.915000999999997,174.495513999999986 -35.988608999999997,174.498016000000007 -35.994163999999998,174.514160000000004 -36.008614,174.56942699999999 -36.037224000000002,174.578583000000009 -36.038894999999997,174.587738000000002 -36.038894999999997,174.596619000000004 -36.036667,174.606902999999988 -36.037506,174.612731999999994 -36.042228999999999,174.622192000000013 -36.053055,174.62912 -36.065834000000002,174.629394999999988 -36.075004999999997,174.616364000000004 -36.100861000000002)),((171.185241999999988 -44.938332000000003,171.182129000000003 -44.94173,171.175017999999994 -44.949902000000002,171.167923000000002 -44.959850000000003,171.165436 -44.966599000000002,171.164703000000003 -44.970275999999998,171.163299999999992 -44.978332999999999,171.149719000000005 -44.996665999999998,171.07995600000001 -45.067222999999998,171.02664200000001 -45.103332999999999,170.975525000000005 -45.151108,170.966063999999989 -45.163055,170.961914000000007 -45.169167000000002,170.921630999999991 -45.243057,170.873566000000011 -45.358055,170.873290999999995 -45.367218,170.876891999999998 -45.373885999999999,170.871338000000009 -45.424171,170.859955000000014 -45.487502999999997,170.855804000000006 -45.493889000000003,170.750274999999988 -45.61972,170.674682999999987 -45.745002999999997,170.616913000000011 -45.839438999999999,170.55886799999999 -45.881667999999998,170.554413000000011 -45.888053999999997,170.555542000000003 -45.896110999999998,170.591063999999989 -45.894165,170.600525000000005 -45.891669999999998,170.608582000000013 -45.888053999999997,170.658600000000007 -45.858612,170.718018 -45.817504999999997,170.724670000000003 -45.813057,170.773314999999997 -45.782775999999998,170.781096999999988 -45.786391999999999,170.790802000000014 -45.806946000000003,170.790802000000014 -45.84639,170.788879000000009 -45.863892,170.783051 -45.878334000000002,170.776366999999993 -45.882773999999998,170.699982000000006 -45.911667,170.664429000000013 -45.908332999999999,170.57330300000001 -45.916663999999997,170.550536999999991 -45.919167000000002,170.484406000000007 -45.926949,170.452453999999989 -45.931946000000003,170.424408 -45.939438000000003,170.382721000000004 -45.956108,170.342467999999997 -45.97361,170.315246999999999 -45.991385999999999,170.309692000000013 -45.996948000000003,170.294433999999995 -46.013893000000003,170.281646999999992 -46.029442000000003,170.263610999999997 -46.051940999999999,170.256378000000012 -46.065551999999997,170.253051999999997 -46.081947,170.252472000000012 -46.09111,170.254424999999998 -46.107779999999998,170.252777000000009 -46.115836999999999,170.240783999999991 -46.146949999999997,170.237731999999994 -46.154167,170.226623999999987 -46.165000999999997,170.214416999999997 -46.174720999999998,170.193848000000003 -46.188048999999999,170.169433999999995 -46.198608,170.067748999999992 -46.246665999999998,169.911925999999994 -46.340279000000002,169.863585999999998 -46.371383999999999,169.858001999999999 -46.376663,169.849396000000013 -46.389442000000003,169.848021999999986 -46.416946000000003,169.849975999999998 -46.433326999999998,169.852172999999993 -46.440834000000002,169.853850999999992 -46.457504,169.850799999999992 -46.464722000000002,169.845245000000006 -46.469994,169.701904000000013 -46.558052000000004,169.631348000000003 -46.581947,169.458008000000007 -46.623328999999998,169.266388000000006 -46.656387000000002,169.133026 -46.670836999999999,169.107727000000011 -46.669167000000002,169.097197999999992 -46.666946000000003,169.084411999999986 -46.657501000000003,169.067200000000014 -46.635002,169.061919999999986 -46.675002999999997,169.053864000000004 -46.678612,169.008026 -46.680832000000002,168.883330999999998 -46.667777999999998,168.878296000000006 -46.661942000000003,168.861908 -46.628334000000002,168.862457000000006 -46.619446000000003,168.864409999999992 -46.611114999999998,168.864959999999996 -46.603889000000002,168.844970999999987 -46.563614,168.835784999999987 -46.560555,168.823853000000014 -46.561110999999997,168.733306999999996 -46.577499000000003,168.640533000000005 -46.603889000000002,168.633605999999986 -46.606392,168.614685000000009 -46.611114999999998,168.593018 -46.614165999999997,168.568848000000003 -46.615004999999996,168.516937000000013 -46.614165999999997,168.492737000000005 -46.613334999999999,168.442138999999997 -46.601500999999999,168.436630000000008 -46.599666999999997,168.446625000000012 -46.584003000000003,168.442200000000014 -46.575004999999997,168.454407000000003 -46.574447999999997,168.490509000000003 -46.573059,168.502472000000012 -46.574173000000002,168.506103999999993 -46.578887999999999,168.499114999999989 -46.583328000000002,168.505553999999989 -46.588051,168.551636000000002 -46.594444000000003,168.561371000000008 -46.591942000000003,168.566924999999998 -46.586661999999997,168.563599000000011 -46.580002,168.550812000000008 -46.570557,168.541655999999989 -46.567504999999997,168.391356999999999 -46.540000999999997,168.361908 -46.544449,168.353577 -46.547783000000003,168.351623999999987 -46.556106999999997,168.352172999999993 -46.564444999999999,168.362731999999994 -46.583885000000002,168.348236000000014 -46.582165000000003,168.352904999999993 -46.584499,168.359267999999986 -46.585830999999999,168.365082 -46.592666999999999,168.367248999999987 -46.596668,168.367599000000013 -46.601497999999999,168.364928999999989 -46.605331,168.35775799999999 -46.604500000000002,168.351409999999987 -46.603164999999997,168.275269000000009 -46.557777000000002,168.269135000000006 -46.535561,168.268311000000011 -46.529167,168.27664200000001 -46.525832999999999,168.286102 -46.523330999999999,168.307738999999998 -46.520553999999997,168.318297999999999 -46.520836000000003,168.318848000000003 -46.529167,168.321075000000008 -46.536667,168.328856999999999 -46.540557999999997,168.339416999999997 -46.539169,168.386658000000011 -46.497779999999999,168.392486999999988 -46.492226000000002,168.395537999999988 -46.485000999999997,168.396087999999992 -46.477775999999999,168.394135000000006 -46.470275999999998,168.37384 -46.421944000000003,168.36883499999999 -46.416106999999997,168.359679999999997 -46.415000999999997,168.350249999999988 -46.417503000000004,168.250274999999988 -46.400832999999999,168.211090000000013 -46.355277999999998,168.206085000000002 -46.351394999999997,168.194702000000007 -46.345551,168.185516000000007 -46.342498999999997,168.174988000000013 -46.340279000000002,168.116364000000004 -46.343612999999998,168.063873 -46.351669,167.955535999999995 -46.371383999999999,167.893035999999995 -46.387222,167.850799999999992 -46.399445,167.832184000000012 -46.398612999999997,167.824401999999992 -46.394447,167.753875999999991 -46.333885000000002,167.776916999999997 -46.312775000000002,167.781372000000005 -46.306389000000003,167.783600000000007 -46.298340000000003,167.781372000000005 -46.290840000000003,167.778045999999989 -46.284171999999998,167.701904000000013 -46.209442000000003,167.596924 -46.166389000000002,167.556641000000013 -46.156387000000002,167.546356000000003 -46.154167,167.534424 -46.152779000000002,167.483032000000009 -46.149726999999999,167.471069 -46.149994,167.460236000000009 -46.151389999999999,167.451904000000013 -46.154716,167.446075000000008 -46.159996,167.415526999999997 -46.204720000000002,167.356628 -46.254447999999996,167.280272999999994 -46.273055999999997,167.261108000000007 -46.267775999999998,167.238555999999988 -46.263893000000003,167.086638999999991 -46.240555,167.001373 -46.229163999999997,166.966063999999989 -46.224716,166.949982000000006 -46.223885000000003,166.915253000000007 -46.226104999999997,166.883026 -46.229996,166.836365 -46.232498,166.823028999999991 -46.231667000000002,166.768035999999995 -46.22361,166.726348999999999 -46.214165,166.717467999999997 -46.210830999999999,166.705230999999998 -46.201110999999997,166.670806999999996 -46.161667,166.67025799999999 -46.15361,166.684417999999994 -46.145004,166.693848000000003 -46.142775999999998,166.709411999999986 -46.135277000000002,166.738861000000014 -46.119163999999998,166.761230000000012 -46.093612999999998,166.784911999999991 -46.064945000000002,166.804748999999987 -46.033279,166.82995600000001 -46.003891000000003,166.854674999999986 -45.994163999999998,166.886932000000002 -45.990279999999998,166.943297999999999 -45.956108,166.949127000000004 -45.950836000000002,166.946930000000009 -45.945273999999998,166.939147999999989 -45.944716999999997,166.929687999999999 -45.947220000000002,166.836365 -45.981383999999998,166.828033000000005 -45.984444000000003,166.791350999999992 -46.005004999999997,166.785797000000002 -46.010283999999999,166.781096999999988 -46.016396,166.759308000000004 -46.035553,166.762969999999996 -46.038387,166.764969000000008 -46.042392999999997,166.763656999999995 -46.047221999999998,166.760162000000008 -46.050392000000002,166.740982000000002 -46.066059000000003,166.737793000000011 -46.066558999999998,166.670532000000009 -46.087218999999997,166.615783999999991 -46.090836000000003,166.613585999999998 -46.086387999999999,166.617461999999989 -46.059722999999998,166.621062999999992 -46.052498,166.640807999999993 -46.015006999999997,166.661652000000004 -45.991942999999999,166.625792999999987 -45.967216,166.492461999999989 -46.013061999999998,166.484406000000007 -46.014449999999997,166.474975999999998 -46.002785000000003,166.467194000000006 -45.990555,166.465239999999994 -45.983055,166.464690999999988 -45.839438999999999,166.468841999999995 -45.823059,166.472473000000008 -45.815834000000002,166.476898000000006 -45.809722999999998,166.537475999999998 -45.798889000000003,166.613861000000014 -45.801108999999997,166.652190999999988 -45.800277999999999,166.699982000000006 -45.798889000000003,166.881348000000003 -45.779998999999997,166.890807999999993 -45.777779000000002,166.974120999999997 -45.735000999999997,166.987182999999987 -45.709724,166.923034999999999 -45.705832999999998,166.912475999999998 -45.705275999999998,166.887482000000006 -45.705002,166.854126000000008 -45.707779000000002,166.825806 -45.714722000000002,166.809417999999994 -45.721381999999998,166.787475999999998 -45.689995000000003,166.775817999999987 -45.662773,166.81153900000001 -45.617942999999997,166.811217999999997 -45.613109999999999,166.812531000000007 -45.608111999999998,166.816710999999998 -45.605606000000002,166.869689999999991 -45.588779000000002,166.881026999999989 -45.586112999999997,166.88736 -45.585278000000002,166.895203000000009 -45.585608999999998,166.901366999999993 -45.587108999999998,166.912871999999993 -45.590946000000002,166.980255 -45.578612999999997,166.991913000000011 -45.580002,167.0 -45.576949999999997,167.005829000000006 -45.571671000000002,167.032470999999987 -45.527779000000002,167.041350999999992 -45.501396,166.989685000000009 -45.519165,166.891693000000004 -45.544724000000002,166.796875 -45.569389,166.791199000000006 -45.570720999999999,166.784836000000013 -45.571556,166.777023000000014 -45.571219999999997,166.710509999999999 -45.579445,166.704407000000003 -45.574447999999997,166.697204999999997 -45.554718,166.699127000000004 -45.546669,166.757476999999994 -45.425277999999999,166.801361000000014 -45.353614999999998,166.821625000000012 -45.320557,166.86883499999999 -45.279724000000002,166.880797999999999 -45.279167,167.008330999999998 -45.341667,167.038299999999992 -45.357779999999998,167.146941999999996 -45.427222999999998,167.16885400000001 -45.472496,167.205230999999998 -45.477775999999999,167.211914000000007 -45.475273,167.21414200000001 -45.467216,167.209411999999986 -45.461387999999999,167.173584000000005 -45.422775,167.158019999999993 -45.406661999999997,167.134978999999987 -45.386116,167.12912 -45.381385999999999,167.115509000000003 -45.372222999999998,167.097747999999996 -45.366112,167.087463000000014 -45.363616999999998,167.061645999999996 -45.345001000000003,167.051085999999998 -45.333328000000002,167.081421000000006 -45.325333,167.08407600000001 -45.321666999999998,167.092407000000009 -45.316498000000003,167.097243999999989 -45.314498999999998,167.114227 -45.310333,167.163574000000011 -45.302833999999997,167.169922000000014 -45.302998000000002,167.173584000000005 -45.305999999999997,167.176422000000002 -45.309330000000003,167.17756700000001 -45.313834999999997,167.212738000000002 -45.313332000000003,167.218841999999995 -45.318336000000002,167.232178000000005 -45.327224999999999,167.239685000000009 -45.331116000000002,167.248566000000011 -45.334167,167.260254000000003 -45.335830999999999,167.270813000000004 -45.334442000000003,167.301636000000002 -45.329445,167.309692000000013 -45.326110999999997,167.307738999999998 -45.318610999999997,167.300262000000004 -45.314444999999999,167.19464099999999 -45.271445999999997,167.138290000000012 -45.268943999999998,167.099471999999992 -45.272114000000002,167.094146999999992 -45.271278000000002,167.08964499999999 -45.268776000000003,167.002196999999995 -45.201110999999997,166.996917999999994 -45.145836000000003,167.146362000000011 -45.001671000000002,167.198577999999998 -44.956108,167.204407000000003 -44.951110999999997,167.228302000000014 -44.930832000000002,167.24105800000001 -44.921387000000003,167.260528999999991 -44.907501000000003,167.267486999999988 -44.903053,167.312744000000009 -44.875,167.320800999999989 -44.871383999999999,167.393462999999997 -44.862999000000002,167.398987000000005 -44.861496000000002,167.404312000000004 -44.863498999999997,167.421798999999993 -44.894168999999998,167.422974000000011 -44.898665999999999,167.420638999999994 -44.908496999999997,167.417968999999999 -44.912166999999997,167.440796000000006 -44.928612,167.439972000000012 -44.9375,167.441924999999998 -44.945,167.459686000000005 -44.99472,167.497741999999988 -45.003891000000003,167.507202000000007 -45.001396,167.508224000000013 -45.0,167.511658000000011 -44.995277000000002,167.511108000000007 -44.986946000000003,167.47908000000001 -44.903446000000002,167.465912000000003 -44.876441999999997,167.462752999999992 -44.867947,167.461578000000003 -44.863444999999999,167.460097999999988 -44.853946999999998,167.459411999999986 -44.843944999999998,167.459914999999995 -44.838444000000003,167.448577999999998 -44.795279999999998,167.453033000000005 -44.788894999999997,167.458587999999992 -44.783614999999998,167.59970100000001 -44.683883999999999,167.743010999999996 -44.611671,167.838866999999993 -44.498610999999997,167.850249999999988 -44.488052000000003,167.949982000000006 -44.40361,167.963593000000003 -44.395004,168.034973000000008 -44.353614999999998,168.12802099999999 -44.316947999999996,168.141662999999994 -44.308052000000004,168.144713999999993 -44.300834999999999,168.144135000000006 -44.292503000000004,168.124099999999999 -44.251404,168.143311000000011 -44.253059,168.153594999999996 -44.251396,168.169708000000014 -44.24472,168.288299999999992 -44.172775,168.29385400000001 -44.167503000000004,168.336638999999991 -44.123885999999999,168.339966000000004 -44.116661,168.337738000000002 -44.109169,168.334411999999986 -44.102783000000002,168.336365 -44.094444000000003,168.369689999999991 -44.043334999999999,168.374968999999993 -44.037781000000003,168.383026 -44.034447,168.402771 -44.029724000000002,168.672211000000004 -43.987777999999999,168.676909999999992 -43.993614,168.683043999999995 -43.998336999999999,168.690246999999999 -44.002228000000002,168.715239999999994 -44.012222,168.723021999999986 -44.012504999999997,168.753875999999991 -44.010002,168.764160000000004 -44.008614,168.824401999999992 -43.988334999999999,168.858582000000013 -43.976661999999997,168.866364000000004 -43.973328000000002,168.879669000000007 -43.964447,168.885254000000003 -43.959167,168.961914000000007 -43.90361,169.080765000000014 -43.848472999999998,169.142212 -43.794167000000002,169.224396000000013 -43.743332000000002,169.271636999999998 -43.722496,169.387482000000006 -43.679169000000002,169.491318000000007 -43.643467,169.539153999999996 -43.633614,169.62661700000001 -43.613892,169.64498900000001 -43.608893999999999,169.652771 -43.605559999999997,169.660521999999986 -43.601944000000003,169.721619000000004 -43.573334000000003,169.728302000000014 -43.568893000000003,169.739136000000002 -43.558052000000004,169.767486999999988 -43.522773999999998,169.790526999999997 -43.496665999999998,169.871062999999992 -43.406661999999997,169.884154999999993 -43.397781000000002,169.961638999999991 -43.371941,170.021911999999986 -43.352500999999997,170.028594999999996 -43.347777999999998,170.033874999999995 -43.342498999999997,170.038025000000005 -43.336112999999997,170.049408 -43.306946000000003,170.111358999999993 -43.254173000000002,170.288299999999992 -43.107779999999998,170.418029999999987 -43.052498,170.523041000000006 -43.010559,170.531921000000011 -43.008057,170.583037999999988 -42.990555,170.674347000000012 -42.958739999999999,170.704407000000003 -42.945830999999998,170.750549000000007 -42.924720999999998,170.781096999999988 -42.910553,170.794128 -42.901389999999999,171.065796000000006 -42.648055999999997,171.108306999999996 -42.608055,171.149719000000005 -42.563614,171.153594999999996 -42.55722,171.196075000000008 -42.476661999999997,171.225799999999992 -42.433608999999997,171.230255 -42.40889,171.235779000000008 -42.394165,171.247467 -42.375,171.260254000000003 -42.366112,171.270537999999988 -42.355003000000004,171.297760000000011 -42.310279999999999,171.304413000000011 -42.296669,171.309692000000013 -42.281944000000003,171.31665000000001 -42.249724999999998,171.321075000000008 -42.224716,171.322754000000003 -42.207222000000002,171.324401999999992 -42.18972,171.326355000000007 -42.172226000000002,171.329131999999987 -42.155830000000002,171.343841999999995 -42.110832000000002,171.361084000000005 -42.067779999999999,171.461638999999991 -41.859726000000002,171.51080300000001 -41.764449999999997,171.533051 -41.766396,171.557738999999998 -41.766663,171.569121999999993 -41.766112999999997,171.650817999999987 -41.761391000000003,171.663025000000005 -41.757781999999999,171.685790999999995 -41.746948000000003,171.790526999999997 -41.696387999999999,171.85522499999999 -41.652779000000002,171.886658000000011 -41.629997000000003,171.942200000000014 -41.550277999999999,172.02276599999999 -41.443053999999997,172.053864000000004 -41.417503000000004,172.064972000000012 -41.40361,172.122192000000013 -41.277779000000002,172.111633000000012 -41.236114999999998,172.10522499999999 -41.153053,172.106078999999994 -40.911385000000003,172.10635400000001 -40.893059,172.108856000000003 -40.885559,172.113861000000014 -40.879997000000003,172.186645999999996 -40.813332000000003,172.218567000000007 -40.785834999999999,172.22470100000001 -40.781109,172.255248999999992 -40.776947,172.263884999999988 -40.774169999999998,172.271362000000011 -40.770553999999997,172.299408 -40.755004999999997,172.348297000000002 -40.727493000000003,172.382721000000004 -40.698334000000003,172.426909999999992 -40.657775999999998,172.478302000000014 -40.613892,172.513320999999991 -40.598441999999999,172.517639000000003 -40.596783000000002,172.523482999999999 -40.597946,172.522644000000014 -40.602943000000003,172.521132999999992 -40.607277000000003,172.520813000000004 -40.625,172.519440000000003 -40.631385999999999,172.525542999999999 -40.6325,172.534149000000014 -40.631667999999998,172.571899000000002 -40.617775000000002,172.596343999999988 -40.601394999999997,172.62802099999999 -40.573891000000003,172.631621999999993 -40.567222999999998,172.631621999999993 -40.559998,172.608582000000013 -40.556946000000003,172.601348999999999 -40.558891000000003,172.597014999999999 -40.553333000000002,172.589690999999988 -40.558838000000002,172.583862000000011 -40.560004999999997,172.581024000000014 -40.556671,172.581848000000008 -40.551665999999997,172.589843999999999 -40.541172000000003,172.627166999999986 -40.511947999999997,172.633330999999998 -40.509171000000002,172.661376999999987 -40.502785000000003,172.712188999999995 -40.495552000000004,172.817748999999992 -40.504173000000002,172.861358999999993 -40.507781999999999,172.981628 -40.527222000000002,172.991332999999997 -40.529167,172.989959999999996 -40.53389,172.978026999999997 -40.53389,172.945251000000013 -40.530830000000002,172.895263999999997 -40.524445,172.797211000000004 -40.516112999999997,172.739959999999996 -40.516945,172.731628 -40.519722000000002,172.656921000000011 -40.653328000000002,172.701355000000007 -40.748336999999999,172.855804000000006 -40.853057999999997,172.865509000000003 -40.853057999999997,172.875244000000009 -40.851112,172.907195999999999 -40.828887999999999,172.930266999999986 -40.802222999999998,172.935241999999988 -40.796669,172.976623999999987 -40.781944000000003,172.985229000000004 -40.781112999999998,173.002196999999995 -40.786667,173.008330999999998 -40.791114999999998,173.013306 -40.796669,173.020537999999988 -40.809722999999998,173.051085999999998 -40.869446000000003,173.059692000000013 -40.962775999999998,173.059692000000013 -40.971938999999999,173.056091000000009 -40.978606999999997,173.031646999999992 -41.027495999999999,173.075806 -41.291114999999998,173.079680999999994 -41.297500999999997,173.085784999999987 -41.302222999999998,173.105529999999987 -41.313332000000003,173.168029999999987 -41.316108999999997,173.188873 -41.313332000000003,173.198853000000014 -41.311385999999999,173.207184000000012 -41.308608999999997,173.272217000000012 -41.274445,173.278320000000008 -41.269722000000002,173.32607999999999 -41.222496,173.340515000000011 -41.205832999999998,173.351623999999987 -41.195549,173.377166999999986 -41.178055,173.426085999999998 -41.150275999999998,173.598021999999986 -41.053612,173.606628 -41.052498,173.639709000000011 -41.073616,173.672760000000011 -41.070557,173.720519999999993 -41.060279999999999,173.727753000000007 -41.056389000000003,173.739959999999996 -41.047226000000002,173.744689999999991 -41.032501000000003,173.743286000000012 -41.024169999999998,173.738281 -41.018608,173.72744800000001 -41.019447,173.718841999999995 -41.022499000000003,173.696930000000009 -41.033614999999998,173.690796000000006 -41.038338000000003,173.682189999999991 -41.041114999999998,173.676085999999998 -41.036391999999999,173.673584000000005 -41.029167,173.674682999999987 -41.020836000000003,173.678314 -41.014449999999997,173.696625000000012 -41.000281999999999,173.751373 -40.976944000000003,173.800262000000004 -40.969161999999997,173.913299999999992 -40.931671,173.984679999999997 -40.896949999999997,173.994415000000004 -40.896667,174.02276599999999 -40.913055,174.027771 -40.91861,174.030272999999994 -40.925834999999999,174.03054800000001 -40.935271999999998,174.02941899999999 -40.943610999999997,174.022217000000012 -40.947220000000002,173.929961999999989 -40.992226000000002,173.832184000000012 -40.995002999999997,173.821075000000008 -40.994163999999998,173.782195999999999 -41.009171000000002,173.778594999999996 -41.015555999999997,173.769713999999993 -41.09861,173.778594999999996 -41.114449,173.794433999999995 -41.109444000000003,173.822204999999997 -41.080832999999998,173.821899000000002 -41.062218,173.836638999999991 -41.055,173.846343999999988 -41.053055,173.93081699999999 -41.049446000000003,173.946625000000012 -41.055832000000002,173.953033000000005 -41.060555,173.917755 -41.087502,173.887482000000006 -41.103332999999999,173.848846000000009 -41.144165,173.820526 -41.245834000000002,173.763306 -41.267502,173.76080300000001 -41.273055999999997,173.775817999999987 -41.289726000000002,173.788025000000005 -41.290557999999997,173.806365999999997 -41.289444000000003,174.03720100000001 -41.218330000000002,174.09970100000001 -41.198334000000003,174.128845000000013 -41.187218,174.133605999999986 -41.181671,174.133605999999986 -41.176108999999997,174.126068000000004 -41.174171,174.008605999999986 -41.175277999999999,174.001099000000011 -41.178885999999999,174.001373 -41.186385999999999,174.000274999999988 -41.194716999999997,173.993010999999996 -41.198334000000003,173.981902999999988 -41.199440000000003,173.932738999999998 -41.199997000000003,173.908324999999991 -41.199997000000003,173.899719000000005 -41.197495000000004,173.893585000000002 -41.192771999999998,173.887206999999989 -41.169724000000002,173.88580300000001 -41.161667,173.888031000000012 -41.154167,173.89776599999999 -41.133614,173.902466000000004 -41.128334000000002,174.032745000000006 -40.999724999999998,174.084411999999986 -41.021385000000002,174.094116000000014 -41.023330999999999,174.246338000000009 -41.044724000000002,174.258330999999998 -41.035277999999998,174.299408 -41.003616,174.315246999999999 -41.000557,174.323853000000014 -41.003334000000002,174.323853000000014 -41.010834000000003,174.321625000000012 -41.018059,174.209960999999993 -41.197495000000004,174.161376999999987 -41.225555,174.152771 -41.226661999999997,174.114685000000009 -41.231383999999998,174.052185000000009 -41.235000999999997,174.02664200000001 -41.236114999999998,174.053864000000004 -41.254173000000002,174.206359999999989 -41.269447,174.214966000000004 -41.266663,174.291655999999989 -41.238892,174.303588999999988 -41.229720999999998,174.320800999999989 -41.220275999999998,174.326904000000013 -41.222771000000002,174.288574000000011 -41.276947,174.249114999999989 -41.322502,174.241637999999995 -41.326110999999997,174.231902999999988 -41.328055999999997,174.208587999999992 -41.329445,174.193572999999986 -41.320281999999999,174.155243000000013 -41.305,174.148041000000006 -41.308608999999997,174.111633000000012 -41.336661999999997,174.052764999999994 -41.421112,174.049133000000012 -41.427779999999998,174.044433999999995 -41.442497000000003,174.045806999999996 -41.450836000000002,174.049988000000013 -41.466392999999997,174.063873 -41.493057,174.084136999999998 -41.526108,174.097473000000008 -41.519447,174.096069 -41.511116,174.100799999999992 -41.505561999999998,174.108306999999996 -41.509171000000002,174.114685000000009 -41.513893000000003,174.125792999999987 -41.523887999999999,174.151093000000003 -41.551392,174.176085999999998 -41.578612999999997,174.178864000000004 -41.586112999999997,174.179961999999989 -41.594444000000003,174.179137999999995 -41.602783000000002,174.174133000000012 -41.608336999999999,174.163299999999992 -41.618606999999997,174.157195999999999 -41.623328999999998,174.193024000000008 -41.685555,174.287749999999988 -41.734444000000003,174.291655999999989 -41.740836999999999,174.289153999999996 -41.748336999999999,174.283324999999991 -41.762222,174.236358999999993 -41.837218999999997,174.212188999999995 -41.865279999999998,174.201355000000007 -41.875557,174.184143000000006 -41.890555999999997,174.17804000000001 -41.895004,174.164703000000003 -41.90361,174.157195999999999 -41.907218999999998,174.143585000000002 -41.915832999999999,174.088561999999996 -41.957779000000002,174.009154999999993 -42.027495999999999,173.979674999999986 -42.061110999999997,173.965239999999994 -42.086945,173.959136999999998 -42.100838000000003,173.954407000000003 -42.115555,173.953307999999993 -42.123885999999999,173.953583000000009 -42.133330999999998,173.956359999999989 -42.166389000000002,173.933319000000012 -42.196944999999999,173.928314 -42.202499000000003,173.884154999999993 -42.243614,173.87802099999999 -42.248055,173.870513999999986 -42.251944999999999,173.86300700000001 -42.255561999999998,173.834686000000005 -42.271385000000002,173.801361000000014 -42.293059999999997,173.794983000000002 -42.297500999999997,173.568572999999986 -42.476944000000003,173.558593999999999 -42.487777999999999,173.541350999999992 -42.511947999999997,173.533874999999995 -42.525002,173.531372000000005 -42.532218999999998,173.500823999999994 -42.599724000000002,173.480804000000006 -42.621941,173.466063999999989 -42.656944000000003,173.459960999999993 -42.670836999999999,173.448853000000014 -42.690277000000002,173.387755999999996 -42.793616999999998,173.351623999999987 -42.840836000000003,173.328033000000005 -42.898887999999999,173.328033000000005 -42.906387000000002,173.325806 -42.913612,173.285521999999986 -42.958053999999997,173.106902999999988 -43.057777000000002,173.099396000000013 -43.061385999999999,173.090515000000011 -43.064444999999999,173.026366999999993 -43.081947,172.975799999999992 -43.09111,172.953033000000005 -43.092773,172.935516000000007 -43.098334999999999,172.92025799999999 -43.105834999999999,172.838012999999989 -43.148055999999997,172.818024000000008 -43.160828000000002,172.797760000000011 -43.183059999999998,172.772217000000012 -43.219718999999998,172.76080300000001 -43.239165999999997,172.758026 -43.246665999999998,172.726944000000003 -43.415539000000003,172.726593000000008 -43.423355,172.775817999999987 -43.612220999999998,172.894135000000006 -43.61972,172.90554800000001 -43.620834000000002,173.059692000000013 -43.653053,173.100525000000005 -43.697220000000002,173.105529999999987 -43.703612999999997,173.114409999999992 -43.741385999999999,173.116913000000011 -43.762504999999997,173.116913000000011 -43.769996999999996,173.112182999999987 -43.825004999999997,173.110779000000008 -43.833328000000002,173.091644000000002 -43.856392,173.058593999999999 -43.871108999999997,173.006088000000005 -43.869498999999998,173.002242999999993 -43.868999000000002,172.999236999999994 -43.865668999999997,172.990905999999995 -43.849670000000003,172.965239999999994 -43.802222999999998,172.961365 -43.764449999999997,172.958862000000011 -43.756950000000003,172.951355000000007 -43.755279999999999,172.939972000000012 -43.756110999999997,172.927185000000009 -43.766112999999997,172.921906000000007 -43.771667,172.920532000000009 -43.824173000000002,172.920532000000009 -43.833328000000002,172.917572000000007 -43.869221000000003,172.923584000000005 -43.875884999999997,172.931243999999992 -43.881390000000003,172.937408000000005 -43.887886000000002,172.938904000000008 -43.892384,172.938247999999987 -43.896220999999997,172.870789000000002 -43.904442000000003,172.861633000000012 -43.901389999999999,172.811919999999986 -43.882216999999997,172.804413000000011 -43.878334000000002,172.745789000000002 -43.837775999999998,172.740783999999991 -43.832222000000002,172.736908 -43.825836000000002,172.715239999999994 -43.808334000000002,172.642761000000007 -43.772224,172.513031000000012 -43.729438999999999,172.495238999999998 -43.723885000000003,172.483582000000013 -43.722771000000002,172.472197999999992 -43.72361,172.424988000000013 -43.733612,172.413299999999992 -43.743614,172.390258999999986 -43.763893000000003,172.384978999999987 -43.77861,172.382445999999987 -43.795006,172.383330999999998 -43.8125,172.384704999999997 -43.820838999999999,172.394713999999993 -43.850281000000003,172.393311000000011 -43.858612,172.386932000000002 -43.863334999999999,172.367461999999989 -43.867775000000002,172.297211000000004 -43.881110999999997,172.286925999999994 -43.883057,172.275542999999999 -43.883887999999999,172.189696999999995 -43.909163999999997,172.050812000000008 -43.965279000000002,171.978577 -43.995834000000002,171.955230999999998 -44.006667999999998,171.941070999999994 -44.015006999999997,171.782470999999987 -44.076949999999997,171.654694000000006 -44.122498,171.583587999999992 -44.153885000000002,171.547211000000004 -44.173889000000003,171.538483000000014 -44.178775999999999,171.355559999999997 -44.285491999999998,171.346465999999992 -44.292186999999998,171.342467999999997 -44.295555,171.319976999999994 -44.316391000000003,171.293578999999994 -44.343612999999998,171.285521999999986 -44.356392,171.278594999999996 -44.369995000000003,171.271911999999986 -44.383887999999999,171.269135000000006 -44.391112999999997,171.275542999999999 -44.395836000000003,171.279144000000002 -44.402495999999999,171.278594999999996 -44.420836999999999,171.277190999999988 -44.428885999999999,171.275542999999999 -44.437218,171.26998900000001 -44.451942000000003,171.263306 -44.465553,171.254974000000004 -44.478332999999999,171.214966000000004 -44.533057999999997,171.208313000000004 -44.537506,171.200531000000012 -44.541114999999998,171.196075000000008 -44.560279999999999,171.192200000000014 -44.645836000000003,171.193024000000008 -44.663330000000002,171.20495600000001 -44.700279000000002,171.21414200000001 -44.739165999999997,171.215239999999994 -44.747498,171.207184000000012 -44.851112,171.198577999999998 -44.919998,171.195800999999989 -44.927498,171.185241999999988 -44.938332000000003)))');
+INSERT INTO geoapp_country ("name", "mpoly") VALUES ('Texas', 'SRID=4326;MULTIPOLYGON (((-103.00243399999998 36.500397,-102.90421904194784 36.500393342967676,-102.8402359524855 36.500390960558398,-102.840235952479716 36.500390960558398,-102.840235952474345 36.500390960558398,-102.840235952468362 36.500390960558398,-102.840235952461725 36.500390960558398,-102.840235952455885 36.500390960558398,-102.792077446284736 36.500389167377229,-102.643207699865854 36.500383624214699,-102.366462330167067 36.500373319605465,-102.250452999999979 36.500368999999999,-102.24499 36.500703999999999,-102.162463000000002 36.500326,-102.12545 36.500323999999999,-102.124752896301885 36.500398159967887,-102.122066000000004 36.500684,-101.930244999999999 36.500526,-101.925344139375468 36.500484781341967,-101.914929315957153 36.500397187533892,-101.826564999999988 36.499653999999992,-101.826498 36.499535000000002,-101.81449312121488 36.499579719643286,-101.788110000000003 36.499678000000003,-101.783359000000004 36.499709000000003,-101.781987 36.499718,-101.780609999999982 36.499727,-101.779435000000007 36.499733999999997,-101.773235954788092 36.499732939140301,-101.709314000000006 36.499721999999998,-101.698684999999998 36.499507999999999,-101.653707999999995 36.499572999999998,-101.649966000000006 36.499572999999998,-101.623914999999997 36.499527999999998,-101.414793008557069 36.499417763984319,-101.392608849457574 36.499406069885133,-101.340061173170298 36.499378370041477,-101.085155999999984 36.499243999999997,-101.052418000000003 36.499562999999995,-101.04533099999999 36.499540000000003,-100.977087999999995 36.499594999999999,-100.936058000000003 36.499602000000003,-100.918513000000004 36.499620999999998,-100.884174000000002 36.499682,-100.884079999999997 36.499682,-100.859656999999984 36.499687000000002,-100.850840000000005 36.49969999999999,-100.824235999999999 36.499617999999998,-100.824218000000002 36.499617999999998,-100.80619 36.499673999999999,-100.806172000000004 36.499634,-100.802909 36.499620999999998,-100.802886 36.499620999999998,-100.761810999999994 36.499617999999998,-100.761810999999994 36.499580000000002,-100.724361999999999 36.499580000000002,-100.724361000000002 36.499558,-100.708625999999995 36.499552999999999,-100.708628000000004 36.499520999999994,-100.657762999999989 36.499482999999991,-100.657762999999989 36.499499999999998,-100.648342999999997 36.499495000000003,-100.648343999999994 36.499462999999999,-100.592613999999998 36.499468999999998,-100.592555999999988 36.499468999999998,-100.592551 36.499428999999999,-100.583539000000002 36.499482999999991,-100.583378999999994 36.499442999999999,-100.578113999999999 36.499462999999999,-100.578113999999999 36.499439000000002,-100.546144999999996 36.499343000000003,-100.531215000000003 36.499341,-100.531215000000003 36.499290000000002,-100.530478000000002 36.49924,-100.530314000000004 36.499357000000003,-100.522227 36.499290999999999,-100.441064999999995 36.499490000000002,-100.441063999999997 36.499462,-100.433959000000002 36.499456000000002,-100.421327999999988 36.499447000000004,-100.421300999999985 36.499487999999999,-100.413634000000002 36.499443999999997,-100.41355 36.499468999999998,-100.378634000000005 36.499516999999997,-100.378591999999998 36.499445,-100.35185199999998 36.499487000000002,-100.351841999999991 36.499473000000002,-100.334463999999997 36.49942,-100.334440999999998 36.49944,-100.324150000000003 36.499679,-100.311244999999985 36.499631,-100.311018000000004 36.499687999999999,-100.310642999999985 36.499642,-100.253572851827684 36.499638031344489,-100.181220999999994 36.499633000000003,-100.090020999999993 36.499634,-100.000405999999984 36.499701999999999,-100.0004059967807 36.499497793115623,-100.00040222345956 36.260147946939995,-100.000399000000002 36.055677000000003,-100.000396170268971 35.879197994164429,-100.000394020347557 35.745115995014778,-100.000391999999991 35.619115,-100.000390396259149 35.519130234823749,-100.000386875554753 35.299632926398459,-100.000386874882437 35.299591010324292,-100.000386852473085 35.298193905884737,-100.000384999999994 35.182701999999999,-100.000381972929958 34.852568985943549,-100.000381605014198 34.812443999872983,-100.000381000000004 34.746460999999996,-100.000381000000004 34.570853999999997,-100.000381000000004 34.570647,-100.000381000000004 34.560509000000003,-99.998254592787575 34.560446149085699,-99.997501461048799 34.560423888524269,-99.985833 34.560079000000002,-99.974761999999998 34.561317999999993,-99.971554999999995 34.562179,-99.965608000000003 34.565843999999998,-99.958898000000005 34.571271000000003,-99.957540999999992 34.572708999999996,-99.95755299999999 34.574168999999998,-99.956716999999998 34.576523999999992,-99.954566999999997 34.578195,-99.94571999999998 34.579273,-99.930492488760507 34.576894921075187,-99.930189904388058 34.576847666503667,-99.929333999999997 34.576714000000003,-99.923210999999995 34.574551999999997,-99.921801000000002 34.570253,-99.915771000000007 34.565975000000002,-99.914151070156151 34.564995899308187,-99.898943000000003 34.555804000000002,-99.896006999999997 34.555529999999997,-99.89376 34.554219000000003,-99.887146999999999 34.549047000000002,-99.885392392967745 34.547401436342639,-99.884583851343237 34.546643143067669,-99.87806651563541 34.540530839522475,-99.87650823800611 34.539069404005723,-99.874403 34.537095,-99.873254000000003 34.535350999999999,-99.872356999999994 34.532096000000003,-99.868953000000005 34.52761499999999,-99.867217250163094 34.525864500605081,-99.853065999999998 34.511592999999998,-99.832903999999985 34.500067999999999,-99.825324999999992 34.497596,-99.818185999999997 34.487839999999991,-99.818738999999979 34.484975999999996,-99.814544624457952 34.476663062301249,-99.814312999999984 34.476204000000003,-99.793683999999999 34.453893999999998,-99.783787954821193 34.445078397966533,-99.782985999999994 34.444364,-99.775743000000006 34.444225000000003,-99.774224411180043 34.443216449834381,-99.765598999999995 34.437488000000002,-99.764825999999999 34.436433999999998,-99.764881999999986 34.435265999999999,-99.767647999999994 34.431854,-99.767234000000002 34.430501999999997,-99.754248000000004 34.421288999999994,-99.740907000000007 34.414763,-99.735679661059166 34.413018903486261,-99.730348000000006 34.411239999999992,-99.720258999999999 34.406295,-99.719721039768913 34.405807854123296,-99.716415999999995 34.402814999999997,-99.715089000000006 34.400753999999999,-99.714231999999996 34.397821999999998,-99.714838 34.394523999999997,-99.712682 34.390928000000002,-99.707900999999993 34.387538999999997,-99.696461999999997 34.381036000000002,-99.678282999999979 34.379798999999998,-99.672337448339604 34.378003970284972,-99.671377000000007 34.377713999999997,-99.666676988468737 34.374633899592595,-99.665992000000003 34.374184999999997,-99.665404581506792 34.374094751646162,-99.662705000000003 34.373679999999993,-99.659863615570984 34.374283464835351,-99.659362000000002 34.374389999999998,-99.654194000000004 34.376519000000002,-99.649662000000006 34.379885000000002,-99.630904999999998 34.376007,-99.628541546335526 34.375150829397036,-99.624196999999995 34.373576999999997,-99.600026 34.374687999999999,-99.596322999999998 34.377136999999998,-99.587595999999991 34.385866999999998,-99.587235087741874 34.386377538370702,-99.585718954359294 34.388522226586467,-99.585441999999986 34.388914,-99.584530999999984 34.391204999999999,-99.585306000000003 34.398122,-99.584479999999985 34.407673000000003,-99.580059999999989 34.416652999999997,-99.574366999999995 34.418281,-99.569695999999993 34.418418000000003,-99.563067665646059 34.417445690943012,-99.562203999999994 34.417318999999999,-99.561530791054494 34.417028950664999,-99.555986000000004 34.414639999999999,-99.549242000000007 34.412714999999992,-99.529786 34.411451999999997,-99.528744576810823 34.411579971493573,-99.523649999999989 34.412205999999998,-99.517623999999998 34.414493999999991,-99.514279999999999 34.414034999999998,-99.499874999999989 34.409607999999999,-99.497090999999983 34.407730999999991,-99.494103999999993 34.404755000000002,-99.490425999999999 34.399693999999997,-99.487218999999982 34.397955000000003,-99.477547 34.396355,-99.477019613816751 34.396364300212412,-99.474810232095294 34.396403261641368,-99.472297823530695 34.396447566809115,-99.470968999999997 34.396470999999991,-99.463286816319666 34.393024688790533,-99.452647999999996 34.388252,-99.445020999999983 34.379891999999998,-99.440759999999997 34.374122999999997,-99.430994999999982 34.373413999999997,-99.43081720973791 34.373532661492725,-99.420432000000005 34.380464000000003,-99.408847999999992 34.372776000000002,-99.407167999999999 34.372605,-99.406018176721332 34.372844364351735,-99.404336527339453 34.373194441551952,-99.402959999999979 34.373480999999998,-99.399602999999999 34.375078999999999,-99.397253000000006 34.377870999999999,-99.396160718377317 34.383134276834824,-99.391492 34.405631,-99.393918999999997 34.415273999999989,-99.396488000000005 34.417290999999999,-99.396901999999997 34.418688000000003,-99.397009999999995 34.424002999999999,-99.395768462359129 34.43494110377263,-99.394955999999993 34.442098999999999,-99.381011 34.456935999999999,-99.376037841709419 34.458617501802458,-99.375365000000002 34.458844999999997,-99.369609999999994 34.458699000000003,-99.358795 34.455862999999994,-99.354671999999994 34.451856999999997,-99.35478257092818 34.450383391084422,-99.354837000000003 34.449657999999999,-99.356770999999995 34.446542,-99.357101999999998 34.444915000000002,-99.356712999999999 34.442143999999999,-99.350407000000004 34.437083,-99.342020261837703 34.431514649700844,-99.341336999999996 34.431061,-99.341016600261696 34.430906286427735,-99.334036999999995 34.427536000000003,-99.331050066208874 34.424666026137302,-99.328674000000007 34.422383000000004,-99.325094009617374 34.416010263301388,-99.324222000000006 34.414458000000003,-99.321411663781888 34.411055277053073,-99.319798627189357 34.409102230797522,-99.319605999999979 34.408869000000003,-99.318363000000005 34.408295999999993,-99.316372999999999 34.408204999999995,-99.308273999999997 34.410013999999997,-99.299098 34.414227999999994,-99.294647999999981 34.415373000000002,-99.289922000000004 34.414731000000003,-99.287844819286008 34.413958196831629,-99.264167 34.405149000000002,-99.261320999999981 34.403498999999996,-99.261255940568432 34.403158389836314,-99.260996786434447 34.401801622187399,-99.259199386422964 34.392391568987605,-99.258998120407611 34.391337867029385,-99.258979999999994 34.391243000000003,-99.259239630132384 34.391043961974496,-99.260703756811225 34.389921531074158,-99.261190999999997 34.389547999999998,-99.262646013804954 34.388906249865343,-99.264243556741917 34.388201635660714,-99.264508000000006 34.388084999999997,-99.271031915197597 34.387722560266795,-99.271781628057255 34.38768090955238,-99.273607516746409 34.387579471291865,-99.273957999999993 34.38756,-99.27534 34.386598999999997,-99.274925999999994 34.384903999999999,-99.271845396288441 34.382114976063626,-99.271280999999988 34.381603999999996,-99.258696 34.372633999999998,-99.254722 34.372405,-99.251407999999984 34.375079999999997,-99.248969000000002 34.375984000000003,-99.242944999999992 34.372667999999997,-99.239138083830497 34.366035888164781,-99.237232999999989 34.362716999999996,-99.237183660287812 34.362563767173611,-99.235448627455725 34.357175329079247,-99.234251999999984 34.353459,-99.233273999999994 34.344101000000002,-99.23260599999999 34.342379999999999,-99.229993999999991 34.340538000000002,-99.226152999999982 34.339725999999999,-99.221975 34.340020000000003,-99.219768999999999 34.341377,-99.217335000000006 34.341520000000003,-99.213134999999994 34.340369000000003,-99.210957832415772 34.336710386428308,-99.210716000000005 34.336303999999998,-99.20972399999998 34.324934999999996,-99.211600000000004 34.313969999999998,-99.213476 34.310671999999997,-99.213233598142949 34.308226764636807,-99.211647999999997 34.292231999999991,-99.211468055040228 34.291676209875057,-99.209990337717599 34.287112032604114,-99.209742000000006 34.286344999999997,-99.209514950796304 34.286049346749877,-99.207560999999998 34.283504999999998,-99.203681000000003 34.281925999999999,-99.200221999999997 34.281151999999999,-99.196259999999995 34.281463000000002,-99.196052113016066 34.281264951942028,-99.19571031750732 34.280939333014615,-99.195605 34.280839,-99.194569999999985 34.272424,-99.196926000000005 34.260928999999997,-99.197153 34.244298,-99.19555299999999 34.24006,-99.191138999999993 34.23234,-99.190145999999984 34.229660000000003,-99.190036000000006 34.227186000000003,-99.192076 34.222192,-99.192683000000002 34.218825000000002,-99.192104 34.216693999999997,-99.189758414718312 34.214539281858485,-99.189510999999996 34.214312,-99.188483307800709 34.214128939694163,-99.159015999999994 34.20888,-99.143985 34.214762999999998,-99.138220000000004 34.219158999999998,-99.130609000000007 34.219408,-99.128513999999996 34.218766000000002,-99.127549000000002 34.217986000000003,-99.126614000000004 34.21532899999999,-99.127525000000006 34.213771,-99.130089999999996 34.212192000000002,-99.131552999999997 34.209352000000003,-99.131884999999997 34.207382000000003,-99.129791999999995 34.204402999999999,-99.126566999999994 34.203004,-99.119203999999996 34.201746999999997,-99.108757999999995 34.203400999999999,-99.102001344898341 34.205813362825268,-99.092190999999985 34.209316,-99.08119261238302 34.211229594305671,-99.079534999999993 34.211517999999991,-99.075978000000006 34.211221000000002,-99.06646499999998 34.208404000000002,-99.060343999999986 34.204760999999991,-99.059158999999994 34.202928999999997,-99.058800000000005 34.201256,-99.058083999999994 34.200569000000002,-99.048792000000006 34.198208999999999,-99.043470999999997 34.198208,-99.040961999999993 34.200842000000002,-99.039004000000006 34.204667,-99.037458999999998 34.206454,-99.036272999999994 34.206912000000003,-99.013074999999986 34.203221999999997,-99.005790000000005 34.206646999999997,-99.002916243275195 34.208781598893673,-99.002945441244265 34.209102775846141,-99.003147197273819 34.211322087284138,-99.003432988816769 34.214465787333673,-99.000760999999997 34.217643000000002,-98.99085199999999 34.221632999999997,-98.987293999999991 34.221223000000002,-98.981363999999999 34.217582999999991,-98.978684999999984 34.210231,-98.976586999999995 34.206291,-98.974131999999983 34.203566000000002,-98.969003 34.201298999999999,-98.966301999999999 34.201323000000002,-98.962469999999996 34.204667999999998,-98.962085000000002 34.206386000000002,-98.962306999999981 34.211312,-98.960791 34.213029999999996,-98.958474999999993 34.213854999999995,-98.952512999999982 34.212649999999996,-98.950395999999984 34.21168,-98.940219999999997 34.203685999999998,-98.928145 34.192689,-98.927456000000006 34.191155000000002,-98.923128999999989 34.185977999999999,-98.920704 34.183435000000003,-98.918333000000004 34.181831000000003,-98.909348999999992 34.177498999999997,-98.892677318093561 34.17250349095427,-98.87651287834953 34.167659972141138,-98.872921999999988 34.166584,-98.871543000000003 34.165026999999995,-98.871211000000002 34.163012000000002,-98.872229000000004 34.160446,-98.874954999999986 34.157031000000003,-98.874871999999996 34.155656999999998,-98.873271000000003 34.153596,-98.868116 34.149635000000004,-98.862549999999999 34.149110999999998,-98.860124999999996 34.149912999999998,-98.858418999999998 34.152732,-98.8579 34.159627,-98.857321999999982 34.161093999999999,-98.855585000000005 34.161620999999997,-98.854264541670545 34.16164976192438,-98.831114999999983 34.162154,-98.812953999999991 34.158444000000003,-98.806809999999984 34.155901,-98.804411553093104 34.153928907629435,-98.792015000000006 34.143735999999997,-98.779288744496085 34.140194111533035,-98.773070373738221 34.138463455122455,-98.767587610783494 34.136937528280072,-98.765569999999983 34.136375999999998,-98.764702233233265 34.135780085954792,-98.763778343962841 34.135145631382905,-98.761796999999987 34.133785000000003,-98.760558000000003 34.132387999999999,-98.759485999999995 34.128881999999997,-98.759653 34.126911999999997,-98.757118934362524 34.12470437936247,-98.757036999999983 34.124633000000003,-98.753813984496389 34.124468645349353,-98.749290999999999 34.124237999999998,-98.741966000000005 34.125529999999998,-98.740191287161664 34.126850584722824,-98.739461000000006 34.127394000000002,-98.737231999999992 34.130991999999999,-98.736819999999994 34.133374000000003,-98.735471000000004 34.135207999999999,-98.734286999999995 34.135758000000003,-98.730242646678789 34.1359250861193,-98.717536999999993 34.136450000000004,-98.716104 34.135947000000002,-98.70640034274598 34.134745066348501,-98.696517999999998 34.133521000000002,-98.690291400890658 34.133167457450512,-98.690072 34.133155000000002,-98.688275858887323 34.134465065675442,-98.685589983550884 34.136424083851644,-98.676900633591032 34.14276190388366,-98.676457484208683 34.143085127260051,-98.670573548505118 34.147376740066704,-98.655654999999982 34.158257999999996,-98.650582999999997 34.163113000000003,-98.648072999999997 34.164440999999997,-98.643223000000006 34.164530999999997,-98.635729999999995 34.161617999999997,-98.634085211037615 34.161100728840964,-98.630950281399748 34.160114822001631,-98.621666000000005 34.157195000000002,-98.620507214282355 34.157012478916968,-98.617663812339856 34.156564612849806,-98.616732999999996 34.156418000000002,-98.615748434938936 34.156446107485429,-98.612133570686254 34.156549305078279,-98.611829 34.156557999999997,-98.610173632571488 34.157093658210222,-98.610154152422197 34.157099961766605,-98.608852999999996 34.157521000000003,-98.603977999999998 34.160249,-98.599789 34.160570999999997,-98.577135999999996 34.148961999999997,-98.572451 34.145091,-98.560191000000003 34.133201999999997,-98.558593000000002 34.128253999999998,-98.550916999999998 34.119334000000002,-98.536257000000006 34.107343,-98.530610999999993 34.099843,-98.528199999999998 34.094960999999998,-98.504182 34.072370999999997,-98.487068052145446 34.063003092954936,-98.486783271268621 34.06284720836274,-98.486328 34.062598,-98.483944186894661 34.06241565608709,-98.482821069121968 34.062329745958955,-98.482039999999998 34.062269999999998,-98.475065999999998 34.064269000000003,-98.449033999999983 34.073461999999999,-98.446378999999993 34.075429999999997,-98.445784000000003 34.076827000000002,-98.445590305319797 34.079232123390703,-98.445584999999994 34.079298,-98.445259148452962 34.079797720749731,-98.443724000000003 34.082152,-98.442807999999999 34.083143999999997,-98.442148160210323 34.083427517317581,-98.441104460406791 34.083875970068213,-98.440092000000007 34.084311,-98.439068026005657 34.084479541105658,-98.434822808733685 34.08517828308225,-98.432126999999994 34.085622,-98.43151641213494 34.085605425226575,-98.43092946822253 34.085589492282431,-98.428479999999993 34.085523000000002,-98.425229999999999 34.084798999999997,-98.422252999999998 34.083036999999997,-98.419995 34.082487999999998,-98.419161945519861 34.082694545588339,-98.41804644206556 34.082971120917755,-98.417812999999995 34.083029000000003,-98.414426000000006 34.085073999999999,-98.400747497198822 34.098985940284976,-98.399776999999986 34.099972999999999,-98.398505572550647 34.104180252359392,-98.39838899999998 34.104565999999998,-98.398160000000004 34.121395999999997,-98.400493999999995 34.121777999999999,-98.400966999999994 34.122236,-98.398441000000005 34.128456,-98.384381000000005 34.146317000000003,-98.381237999999996 34.149453999999999,-98.367493999999994 34.156190999999993,-98.366862955318183 34.156357896864854,-98.364023000000003 34.157108999999998,-98.34173552164826 34.153594120579292,-98.339428832109121 34.153230340726623,-98.331172907733077 34.151928328079421,-98.326986688030772 34.151268134169193,-98.325445000000002 34.151024999999997,-98.324621914768684 34.150650086831803,-98.323612587945547 34.150190341106089,-98.322580000000002 34.149720000000002,-98.320651676675396 34.148059023851737,-98.318749999999994 34.146420999999997,-98.315432139066189 34.144301906683673,-98.312023538956254 34.142124858924547,-98.300208999999995 34.134579000000002,-98.299345719035045 34.134365643147696,-98.29862570169189 34.134187693395319,-98.293901000000005 34.133020000000002,-98.280321 34.130749999999999,-98.258217018239392 34.129574098564007,-98.256467 34.129480999999998,-98.254901718278489 34.129708262798985,-98.247953999999993 34.13071699999999,-98.241012999999995 34.133102999999998,-98.225282000000007 34.127245000000002,-98.223600000000005 34.125093,-98.216463000000005 34.121820999999997,-98.203710999999998 34.117676000000003,-98.200074999999998 34.116782999999998,-98.191455000000005 34.115752999999998,-98.169120000000007 34.114170999999999,-98.157411999999994 34.120466999999998,-98.154353999999998 34.122734,-98.142753999999996 34.136358999999999,-98.136769999999999 34.144992000000002,-98.130815999999996 34.150531999999998,-98.123377000000005 34.154539999999997,-98.114506000000006 34.154727,-98.109461999999979 34.154110999999993,-98.107064999999992 34.152531000000003,-98.101937000000007 34.146829999999994,-98.092021474678845 34.132735952269094,-98.090223999999992 34.130181,-98.089754999999982 34.128211,-98.090659999999986 34.12198,-98.092421000000002 34.116917,-98.095117999999999 34.11119,-98.096177285423778 34.109455137055363,-98.096466125075011 34.108982084942461,-98.099327999999986 34.104295,-98.101378023037029 34.101786489578267,-98.103538246996251 34.099143131812454,-98.104308999999986 34.098199999999999,-98.119416999999999 34.084474,-98.121038999999996 34.081265999999999,-98.120207999999991 34.072127000000002,-98.11802999999999 34.067064999999999,-98.114587 34.06228,-98.100919767943822 34.050244792175462,-98.099096110217346 34.048638900093685,-98.096177018664264 34.044625138601674,-98.096541898037387 34.040976263553816,-98.09727167092565 34.038969381040054,-98.097731364247636 34.038509687718062,-98.098001443813914 34.038239608151798,-98.102015208841422 34.03732738850595,-98.104022094890695 34.036232725638037,-98.104083244997014 34.036133356900422,-98.105481647738245 34.033860956680144,-98.105481647738245 34.032444902147553,-98.105481647738245 34.031306746267951,-98.103616999999986 34.029206999999992,-98.088202999999993 34.005481000000003,-98.085260000000005 34.003259,-98.082839000000007 34.002412,-98.055197000000007 33.995840999999999,-98.050169864666017 33.994989457544634,-98.041117 33.993456000000002,-98.027671999999981 33.993357000000003,-98.019485000000003 33.993803999999997,-98.018481521828946 33.993960861546498,-98.005667000000003 33.995964,-97.987387999999996 33.999822999999999,-97.982805999999997 34.001949000000003,-97.978243000000006 34.005386999999999,-97.974597608872358 34.00657735007583,-97.974172999999993 34.006715999999997,-97.973934144800623 34.006593661859519,-97.971670000000003 34.005434,-97.968339999999998 34.000529999999998,-97.965354903485249 33.996992503283089,-97.963375425210828 33.994646717187933,-97.96302799999998 33.994235000000003,-97.962715090700769 33.994009516348072,-97.958325000000002 33.990845999999998,-97.955849999999998 33.990136,-97.952687999999995 33.990113999999998,-97.947571999999994 33.991053,-97.946472999999997 33.990731999999994,-97.945729999999998 33.989839000000003,-97.945949999999982 33.988395999999995,-97.952184120103468 33.971402949359636,-97.95307606469359 33.968971674482539,-97.95691699999999 33.958502000000003,-97.960351000000003 33.951928000000002,-97.965737000000004 33.947392,-97.972662 33.944527,-97.974172999999993 33.942832000000003,-97.974062000000004 33.940289,-97.972493999999998 33.937907000000003,-97.971175000000002 33.937128999999999,-97.965952999999999 33.936191,-97.963425 33.936236999999998,-97.955511 33.938186000000002,-97.954466999999994 33.937773999999997,-97.953395 33.936444999999999,-97.952679000000003 33.929482,-97.953694999999996 33.924373000000003,-97.957155 33.914453999999999,-97.960615000000004 33.910353999999998,-97.961188664141474 33.909913087050903,-97.963139679674441 33.908413554571595,-97.964461 33.907398,-97.964803587866868 33.907309441163022,-97.9693952279504 33.906122503898267,-97.969873000000007 33.905999,-97.970298415583201 33.906261144464871,-97.973142999999993 33.908014,-97.976962999999998 33.912548999999999,-97.978803999999997 33.912548,-97.979984999999999 33.911402000000002,-97.983551999999989 33.904001999999991,-97.984539999999996 33.900703,-97.984566 33.899076999999998,-97.984416725907181 33.89872544733722,-97.984025057628415 33.897803036597892,-97.98383498894799 33.897355409354304,-97.983768999999995 33.897199999999991,-97.977858999999995 33.889929000000002,-97.974177999999995 33.886642999999999,-97.967776999999998 33.882429999999999,-97.958438 33.879179,-97.951215000000005 33.878424000000003,-97.946463999999992 33.878883000000002,-97.942729999999997 33.879845000000003,-97.938801999999995 33.879891,-97.936743000000007 33.879204,-97.933120450042608 33.877388671138185,-97.918328311832767 33.869976048610916,-97.905467000000002 33.863530999999995,-97.896737999999985 33.857984999999999,-97.877386999999999 33.850236000000002,-97.871447000000003 33.849001,-97.865764999999982 33.849392999999999,-97.835425213046037 33.857383352392631,-97.834333 33.857671000000003,-97.833886750888084 33.857971936447115,-97.833218553718808 33.858422547723912,-97.806802470257153 33.876236728393856,-97.805423000000005 33.877167,-97.803472999999997 33.880189999999999,-97.801578000000006 33.885137999999998,-97.784656999999982 33.890631999999997,-97.78061799999999 33.895533,-97.779683000000006 33.899242999999998,-97.780339999999995 33.904833000000004,-97.783716999999996 33.910559999999997,-97.772672 33.914382000000003,-97.765445999999997 33.913531999999989,-97.763769999999994 33.914240999999997,-97.762914903547767 33.914953098088951,-97.761142192227695 33.916429357685161,-97.760223999999994 33.917194000000002,-97.759399000000002 33.91881999999999,-97.759833999999984 33.92521,-97.762660999999994 33.930846000000003,-97.762767999999994 33.934396,-97.752956999999995 33.937049000000002,-97.738478 33.937421,-97.736553999999998 33.936574999999998,-97.735919542935619 33.936533987763056,-97.734773489745407 33.936459905200778,-97.733722999999998 33.936391999999998,-97.732266999999993 33.936691000000003,-97.725289000000004 33.941045000000003,-97.720699142354164 33.94461309292862,-97.716772000000006 33.947665999999998,-97.714693355370301 33.94981590741822,-97.712051708440285 33.952548118711093,-97.709683999999996 33.954996999999999,-97.708350195107343 33.95701014009046,-97.70415899999999 33.963335999999998,-97.69792099999998 33.977331,-97.69310999999999 33.983699,-97.688023 33.986606999999999,-97.671772000000004 33.991370000000003,-97.661489000000003 33.990817999999997,-97.656210000000002 33.989488,-97.633778000000007 33.981256999999999,-97.609091000000006 33.968093000000003,-97.589597999999995 33.953553999999997,-97.588828000000007 33.951881999999998,-97.591270649549756 33.930345579062646,-97.591514000000004 33.928199999999997,-97.595084 33.922953999999997,-97.596154999999996 33.922105999999999,-97.59697899999999 33.920228000000002,-97.597115000000002 33.917867999999999,-97.596955673755872 33.917077348335745,-97.596288999999985 33.913769000000002,-97.593782375104212 33.910260437761373,-97.589253999999997 33.903922,-97.587440999999984 33.902479,-97.582744000000005 33.900784999999999,-97.578907598302408 33.900207204108142,-97.558269999999993 33.897098999999997,-97.555002000000002 33.897281999999997,-97.551541 33.897947000000002,-97.543245999999996 33.901288999999998,-97.533617322522971 33.906127586572126,-97.532723000000004 33.906576999999999,-97.525277000000003 33.911750999999995,-97.519170999999986 33.913637999999999,-97.504870374844515 33.918353570482601,-97.500960000000006 33.919643,-97.495648860558163 33.919307898609453,-97.494857999999979 33.919257999999999,-97.492061582842766 33.918500058129531,-97.487115891787269 33.917159576320657,-97.48650499999998 33.916993999999995,-97.484158940985964 33.915822631562747,-97.460375999999982 33.903948,-97.458068999999995 33.901634999999999,-97.451065249608234 33.891558064966901,-97.450953999999996 33.891398000000002,-97.451469000000003 33.87093,-97.452287410342421 33.86882620086994,-97.455665873415143 33.860141550511862,-97.457616999999999 33.855125999999998,-97.459565999999995 33.853316,-97.461485999999994 33.849559999999997,-97.462857 33.841771999999999,-97.459067999999988 33.834581,-97.453056999999987 33.828536,-97.444192999999999 33.823773000000003,-97.426492999999994 33.819398,-97.410387 33.818845000000003,-97.403235695189224 33.818961304668854,-97.384901622687948 33.819259479377855,-97.372940999999997 33.819454,-97.368744000000007 33.821471000000003,-97.365506999999994 33.823762999999992,-97.358512999999988 33.830018000000003,-97.348337999999984 33.843876000000002,-97.340900078515631 33.860236176367188,-97.339391593410966 33.867629740388111,-97.337846311291798 33.870430566802547,-97.336524008254173 33.872827243260353,-97.33293952159849 33.874440259476913,-97.329175814777756 33.874440259476913,-97.327562805507441 33.873902588562437,-97.326564370247013 33.872737756024428,-97.326487449786001 33.872648016149064,-97.324157539016809 33.866016724171544,-97.322365295688968 33.864941382342593,-97.318243141591921 33.865120602507631,-97.31654836796514 33.865642075591225,-97.315913230822716 33.865837504006514,-97.314412999999988 33.866988999999997,-97.310479256695203 33.873361218982971,-97.307489695517361 33.878203969770759,-97.302471419756401 33.880175433263638,-97.299245387323282 33.880175433263638,-97.295170524880618 33.877119286431629,-97.294227111562321 33.876411726442917,-97.286921603026471 33.869423850720118,-97.28598279642199 33.868525862052032,-97.284253187903744 33.867526845294535,-97.279107999999979 33.864555000000003,-97.275347999999994 33.863225,-97.271531999999993 33.862560000000002,-97.257971626565464 33.863220416657512,-97.256624999999985 33.863286000000002,-97.255635999999996 33.863697999999999,-97.254234999999994 33.865322999999997,-97.249208999999993 33.875100999999994,-97.246418496348156 33.898356425448434,-97.246179999999981 33.900343999999997,-97.245398270620598 33.902084836575838,-97.245057441245748 33.90284383100218,-97.244945999999999 33.903092,-97.242092 33.906277000000003,-97.241794392023195 33.906436890220043,-97.238755934556053 33.908069304909361,-97.226522000000003 33.914642,-97.210920999999999 33.916063999999999,-97.210512235443105 33.915911440173737,-97.206141000000002 33.914279999999998,-97.185457999999997 33.9007,-97.180845000000005 33.895203999999993,-97.179608999999999 33.892249999999997,-97.170773789281327 33.861660975771436,-97.166629 33.847310999999998,-97.166824000000005 33.840395,-97.171627 33.835335,-97.180939422624874 33.831550006302521,-97.181369999999987 33.831375,-97.186254000000005 33.830894,-97.193690000000004 33.831307000000002,-97.195830999999998 33.830803000000003,-97.197477000000006 33.829794999999997,-97.199700000000007 33.827322000000002,-97.203513999999998 33.821824999999997,-97.204994999999997 33.81886999999999,-97.205652 33.809823999999999,-97.205556910941183 33.806237292333442,-97.205445103342427 33.802019970418343,-97.205431000000004 33.801487999999999,-97.205114487332324 33.800890302957832,-97.203236000000004 33.797342999999998,-97.194785999999993 33.785344000000002,-97.190397000000004 33.781153000000003,-97.187792000000002 33.769702000000002,-97.181842999999986 33.755869999999994,-97.173532726140948 33.740090726508434,-97.172577000695028 33.738276026602087,-97.172191999999995 33.737544999999997,-97.168438536634085 33.734131892706188,-97.163454368039083 33.729599677915004,-97.163149000000004 33.729322000000003,-97.162807288850388 33.729115696596551,-97.155066000000005 33.724442000000003,-97.152609597300682 33.723370138808036,-97.150103410774264 33.72227655424301,-97.149393999999987 33.721966999999999,-97.137529999999998 33.718663999999997,-97.126102000000003 33.716940999999998,-97.121101999999993 33.717174,-97.119522126797463 33.717502594273334,-97.114921749218269 33.718459416457094,-97.113264999999998 33.718803999999999,-97.112398501853761 33.719102240295193,-97.110065570752283 33.719905212653977,-97.108936 33.720294000000003,-97.108097026518521 33.720734123472262,-97.106518853348803 33.721562029324609,-97.104524999999995 33.722608,-97.097154000000003 33.727809,-97.094085000000007 33.730992,-97.092697209381924 33.732891057656268,-97.092130098039192 33.733667094850453,-97.091071999999983 33.735115,-97.089936943375889 33.737167271747261,-97.087911027802278 33.740830286618703,-97.086195000000004 33.743932999999998,-97.084820762198987 33.752363244406453,-97.084693 33.753146999999998,-97.08461299999999 33.759993,-97.085217999999998 33.765512,-97.087362453285593 33.77250304797397,-97.087851999999998 33.774099,-97.093101265647221 33.787040841586602,-97.093917000000005 33.789051999999998,-97.094675961767678 33.791977368936216,-97.095047178759813 33.793408200769441,-97.095235999999986 33.794136000000002,-97.095080023591905 33.79561056406444,-97.094877682854474 33.797523445530629,-97.094770999999994 33.798532000000002,-97.093897185962049 33.800360798466031,-97.09266432242093 33.802941048788071,-97.092111999999986 33.804096999999999,-97.087998999999982 33.808746999999997,-97.078589999999991 33.812755999999993,-97.067977124183287 33.814475679891196,-97.064604445188394 33.815487484896828,-97.062631847535258 33.816079264957295,-97.058622892638837 33.818751903281317,-97.055415722506638 33.823829921794093,-97.055412197115942 33.8238546000754,-97.055148464371385 33.82570077017467,-97.055682980641905 33.830778788687446,-97.057821087157734 33.834520485448607,-97.058282726048489 33.836367011192308,-97.058622892638837 33.837727655580807,-97.057553829022481 33.840133030590344,-97.055415722506638 33.841202089027483,-97.052208542016004 33.841736615656437,-97.048734113748537 33.840934820533782,-97.045339940802535 33.839496399893775,-97.041245000000004 33.837761,-97.038858000000005 33.838264000000002,-97.023899 33.844213000000003,-97.017857000000006 33.850141999999998,-97.010381749407998 33.858564100233409,-96.999664164722446 33.87063922351804,-96.985567000000003 33.886521999999999,-96.983970999999997 33.892082999999992,-96.984938999999997 33.904865999999991,-96.985275905099471 33.906070041818985,-96.988744999999994 33.918467999999997,-96.993996999999979 33.928978999999998,-96.995022999999989 33.932034999999999,-96.995140238436761 33.933014648420269,-96.996024643022366 33.940404763634284,-96.996183000000002 33.941727999999998,-96.996167702736543 33.941832622020257,-96.995421139189489 33.946938567064805,-96.995367999999999 33.947302,-96.994947208134789 33.948043840473474,-96.994456760007211 33.948908482357652,-96.994287999999983 33.949205999999997,-96.990835000000004 33.952700999999998,-96.988126301178397 33.954514162310069,-96.987892000000002 33.954670999999998,-96.982723774786024 33.956016867344054,-96.981537499896135 33.956325787441237,-96.981336999999982 33.956377999999994,-96.979415000000003 33.956178,-96.979347000000004 33.955129999999997,-96.980675999999988 33.951813999999999,-96.981031000000002 33.949159999999999,-96.97981799999998 33.941588000000003,-96.976955000000004 33.937452999999998,-96.973806999999979 33.935696999999998,-96.97254199999999 33.935794999999999,-96.952313000000004 33.944581999999997,-96.944610999999995 33.949216999999997,-96.933309804512817 33.955134148312766,-96.932252000000005 33.955688000000002,-96.924267999999998 33.959159,-96.922113999999979 33.959578999999998,-96.921429967464036 33.959451233053208,-96.919039990098355 33.959004821377064,-96.918617999999995 33.958925999999998,-96.91833921313939 33.958790334953079,-96.917063225391544 33.958169405626251,-96.916299999999993 33.957797999999997,-96.91417790611122 33.956157267456653,-96.911732563120111 33.95426660943896,-96.911336000000006 33.953960000000002,-96.910857206749995 33.953482904168467,-96.908421363636307 33.951055696608989,-96.907387 33.950024999999997,-96.905252999999988 33.947218999999997,-96.902433999999985 33.942017999999997,-96.901946611333699 33.940667581536225,-96.899441999999993 33.933728000000002,-96.896468999999996 33.91331799999999,-96.897193999999999 33.902954,-96.895728000000005 33.896414,-96.887761838797758 33.878628251663962,-96.883009999999999 33.868018999999997,-96.875280999999987 33.860505000000003,-96.87198767019855 33.857765462058182,-96.866438000000002 33.853149000000002,-96.85608999999998 33.84749,-96.850593000000003 33.847211,-96.845895999999996 33.848974999999996,-96.841592000000006 33.852893999999999,-96.840818999999996 33.863644999999998,-96.839777999999995 33.868395999999997,-96.837412999999984 33.871349000000002,-96.833926235310372 33.873661568818115,-96.832156999999995 33.874834999999997,-96.812777999999994 33.872646000000003,-96.794275999999996 33.868886000000003,-96.786859371055769 33.865207582975678,-96.783484999999999 33.863533999999994,-96.780568999999986 33.860098,-96.779588000000004 33.857939000000002,-96.777202000000003 33.848162000000002,-96.776765999999995 33.841976000000003,-96.770675999999995 33.829621000000003,-96.769378000000003 33.827477000000002,-96.766316855179326 33.825510582121247,-96.766234999999995 33.825457999999998,-96.761588000000003 33.824406000000003,-96.754041 33.824657999999999,-96.746233969152598 33.825673509073113,-96.746037999999984 33.825699,-96.741799282455162 33.826447231494264,-96.71318112067361 33.831498997677379,-96.712421999999989 33.831632999999997,-96.708134 33.833060000000003,-96.704457000000005 33.835020999999998,-96.700318655907978 33.838434731313264,-96.699573999999998 33.839049000000003,-96.695480719177567 33.844085960723298,-96.693127324791789 33.84698191524042,-96.690708 33.849958999999998,-96.688190999999989 33.854613,-96.687524326814838 33.85620885855986,-96.684726999999995 33.862904999999998,-96.682762564556768 33.871464102957781,-96.682209 33.873876000000003,-96.682102999999998 33.876645000000003,-96.683464 33.884217,-96.681051007513375 33.895708672998403,-96.680947000000003 33.89620399999999,-96.675306000000006 33.909114000000002,-96.673449000000005 33.912278,-96.670618000000005 33.914913999999996,-96.667186999999998 33.916939999999997,-96.665308436653305 33.917161206414967,-96.66440999999999 33.917267000000002,-96.659896000000003 33.916665999999999,-96.65150600931733 33.910998546998165,-96.644049999999979 33.905962000000002,-96.630116999999998 33.895422000000003,-96.628293999999997 33.894477000000002,-96.616355751891987 33.894625565889051,-96.614680358047494 33.89464641537834,-96.611821556077771 33.89468199182577,-96.607562 33.894734999999997,-96.592948000000007 33.895615999999997,-96.588319642127203 33.894847991673281,-96.587934000000004 33.894784,-96.58760387584924 33.894318075382706,-96.585452000000004 33.891280999999999,-96.585359999999994 33.888947999999999,-96.587494000000007 33.884250999999999,-96.590112000000005 33.880665,-96.597347999999982 33.875100999999994,-96.601685999999987 33.872822999999997,-96.611969999999999 33.869016000000002,-96.625399000000002 33.856541999999997,-96.628968999999998 33.852406999999999,-96.629746999999995 33.850866000000003,-96.630021999999983 33.847541,-96.629842405402627 33.847037300944812,-96.629577623992816 33.846294683138318,-96.629289999999997 33.845488000000003,-96.627812273090953 33.844523322531259,-96.626623854929747 33.84374750920842,-96.623154999999997 33.84148299999999,-96.622548607895212 33.841284829387497,-96.620258613641042 33.840536452948584,-96.605267599881515 33.835637348301233,-96.601258 33.834327000000002,-96.599141379811712 33.83346048638235,-96.597030984690946 33.832596521217091,-96.595164098773168 33.831832245189069,-96.592925999999991 33.830916000000002,-96.587067000000005 33.828009000000002,-96.573054340771023 33.81917200025552,-96.572936999999996 33.819097999999997,-96.568822993124115 33.818734252140963,-96.566549213959448 33.818533211567136,-96.566298000000003 33.818511,-96.551222999999993 33.81912899999999,-96.541502252916899 33.82118138128849,-96.537683599711926 33.821987629236112,-96.532865 33.823005000000002,-96.532141353898353 33.822830017549641,-96.529233999999988 33.822127000000002,-96.526655000000005 33.820891000000003,-96.526331240434345 33.820568979830284,-96.523863000000006 33.818114,-96.519910999999993 33.811346999999998,-96.517492044660074 33.805400310572544,-96.516583999999995 33.803167999999999,-96.515958999999995 33.798933999999996,-96.515952403498957 33.797370629253059,-96.5159410675722 33.794684014612457,-96.515912 33.787795000000003,-96.51191399999999 33.781477999999993,-96.502285999999998 33.773459999999993,-96.500268000000005 33.772582999999997,-96.486059999999995 33.773009999999999,-96.459153999999998 33.775232000000003,-96.456254 33.776035,-96.450509999999994 33.780588000000002,-96.448044999999993 33.781030999999999,-96.436454999999995 33.780050000000003,-96.430214000000007 33.778654000000003,-96.423664429058576 33.776393528613141,-96.422642999999994 33.776040999999999,-96.422322840041474 33.775682043625913,-96.420980388055867 33.774176915691271,-96.419961 33.773034000000003,-96.419583102042878 33.772404537625398,-96.417562000000004 33.769038000000002,-96.416145999999998 33.76609899999999,-96.413408000000004 33.757714,-96.411885201063754 33.755703128434462,-96.408468999999997 33.751191999999996,-96.403507000000005 33.746288999999997,-96.384116000000006 33.730141000000003,-96.383299027856694 33.729391180874664,-96.380090129695702 33.726446045924753,-96.379450023740389 33.7258585550397,-96.370956555983966 33.718063228581727,-96.370761536889887 33.717884239557762,-96.369590000000002 33.716808999999998,-96.369084597701828 33.715741445126696,-96.366945 33.711221999999999,-96.363253 33.701050000000002,-96.363143372320295 33.69469995601051,-96.363135 33.694215,-96.362964209763192 33.693778090504111,-96.362198000000006 33.691817999999998,-96.356236230636398 33.68737146600408,-96.355945999999989 33.687154999999997,-96.355455421824701 33.68710517164083,-96.352724507664888 33.686827790830883,-96.348305999999994 33.686378999999995,-96.346643697131185 33.686554630652331,-96.344174978865311 33.686815463144171,-96.342664999999997 33.686974999999997,-96.337175125435976 33.689043696356201,-96.321102999999994 33.695099999999996,-96.318759999999997 33.696753,-96.318590686098233 33.696960051986665,-96.318010443675675 33.697669623646739,-96.316924999999998 33.698996999999999,-96.314798583555884 33.702507526903553,-96.309963999999994 33.710489000000003,-96.308342766341951 33.715746247280322,-96.307034999999985 33.719987000000003,-96.307001890234133 33.720499786556005,-96.306595999999999 33.726785999999997,-96.307389 33.735005,-96.3061 33.741002000000002,-96.30525491425243 33.743702118680943,-96.304087485467235 33.747432149959735,-96.303009000000003 33.750878,-96.301705999999982 33.753756000000003,-96.294866999999996 33.764771000000003,-96.292482000000007 33.766418999999999,-96.277269000000004 33.769734999999997,-96.269895999999989 33.768405,-96.251497151236435 33.760405611313516,-96.248231999999987 33.758986,-96.23960043273749 33.754058875473291,-96.229595766085112 33.748347949873668,-96.229022999999998 33.748021,-96.220521000000005 33.747390000000003,-96.1999 33.752116999999998,-96.196336040977513 33.753254070097242,-96.186553999999987 33.756374999999998,-96.178059000000005 33.760517999999998,-96.174632999999986 33.763699000000003,-96.169932696734321 33.769534234627457,-96.169452000000007 33.770130999999999,-96.167888847884015 33.774482610028038,-96.162756999999985 33.788769000000002,-96.162122572851359 33.796140263149638,-96.162213638666273 33.796174412747511,-96.166837334419654 33.79790829445497,-96.170373408451042 33.799381659586444,-96.173025461119408 33.800560352833699,-96.175150000000002 33.801951000000003,-96.17734 33.805117000000003,-96.17895107878303 33.810509748931381,-96.178963999999993 33.810552999999999,-96.176910000000007 33.813934000000003,-96.175889999999981 33.814627000000002,-96.164217431250009 33.817001137011715,-96.150765000000007 33.816986999999997,-96.148792 33.819197000000003,-96.151629999999983 33.831945999999995,-96.150147000000004 33.835856,-96.148457006953691 33.837436961236868,-96.14806999999999 33.83779899999999,-96.147446683377808 33.837891494337825,-96.138904999999994 33.839159000000002,-96.128108733462625 33.839703753325978,-96.122951 33.839963999999995,-96.118168999999995 33.837883999999995,-96.109992999999989 33.832396000000003,-96.104074999999995 33.830730000000003,-96.099360000000004 33.830469999999998,-96.097448 33.832724999999996,-96.097637999999989 33.837935000000002,-96.099152999999987 33.842409000000004,-96.100785000000002 33.844230000000003,-96.101348999999999 33.845720999999998,-96.101472999999999 33.846708999999997,-96.100094999999996 33.847971,-96.084626 33.846656000000003,-96.063924 33.841522999999995,-96.055357999999984 33.838262,-96.049381559404907 33.836618570443349,-96.048833999999999 33.836468000000004,-96.044074587870469 33.838420736557822,-96.037191000000007 33.841245,-96.031783693249977 33.849934429642978,-96.031271075997878 33.850758194920559,-96.029462717056688 33.852402158173604,-96.025188419607474 33.852073366797306,-96.022229284477689 33.850922593794486,-96.021900493101384 33.849114234853282,-96.022507000000004 33.846130000000002,-96.022064891975305 33.843195970965255,-96.021407302851145 33.841880802274289,-96.019950829321616 33.840821548098475,-96.019598947095744 33.84056563358331,-96.005296 33.845505000000003,-96.000534603789163 33.849305889934179,-95.998351 33.851049000000003,-95.997709 33.852181999999992,-95.997673906338932 33.852568581878202,-95.997405462294296 33.855525685805766,-95.9977342536706 33.860950759443568,-95.997376655326022 33.862202357114477,-95.996747879541701 33.864403078452035,-95.993624351909531 33.866211440579008,-95.991487204777812 33.866869023331596,-95.988856861024331 33.866869023331596,-95.984753921632091 33.864671017651808,-95.984253769013037 33.864403078452035,-95.980965842506947 33.859306796190523,-95.9735403792467 33.856832331211713,-95.972155999999998 33.856371000000003,-95.971744371228908 33.856383941655046,-95.951609000000005 33.857016999999999,-95.945502988542614 33.859346036998218,-95.944283999999982 33.859811,-95.943359355023844 33.860365112733476,-95.941777921153459 33.861312819872232,-95.941266999999996 33.861618999999997,-95.936631000000006 33.870615,-95.93550004724635 33.874497995518659,-95.935325000000006 33.875098999999999,-95.935308000000006 33.878723999999998,-95.935637 33.880370999999997,-95.936817000000005 33.882385999999997,-95.937201999999999 33.884652000000003,-95.936131999999986 33.886825999999999,-95.935198 33.887100999999994,-95.922712000000004 33.883758,-95.915960999999996 33.881148000000003,-95.905343000000002 33.875629000000004,-95.893305999999995 33.868161,-95.887490999999997 33.863855999999998,-95.881292000000002 33.860627,-95.859469000000004 33.852455999999997,-95.849863999999997 33.844951999999999,-95.843772999999999 33.838949,-95.841300369514457 33.837329726167006,-95.840012000000002 33.836486,-95.839442445999168 33.836292954052603,-95.838335071878717 33.835917618112738,-95.837515999999994 33.835639999999998,-95.831947999999997 33.835160999999999,-95.828244999999995 33.836053999999997,-95.827967044704152 33.836191602640042,-95.826538854622555 33.836898632614485,-95.822787000000005 33.838755999999989,-95.821905415666805 33.839551758599306,-95.821112514659319 33.840267467546653,-95.820784000000003 33.840564,-95.819357999999994 33.842784999999999,-95.818975999999992 33.844456,-95.819524999999999 33.848438999999999,-95.820676999999989 33.850750999999995,-95.821665999999979 33.855443,-95.821665999999979 33.856633000000002,-95.82138191533943 33.857119395418813,-95.820824189768416 33.858074304994595,-95.820595999999995 33.858464999999995,-95.820256321913618 33.858527429344676,-95.805149 33.861303999999997,-95.800842000000003 33.861212000000002,-95.790314669347865 33.857829825250164,-95.789867 33.857685999999994,-95.789358977006231 33.85733891951336,-95.788304168820886 33.85661827626933,-95.787891000000002 33.856335999999999,-95.776255000000006 33.845145000000002,-95.773281999999995 33.843834,-95.772067000000007 33.843817,-95.763621999999984 33.847954,-95.758311274366889 33.849968021173019,-95.758015999999998 33.850079999999998,-95.757640875431136 33.850475976069447,-95.754310000000004 33.853991999999998,-95.753512999999984 33.856464000000003,-95.753688987366843 33.856976705401074,-95.75729390188404 33.867478931648478,-95.757457999999986 33.86795699999999,-95.758009454152003 33.868443703186436,-95.760805000000005 33.870911,-95.762558999999996 33.874366999999992,-95.76194240701966 33.883030946465368,-95.761915999999999 33.883401999999997,-95.758343999999994 33.890610999999993,-95.756366999999997 33.892625000000002,-95.747335000000007 33.895755999999999,-95.737508000000005 33.895966999999999,-95.729445045960333 33.893952819075864,-95.728448999999998 33.893704,-95.723226300470785 33.890698381785455,-95.717160861060378 33.887207774089354,-95.713910181462765 33.885337036216413,-95.713539999999981 33.885123999999998,-95.710877999999994 33.884551999999999,-95.696961999999999 33.885218000000002,-95.684831000000003 33.890231999999997,-95.676924999999983 33.897236999999997,-95.669978 33.905844000000002,-95.665338000000006 33.908132000000002,-95.659818 33.909092,-95.647272999999998 33.905976000000003,-95.636977999999999 33.906613,-95.609439392746168 33.923623282239362,-95.603656999999998 33.927194999999998,-95.599677999999983 33.934246999999999,-95.585944999999981 33.93448,-95.570311428427317 33.932892416047835,-95.564667905744443 33.932319318211334,-95.563423999999998 33.932192999999998,-95.562724847986416 33.932007581530534,-95.561592737930383 33.931707340510293,-95.561007000000004 33.931551999999996,-95.560415995740641 33.931042615914556,-95.559931936825777 33.930625407571753,-95.559414000000004 33.930179000000003,-95.558286100391328 33.928753215740784,-95.557777967458279 33.928110882033096,-95.556914999999989 33.927019999999999,-95.551147999999984 33.914566,-95.549144999999996 33.90795,-95.549475 33.901310999999993,-95.552330999999981 33.894419999999997,-95.55209457427955 33.888655441173519,-95.552085000000005 33.888421999999998,-95.551943532854764 33.888208369560985,-95.548485831718622 33.882986873004867,-95.548324999999991 33.882744000000002,-95.547838962671932 33.882363312195096,-95.545708294665019 33.880694470565629,-95.545197000000002 33.880293999999999,-95.54352178779898 33.880173169084813,-95.541265054919734 33.880010393826282,-95.539789999999996 33.879904000000003,-95.537358049249164 33.88037416967029,-95.534038375697051 33.881015963020303,-95.533282999999997 33.881161999999996,-95.531798241123994 33.881968630089013,-95.525321999999989 33.885486999999998,-95.521418133191162 33.888379988113826,-95.520137966641357 33.88932866459119,-95.515301759339067 33.891142240377064,-95.510062536063273 33.890134704348199,-95.506233872599807 33.886306036979761,-95.506495 33.878588999999998,-95.506084999999999 33.87639,-95.502407477038815 33.874787101867227,-95.502303999999995 33.874741999999998,-95.492028000000005 33.874822000000002,-95.480004545492946 33.87882505156746,-95.478574999999992 33.879300999999998,-95.477829321179073 33.879890044047791,-95.469962325642697 33.886104525088022,-95.467351237093553 33.886417854985297,-95.464924614258621 33.886709049048328,-95.462909526581015 33.885903021006229,-95.461498966768687 33.883686425341857,-95.46277824472287 33.878821065729895,-95.464211000000006 33.873372000000003,-95.463346 33.872312999999998,-95.461127233926518 33.871832054399569,-95.447370000000006 33.868850000000002,-95.418546279096461 33.866998581211959,-95.411345060268999 33.866536029139695,-95.407794999999979 33.866307999999989,-95.406882133018115 33.866362247208706,-95.404325916920058 33.866514150597617,-95.375232999999994 33.868243,-95.352338000000003 33.867789000000002,-95.339561303488324 33.868836967540759,-95.339121999999989 33.868873,-95.339014688391742 33.869073090388603,-95.33835013321854 33.870312202400832,-95.334854000000007 33.876830999999996,-95.334836460323601 33.877305631062114,-95.334523000000004 33.885787999999998,-95.333451999999994 33.886285999999998,-95.325571999999994 33.885703999999997,-95.310579050797429 33.880679668661742,-95.294789354523203 33.875388337067108,-95.287864786488143 33.87494634339312,-95.28344485260331 33.877745636185885,-95.281676877907344 33.882902226669891,-95.281529544303439 33.887616824907447,-95.281317419351268 33.889260797911334,-95.280350898312903 33.896751357029835,-95.279761569607459 33.899108654721076,-95.277846267017765 33.900876629417048,-95.275341635722626 33.901760616765031,-95.272542342929853 33.902055281117747,-95.267212735027385 33.900338966530455,-95.263849803053915 33.899255988324974,-95.261050510261143 33.899992642069066,-95.255746586173245 33.902939265610648,-95.253094626984378 33.90544389690578,-95.250884657186859 33.913105118684925,-95.250737329293145 33.917083057468233,-95.251326652288412 33.924154956252103,-95.253020000000006 33.927236999999998,-95.253623000000005 33.92971,-95.252905999999982 33.933647999999998,-95.250453815364224 33.936614470603772,-95.23166760862577 33.959340626388752,-95.231194814374604 33.959912577712174,-95.230491 33.960763999999998,-95.226393000000002 33.961953999999999,-95.219358 33.961567000000002,-95.184075000000007 33.950353,-95.174181557651636 33.944707625858101,-95.173657196254922 33.944408415920272,-95.168745999999999 33.941605999999993,-95.166685999999984 33.939728000000002,-95.161108999999982 33.937598,-95.149462 33.936335999999997,-95.131725657216535 33.936903570678005,-95.131056 33.936924999999995,-95.130760550144942 33.936820411866918,-95.124700000000004 33.934674999999991,-95.121184 33.931306999999997,-95.121974867397924 33.925542192115131,-95.122499622273722 33.921717137430115,-95.122365486317321 33.918632002634986,-95.119951031304154 33.915815139752631,-95.110963896232136 33.912998276870283,-95.103318123323447 33.913668959251616,-95.10214780889666 33.912991409673538,-95.100769532353866 33.912193461131935,-95.098489218495843 33.909913139475762,-95.095001673232161 33.904815960136006,-95.095247706914634 33.899772255341666,-95.095269945144935 33.899316370327696,-95.09392858558104 33.895962961020395,-95.090441035118587 33.893280234094433,-95.084002493615529 33.893280234094433,-95.079139333602001 33.898143394107954,-95.078905311676394 33.898377416033576,-95.074957661870556 33.900039583313315,-95.073630040977179 33.900598581227868,-95.071259538767663 33.901596686785098,-95.065491679645973 33.899584642240477,-95.06106518008815 33.895292278639054,-95.058834000000004 33.886812999999997,-95.049025 33.864089999999997,-95.046567999999994 33.862564999999996,-95.038661112238941 33.860609605793528,-95.037206999999995 33.86025,-95.033518790033554 33.860141698175291,-95.03143098776043 33.86008039125462,-95.030255193062573 33.860045864827867,-95.022324999999995 33.859813000000003,-95.016999191469623 33.861237606415294,-95.016422000000006 33.861392000000002,-95.008375999999984 33.866088999999995,-95.000223000000005 33.862504999999999,-94.995524000000003 33.857438000000002,-94.992810330111539 33.852698351540766,-94.992671 33.852454999999999,-94.992523097811741 33.852403566519136,-94.990494037024106 33.851697953840834,-94.988486999999992 33.850999999999999,-94.98739725328582 33.851074415574232,-94.983303000000006 33.851354,-94.981650000000002 33.852283999999997,-94.976208 33.859846999999995,-94.973410999999999 33.861730999999999,-94.971435 33.862122999999997,-94.968895000000003 33.860916000000003,-94.965888000000007 33.848421999999999,-94.964400999999995 33.837020999999993,-94.957676000000006 33.835003999999998,-94.949533421399437 33.825707838785306,-94.949112883549958 33.821754768331147,-94.948729542346143 33.818151347643564,-94.948715939727023 33.818023482549535,-94.944301522854289 33.81213759866646,-94.939560116480934 33.810502632153295,-94.935799688114457 33.810339132650462,-94.932366255585293 33.810993121156741,-94.928442330884351 33.812628087669893,-94.92451840618341 33.812791587172725,-94.924196338046286 33.812670811231236,-94.921902464831703 33.811810605997493,-94.919450010309433 33.810175636315982,-94.917815040627914 33.808704169305649,-94.917091634856007 33.805689966907131,-94.916834062621035 33.804616745101868,-94.916997555787162 33.801510305241678,-94.91961350347556 33.794152948011565,-94.920034399525505 33.790224602097751,-94.920103995647338 33.789575041141042,-94.920095560257593 33.789518805381888,-94.91961350347556 33.786305103362189,-94.913003475392784 33.779908559849432,-94.912450337640749 33.77937328682863,-94.911427000000003 33.778382999999998,-94.906244999999998 33.778191999999997,-94.902276 33.776288999999998,-94.89497736748055 33.771540270803243,-94.89019868072495 33.768431100796676,-94.888367999999986 33.76724,-94.887910246679809 33.766674529711281,-94.886225692565191 33.764593571999796,-94.885411379435553 33.764756432942491,-94.881447983999394 33.765549103837166,-94.879218389137634 33.764912090842074,-94.876033253179955 33.760771407616105,-94.875653319149677 33.757021753168047,-94.875534806260347 33.755852122792213,-94.875497398046861 33.755482932714841,-94.877080000000007 33.75222,-94.874668 33.749164,-94.870299604394191 33.746484207390097,-94.869443369718425 33.745958950164457,-94.869299999999996 33.745871,-94.8570941233355 33.742035460072337,-94.849295999999981 33.739584999999991,-94.841633779899112 33.739430990835892,-94.830804318260235 33.740068022348083,-94.828875382311935 33.74092532536806,-94.827937698058648 33.741342073027738,-94.826026615866809 33.743890180559411,-94.824752565187154 33.749304914465036,-94.82447272313469 33.749460382205008,-94.821885938813196 33.750897483986968,-94.817426749089677 33.752171534666616,-94.815635414888177 33.752066164468857,-94.813744972719192 33.751954964523563,-94.81275807295215 33.751896912919612,-94.812012015184067 33.751853028169073,-94.80914539498248 33.749304914465036,-94.798634446013509 33.744527205899239,-94.789716054221742 33.746119775421171,-94.777638928565466 33.753471071068567,-94.775064434371529 33.755038154868203,-94.770923763490302 33.754401129528375,-94.768057130944001 33.753445597691005,-94.766464573766783 33.750897483986968,-94.766146067269247 33.748030863785381,-94.766818924318841 33.746124416643802,-94.768057130944001 33.742616129879757,-94.767738636791165 33.737519908644046,-94.767244154304578 33.736926531576607,-94.76296091588064 33.731786662068515,-94.759138751496963 33.729557067206756,-94.758159820145337 33.729557067206756,-94.753087004596253 33.729557067206756,-94.750011775433265 33.728811557489699,-94.742576055627282 33.727008959675082,-94.742176780415733 33.726449974997927,-94.739390916583417 33.72254976995157,-94.737479828219207 33.716179498036198,-94.737788227808608 33.71500758055268,-94.73907239774114 33.71012773879076,-94.73746132453816 33.705563045258067,-94.73716130937693 33.704713004885136,-94.732383613155861 33.700253815161624,-94.728242929929891 33.699616789821789,-94.725694828570582 33.702483410023376,-94.724525908047042 33.704821269192259,-94.724102271393392 33.705668549067234,-94.721872664186904 33.707261118589173,-94.719006043985303 33.708216656598914,-94.714865360759347 33.707261118589173,-94.711043208720398 33.705668549067234,-94.709450639198465 33.699616789821789,-94.710289486124168 33.697309952648205,-94.710724689878106 33.696113138108018,-94.710724689878106 33.691653948384499,-94.710106194192988 33.688252279047049,-94.71008765219355 33.688150299756906,-94.707858069676533 33.686876245991066,-94.691547961569825 33.685092048879412,-94.684792000000002 33.684353000000002,-94.659166999999997 33.692138,-94.652265035786613 33.690979104454883,-94.649628372726468 33.688049476940073,-94.649099284135872 33.686462209886628,-94.648456523423718 33.684533926193204,-94.64818493525776 33.682632803768527,-94.647928021538007 33.680834402751707,-94.647870600191638 33.680432452214262,-94.648456523423718 33.673401362074948,-94.647827859209684 33.672301196274027,-94.646112824818204 33.669299876741562,-94.642890235687361 33.668420997570671,-94.635273213800133 33.669885811328072,-94.631328876730365 33.67284406472757,-94.630585813750528 33.673401362074948,-94.627656194751552 33.677795791992715,-94.62121101648988 33.681018386800773,-94.616816575217669 33.679553573043371,-94.614284398758912 33.677302743466427,-94.611543254774574 33.674866164477912,-94.611424034353576 33.674789522931938,-94.607441775118403 33.672229504256364,-94.60304734520065 33.671350625085473,-94.596895128555005 33.671350625085473,-94.593672545101384 33.673987285307021,-94.590449961647764 33.677502836053897,-94.590316660066918 33.67755410593854,-94.586641449284855 33.678967649811298,-94.579620000000006 33.677622999999997,-94.576973687569549 33.673401362074948,-94.5728722135906 33.669885811328072,-94.571305222138406 33.668005422800071,-94.569942586075811 33.666370260581196,-94.569356662843745 33.663440621711956,-94.571445361022185 33.660423619728157,-94.571993323065286 33.659632120703485,-94.572286279004103 33.656995454804722,-94.570821465246695 33.654944723492456,-94.568770728257221 33.65465176187643,-94.564669254278257 33.655823608340576,-94.563858010166513 33.65591721375597,-94.557052229552454 33.656702498865904,-94.552071876402621 33.653479904057846,-94.551192985877293 33.650257320604226,-94.551311999999982 33.644569999999995,-94.553536678805585 33.642054372646328,-94.552657799634687 33.638245860283412,-94.549142248887819 33.635902161677912,-94.543868917090279 33.635902161677912,-94.538888563940446 33.637952898667386,-94.538195599937964 33.637916426989378,-94.537583502619341 33.637884211439605,-94.533322276204103 33.637659937051346,-94.529220802225154 33.63443734792051,-94.528408204203203 33.630103504051213,-94.528341911699826 33.629749945032266,-94.52980672545722 33.627406252103981,-94.528927834931892 33.621839964367631,-94.526291174710352 33.619203298468861,-94.521363727720257 33.61686924674752,-94.520724886974008 33.61656663824732,-94.504615 33.620682000000002,-94.493418698303032 33.624467326832118,-94.492501061148843 33.624777568252533,-94.491502999999994 33.625115,-94.491295462081894 33.62531395337146,-94.487514000000004 33.628939000000003,-94.485874999999993 33.637867,-94.481313 33.638818999999998,-94.476415000000003 33.638947000000002,-94.466075000000004 33.636262000000002,-94.464185999999998 33.637655000000002,-94.461453000000006 33.643615999999994,-94.459197999999986 33.645145999999997,-94.454819999999998 33.644902999999999,-94.448637000000005 33.642766000000002,-94.446871000000002 33.640177999999999,-94.447513999999998 33.636254999999991,-94.448451000000006 33.634497000000003,-94.458816999999982 33.632444,-94.462736000000007 33.63091,-94.461129 33.625414999999997,-94.460285999999996 33.624420999999998,-94.45525499999998 33.622917,-94.452710999999994 33.622621000000002,-94.452325000000002 33.618817,-94.452961000000002 33.616985999999997,-94.454768999999999 33.615155999999992,-94.462335999999993 33.610567000000003,-94.469451000000007 33.60731599999999,-94.472166 33.604199,-94.471974000000003 33.602665000000002,-94.471151999999989 33.601588,-94.468086 33.599435999999997,-94.461794602929331 33.598691554192769,-94.458900358388505 33.598349085232492,-94.458231999999995 33.598269999999999,-94.454858239556387 33.593453869357283,-94.453995999999989 33.592222999999997,-94.453435550445548 33.592019500625121,-94.452150252013013 33.591552808439438,-94.451622 33.591360999999999,-94.449112 33.590893999999992,-94.442363999999998 33.591242999999999,-94.441536999999997 33.591501999999991,-94.439518000000007 33.594154000000003,-94.430358101189597 33.59122600196271,-94.430038999999994 33.591124,-94.429672337173542 33.590855074196774,-94.427920122643982 33.589569927010331,-94.427577999999983 33.589319000000003,-94.425982000000005 33.586424999999998,-94.413155000000003 33.569367999999997,-94.412481642075306 33.56890283335202,-94.412480771235352 33.568902231761562,-94.412480202418593 33.568901838813659,-94.412175000000005 33.568691,-94.408900999999986 33.568196999999998,-94.403341999999995 33.568424,-94.397341999999981 33.571607999999998,-94.385926999999995 33.581887999999999,-94.382886999999997 33.58326799999999,-94.379649 33.580607,-94.378075999999993 33.577019,-94.377759999999981 33.574609000000002,-94.378561000000005 33.571328999999999,-94.380090999999993 33.568942999999997,-94.382534000000007 33.567056999999998,-94.388052000000002 33.565511,-94.392357000000004 33.565286999999998,-94.394655618773015 33.564059042448399,-94.397398454287298 33.562313601959417,-94.399227012370631 33.559903231990447,-94.399393244337958 33.557077279687135,-94.399143896386974 33.555498071165481,-94.397957000000005 33.554389999999998,-94.392572999999999 33.551141999999999,-94.389515000000003 33.546778000000003,-94.386086000000006 33.544922999999997,-94.381666999999993 33.544035,-94.373392999999993 33.544471,-94.371597999999992 33.545000999999999,-94.363297000000003 33.544956999999997,-94.361350999999999 33.544612999999998,-94.358969999999999 33.54323,-94.355945000000006 33.54318,-94.348944999999986 33.548358999999998,-94.347382999999979 33.55107799999999,-94.34729 33.552197,-94.352653000000004 33.560611000000002,-94.352433000000005 33.56217199999999,-94.345512999999997 33.567312999999999,-94.344023000000007 33.567824000000002,-94.340576999999996 33.567878,-94.340047258358467 33.56768232744934,-94.338972839399958 33.567285465504582,-94.33842199999998 33.567081999999999,-94.337996277272822 33.566655299162022,-94.334939999999989 33.563592,-94.334379999999996 33.562536,-94.333929800646288 33.557825151092565,-94.333894999999998 33.557461000000004,-94.333202999999997 33.555365999999992,-94.331833000000003 33.553348,-94.33059 33.552692,-94.323660000000004 33.549835000000002,-94.319491999999997 33.548864000000002,-94.309582000000006 33.551673,-94.30641 33.555616,-94.306214999999995 33.557676,-94.307180999999986 33.559797000000003,-94.303577000000004 33.56828,-94.301022999999986 33.573022000000002,-94.298392000000007 33.576217999999997,-94.293257999999994 33.580418999999999,-94.289129000000003 33.582143999999992,-94.287025 33.582410000000003,-94.283581999999996 33.581890999999999,-94.282647999999995 33.580978000000002,-94.280849000000003 33.577187000000002,-94.280604999999994 33.574907999999994,-94.282171999999989 33.572989,-94.290372000000005 33.567905000000003,-94.291686999999996 33.563481000000003,-94.290901000000005 33.558872,-94.289439999999999 33.557634999999998,-94.287571999999997 33.557178,-94.279089999999997 33.557026,-94.275600999999995 33.557963999999998,-94.274473 33.558652000000002,-94.271997999999996 33.561517999999992,-94.270978999999997 33.563220999999999,-94.270853000000002 33.564782999999998,-94.265668999999988 33.573588999999998,-94.262754999999999 33.577354,-94.257801 33.582507999999997,-94.257524288354617 33.582703553652586,-94.252656000000002 33.586143999999997,-94.245931999999996 33.589113999999995,-94.242777000000004 33.589708999999999,-94.240178999999998 33.589536000000003,-94.236971999999994 33.587411000000003,-94.236362999999997 33.585991999999997,-94.236835999999997 33.580914,-94.237975000000006 33.577756999999998,-94.238867999999997 33.576721999999997,-94.244365999999999 33.573549,-94.251108000000002 33.56528,-94.252330999999984 33.561855,-94.252283000000006 33.560445,-94.251569000000003 33.558188,-94.250197 33.556764999999999,-94.237903999999986 33.552675,-94.233128263729824 33.552212399803537,-94.233017493976078 33.552201670126067,-94.231843999999981 33.552087999999998,-94.226392000000004 33.552911999999999,-94.222920999999999 33.554088,-94.21922099999999 33.556095999999997,-94.213604000000004 33.563133999999998,-94.21268334130005 33.563763266722709,-94.208078 33.566910999999998,-94.205634000000003 33.567228999999998,-94.203593999999981 33.566546000000002,-94.202594978382763 33.562850001484037,-94.201237000000006 33.557825999999999,-94.199485999999993 33.556085000000003,-94.197816999999986 33.555238000000003,-94.196394999999995 33.555123000000002,-94.193247999999997 33.556153999999999,-94.191332999999986 33.55766599999999,-94.189883999999992 33.562454000000002,-94.192482999999996 33.570425,-94.194399000000004 33.573678,-94.196366991504703 33.574779501237479,-94.201105911663163 33.575851400157113,-94.204265191768783 33.575005164570705,-94.207404999999994 33.574353000000002,-94.209665 33.573509999999999,-94.211329000000006 33.573774,-94.216140999999993 33.576391999999998,-94.217408000000006 33.579259999999998,-94.217197999999982 33.580736999999999,-94.214431000000005 33.583187000000002,-94.212997 33.583486999999991,-94.210966999999997 33.583143,-94.205788416261612 33.581380140341984,-94.203588205048902 33.580815984742067,-94.199751933850294 33.581098061448763,-94.196536237091394 33.581718635888464,-94.194464999999994 33.582886000000002,-94.190890999999979 33.587474,-94.183913000000004 33.594681999999999,-94.180879999999988 33.592612000000003,-94.176327 33.591076999999999,-94.162266000000002 33.588906,-94.161081999999993 33.587972,-94.162009999999995 33.580877,-94.161276999999998 33.579270999999999,-94.156782000000007 33.575749000000002,-94.152625999999998 33.575923000000003,-94.148731999999995 33.580196999999998,-94.146047999999993 33.581975,-94.144383000000005 33.582097999999995,-94.142160000000004 33.581389999999999,-94.141852 33.579590000000003,-94.143023999999983 33.577725,-94.145668999999984 33.575599999999994,-94.149506000000002 33.573602,-94.151257 33.571793,-94.151754999999994 33.569476000000002,-94.151455999999996 33.568387,-94.148520000000005 33.565677999999991,-94.145239000000004 33.564987000000002,-94.143401999999995 33.565504999999995,-94.136863999999989 33.570999999999998,-94.136045999999993 33.571387999999999,-94.135142000000002 33.571033,-94.134308000000004 33.569209,-94.133047999999988 33.557952999999998,-94.131382000000002 33.552934,-94.128658 33.550952000000002,-94.126897999999983 33.550646999999991,-94.123897999999997 33.552100000000003,-94.122878999999983 33.553111999999999,-94.12071899999998 33.560555,-94.120354999999989 33.5655,-94.119902152897509 33.566998927274319,-94.112842999999998 33.566991000000002,-94.103176000000005 33.570349999999998,-94.100106999999994 33.57256799999999,-94.097439999999992 33.573718999999997,-94.088943 33.575322,-94.082640999999995 33.575491999999997,-94.072670000000002 33.572234000000002,-94.072231491265512 33.572605318678747,-94.072031926011121 33.573523317998088,-94.072031926011121 33.573846369634623,-94.072031926011121 33.574161925883949,-94.071815412538413 33.574459631515609,-94.071712621294751 33.574600969288895,-94.071353404455635 33.574840447439463,-94.070395493400298 33.574561056392717,-94.069534727631535 33.574169799087244,-94.069517406590393 33.574161925883949,-94.068559493988133 33.573563230894273,-94.068280102941401 33.571966710019424,-94.06782332144887 33.570215714974232,-94.067801146640278 33.570130711574109,-94.066845999999998 33.568908999999998,-94.061283000000003 33.568804999999998,-94.056597999999994 33.567824999999999,-94.056095999999997 33.567252000000003,-94.055662999999996 33.561886999999999,-94.056442000000004 33.560997999999991,-94.059849999999997 33.559249,-94.061179999999993 33.559159,-94.066685000000007 33.560953999999995,-94.067984999999993 33.560960999999999,-94.071719999999999 33.559682000000002,-94.073744000000005 33.558284999999998,-94.073825999999997 33.555833999999997,-94.072156000000007 33.553863999999997,-94.069091999999998 33.553406000000003,-94.06547999999998 33.550908999999997,-94.061896000000004 33.549764000000003,-94.056095999999997 33.550725999999997,-94.051882000000006 33.552585,-94.050211999999988 33.551082999999998,-94.046040000000005 33.551321000000002,-94.043449999999993 33.552253,-94.043428000000006 33.551424999999995,-94.043374999999997 33.542315000000002,-94.043020107474533 33.494534442391668,-94.043008999999998 33.493039000000003,-94.043278999999998 33.491029999999995,-94.043271947583932 33.489425304099555,-94.043188 33.470323999999991,-94.043130608695648 33.460424000000003,-94.043089437732434 33.453322008844353,-94.043061045958495 33.448424427841935,-94.043010021810147 33.439622762252007,-94.042987999999994 33.435823999999997,-94.042987999999994 33.434442436873745,-94.042987999999994 33.431023999999994,-94.042886999999993 33.420225000000002,-94.042890126641851 33.419424334827802,-94.042891364631132 33.419107312620362,-94.042967439944888 33.399626074590046,-94.043053 33.377715999999999,-94.042868999999996 33.371169999999999,-94.043127999999996 33.358756999999997,-94.043066999999979 33.352097,-94.043066999999979 33.347351000000003,-94.043066999999979 33.339614667914582,-94.043066999999979 33.330497999999999,-94.042990000000003 33.271227000000003,-94.043049999999994 33.260903999999996,-94.043003999999996 33.250127999999997,-94.042730000000006 33.241822999999997,-94.042876000000007 33.215218999999998,-94.042891999999995 33.202666,-94.042874999999995 33.199784999999999,-94.042718999999991 33.160290999999994,-94.043184999999994 33.143476,-94.043076999999982 33.138162,-94.043007000000003 33.13389,-94.042951563372725 33.117233519058104,-94.042869999999994 33.092726999999996,-94.043036 33.079484999999998,-94.042963999999998 33.019219,-94.042986850316112 33.007494023677346,-94.043068075862834 32.965815492539427,-94.043087999999997 32.955592000000003,-94.043066999999979 32.937902999999999,-94.043092 32.910021,-94.042884999999998 32.898910999999998,-94.042859000000007 32.892771000000003,-94.042885999999996 32.880965000000003,-94.043025 32.880445999999999,-94.042784999999995 32.871485999999997,-94.042921087938623 32.829694015190334,-94.043025999999983 32.797476000000003,-94.042747000000006 32.786973000000003,-94.042828999999998 32.785277,-94.042937999999992 32.780557999999999,-94.043026999999995 32.776862999999999,-94.042946999999998 32.767991000000002,-94.042974715046569 32.757603400545236,-94.04314699999999 32.693030999999998,-94.042912999999999 32.655126999999993,-94.042779999999993 32.643465999999997,-94.042823999999996 32.640304999999998,-94.042925999999994 32.622014999999998,-94.042929 32.618259999999992,-94.042918999999998 32.610142000000003,-94.042939007208048 32.604544739553475,-94.043082999999996 32.564261000000002,-94.043142000000003 32.559502000000002,-94.043081 32.513612999999999,-94.042884999999998 32.505144999999999,-94.042911000000004 32.492851999999999,-94.043088999999995 32.486561000000002,-94.043071999999995 32.48429999999999,-94.042955000000006 32.480260999999999,-94.042995000000005 32.478003999999999,-94.042901999999998 32.472905999999995,-94.042874999999995 32.471347999999992,-94.042902999999981 32.470385999999998,-94.042907999999997 32.439890999999996,-94.042985999999999 32.435507,-94.042898999999991 32.400658999999997,-94.042923000000002 32.399918,-94.042900999999986 32.392282999999999,-94.042762999999994 32.373331999999998,-94.042738999999997 32.363559000000002,-94.042733519218956 32.277818574933548,-94.042732999999998 32.269696000000003,-94.042732 32.269620000000003,-94.042671451745775 32.225096273752321,-94.042662000000007 32.218145999999997,-94.042600205901905 32.185155675879351,-94.042565999999994 32.166893999999999,-94.042538999999991 32.166826,-94.042591000000002 32.158096999999998,-94.042681000000002 32.137956000000003,-94.042751999999993 32.125163,-94.042337000000003 32.119914,-94.042699999999996 32.056012000000003,-94.042717288248511 32.00695918811028,-94.042720000000003 31.999265,-94.042490448495869 31.997488887291052,-94.042251674184627 31.995641414801661,-94.041832999999997 31.992401999999998,-94.038411999999994 31.992436999999999,-94.029282999999992 31.995864999999998,-94.027080554152732 31.994823406342874,-94.018664 31.990842999999998,-94.011671046736083 31.979908989829021,-94.008352361284565 31.974719974671689,-94.002944198469422 31.966263903968002,-93.995504541226836 31.954631438414648,-93.994147015257326 31.952508844111783,-93.977461000000005 31.926418999999996,-93.971711999999982 31.920383999999995,-93.953546000000003 31.910562999999996,-93.943541310721315 31.908563758569336,-93.938002035663573 31.906916949339585,-93.935007833635339 31.903773037645127,-93.932462763507019 31.895538979891644,-93.931327794714704 31.894581351390723,-93.92767203678045 31.891496810199779,-93.923929283519882 31.889849995167665,-93.919587694495533 31.890748256066246,-93.915948999999998 31.892861000000003,-93.909557114944889 31.893143619429534,-93.905252294448232 31.890856686636408,-93.90476638821832 31.890598549301192,-93.901173350426333 31.885957535142037,-93.901888 31.880063,-93.898135577976262 31.874953416991548,-93.896981462364707 31.873381885463036,-93.889196542313442 31.867692899288475,-93.888241004857136 31.85786451213389,-93.888148571748644 31.856913771406646,-93.887306164689562 31.854968889155742,-93.884117000000003 31.847605999999995,-93.880377455095243 31.844791786271248,-93.879654915472827 31.84424803536659,-93.874821999999995 31.840611000000003,-93.874804231839249 31.835091218914506,-93.874787826198073 31.829994712349503,-93.874761000000007 31.821660999999999,-93.870917000000006 31.816836999999996,-93.868473098390325 31.815251608244314,-93.853390000000005 31.805467,-93.846187999999998 31.802021,-93.839950728453459 31.798597132180646,-93.836868453653821 31.794158659336233,-93.836868453653821 31.791454071635616,-93.836868453653821 31.788733862378688,-93.834649214842401 31.783309060642711,-93.831197070889573 31.780226788232302,-93.827450999999996 31.777740999999999,-93.823442999999997 31.775098,-93.822597999999985 31.773558999999995,-93.826519525540022 31.761832440276638,-93.827342999999999 31.759369999999997,-93.830112066651125 31.754555168030393,-93.830647423185951 31.745811043570992,-93.824579 31.734396999999998,-93.819048075401312 31.72885814427071,-93.818932598107111 31.728523867973351,-93.815657495541259 31.719043310199801,-93.815835943108667 31.711905251886723,-93.815525624652665 31.710796971318612,-93.814600367558683 31.707492480599399,-93.814586782471608 31.707443962415162,-93.811060073548262 31.705827553684028,-93.810303944025605 31.705480994217723,-93.807270273132957 31.704231833580664,-93.806045429297654 31.703104120446881,-93.803419352361757 31.700686292667093,-93.802693549340276 31.697783082925291,-93.802451615781152 31.693186330065117,-93.804479 31.685663999999999,-93.812820813246589 31.676953615984285,-93.81562111199878 31.674029590143711,-93.817425 31.672146,-93.821829497696953 31.673879806810671,-93.822051000000002 31.673966999999998,-93.822341750589956 31.673502431839047,-93.826462000000006 31.666919,-93.8257324849111 31.66154827530681,-93.825660999999997 31.661021999999996,-93.825228912080746 31.660277861177896,-93.81803699999999 31.647891999999999,-93.817707248836442 31.6409111211136,-93.816838000000004 31.622509,-93.818717000000007 31.614555999999997,-93.823976999999999 31.614227999999997,-93.825414416100287 31.615089707767993,-93.827851999999993 31.616550999999998,-93.838056999999992 31.606795000000002,-93.839382999999998 31.599074999999999,-93.837534908858984 31.593743346167731,-93.834924 31.586210999999999,-93.822958 31.568129999999996,-93.822219025006859 31.564792487143556,-93.820763999999997 31.558221000000003,-93.818582000000006 31.554825999999998,-93.798086999999995 31.534044000000002,-93.787687000000005 31.527343999999996,-93.781574079702807 31.525595412174177,-93.780834999999996 31.525383999999999,-93.777170583402579 31.525128039451072,-93.760062000000005 31.523933,-93.753860000000003 31.525331,-93.751899169046524 31.525601857922521,-93.749869902733366 31.526210635456998,-93.746826003263621 31.526007705679731,-93.743376259969125 31.525196002300419,-93.742401241878753 31.523787647735123,-93.74154991556837 31.522557958452786,-93.741111000000004 31.520101,-93.740752889151466 31.518711098615515,-93.740332360499409 31.517078940980245,-93.739317727342822 31.515049678599539,-93.734411826534469 31.513527159467717,-93.733432858180635 31.513223342063657,-93.726736285639134 31.511599931372594,-93.725924582259807 31.504091651519342,-93.728765551952293 31.496786301443361,-93.730997740177827 31.492118989316349,-93.733996137544537 31.48847587643743,-93.737167999999997 31.484621999999998,-93.741884999999982 31.483535,-93.745608448194673 31.481972669547908,-93.746355058504165 31.481633300507966,-93.747840636420193 31.480958036391328,-93.749869902733366 31.478928770078173,-93.749869902733366 31.475276095040186,-93.749626709600278 31.47120988033301,-93.749476 31.468689999999999,-93.709416000000004 31.442995,-93.706857276389258 31.44142369846492,-93.700929751125955 31.437783629836048,-93.697919763270235 31.429300939077926,-93.697603150134782 31.428408665937056,-93.704678 31.418899999999997,-93.704697874245824 31.418107106580852,-93.704878999999991 31.410881,-93.701611 31.409333999999998,-93.695865999999995 31.409391999999997,-93.689953513429003 31.406208353384852,-93.678362516190631 31.399967047179565,-93.675064666986117 31.398191282223291,-93.674659331220113 31.397973024503138,-93.674116999999981 31.397680999999995,-93.671643999999986 31.393352,-93.670181999999983 31.387184,-93.668532759396427 31.379357124595749,-93.668145986696857 31.37510269235548,-93.669064113561134 31.373151679996884,-93.669693055010129 31.371815184369147,-93.669512094168894 31.370548454097019,-93.668919524600994 31.366400452767671,-93.667402247962755 31.365414223393856,-93.665051865060306 31.363886475190469,-93.663891561951601 31.361952641672623,-93.663698175601809 31.360018811902275,-93.664665092360735 31.357698213179859,-93.665825387974422 31.355184231855155,-93.668439000000006 31.353011999999996,-93.669515978941746 31.350266666374935,-93.673736148309771 31.339509006758242,-93.677277000000004 31.330482999999997,-93.687850999999995 31.309835,-93.686922292404276 31.305369360695714,-93.686880000000002 31.305166,-93.686723586265984 31.304979085312567,-93.684737187533131 31.30260533533086,-93.684038999999999 31.301770999999995,-93.683824154244718 31.301752735987076,-93.675439999999995 31.30104,-93.668927999999994 31.297974999999997,-93.657003999999986 31.281735999999999,-93.647719584117951 31.27389987096868,-93.642516 31.269508000000002,-93.632650200244299 31.270182983909681,-93.620343000000005 31.271025000000002,-93.615257056394739 31.261768439618621,-93.61394199999998 31.259374999999995,-93.614287999999988 31.251631,-93.616308000000004 31.244595000000004,-93.616007481020262 31.233959925788763,-93.613835693061347 31.232449117569455,-93.609977782626956 31.229765355202261,-93.609827614285464 31.229660890324059,-93.608033931702224 31.227867209671889,-93.60740940488401 31.227242683526022,-93.605259887151632 31.224152751460338,-93.604319472818304 31.220794125122111,-93.604319472818304 31.215285983654958,-93.607287999999997 31.205403,-93.602442999999994 31.182541,-93.600307999999998 31.176157999999997,-93.598827999999997 31.174679,-93.595531708436056 31.171774432382691,-93.588772842417583 31.16581877494577,-93.588502999999989 31.165581,-93.588046655571759 31.165671453282986,-93.583339301771971 31.166604510813709,-93.579215000000005 31.167421999999995,-93.578993496784307 31.167654977688123,-93.574136071231791 31.172764031170193,-93.569563000000002 31.177574,-93.560942999999995 31.182481999999997,-93.552649000000002 31.185575,-93.548930999999996 31.186601,-93.535096999999993 31.185614,-93.533756450961803 31.184752004501149,-93.533306999999994 31.184463,-93.5330935917342 31.183965183917415,-93.531744000000003 31.180816999999998,-93.533193520062923 31.174490811082034,-93.53417786817559 31.170194787673282,-93.536829999999981 31.158620000000003,-93.540253000000007 31.156578999999997,-93.544009577425854 31.153014849431809,-93.544887639546317 31.148844041597808,-93.544887639546317 31.143136612291205,-93.544701999999987 31.135888999999999,-93.540277800652078 31.128868068802213,-93.539619249807799 31.121843550568837,-93.541375382556595 31.113501939154769,-93.541635919885238 31.113241401693255,-93.548470239502265 31.106407078590973,-93.549716998224596 31.105160319232844,-93.55112206776522 31.099540038044921,-93.551692642249563 31.097257738879012,-93.551034091405285 31.091111287020031,-93.546643772295099 31.082989189009115,-93.540128999999993 31.078002999999995,-93.53104031045666 31.074698717981779,-93.527873992025093 31.072210897922254,-93.526043656150705 31.070772777782928,-93.524020490083288 31.067083472240864,-93.523009982318626 31.065240780256033,-93.523659621286654 31.063941504256789,-93.525329858273139 31.060601035263321,-93.529255791555698 31.057567354514948,-93.532069000000007 31.055264,-93.531218761655126 31.051678447674814,-93.523247999999995 31.037841999999998,-93.516942620821894 31.032584114108545,-93.516407263768343 31.029550433360171,-93.516883288197775 31.024314186160638,-93.516942620821894 31.023661529978199,-93.539525999999995 31.008497999999999,-93.540062152267268 31.008345085566372,-93.540618575989114 31.008186389569964,-93.555580999999989 31.003918999999996,-93.562626264226125 31.00599480945781,-93.566016847371429 31.004567194682853,-93.567979815741779 31.001533515663564,-93.569764334642755 30.996715319472376,-93.571101253513504 30.991033414001794,-93.571905755076102 30.987614282198351,-93.567971999999997 30.977981,-93.560533000000007 30.971285999999999,-93.55046299120518 30.967360467203815,-93.549841 30.967117999999996,-93.539153617393822 30.956968324013513,-93.532549000000003 30.950695999999997,-93.526524876707626 30.939912016599852,-93.526293050708773 30.939497017171423,-93.526245000000003 30.939411,-93.526242458076936 30.939167805401102,-93.526231146824912 30.938085618677029,-93.526146999999995 30.930035,-93.526269219450654 30.929894609689271,-93.530935999999983 30.924533999999998,-93.542488999999989 30.920064,-93.54502991280485 30.920837107400992,-93.546884259495414 30.92151141825828,-93.549244331161987 30.921005686748707,-93.550358562122057 30.920030731622223,-93.551941554990407 30.918645608548566,-93.555650241837967 30.911228247920597,-93.555751501305451 30.910053639118178,-93.555774257662236 30.909789665608852,-93.556493125509377 30.9014508058257,-93.562447641167196 30.896531852982324,-93.563812214002311 30.895404595987301,-93.564247644832776 30.895044891882932,-93.567787752332634 30.888301832311882,-93.567450600170787 30.878524390216981,-93.566008182600839 30.875519355165832,-93.565853452041281 30.875197,-93.565427680666076 30.874309976760035,-93.563763247930751 30.87311591407202,-93.559394659034922 30.869981891957959,-93.55904186947815 30.86972880101742,-93.558616999999984 30.869423999999999,-93.558608112367665 30.868835818489011,-93.558593354020289 30.867859114376206,-93.558393833586933 30.854654896933653,-93.558352334289978 30.851908482785802,-93.558231866260058 30.843935935637496,-93.558171999999999 30.839973999999998,-93.553625999999994 30.835139999999999,-93.55374115920948 30.832414921630001,-93.554057 30.824940999999995,-93.561666000000002 30.807738999999998,-93.563243 30.806218000000005,-93.564501487304341 30.805543276361082,-93.569303000000005 30.802969,-93.578395 30.802046999999998,-93.584264999999988 30.796662999999995,-93.588934854633479 30.787551489258888,-93.589380999999989 30.786681000000002,-93.589895999999996 30.77776,-93.591925627378814 30.768225181611253,-93.592827999999997 30.763985999999996,-93.607757000000007 30.757656999999995,-93.611581311334461 30.752392350515215,-93.615058988962588 30.747604886281291,-93.619129 30.742001999999996,-93.617688 30.738479000000005,-93.609908791486006 30.729403419430973,-93.609718999999998 30.729181999999998,-93.609544 30.723138999999996,-93.61030547238029 30.720788970554505,-93.611192000000003 30.718053,-93.61618399999999 30.713980000000003,-93.616977218405893 30.712276394979256,-93.620773999999997 30.704122000000005,-93.621061387132315 30.696047232392139,-93.621092999999988 30.695159,-93.62235785978659 30.692974242186811,-93.629903999999996 30.679939999999995,-93.632922525899005 30.677439880221801,-93.638212999999993 30.673057999999997,-93.646373493696458 30.671658473870171,-93.653439445062318 30.670446661945991,-93.654970999999989 30.670183999999999,-93.666219386787546 30.661299653678171,-93.670353999999989 30.658033999999997,-93.670860468306827 30.657347728689221,-93.683099999999996 30.640763000000003,-93.685120999999981 30.625201,-93.684323003112922 30.617258061147268,-93.683396999999985 30.608040999999997,-93.680812614601606 30.602993111696524,-93.680648411741274 30.602453589051585,-93.679828117977763 30.599758343304948,-93.681234543283509 30.596101640780542,-93.683902548646543 30.593069810094963,-93.684328672415049 30.59258557751615,-93.684347894395486 30.592579170189346,-93.687282162286593 30.59160108089231,-93.689533999999995 30.592759,-93.692869000000002 30.594382000000003,-93.712453999999994 30.588479,-93.72107859525056 30.580404159651369,-93.727657631584904 30.574244488790981,-93.727844000000005 30.574069999999995,-93.727840097341868 30.573768021870688,-93.72780696123904 30.571204031383882,-93.727747245613443 30.566583382517752,-93.727745999999996 30.566486999999999,-93.725846999999987 30.556978,-93.728764326223569 30.546403128121515,-93.729195000000004 30.544841999999999,-93.736587760607577 30.541316766984647,-93.740252999999996 30.539569,-93.738909526480768 30.537838512460276,-93.732793 30.529960000000003,-93.727721000000003 30.525671000000003,-93.718711305261792 30.520890798500346,-93.714321999999996 30.518561999999996,-93.710116999999997 30.506399999999996,-93.713193644304937 30.50058809182816,-93.716678000000002 30.494005999999995,-93.71365216083376 30.483878530555742,-93.711446941284677 30.476497671106777,-93.710595424186792 30.473647647388944,-93.709703157003446 30.47066123332699,-93.708899372668625 30.467970970942378,-93.705844999999997 30.457747999999999,-93.697828 30.443837999999996,-93.6978 30.440583,-93.698862234241474 30.438260713588438,-93.702220303997905 30.430919206922557,-93.702664999999996 30.429947000000002,-93.722313999999997 30.420729,-93.729486046484141 30.413342592858086,-93.738025291703323 30.404548123662593,-93.738321805525445 30.404242747530638,-93.745333000000002 30.397022,-93.751243378615428 30.396311282781173,-93.751436999999996 30.396287999999998,-93.754787283332149 30.393127406185759,-93.75746720581121 30.390599218098316,-93.757654000000002 30.390422999999995,-93.757872622462301 30.389610210267922,-93.758470934573069 30.387385818798332,-93.75855399999999 30.387077,-93.758091991038413 30.3842338214119,-93.758032188807945 30.383865801664729,-93.757931393201204 30.383245510859378,-93.75589426835937 30.370709152880856,-93.756044740613035 30.365928314513319,-93.75610723110799 30.3639428524199,-93.756352000000007 30.356166000000002,-93.758519945992674 30.350935458285047,-93.760658351649255 30.34577618769989,-93.763244572034736 30.339536487238696,-93.765822 30.333317999999995,-93.764264999999995 30.330222999999997,-93.760690955159149 30.32995156504764,-93.760328 30.329923999999998,-93.747921244232074 30.314935395431327,-93.743830002049762 30.309992764786195,-93.741160171732417 30.306767342150266,-93.738698999999997 30.303793999999996,-93.734966161369201 30.301561360829975,-93.729390287632427 30.298226388348422,-93.724220000000003 30.295133999999997,-93.718684474451791 30.295009979388311,-93.714319430116035 30.294282471059141,-93.71311219174963 30.293184979315004,-93.711118400234781 30.291372437742464,-93.709949692759622 30.289928741213533,-93.708644873043468 30.288316906143507,-93.708448001046747 30.287627854154977,-93.707590519980414 30.284626670422831,-93.706607851977495 30.281187332412603,-93.706635817233519 30.280914670488997,-93.707189856385114 30.275512775340033,-93.709131999999997 30.271826999999995,-93.707538803456245 30.253087036355307,-93.707271000000006 30.249936999999996,-93.705637767078656 30.244573755694763,-93.705083000000002 30.242751999999996,-93.707646217538425 30.23733474070027,-93.713358999999997 30.225261,-93.71802168481895 30.219915738218987,-93.719219999999993 30.218541999999999,-93.720945999999998 30.209852,-93.717397000000005 30.193439,-93.710467999999992 30.180670999999997,-93.706634735424259 30.17682001000631,-93.705927274531248 30.176109277739844,-93.705791510460429 30.175972885881706,-93.703764000000007 30.173936,-93.703646997347349 30.173527735424756,-93.702964616901454 30.171146663230584,-93.701744610591902 30.166889619937699,-93.701686103512344 30.166685467574972,-93.697748000000004 30.152943999999998,-93.696083741705934 30.150925109485563,-93.688211999999979 30.141376,-93.69286799999999 30.135216999999997,-93.69498 30.135185,-93.698276000000007 30.138608000000005,-93.700984936503929 30.137486558544058,-93.701251999999997 30.137376,-93.7012922571502 30.136537706048752,-93.701585086407604 30.130439981942867,-93.701656556414648 30.128951727699913,-93.701742498922442 30.127162105630983,-93.701985639262489 30.122099077688652,-93.702366286953335 30.114172668214064,-93.702403861450691 30.11339023643033,-93.702436000000006 30.112720999999997,-93.70268530105453 30.112503701678254,-93.704703872918159 30.110744253531749,-93.710410303455276 30.105770356484715,-93.714491639657382 30.10221294069715,-93.723764999999986 30.094129999999996,-93.727140999999989 30.092110594495406,-93.7293848599641 30.090768395691203,-93.72996305770063 30.09042253796256,-93.732484999999997 30.088913999999995,-93.734084999999979 30.086129999999997,-93.731705540540531 30.081478540540548,-93.731605000000002 30.081282000000002,-93.729179922109864 30.079341937687897,-93.727017487667368 30.077611990133899,-93.71640499999998 30.069121999999997,-93.716151269697463 30.069056930886212,-93.707507094464489 30.066840132907302,-93.702179999999998 30.065473999999995,-93.700580000000002 30.063666,-93.699479012508235 30.0595596142199,-93.699395999999993 30.059249999999995,-93.699786698153744 30.05843348475733,-93.700658293446523 30.056611948527472,-93.700819999999993 30.056273999999998,-93.702099264262131 30.055460929156467,-93.703267223154896 30.054718601437116,-93.703940000000003 30.054290999999999,-93.704473210548429 30.054251542735575,-93.709782747672762 30.053858640136632,-93.710785394684464 30.05378444485228,-93.720804999999999 30.053042999999995,-93.729054152595779 30.045230570163486,-93.729990027439044 30.044344241966268,-93.737446000000006 30.037282999999999,-93.739158000000003 30.032626999999998,-93.739733999999999 30.023987000000002,-93.741078000000002 30.021571000000002,-93.744068611359822 30.019549890100706,-93.74834924745744 30.01665695787004,-93.753252045558341 30.013343557169065,-93.766227014667976 30.004574835541469,-93.782835629207284 29.993350429819579,-93.786934999999986 29.990579999999998,-93.789430999999993 29.987812000000002,-93.803328792953494 29.962666096659486,-93.807814999999991 29.954549,-93.813734999999994 29.935126,-93.816550000000007 29.920725999999995,-93.818997999999993 29.914822,-93.830374000000006 29.894358999999998,-93.838374000000002 29.882854999999999,-93.853129483564672 29.866348149842587,-93.854474509531912 29.864843479256791,-93.855140000000006 29.864098999999996,-93.857517787207271 29.862146563102172,-93.862474802662518 29.858076283033213,-93.863569999999996 29.857177,-93.864820388168837 29.856398395289631,-93.872445999999997 29.851650000000003,-93.890679000000006 29.843159000000004,-93.900728 29.836967,-93.911111176241661 29.828996955749506,-93.916359999999997 29.824967999999998,-93.922743999999994 29.818808,-93.927992000000003 29.809640000000002,-93.929208000000003 29.802952,-93.928808000000004 29.79708,-93.926503999999994 29.789559999999998,-93.922407000000007 29.785048,-93.898470000000003 29.771576999999997,-93.893861999999999 29.767289000000002,-93.890820999999988 29.761672999999995,-93.891780610698319 29.758916671398389,-93.892526767476923 29.756773455119472,-93.893828999999997 29.753032999999999,-93.891732576672823 29.744984915009951,-93.891637000000003 29.744618000000003,-93.891484462723341 29.744488863328282,-93.888820999999993 29.742234000000003,-93.873941000000002 29.737770000000005,-93.870019999999997 29.735482,-93.863203999999996 29.724059,-93.837970999999982 29.690618999999998,-93.852868 29.675885,-93.866980999999996 29.673085,-93.889989999999997 29.674012999999999,-93.930999999999997 29.679611999999999,-93.955443390383635 29.680262610936268,-93.955453232202885 29.68026287289646,-93.991585827226885 29.681224615973395,-94.000169999999997 29.681453101326589,-94.000222586816207 29.681454501032487,-94.001406000000003 29.681486,-94.010062765207763 29.679864152681674,-94.056505999999999 29.671163,-94.132576999999984 29.646217,-94.354166823921716 29.561457673765378,-94.370794193562546 29.555097613439198,-94.391123278008692 29.54732162684321,-94.45341877657637 29.523493256060661,-94.456196753642018 29.522430664556182,-94.45805240375158 29.521720868184531,-94.499046371673685 29.506040450016997,-94.499089575343746 29.506023924375612,-94.500455432020999 29.505501476685335,-94.500806999999995 29.505367,-94.552043946167103 29.48495633977835,-94.552044379602123 29.484956167115939,-94.568074121423052 29.478570587212708,-94.593696728539513 29.46836361027578,-94.594852999999986 29.467903,-94.599458690353401 29.465813271763974,-94.62931993394271 29.452264405230761,-94.631084 29.451464,-94.634656044789836 29.449584234717392,-94.661528069434993 29.435443006940758,-94.670389 29.430779999999999,-94.674924987623086 29.427889211977174,-94.680871144138621 29.42409972235215,-94.694158000000002 29.415631999999999,-94.708472999999998 29.403049000000003,-94.723958999999979 29.383268000000005,-94.730956033155138 29.369322304827527,-94.731047000000004 29.369140999999996,-94.731324722869132 29.369141342444962,-94.731537324603394 29.369141604592603,-94.742750849251038 29.369155431380086,-94.744595216508316 29.369157705569055,-94.744833999999997 29.369157999999999,-94.761491000000007 29.361882999999999,-94.772184717669788 29.3616343088914,-94.778690999999995 29.361483,-94.780073439975141 29.362532749099824,-94.782355999999993 29.364266,-94.782645420567292 29.368514320481975,-94.783130999999997 29.375641999999996,-94.766847999999996 29.393488999999999,-94.754099999999994 29.400999999999996,-94.743385419572206 29.410035318862811,-94.73704402931665 29.415382843516582,-94.727822669267709 29.423158969605012,-94.723817999999994 29.426535999999995,-94.716270519001597 29.430976788539081,-94.706539419927282 29.436702374764607,-94.706364999999991 29.436804999999996,-94.686385999999999 29.466508999999995,-94.681540999999996 29.471388999999999,-94.672399999999996 29.476842999999999,-94.665852999999998 29.478401000000002,-94.656737000000007 29.478032999999996,-94.645948000000004 29.473769,-94.628217000000006 29.475986000000002,-94.608557000000005 29.483344999999996,-94.594211 29.492127,-94.595122262498009 29.503650874486677,-94.595439999999996 29.507669,-94.591407000000004 29.513857999999999,-94.580274000000003 29.525295,-94.566674000000006 29.531987999999995,-94.553989999999985 29.529558999999999,-94.546993999999998 29.524379,-94.532347999999999 29.5178,-94.511044999999996 29.519649999999995,-94.495024999999984 29.525030999999998,-94.503428999999997 29.543249999999997,-94.509486999999993 29.542589999999997,-94.523742999999996 29.545987,-94.523871183237745 29.546315590042923,-94.5261306113389 29.55210749848424,-94.526336 29.552633999999998,-94.542531999999994 29.568999999999999,-94.546193009360195 29.571896121601313,-94.546385 29.572047999999995,-94.546803832691651 29.57214903106096,-94.55398799999999 29.573882,-94.570006000000006 29.572232,-94.578210999999982 29.567281,-94.593518000000003 29.561319,-94.625889999999998 29.552807999999999,-94.634988842169335 29.550728838088908,-94.643914431984982 29.54868926579681,-94.666855093063802 29.543447131924982,-94.691625000000002 29.537787000000002,-94.693243673136905 29.537529479678042,-94.718275999999989 29.533546999999995,-94.740699000000006 29.525857999999999,-94.757688999999999 29.524616999999999,-94.768675999999999 29.525659,-94.780938000000006 29.531093000000002,-94.785987568065153 29.540133852805589,-94.789123822994313 29.545749069554745,-94.789562096440733 29.546533763545689,-94.78971899677407 29.546814681200559,-94.790604999999999 29.548400999999998,-94.779438999999996 29.549472000000002,-94.772471009935998 29.548613672580952,-94.771052999999995 29.548438999999995,-94.762972090755014 29.555767305595641,-94.75523699999998 29.562781999999999,-94.750081379755628 29.56810096117977,-94.734626000000006 29.584046,-94.731874420576986 29.588423440241069,-94.724443803393115 29.600244680945409,-94.708741000000003 29.625226,-94.705273448792255 29.640626536822896,-94.703938528752261 29.6465553563269,-94.702680930363101 29.65214076491651,-94.702542126991759 29.652757236398369,-94.699660909360375 29.665553672721437,-94.69780371146922 29.673802100155214,-94.694887994254785 29.686751760487848,-94.693153999999993 29.694452999999999,-94.692434000000006 29.70361,-94.692611750388934 29.704808689927841,-94.695098387970873 29.721577752663908,-94.695317000000003 29.723051999999999,-94.695611486157915 29.72357178078331,-94.697558868014866 29.727008993840069,-94.705700105090941 29.741378628781629,-94.713878412983604 29.755813695314995,-94.714586470042065 29.757063446593907,-94.722078339612551 29.770286919851305,-94.724615999999983 29.774766,-94.735270999999997 29.785433,-94.738125273271791 29.786265833277604,-94.740919000000005 29.787080999999997,-94.749144589762409 29.783534045463153,-94.75591801041729 29.780613280409739,-94.771512 29.773888999999997,-94.792237999999998 29.767432999999997,-94.798897371247961 29.764438558858895,-94.816085 29.756710000000002,-94.81943931055217 29.753325616252695,-94.823987131664666 29.748737021482022,-94.851107999999996 29.721373000000003,-94.856932183541645 29.710462974624775,-94.860426638443812 29.703917062844585,-94.864167858487249 29.696908903620852,-94.865007000000006 29.695336999999999,-94.865123196353878 29.694545038919138,-94.867438000000007 29.678768000000002,-94.872550999999987 29.67125,-94.893107 29.661335999999999,-94.915413 29.656613999999998,-94.921317999999999 29.658177999999999,-94.928410408640929 29.669495826038883,-94.930071799099807 29.672147016790593,-94.930110565443542 29.672208878811933,-94.930656833967475 29.673080595662611,-94.931474856161643 29.67438596783704,-94.934166999999988 29.678681999999998,-94.935264231405057 29.686686879688732,-94.935319060033862 29.687086883348073,-94.935997030967087 29.692033037575822,-94.936088999999996 29.692703999999999,-94.936280063994801 29.692851065945039,-94.941277009519624 29.696697319220664,-94.942680999999993 29.697778,-94.942922907078852 29.697804516058127,-94.95311095436017 29.698921254167477,-94.965343618259496 29.700262107971746,-94.965962999999988 29.70033,-94.972666000000004 29.684869999999997,-94.980123280315652 29.679059463608382,-94.986438191421769 29.674139034277729,-94.988580124776774 29.672470090483102,-95.001800051879343 29.662169436052462,-95.002396227716986 29.661704909944582,-95.005398 29.659365999999995,-95.011683000000005 29.649802000000005,-95.013860566469219 29.644103309100927,-95.014229369455222 29.643138151779844,-95.015636 29.639457,-95.015582911847446 29.639202042718885,-95.014543866006605 29.634211997110764,-95.013498999999996 29.629193999999998,-95.006633444897872 29.623869765921089,-95.00056235200779 29.61916163683599,-95.000370188745762 29.619012614335521,-94.997782627529062 29.617005962082896,-94.997731096758997 29.616965999999998,-94.995478872439179 29.615219401320278,-94.993499353954022 29.613684285860323,-94.988871000000003 29.610095,-94.988045541621688 29.608923290953985,-94.982835617337045 29.60152798723708,-94.982705999999993 29.601344000000005,-94.982886347998431 29.601051719777942,-94.983895794498991 29.599415764569699,-94.98693593300419 29.594488776939745,-94.988992999999994 29.591155,-94.991605757589539 29.588791109774153,-94.991811610459919 29.588604864563266,-94.992208959522046 29.588245363334387,-95.006677600766466 29.575154872369662,-95.007235451984087 29.574650156950938,-95.007670000000005 29.574256999999996,-95.00815781845921 29.573398130166158,-95.016627 29.558487,-95.018253 29.554884999999999,-95.016926355758628 29.548485488141377,-95.015164999999996 29.539988999999998,-95.012091452887788 29.536262245236642,-95.011587670186657 29.535651395780732,-95.011086587278399 29.535043819893005,-95.001666768519442 29.523622047865974,-94.999580999999992 29.521093,-94.989064037839412 29.515168017977793,-94.982063906682782 29.511224326765198,-94.981915999999998 29.511140999999995,-94.981645984265953 29.511070508097891,-94.961088181447877 29.505703566689924,-94.958443000000003 29.505013000000002,-94.958183821928699 29.504969740154092,-94.957844913785792 29.504913172428417,-94.95747910332102 29.504852114391142,-94.955724072517796 29.504559179260749,-94.952845264169682 29.504078672538427,-94.930551536860648 29.500357589179547,-94.927405495678158 29.499832478177321,-94.909464999999997 29.496837999999997,-94.913072085311995 29.488019044482122,-94.913385000000005 29.487254,-94.917178632618899 29.481741136316387,-94.925104227340569 29.470223752399235,-94.925293406029382 29.469948840084836,-94.925914000000006 29.469047,-94.930860999999993 29.450503999999999,-94.923011455799639 29.448810114938265,-94.920334997737442 29.448232551169699,-94.919400999999993 29.448030999999997,-94.916063708203708 29.446327523795176,-94.890799999999984 29.433432,-94.888257132054065 29.420136433311271,-94.887299999999996 29.415132,-94.887087039327696 29.40154064293051,-94.886938304445962 29.392048238229908,-94.886925408340758 29.391225196262944,-94.886904215833582 29.389872669858736,-94.886764190565785 29.380936121184895,-94.886591910643261 29.369941049100753,-94.886536208040312 29.366386054846032,-94.886982892003275 29.364738908620176,-94.888420210858001 29.359438798199445,-94.888544709543254 29.358979709544975,-94.888781730376067 29.358105695694917,-94.894234145274325 29.337999926591962,-94.894147383920654 29.327241695272729,-94.894002695197727 29.309300588032027,-94.893993580875261 29.308170430590454,-94.891329624021282 29.304475264201969,-94.888683946869179 29.30080545353194,-94.886599269217157 29.297913803549264,-94.886536208040312 29.297826331584119,-94.885816422022174 29.297499155955627,-94.884216982863776 29.296772137788121,-94.876917125093229 29.293454018939102,-94.875951551627523 29.293015121686942,-94.86617837453683 29.293883848703121,-94.865126326153927 29.293977364132552,-94.861112574100105 29.294855372432302,-94.849730461009372 29.297345209778594,-94.825607939204673 29.30577638202961,-94.824952733476934 29.30600538596191,-94.823862547308252 29.313200608971236,-94.822547126780194 29.321882377573708,-94.82230657170463 29.344254498409398,-94.810695999999993 29.353434999999998,-94.797913847039041 29.344567105809805,-94.79693012269928 29.343884625840758,-94.784895000000006 29.335535,-94.779995 29.334935000000002,-94.777063999999996 29.336811,-94.773074869484503 29.336485139838025,-94.745528999999991 29.334235,-94.744945 29.33641,-94.731319999999997 29.338066,-94.722529999999992 29.331445999999996,-94.731082 29.331833,-94.769694999999999 29.304936,-94.780304129101268 29.295750693651897,-94.786095000000003 29.290737,-94.793321795438203 29.286014946162535,-94.795651468635626 29.284492716516493,-94.803695000000005 29.279236999999998,-94.809348860129617 29.275904173901317,-94.81020919937113 29.275397022855465,-94.819018398045671 29.270204194137058,-94.82210781776098 29.268383049216432,-94.825036245866656 29.266656805306088,-94.825782574142963 29.266216861214712,-94.826962003659688 29.265521613475173,-94.833188167130103 29.261851427154124,-94.844390135018429 29.255248113651685,-94.870677905110114 29.23975205180561,-94.881596387366812 29.233315846843187,-94.896165027201874 29.224727954332334,-94.925556066041452 29.207402583865772,-94.927613957028456 29.206189502425392,-94.940693735267132 29.198479261054111,-94.968741214129224 29.181945889621023,-94.978383546115566 29.176261947153485,-94.981700088962569 29.174306918145966,-95.026218999999998 29.148064000000002,-95.076832914261459 29.114498139229923,-95.081772999999998 29.111222,-95.084611040272236 29.108948681405003,-95.100241410561338 29.096428488590096,-95.110484 29.088224,-95.116308293211759 29.081343778536318,-95.119264367911811 29.077851775668329,-95.119484217932538 29.077592067446851,-95.122403192505772 29.074143890856067,-95.122524999999996 29.074000000000002,-95.122638295373392 29.073709965581063,-95.125134000000003 29.067321,-95.183550616106302 29.028323983126334,-95.191390999999996 29.023089999999996,-95.192301227546167 29.02243038040822,-95.237672480263356 28.989550945676651,-95.238923999999997 28.988644,-95.240558404572027 28.987315672512366,-95.251568580535192 28.978367386619187,-95.251619678822578 28.978325857575001,-95.272266000000002 28.961545999999995,-95.29656403895315 28.934716691525271,-95.297146999999981 28.934073,-95.309703999999996 28.928262,-95.334686660244515 28.911063042846731,-95.353450999999993 28.898145,-95.376979000000006 28.876159999999999,-95.377903963555724 28.874482723635413,-95.38239 28.866347999999999,-95.416173999999998 28.859482,-95.436326577581042 28.85908617652915,-95.439594 28.859022000000003,-95.449516932572138 28.854239851149391,-95.480746000949352 28.839189657836059,-95.485144835951402 28.837069731735976,-95.486768999999995 28.836286999999995,-95.506945757563287 28.824808612805594,-95.536465934189138 28.808014833314715,-95.564052739104355 28.79232093268277,-95.564094788066555 28.792297011382839,-95.564132228771385 28.792275711681647,-95.568135999999981 28.789997999999997,-95.576201168007842 28.785870627961152,-95.606319447682353 28.770457515020929,-95.613122366343802 28.766976102576891,-95.695711236705606 28.724711019702028,-95.715243498124195 28.714715330888584,-95.812504000000004 28.664942,-95.854124934570734 28.646410960033691,-95.884026000000006 28.633098,-95.920915435374582 28.618912188118028,-95.97832748198536 28.596834417485056,-96.000681999999983 28.588238,-96.000998496292368 28.588108377001081,-96.024040703743012 28.578671299526803,-96.035336417502748 28.574045070633311,-96.05294532761279 28.566833233429691,-96.077867999999995 28.556625999999998,-96.194412 28.502223999999998,-96.220123346321373 28.492065891861738,-96.220376184174313 28.491966,-96.226882700448613 28.487451845000788,-96.241923733725443 28.477016528665938,-96.244750999999994 28.475055,-96.270391000000004 28.461929999999999,-96.303212000000002 28.441870999999999,-96.321560000000005 28.425148,-96.328817 28.423658999999997,-96.341616999999999 28.417333999999997,-96.371116999999998 28.397660999999999,-96.372100999999986 28.393874999999998,-96.370716999999985 28.387667,-96.378616389014681 28.383909329746462,-96.379349732835649 28.386024690464755,-96.381702691108558 28.392811896356477,-96.381863685354148 28.393276290946375,-96.375880899310658 28.401794149460329,-96.37413840285555 28.404274990018202,-96.340801887331921 28.432913073072363,-96.338559687910475 28.434839257985413,-96.335119195902806 28.437794848703732,-96.312964581561445 28.451131053409146,-96.280819757359396 28.470480970729877,-96.274497619264608 28.474286648703266,-96.268341347214189 28.477992481854848,-96.252027698910211 28.484249764669329,-96.250247000000002 28.484932771712327,-96.223824788704931 28.495067307260509,-96.218978121459415 28.500382701101032,-96.21505000939203 28.509679222336811,-96.145447855080619 28.544740658174199,-96.10473518795402 28.559498996555909,-96.046210731424992 28.586980036018211,-96.032979113622659 28.589015683181284,-96.007533711461477 28.59970275682273,-95.986159544454679 28.60631857558586,-95.982088289576367 28.614461085342473,-95.98565064745685 28.621076904105603,-95.983106103295938 28.641942154390655,-95.97852589224803 28.650593590730978,-95.986065974637228 28.655467849280154,-95.996337701374344 28.658736120211515,-96.002953500413568 28.656191585912577,-96.006515878017979 28.648049056432036,-96.010005951759737 28.648641710656278,-96.010506546843942 28.648726717396318,-96.011440067305529 28.648885239790378,-96.014343010193883 28.649378192516537,-96.026200716522851 28.65139176594381,-96.03348799089656 28.652629228032097,-96.039323368019012 28.651170385770797,-96.047737442142406 28.649066870151618,-96.049244844336243 28.648218956037223,-96.052682972641108 28.646285007998213,-96.05836686193534 28.643087818836001,-96.072165030584017 28.635326345489485,-96.092812363862251 28.627145317384699,-96.098878916233431 28.624741586366319,-96.099137163186526 28.624639261986079,-96.099760206508392 28.62447226081035,-96.102639895829256 28.623700385909448,-96.141413249033207 28.613307536255487,-96.148501276515404 28.611407654045699,-96.187178316202875 28.593595864643298,-96.198374286842139 28.586980055742131,-96.221784081288092 28.580364246840958,-96.228908787187095 28.580873158631725,-96.233997875508891 28.596649310733014,-96.233997875508891 28.601738394123839,-96.222292978285921 28.607336389305434,-96.214150448805384 28.613443281484855,-96.212623728226021 28.62260364440889,-96.2309444244882 28.64143324753087,-96.208552463485731 28.662298487953962,-96.214659365527126 28.665351929112688,-96.192267404524671 28.68774389011514,-96.1912495908051 28.694359708878277,-96.195829762405154 28.698939880478335,-96.202445561444364 28.700975507917487,-96.208747675276499 28.700187749031503,-96.21684000834783 28.699176214258408,-96.221467818495611 28.69859774191346,-96.222801895007663 28.698430983480506,-96.223384071149837 28.698294,-96.224163927167865 28.698110503315906,-96.227000018566372 28.697443183508955,-96.229623268039219 28.696825944469072,-96.231453341209956 28.69639533631743,-96.233964222112746 28.695240331316239,-96.23422531976 28.695120226420762,-96.234426397558138 28.695027730650764,-96.243315632596989 28.690938683290845,-96.256898753233088 28.684690448956413,-96.263514562134276 28.683672635236839,-96.268603640594122 28.688761723558645,-96.287942160437836 28.68316371851509,-96.304227224329892 28.671458831154069,-96.305245042980445 28.660262850652849,-96.303866760710434 28.646480081370939,-96.303718312539132 28.644995605411349,-96.322902111893882 28.641863561491792,-96.322903115546453 28.641863397630402,-96.328654788116609 28.640924350533034,-96.373438710121519 28.626674919011112,-96.376492171004159 28.620059100247982,-96.384634680760783 28.615987845369677,-96.473693647496702 28.573239550803915,-96.48794308888057 28.569677192923439,-96.482854000558774 28.580364266564878,-96.480309456397848 28.596649335387912,-96.485907441717487 28.60784531588914,-96.490487633041468 28.610898766909834,-96.510843966604781 28.614970031650095,-96.510335069606953 28.617514575811001,-96.497612348802434 28.625148188569788,-96.496594535082863 28.630746183751381,-96.49964797624159 28.635835272073191,-96.506263795004728 28.638379806372129,-96.513590449607946 28.639711925390898,-96.518002756430107 28.640514162994929,-96.524548246905439 28.641704252172264,-96.541744210187403 28.644830790950802,-96.545449731689985 28.645504522133091,-96.555118991611849 28.64601343885484,-96.5632615210924 28.64448670841351,-96.564664053901609 28.647882315216158,-96.572092291837293 28.665866475800886,-96.572930781014264 28.667896502859467,-96.570386236853366 28.674003385176928,-96.559190266214102 28.687235002979271,-96.559699163211917 28.6913062775815,-96.561225893653244 28.696395346179383,-96.566823878972883 28.697922096344637,-96.575158129308363 28.702846874961025,-96.578019859474111 28.704537895383844,-96.57828826199534 28.705826226653553,-96.579938546079447 28.713747585140421,-96.580564403635009 28.716751699466613,-96.584126761515478 28.722858581784067,-96.584439828543964 28.722940967911413,-96.591359183115401 28.724761852179114,-96.593796021437342 28.725403125944972,-96.611342043876562 28.720366765465901,-96.616906294097589 28.718769618875786,-96.625254999999996 28.716373230030175,-96.632357663078409 28.714334501780041,-96.638120426114043 28.71268037463507,-96.643733366943522 28.711069252030907,-96.64589364157122 28.710449172933409,-96.648758110223909 28.709626963981723,-96.65548660082564 28.704200766225345,-96.664534272187169 28.696904262901135,-96.657918463285995 28.687743919701024,-96.642136214348383 28.67476740345478,-96.635017595423747 28.668914316579048,-96.634564255386636 28.662567599984854,-96.634358790297441 28.659691108644115,-96.634304719917793 28.658934128568227,-96.633999771842213 28.654664885057134,-96.627892869800831 28.650084693733149,-96.626425176648581 28.649921620227584,-96.623312698200763 28.64957579673532,-96.621378075676532 28.648286046719594,-96.615940371111847 28.64466090565978,-96.615679075580019 28.64448670841351,-96.614055987266909 28.642701311583636,-96.613585709918453 28.642184006591457,-96.613038272810982 28.641581825879328,-96.612716570908134 28.641227953848528,-96.611999586497333 28.640439271135588,-96.610589997120172 28.638888723093881,-96.610589997120172 28.638695619081329,-96.610589997120172 28.63634418879494,-96.61975034032028 28.62769274259265,-96.620390401117646 28.626519297452973,-96.620672695530928 28.626001757543317,-96.621575870071126 28.624345937066781,-96.622336527533278 28.62295139797671,-96.622803791340985 28.622094747411062,-96.621924089240224 28.619379144726071,-96.621515564809087 28.618118047314677,-96.621338841511317 28.617572510068054,-96.620571817957583 28.61520474122884,-96.620437729127232 28.614790814755992,-96.617253050911174 28.604959849584038,-96.615239196090883 28.598743166058551,-96.614649885719274 28.596923990196654,-96.613008078443599 28.591855801497097,-96.611528402529856 28.587288105363601,-96.611113505533794 28.586007336117376,-96.611098903979951 28.585962261746474,-96.608298572876635 28.583628658523324,-96.608045443097311 28.583417717585569,-96.607377235577218 28.583437664220053,-96.600365219155734 28.58364697962633,-96.593251058093557 28.583859344147964,-96.573948594733835 28.584435541167107,-96.565297148531556 28.582399903865994,-96.564279334811971 28.57629300182461,-96.563658896232639 28.575155527088082,-96.562968608029692 28.573889994257026,-96.561225893653244 28.570695006643017,-96.557566061723506 28.569051817003789,-96.543745727976315 28.562846769979732,-96.536289388489891 28.559499026141786,-96.535271536438941 28.559346348925885,-96.526111211846271 28.557972305562419,-96.524846286909124 28.55686549700842,-96.523547686998668 28.555729222873186,-96.522039937244045 28.554409942750958,-96.516783301381025 28.541093122164042,-96.514406314623301 28.535071417976255,-96.512075206364955 28.532603188828926,-96.505754868421008 28.525911074776143,-96.496773944100411 28.520225902118948,-96.493684489370622 28.518270192113103,-96.482894459981281 28.511439806078794,-96.464303363514816 28.49967112954555,-96.450283853050735 28.49079639296917,-96.41974938229167 28.46738661824714,-96.410828816467941 28.459457253614527,-96.410588999643707 28.459244083835621,-96.409758652296418 28.458206146634446,-96.408886828651134 28.457116363910039,-96.40506625078595 28.452340627696451,-96.402446489887097 28.449065917053971,-96.402758256176753 28.447714917044181,-96.403973200604497 28.442450108152798,-96.407195206365273 28.441281062045864,-96.417343901660857 28.437598792799108,-96.461479843413926 28.421584870195201,-96.476120924474287 28.411702150055138,-96.481836236149007 28.407844318412668,-96.504737094149291 28.397666161492985,-96.511137484289378 28.396220910815867,-96.520513236388609 28.394103803612502,-96.534249520963641 28.388796609353736,-96.542905217114992 28.385452367272176,-96.559699173073881 28.377818734789468,-96.57038624671533 28.368658381727396,-96.577905378446388 28.364719789411506,-96.5917603939982 28.357462401226169,-96.600411840200493 28.354408960067438,-96.650793747525029 28.34677533744669,-96.672676831253582 28.335579347083499,-96.688452973492915 28.347284234444516,-96.694559875534281 28.347284234444516,-96.698122233414779 28.342704062844462,-96.705246949175717 28.348810964885843,-96.700157860853906 28.369676195446971,-96.705755865897487 28.400210705653887,-96.710336037497541 28.406826524417021,-96.710425531143088 28.406841439843959,-96.711757514930511 28.407063434453107,-96.711949596522956 28.407095447664108,-96.71209813364915 28.407120203551969,-96.7125191933293 28.40719037931537,-96.712878460543081 28.407250256459115,-96.722549831718325 28.408862132132249,-96.749013067323034 28.408862132132249,-96.762244685125353 28.411915593014903,-96.76554491144303 28.411090543097366,-96.768351577304784 28.410388882297497,-96.775985199925543 28.405808690973519,-96.777118787058129 28.404067826336821,-96.778115367638478 28.402537364460464,-96.780337941159374 28.399124129135416,-96.780820705165937 28.398382742114745,-96.790234641309425 28.383925636830853,-96.794392274787313 28.366371177405831,-96.794814812909479 28.364587126849088,-96.794810066932399 28.364444747076842,-96.79477772408616 28.363474458555832,-96.794305906049686 28.349319871745632,-96.794064195689629 28.347593374049037,-96.792754716842737 28.338239980125699,-96.790743538307225 28.323874459722486,-96.791161640090152 28.319066463411133,-96.791737095961722 28.312448960638157,-96.791761391474679 28.312169572361466,-96.791798306096766 28.312130020933203,-96.806010803272656 28.29690232711997,-96.809573161153153 28.290286508356836,-96.806010803272656 28.282143978876302,-96.799480493673911 28.2729662335258,-96.799349781293685 28.272782529381054,-96.787181219874626 28.255680743271615,-96.787181219874626 28.250082757951983,-96.800412817953031 28.224128419345121,-96.810027933605966 28.21709297064087,-96.81015126416365 28.217002728792142,-96.823379937963566 28.207323213817581,-96.836184503007971 28.197954022244446,-96.84100213695676 28.194428925121734,-96.842143298799229 28.193593928862132,-96.847274602334139 28.190686192954498,-96.857267971405633 28.185023289193378,-96.872677809006134 28.176291056181483,-96.877474270970822 28.171878306563691,-96.886067200578026 28.1639728030657,-96.898123211167331 28.152881261735526,-96.906497631141988 28.149042991548708,-96.910337015250093 28.147283276415891,-96.926704620510804 28.131597659113019,-96.934764623415617 28.123873491831901,-96.962356663895278 28.123371819605953,-96.962754569737697 28.123364584972112,-96.979717515560068 28.129783000626698,-96.995398793779131 28.135716460690723,-97.000413785843605 28.137614026355994,-97.007520616950742 28.136091128354632,-97.007538501604586 28.136087295914667,-97.009222611239821 28.135094102666635,-97.00939982996681 28.134989589017771,-97.027385928308092 28.12438239869169,-97.028912648887456 28.117257682930727,-97.025203084589847 28.111384210119862,-97.023365428929196 28.108474590635566,-97.022805746846075 28.107588427939849,-97.02290356380766 28.107197159145706,-97.023379876854563 28.105291902342927,-97.02382356056566 28.10351716319958,-97.025496807419856 28.101530180660298,-97.031966099908146 28.09384788848477,-97.033883146887263 28.088918342142531,-97.035528457788629 28.084687545284659,-97.035528457788629 28.083043098067591,-97.035528457788629 28.081818766572983,-97.035528457788629 28.074000471643224,-97.033022532693735 28.061470870449408,-97.032801767679686 28.060367047518316,-97.031459273912688 28.053654591691117,-97.031457183186404 28.053644138079921,-97.025859197866765 28.041939250718904,-97.030948266464648 28.033287814378582,-97.03239348781301 28.032603236465789,-97.040617526386512 28.028707642778524,-97.041168915404441 28.028259640036232,-97.046718327422383 28.023750751173218,-97.048760075590963 28.022091833877354,-97.050263648357429 28.019142519014494,-97.059727497080047 28.000578821719444,-97.061991693393324 27.99613751499442,-97.06790259446116 27.99219690579767,-97.073772658186698 27.988283521554418,-97.075732208193486 27.986977152070377,-97.083740513918784 27.975854507337193,-97.090858162154831 27.965968886660271,-97.094600599978094 27.960771057335059,-97.101378519421061 27.951357282114685,-97.101544336287489 27.951126980954953,-97.101629253046639 27.951009041034034,-97.112670327945679 27.935674217691009,-97.118292397880069 27.927865788706086,-97.121533983365822 27.923363587495643,-97.122089895488358 27.923104160785101,-97.123659587861624 27.92237163470331,-97.129167576400675 27.91980122961516,-97.134800331352182 27.902469771509406,-97.13578341488774 27.899444915775788,-97.139044920333077 27.897526377912126,-97.141761509630356 27.895928379836029,-97.144434841366106 27.894355827453982,-97.155121915007527 27.880615312653809,-97.156735458496229 27.877916799393841,-97.171211094589736 27.85370753808861,-97.17159000749372 27.853073838716419,-97.18273536107327 27.834434189625789,-97.184638591770963 27.831251199324921,-97.187183135931861 27.824126483563962,-97.18941247112663 27.823657146727278,-97.196852395853725 27.822090836400886,-97.201135366472329 27.822090836400886,-97.208766105658313 27.822090836400886,-97.209575096934316 27.822090836400886,-97.21103842611052 27.822356897891609,-97.21191517248603 27.822516307306422,-97.214117494684729 27.822916731993345,-97.215541825234411 27.823175702780983,-97.217387510601711 27.823511284007832,-97.220771087297493 27.824126483563962,-97.222189700736266 27.82464074101355,-97.223091414240102 27.824967618564596,-97.225175600069406 27.825723150734085,-97.225442194074731 27.826156365185522,-97.225555528799433 27.826340533769983,-97.225696025109201 27.826568839847944,-97.22598639723725 27.82704069367685,-97.227317456819009 27.829203661466853,-97.227317456819009 27.832884543697009,-97.227317456819009 27.832951908184537,-97.22711696094737 27.834288541284948,-97.22651425924083 27.838306534493725,-97.227537582741903 27.841230302974814,-97.228388390382094 27.843661171179477,-97.233100025453197 27.847817700825228,-97.234045759551762 27.848652012430087,-97.234511621821596 27.849062988727319,-97.238500481248579 27.854279199579018,-97.239439164419366 27.855506710708827,-97.241127420860792 27.857714434929608,-97.24139627838295 27.858969111470945,-97.242350826195675 27.863423696705052,-97.242654131578206 27.86483913096664,-97.243132066142749 27.865496290124597,-97.244364366034702 27.867190700237273,-97.250796680782656 27.876035121329831,-97.263010484865433 27.88010639593206,-97.267085449659064 27.88068852838779,-97.272090543185925 27.881403535150675,-97.273697558506882 27.881633106649463,-97.276628649874411 27.881144591421538,-97.283916343274228 27.879929975854907,-97.291452123510041 27.878674012482271,-97.291709327200167 27.878631145200583,-97.295071705789752 27.87807074876898,-97.29826066531912 27.876989746639367,-97.302276298241679 27.875628516526195,-97.30641171632756 27.874226681314273,-97.315889353880934 27.871013926092836,-97.325097299274915 27.867892591849294,-97.326845878314657 27.866807265961079,-97.334190606350404 27.862248465187459,-97.346213303335873 27.854786094892546,-97.354613966176373 27.849571885725148,-97.359768343966266 27.850509060182219,-97.360211961357962 27.850589719168646,-97.360654441244435 27.850290746360063,-97.363614400263117 27.848290774636723,-97.376904444631478 27.839311017562139,-97.379041564479934 27.837867018088055,-97.379057154646048 27.837837708581311,-97.379081675001302 27.837791610322164,-97.37968928125764 27.836649310776913,-97.391764280353456 27.813948316782309,-97.391812130016405 27.812975373996721,-97.391812459346511 27.812968677620422,-97.39203202611381 27.808504155006624,-97.392068018906713 27.807772301822137,-97.392095751995882 27.807208395884746,-97.393123788240075 27.786304999999999,-97.393168763213623 27.785390509210199,-97.393291005863816 27.782904909577571,-97.393142269808052 27.782564941361908,-97.39298939956177 27.782215523565412,-97.390949955785928 27.777553936582201,-97.390465068726371 27.776445623015572,-97.390185233729682 27.775805999999999,-97.389524844304646 27.774296538065283,-97.38835420640342 27.771620793596586,-97.388306220610531 27.771511111755789,-97.388011229692253 27.770836846624743,-97.38704242749894 27.768622441036733,-97.386166290102864 27.766619840754537,-97.385225495384532 27.765302728148875,-97.378862356737287 27.756394334042721,-97.375764970087644 27.752057992733249,-97.373069654276961 27.748284550598278,-97.368354500700462 27.741683335591173,-97.365855345900911 27.739779218033028,-97.354970329043653 27.731485873530172,-97.352272255056832 27.729430198526604,-97.34997871774064 27.727682741876539,-97.347507961666906 27.725800261438444,-97.346980343555629 27.725398266768138,-97.343485766084669 27.723942192633796,-97.323096068004702 27.715446484002907,-97.316445853072636 27.712675560756566,-97.312489136070184 27.711663774861414,-97.307771479065892 27.710457406346261,-97.30518751069485 27.709796650788128,-97.285725857752936 27.704820043684109,-97.259850586867117 27.698203387982087,-97.253955150197811 27.696695845323848,-97.254014647303208 27.696526337654994,-97.255455364792269 27.692421723465429,-97.259957004258851 27.67959652118169,-97.261636792970123 27.679316557300702,-97.26241778482418 27.679186392412099,-97.266063906300232 27.678578707462119,-97.266172011465457 27.678349884642419,-97.272736281666539 27.664455499360063,-97.273042341106247 27.663807672923248,-97.273584380560237 27.662660354976065,-97.276535709391737 27.656413369610792,-97.277059923980644 27.655303780997631,-97.278846463786479 27.651522268106756,-97.280071982275985 27.648928251476995,-97.280889132874719 27.647198614380269,-97.282300269490932 27.644211705671331,-97.282869528026779 27.64300677394548,-97.287959956150573 27.632232024058997,-97.288756326795195 27.630546371240786,-97.290370933329072 27.627128784125372,-97.290610159422798 27.626622421740255,-97.291264204229464 27.625238025568656,-97.291996439564016 27.623688125953898,-97.292910903535031 27.621752508687905,-97.293983233844585 27.619482740684056,-97.29528946695001 27.616717877953022,-97.296598377059297 27.613947348891728,-97.297587499071795 27.609496333379006,-97.298634024222366 27.60478700569162,-97.29761621050281 27.598680093788271,-97.294053852622326 27.594099922188217,-97.294182769084571 27.593971005725969,-97.300049926927869 27.588103847882682,-97.302196382102863 27.585957392707677,-97.311120578488044 27.579146819865922,-97.321534901946578 27.571199044464009,-97.325080504595888 27.561034984604785,-97.336802147188081 27.527432946040641,-97.343417965951204 27.517763686118776,-97.347489240553443 27.503005347737066,-97.350542661988243 27.478577729709574,-97.359194108190536 27.458221396146271,-97.365809926953673 27.450587783387487,-97.371916828995055 27.425142361502377,-97.369881181831957 27.412419660421783,-97.372934622990698 27.401223670058592,-97.379550422029908 27.390027689557368,-97.399397858595393 27.344734850830708,-97.401942402756291 27.335574497768633,-97.404995863638931 27.329976512448997,-97.413138393119482 27.321325066246711,-97.42026310888042 27.317253791644482,-97.430441285524054 27.313691423902039,-97.450797599363412 27.313691423902039,-97.482858840011673 27.297915271800758,-97.508304242172855 27.275014394076553,-97.532222933616623 27.278576761818989,-97.544436737699399 27.284174747138625,-97.546981281860297 27.290790556039799,-97.536803105216677 27.289263825598471,-97.526624948296998 27.291808369759369,-97.524589320857856 27.297915271800758,-97.51746460509689 27.305039987561717,-97.504741884292372 27.305039987561717,-97.498126085253162 27.308602345442196,-97.502706237129289 27.322342870104325,-97.499143898972747 27.327940855423961,-97.483876634007316 27.33862793892736,-97.483876634007316 27.351350640007954,-97.486930094889971 27.358984272490666,-97.501688443133645 27.366617904973374,-97.514411144214236 27.361528796927644,-97.520518046255617 27.352877370449281,-97.538329835658018 27.335574478044709,-97.570899973304094 27.315727061203152,-97.584131581244463 27.309620159161771,-97.609068086407831 27.285192570720163,-97.621790807212349 27.287228188297352,-97.63146005727225 27.286210384439741,-97.63654914066305 27.282139109837512,-97.636657939024673 27.281797172172649,-97.640111498543547 27.270943129336285,-97.639093679892994 27.253131339933887,-97.635022415152719 27.247024437892502,-97.628915513111338 27.242953173152234,-97.597363199046811 27.242444266292445,-97.5826048606651 27.240408628991332,-97.573953414462821 27.238881903480983,-97.56123071338223 27.232775006370584,-97.542910007258072 27.229212648490105,-97.520009129533875 27.231248285791217,-97.509830972614182 27.235319550531486,-97.503215153851045 27.23989972213154,-97.500161712692318 27.244479898662579,-97.485148876501881 27.25084127385778,-97.467082638600573 27.253640266517596,-97.45843119239828 27.259492710198106,-97.450288657986775 27.262546171080761,-97.424079880742951 27.264072891660124,-97.422298701802717 27.257711541119829,-97.434766954384401 27.202240525749552,-97.444945121166043 27.144733882940127,-97.443672849085587 27.116235010034327,-97.452324285425917 27.115217201245734,-97.455886653168363 27.110382571284802,-97.456650008527049 27.09969549764336,-97.46173908698691 27.095624227972113,-97.475479621510999 27.098423220631929,-97.480568699970846 27.102494490303176,-97.491510231973166 27.101222218222723,-97.495835955074313 27.09409750739275,-97.4932914109134 27.078066891999608,-97.477515248950155 27.066107546277717,-97.479041969529504 27.06279964182713,-97.482256963728076 27.061942305056665,-97.48693005051112 27.057710553505324,-97.487693415731783 27.053639288765055,-97.486675602012198 27.034809685643079,-97.477515248950141 27.032519589981089,-97.473952881207694 27.029211690461484,-97.473443984209865 27.022850330059228,-97.478300083716704 27.000269498406993,-97.478533072531675 26.999186101907302,-97.480568690108868 26.997659376396957,-97.483967678435022 27.000330000000002,-97.484131057851314 27.000458369056773,-97.492988547644813 27.000330000000002,-97.49889841702128 27.000244349959733,-97.533497176854453 26.999742920066073,-97.536803065768822 26.999695008767091,-97.549271318350492 26.995878197456715,-97.555378215460905 26.990280207206101,-97.551052502221722 26.980865400714134,-97.549525776711377 26.965343697111763,-97.552324769371197 26.95211208177491,-97.555378205598956 26.947277449348487,-97.555378205598956 26.938880461507075,-97.540874325578116 26.906310323861007,-97.540110950495503 26.900966796902246,-97.547999041339082 26.895114353221743,-97.552324764440229 26.888498544320569,-97.552324764440229 26.875332999999998,-97.552324764440229 26.873831771434514,-97.552324764440229 26.871753101924,-97.552324764440229 26.867633303897481,-97.555396527456509 26.865969429990074,-97.558431656619632 26.864325399446898,-97.558453748966258 26.864224239771101,-97.559853702000524 26.857813929560987,-97.562641307980527 26.845049630589628,-97.563266286580571 26.842187886943357,-97.552579212939136 26.827938454188693,-97.547744582978211 26.824630549738107,-97.537566416196555 26.824885004400745,-97.509830908511418 26.8035108521869,-97.48438549155729 26.763561555211936,-97.478024141017002 26.757200199740662,-97.471662790476714 26.758726925251008,-97.468609339456009 26.740915130917632,-97.467337057513589 26.710126182073765,-97.444945096511148 26.633535472850511,-97.445708451869848 26.609362327976836,-97.441206258760758 26.5999011976768,-97.435205432977895 26.587290766879221,-97.432741093635642 26.582112082834445,-97.429217375703914 26.574707168454967,-97.428151110966368 26.572466467229631,-97.418145193925739 26.555638334425574,-97.416955130465126 26.553636864107652,-97.41864075483771 26.543121778291471,-97.42039414733226 26.532183948458435,-97.422284917775215 26.520389141863415,-97.422298667285844 26.520303371102887,-97.425861015304378 26.516741008291426,-97.430695645265303 26.506562841509776,-97.430695645265303 26.494603495787885,-97.42802638225659 26.488322868889494,-97.42636993202612 26.484425333937217,-97.429168909893022 26.478063961207511,-97.43553026043331 26.470175880225888,-97.441382709044788 26.466613522345408,-97.441382709044788 26.455417541844177,-97.43756589773443 26.449819546662585,-97.425861005442428 26.446002740283195,-97.421026375481503 26.446766095641895,-97.417209564171131 26.449819546662585,-97.411611568989528 26.447275002501684,-97.412883841069984 26.433025580841726,-97.421789740702152 26.417249413947498,-97.419499649971158 26.413178149207234,-97.406013578738921 26.409106884466965,-97.398125502688274 26.410888063407203,-97.394308686446919 26.414450416356704,-97.395072051667569 26.417249413947498,-97.382484933201752 26.411326066613285,-97.377769169124974 26.409106884466965,-97.369626639644437 26.394602999515151,-97.374461259743413 26.38086247238753,-97.388965149626202 26.365849678110436,-97.392018610508856 26.339386444971247,-97.391000786927322 26.332261729210284,-97.38794734576858 26.330480545339064,-97.376242448545611 26.336332993950553,-97.372171183805335 26.339895346900054,-97.36937219114553 26.348546788171358,-97.358176200782339 26.356434874083959,-97.343417852538664 26.35923386920927,-97.342332537534404 26.358759043566288,-97.335275323058127 26.355671510096041,-97.335020017473738 26.355402767481841,-97.331108052904881 26.351284911668415,-97.330440693097202 26.350582427937965,-97.333762617526986 26.340749518544904,-97.336802038706509 26.331752819885011,-97.343786761143846 26.325987658774913,-97.344677525679145 26.325252425399061,-97.352414066956698 26.31886671611711,-97.352832659030639 26.318521211944631,-97.354359379610003 26.313941040344577,-97.348998828460125 26.312092573442666,-97.347821984790102 26.311686765063648,-97.346980205488165 26.311396496183672,-97.34736083223585 26.297503848546928,-97.347437236753805 26.2947151295396,-97.347489122209922 26.292821341560611,-97.347051378510429 26.289694600417153,-97.344137846000223 26.268883651035111,-97.343926764329439 26.267375924606483,-97.342629246748771 26.266550231912309,-97.341127771669619 26.265594748131736,-97.335282658907644 26.265594748131736,-97.331967408745584 26.265594748131736,-97.330307576264516 26.266747410222209,-97.323817586106017 26.271254350355399,-97.322807065545476 26.271956101137519,-97.313207351206557 26.273518846137112,-97.312102101648151 26.273698770576502,-97.311865543405119 26.273737280077761,-97.307030913444194 26.253126493084562,-97.308048727163751 26.249055213551365,-97.321280340035131 26.236078054109896,-97.321280340035131 26.228698889850026,-97.304486359421333 26.202490107675235,-97.296598288301666 26.200708923804015,-97.294817109361432 26.192311940893585,-97.296089381441874 26.182388227541828,-97.303096384204423 26.167373221160254,-97.305986772892751 26.161179530923267,-97.306776455083323 26.159487354748606,-97.300965235160419 26.149753561518516,-97.296881711355638 26.142913659244432,-97.296598288301666 26.14243892563589,-97.285549237329036 26.12861437636975,-97.28536038956149 26.128378090441405,-97.284582435540926 26.126454238998875,-97.282094393487881 26.120301403270393,-97.282839179410786 26.118439442973433,-97.28311220967295 26.117756868971455,-97.285501587752023 26.116923364107649,-97.294053737977038 26.113940052730097,-97.295071554162092 26.108342057548505,-97.292023254217796 26.105090538920617,-97.291924538345086 26.104985242032239,-97.291541272704407 26.104576425513905,-97.287190793518263 26.099935916255493,-97.286650074642992 26.099359149688052,-97.286603231473521 26.09930918366079,-97.283195451762182 26.095674220102872,-97.282639002190891 26.095080674133143,-97.282108002623801 26.094514274823585,-97.280435495761154 26.092730268223651,-97.279905974795895 26.09216544608875,-97.27980430522237 26.092056998587434,-97.27089841052117 26.086459003405839,-97.267086875013263 26.085485845069449,-97.24859983335169 26.080765747704277,-97.246979719077387 26.080352101364454,-97.229515030031649 26.08000965739204,-97.220290685310772 26.079828788368793,-97.208048240752987 26.079588741074772,-97.205005053278043 26.078666562185607,-97.199651252911579 26.077044196913871,-97.199152512570265 26.073220535461079,-97.199134106850465 26.073079425477676,-97.198725011196004 26.069943037351702,-97.198302051934135 26.066700361972018,-97.196018989165054 26.049196947106083,-97.195939794821285 26.0485897927724,-97.195071061587612 26.04192952989985,-97.204994779870347 26.030224637607851,-97.214918488291119 26.030733549398622,-97.224842206573854 26.027425644948035,-97.226114478654296 26.024372193927345,-97.219244211392265 25.99612778184791,-97.216954125592238 25.993837693582392,-97.208557137750816 25.991802058746771,-97.195834416946283 25.993074335758202,-97.174460269663413 26.000071824804216,-97.167208324722026 26.007069313850227,-97.162755377371425 26.014575709756024,-97.16262814819099 26.023481604457221,-97.172042954682937 26.044728528107019,-97.178658763584124 26.045491893327686,-97.182730028324386 26.053125515948434,-97.164981847348457 26.063876207878327,-97.152009000000007 26.062107999999998,-97.152012551274964 26.062039393270581,-97.15321 26.038906,-97.151921999999999 26.017652999999999,-97.14747181118706 25.985075937251509,-97.145567 25.971132,-97.146880999999993 25.969781,-97.146293999999997 25.955606,-97.147784999999985 25.953132,-97.156608000000006 25.949021999999999,-97.160293999999993 25.950243,-97.168198638692317 25.959262149012673,-97.178362000000007 25.962114,-97.187583000000004 25.958174,-97.206945000000005 25.960899,-97.214339285966162 25.960186817526893,-97.227626420907342 25.958907063854085,-97.229225999999997 25.958753000000002,-97.239867000000004 25.954974,-97.244841570811701 25.950784663302475,-97.248032999999992 25.948097,-97.255343503388133 25.949129556975723,-97.276707000000002 25.952147,-97.28138899999999 25.948036999999996,-97.277163000000002 25.935438,-97.284201820237172 25.935775045516863,-97.290083634347766 25.936056689174489,-97.293963761326751 25.936242484429805,-97.303601999999998 25.936703999999999,-97.316138101068788 25.931602038234757,-97.320560999999984 25.929801999999999,-97.324914000000007 25.924040999999999,-97.332235861490744 25.923541683060932,-97.33463605770983 25.923378000829199,-97.338346 25.923124999999999,-97.339310160867683 25.923294280152341,-97.350397999999998 25.925241,-97.367642000000004 25.915679999999998,-97.369283543255307 25.913688286645449,-97.373641276386991 25.908400972256459,-97.374430000000004 25.907443999999998,-97.372365000000002 25.905015999999996,-97.365976000000003 25.902446999999999,-97.365883578347024 25.900015396466173,-97.365521 25.890476,-97.364300486696564 25.885628504434479,-97.362421560218849 25.878165998501085,-97.360082000000006 25.868874000000002,-97.364783621478566 25.852096838905283,-97.36542 25.849826,-97.372864000000007 25.840116999999996,-97.394513000000003 25.837377,-97.422635999999997 25.840377999999998,-97.42853949246836 25.842912007889609,-97.434188204901034 25.845336654308195,-97.441181027463472 25.848338244915578,-97.445113000000006 25.850026,-97.445601387363794 25.851485440010176,-97.447179184935308 25.856200346812667,-97.448271000000005 25.859463000000002,-97.449172000000004 25.871677999999996,-97.452166849899044 25.875807172885114,-97.453724626189043 25.87795496921364,-97.454727000000005 25.879337,-97.45488774919265 25.879394304385261,-97.462586893331732 25.882138919861518,-97.468261999999982 25.884162,-97.468599721544905 25.884059457735212,-97.481532785459223 25.880132596436578,-97.486059999999995 25.878758,-97.490359999998347 25.879275544671589,-97.494739403174762 25.879802646248233,-97.496860999999996 25.880057999999998,-97.519591990380178 25.88590026892226,-97.521761999999995 25.886458,-97.52344767329889 25.891064017588189,-97.524375103029939 25.893598172727145,-97.528116959024402 25.903822606212749,-97.528119935206945 25.903830738482007,-97.52812430798204 25.903842686870224,-97.528627999999998 25.905218999999999,-97.528849446448064 25.906732522417784,-97.530321999999998 25.916796999999999,-97.530415259581318 25.916820899843632,-97.539878370214808 25.919246032588486,-97.542957 25.920034999999999,-97.545169999999999 25.923974999999999,-97.545468770003851 25.926387609575503,-97.545470694802859 25.92640315259677,-97.546397824784293 25.933889856891241,-97.546420999999995 25.934076999999998,-97.546611329705271 25.934141994258589,-97.555160182125618 25.937061277530951,-97.555378999999988 25.937135999999999,-97.555477252221124 25.937015705749829,-97.559364000000002 25.932257,-97.582565000000002 25.937856999999997,-97.580418999999992 25.945115999999995,-97.583044 25.955442999999999,-97.598043000000004 25.957556,-97.5981230356591 25.957681442330628,-97.607733999999994 25.972745,-97.60783562843973 25.973457509771446,-97.607844088251909 25.973516820913719,-97.608283 25.976593999999999,-97.609461531117333 25.977846566488182,-97.613191727531174 25.981811093986448,-97.613466053312663 25.982102652924251,-97.616041456343709 25.984839842874308,-97.624938181905222 25.994295461083137,-97.627225999999993 25.996727,-97.634804000000003 25.999508999999996,-97.635072411453706 25.99971613545971,-97.639164724998494 26.00287420951236,-97.642117661027001 26.005153015998879,-97.644011365977178 26.006614404624422,-97.643848619841975 26.01214811069886,-97.643707610985203 26.016942704231127,-97.649175518723894 26.021499311673544,-97.65096419129361 26.02118629315062,-97.659123404318109 26.019758427116106,-97.661326460130226 26.019372891335045,-97.66298585459532 26.019511685247039,-97.668297999999993 26.019955999999997,-97.669519566971061 26.021667429940447,-97.671350987084779 26.024233271429612,-97.671567999996611 26.024226704244594,-97.691453959129774 26.023624920821636,-97.697068999999999 26.023454999999998,-97.703247203861338 26.030308742132775,-97.706066818770353 26.031284762516545,-97.709294717923569 26.032402112038366,-97.711145328137576 26.033042707775564,-97.719920000000002 26.030837999999999,-97.723585926686539 26.030959832537771,-97.729354247932832 26.031151535557555,-97.735180242251758 26.031345155270547,-97.758837769919694 26.032131383932391,-97.76309059882324 26.033650253079866,-97.763351431657455 26.034258862745556,-97.76491324062286 26.037903081983409,-97.769788888528993 26.041344719068825,-97.770077387482857 26.041548365582649,-97.776788595669075 26.042443189872706,-97.779190602367677 26.042763456191249,-97.784050976575529 26.040637041739476,-97.789822674626535 26.0424596835391,-97.792252861730461 26.04428232533872,-97.793102878401371 26.047342389307317,-97.793537334820812 26.048906434437896,-97.794638769549053 26.052871604582215,-97.795290594138677 26.055218176136449,-97.801344 26.060016999999998,-97.803973303988229 26.059548218630308,-97.8082126910423 26.058792373859696,-97.819424117916668 26.056793476786609,-97.820997703829306 26.056512920501468,-97.825546000000003 26.055702,-97.826721102251625 26.055271667399982,-97.830409376527257 26.053920989485444,-97.836607999999984 26.051650999999996,-97.848759348822554 26.052295281844582,-97.85186756815483 26.052460084066457,-97.859824237628374 26.052881958029587,-97.860225497621784 26.05290323340671,-97.860503999999992 26.052917999999998,-97.861874999990562 26.053580848914272,-97.869705222636284 26.057366592615971,-97.871187000000006 26.058082999999996,-97.876982999999996 26.064482999999999,-97.886529999999993 26.066338999999999,-97.901546631929207 26.060958662441269,-97.905109129229899 26.05968224852101,-97.913882 26.056539,-97.935419999999993 26.052687999999996,-97.944344999999984 26.059620999999996,-97.950095000000005 26.061827999999998,-97.96210735288345 26.054793018383155,-97.96735799999999 26.051718,-97.971403108419892 26.054550391225565,-97.978769 26.059707999999997,-97.979877702655912 26.062937323324391,-97.981335 26.067181999999995,-98.010970999999998 26.063862999999998,-98.015122209308288 26.064471399070538,-98.026123959861238 26.06608380989196,-98.028288992822496 26.066401115993269,-98.028758999999994 26.066469999999999,-98.029241090705753 26.065867136858621,-98.033102 26.061039,-98.034402999999998 26.051375,-98.034479464439173 26.051215303797409,-98.034525269179767 26.051119640464091,-98.039238999999981 26.041274999999995,-98.054365285842039 26.044575736209502,-98.070020999999997 26.047992,-98.070022345126233 26.049160242153427,-98.070025 26.051466,-98.071425788568789 26.055027814897404,-98.076094939927231 26.066900165398668,-98.076139697069991 26.067013970337847,-98.076205751241318 26.067181927684643,-98.076543999999998 26.068041999999998,-98.076994427275579 26.068371469710563,-98.080289992888041 26.070782045417982,-98.080494999999999 26.070931999999999,-98.080906883185932 26.070920010911959,-98.084755 26.070808,-98.085506402845155 26.069709056167966,-98.085848999999982 26.069208,-98.085628527723046 26.069048386721494,-98.081567000000007 26.066108,-98.081855064865067 26.063941606819231,-98.081884000000002 26.063724,-98.082307152201508 26.063513440869801,-98.091037999999998 26.059169,-98.093593108176947 26.058759459973995,-98.094431999999998 26.058624999999996,-98.095078111969258 26.058956205325877,-98.096949561841043 26.059915534659098,-98.097643000000005 26.060270999999997,-98.105504999999994 26.067537000000002,-98.122952624574893 26.063250384797335,-98.12786358062813 26.062043837809401,-98.128331000000003 26.061928999999999,-98.142925292417388 26.051941751725515,-98.14645163947533 26.049528582072455,-98.146621999999994 26.049412,-98.146852932570667 26.049588146033326,-98.149462999999997 26.051579,-98.149462999999997 26.055813,-98.151730999999998 26.058187,-98.158277994458601 26.062311711597108,-98.16142849281799 26.064296576133319,-98.161911645017582 26.064600969774318,-98.167608590156348 26.068190136655492,-98.172071527808072 26.071001859012309,-98.177897000000002 26.074672,-98.179863281323136 26.072661506851002,-98.189059999999998 26.063257999999998,-98.191534000000004 26.057117999999999,-98.197046 26.056152999999998,-98.200871000000006 26.059161,-98.203328791159265 26.063523594334541,-98.204415309491765 26.065452171017675,-98.20496 26.066419,-98.205720285634712 26.066905180236589,-98.2057544964389 26.066927057036718,-98.220672999999991 26.076467,-98.228363119990576 26.077028417928002,-98.230097 26.077155,-98.231072909449267 26.07694353295701,-98.240214327563166 26.074962705064888,-98.248806000000002 26.073101,-98.250234708208026 26.074229377516481,-98.260964088277859 26.082703320039151,-98.264514000000005 26.085506999999996,-98.272091468517374 26.0934369782697,-98.272527821536428 26.09389363077193,-98.277218000000005 26.098801999999999,-98.277020629370639 26.099144109090908,-98.272932087266241 26.106230915405163,-98.272897999999998 26.10629,-98.272099931737145 26.106512924095771,-98.270258188934392 26.107027377392626,-98.270033999999995 26.107089999999999,-98.269661374787887 26.108231250649609,-98.268046405073434 26.113177467856264,-98.266755660647689 26.117130670341034,-98.265753950746401 26.120198637935399,-98.265698 26.12037,-98.266046753689267 26.120369439652073,-98.268388964369507 26.120365676386069,-98.271048543344023 26.120361403199535,-98.2713587738927 26.120360904747326,-98.279433560913844 26.12034793086255,-98.289509742149562 26.120331741306838,-98.296194999999997 26.120321,-98.299522999999979 26.11749,-98.299575546893735 26.117376878214852,-98.299577897643644 26.117371817572689,-98.299619756950364 26.117281703787395,-98.301477861619162 26.113281617347607,-98.302978999999993 26.110049999999998,-98.307788398559808 26.112633359128559,-98.31093219000293 26.114322040617914,-98.314784784069062 26.116391454064445,-98.31781148535309 26.118017240801439,-98.323055746360907 26.120834185452331,-98.323827999999992 26.121248999999995,-98.324165904650499 26.121735183484471,-98.335204000000004 26.137616999999999,-98.337914801547555 26.149187638321976,-98.338210450252006 26.150449569219312,-98.338419999999999 26.151344000000002,-98.338123748811455 26.151776768193923,-98.337139471603692 26.153214615149455,-98.336278203634194 26.154472768358826,-98.335109254490916 26.156180386856505,-98.334230366689056 26.157464279382136,-98.333315999999996 26.158799999999999,-98.333279392301918 26.159609030127591,-98.333194378655719 26.161487831708563,-98.333156000000002 26.162336,-98.33332593363771 26.162525092143447,-98.336569396995017 26.166134227137082,-98.336837000000003 26.166432,-98.337709251548077 26.166391430160555,-98.345513373134324 26.166028447761192,-98.345781000000002 26.166015999999999,-98.345955918391979 26.165759937155421,-98.34781294946896 26.163041431373035,-98.354645000000005 26.15304,-98.380009845764519 26.156864235849298,-98.386243919298991 26.157804141722139,-98.386694000000006 26.157872,-98.386714843024777 26.157901012682096,-98.387178289965661 26.158546112849205,-98.389418830831929 26.161664858836595,-98.394322667090904 26.168490808715738,-98.402249554153599 26.179524728065878,-98.404432999999997 26.182563999999999,-98.41082579547016 26.183537375155975,-98.418120000000002 26.184647999999999,-98.44253599999999 26.199151,-98.444302622216625 26.201317032456906,-98.444376000000005 26.201407,-98.444366742625562 26.201566115583965,-98.444174812576264 26.204865005795593,-98.443681770155465 26.213339409994948,-98.45054565332704 26.219516919037407,-98.450975699346984 26.219903961344286,-98.465077324681431 26.222335272645303,-98.467962758220992 26.221802674698019,-98.47639547470331 26.220246150374404,-98.481645999999998 26.219277000000002,-98.483269000000007 26.216439,-98.496684404575589 26.212853148677059,-98.500574513964963 26.213825676024403,-98.503492081872309 26.214798198660183,-98.504399410834864 26.216045775617395,-98.509275818143593 26.222750833698164,-98.509327236533252 26.222821533963195,-98.516621175147847 26.223550930651591,-98.520846190978133 26.222726536052498,-98.524733007990875 26.221968131567948,-98.526589565145571 26.221605875956907,-98.528323413163747 26.222421776495104,-98.535240999999999 26.225677,-98.538016739096946 26.231331135295655,-98.538505426714039 26.231595841236214,-98.543851889046309 26.23449184328507,-98.556093449912439 26.231976454911809,-98.561600478976516 26.23084487397777,-98.564343479612191 26.231667774301364,-98.575891642961039 26.235132223865481,-98.57618836327309 26.235221239973473,-98.581780384919284 26.243001439905978,-98.583095590242166 26.247416774401941,-98.585184223567666 26.254428618568909,-98.588002268837087 26.255070784392117,-98.599153999999999 26.257611999999998,-98.610401443364651 26.253223367217647,-98.613465000000005 26.252027999999999,-98.617434734670965 26.252082931217494,-98.618976176235122 26.252104260920568,-98.625299999997523 26.252191766854153,-98.626653663614832 26.252210498179227,-98.633391522135483 26.243617562727948,-98.63418 26.242612,-98.636673745354344 26.241784277127035,-98.654221000000007 26.235959999999999,-98.669397000000004 26.236319999999996,-98.675206000000003 26.239989,-98.678410535728389 26.244637915883345,-98.679041999999995 26.245553999999998,-98.678977427258005 26.246060764449961,-98.677766000000005 26.255568,-98.679196310064967 26.258571609080832,-98.681167000000002 26.262709999999998,-98.687156000000002 26.26512,-98.698855915315121 26.265619481498664,-98.707451416076225 26.272152066874316,-98.710601999999994 26.279018,-98.709170532219119 26.284185773270103,-98.710647239525585 26.288123668959596,-98.711233447604599 26.289686894290245,-98.722550749196131 26.295571625529284,-98.729196000000002 26.299026999999999,-98.73263614407044 26.29899082409209,-98.734613221934339 26.298970033513189,-98.745271658069271 26.303095890935232,-98.745297595683382 26.304159357241051,-98.745599830797417 26.316551278053844,-98.745615470637418 26.317192526042046,-98.748245116157776 26.32061106368975,-98.74905366960931 26.321662182706675,-98.754840366886953 26.324877004144408,-98.755242435754027 26.32510037501579,-98.766685638772316 26.325769085950686,-98.779858354339893 26.326538865087553,-98.779911999999996 26.326541999999996,-98.779946859358333 26.326559704051515,-98.789821999999987 26.331575,-98.796251999999996 26.349104,-98.797592059971961 26.356670995104565,-98.798210999999995 26.360166,-98.807348000000005 26.369420999999999,-98.808280016253249 26.369491024329768,-98.813413043374013 26.369876679389535,-98.81818280466733 26.370235041528161,-98.81932575812273 26.370320914010964,-98.824571000000006 26.370715,-98.828353477559162 26.367368473620303,-98.832909 26.363337999999999,-98.838554497099707 26.360957856802237,-98.842229804437778 26.359408346173527,-98.844057000000006 26.358637999999999,-98.847707 26.359594999999999,-98.853132332741467 26.364754198689674,-98.853414999999998 26.365023,-98.853852117327648 26.365076242531281,-98.854321671505204 26.365133435992636,-98.861354000000006 26.365989999999996,-98.861661690067152 26.365902494757481,-98.869113443480302 26.363783259984523,-98.874117355796216 26.362360176799562,-98.876164212939671 26.361778062685843,-98.882912762903771 26.359858814831277,-98.890964919192157 26.357568829017531,-98.895015448091129 26.359360408468842,-98.900432100164338 26.361756234493352,-98.900829697862818 26.361932094951143,-98.905559653818443 26.364024190108832,-98.91296803413384 26.372226331500926,-98.915344992389564 26.37485796579432,-98.921277034399395 26.381425588572444,-98.922831447878195 26.38166472803821,-98.923508557916591 26.381768898347495,-98.924925720775448 26.381986922427696,-98.926689551972586 26.38116380140492,-98.934437533628781 26.377548077521784,-98.937555770591459 26.376092900630621,-98.942046463189357 26.375531566775365,-98.950185820407469 26.380302920861933,-98.952073083609605 26.383491745197549,-98.952938578460817 26.384954133189183,-98.953327659277917 26.385611545667039,-98.958325183064531 26.394055638388448,-98.960041959595969 26.394835991082342,-98.96758721887106 26.398265653180793,-98.981979903868819 26.396488780147621,-98.98323657723455 26.396333635432413,-98.985344372930967 26.396073413984297,-98.99032130527651 26.395458978465552,-99.008003378826189 26.395458978465552,-99.014739404125635 26.398826987036053,-99.018845438188137 26.404005475794783,-99.021934999999999 26.407902,-99.025336792347318 26.409271761295809,-99.030462148109507 26.411335530401477,-99.031104888479149 26.411594335405351,-99.032315999999994 26.412082000000002,-99.033086386506682 26.412180127570064,-99.037216923343138 26.412706252494743,-99.039107 26.412946999999999,-99.039645291109963 26.412681959983438,-99.045466000000005 26.409815999999999,-99.053184999999999 26.402006,-99.062093000000004 26.397371,-99.082001999999989 26.396509999999996,-99.085125999999988 26.398782,-99.089412999999979 26.408099999999997,-99.092044248326658 26.410330707587079,-99.0977332288968 26.415153685331873,-99.099649490160544 26.416778244479925,-99.110855 26.426278,-99.113807999999992 26.434002,-99.110485406379198 26.436329519428725,-99.103082999999998 26.441514999999999,-99.097481906444941 26.458865277747179,-99.094712087984234 26.467445230774196,-99.091634999999997 26.476977000000002,-99.105030999999997 26.500335,-99.114051328117867 26.510193091438737,-99.123438026388797 26.520451579672599,-99.126618350727256 26.523927276756307,-99.127319211298612 26.524693229780183,-99.127781999999996 26.525199,-99.128040494672888 26.525242991472329,-99.131554903978838 26.52584108518932,-99.136510932879688 26.526684518463242,-99.143658999999985 26.527901,-99.157083944984777 26.532657279516766,-99.166741999999985 26.536078999999997,-99.170704 26.540316,-99.171403999999995 26.549848,-99.167459686682065 26.559874693319248,-99.167410000000004 26.560001,-99.168618869529794 26.566870928153797,-99.16946034016965 26.571652951934592,-99.178064000000006 26.620546999999998,-99.200522000000007 26.656442999999999,-99.209947999999997 26.693937999999999,-99.208906999999982 26.724761,-99.240022999999979 26.745850999999998,-99.242444000000006 26.788262,-99.243132825912184 26.78921716914337,-99.262208 26.815667999999999,-99.268613000000002 26.843212999999999,-99.274832961326339 26.850997131057774,-99.280470999999991 26.858053000000002,-99.295146000000003 26.86544,-99.316753000000006 26.865831,-99.328801222539823 26.879647723469141,-99.328900000000004 26.879760999999998,-99.328852280051947 26.879943529980665,-99.328653604395157 26.88070346927794,-99.326247644284351 26.88990632616278,-99.321819000000005 26.906846000000002,-99.324684000000005 26.915973,-99.337297000000007 26.922758999999999,-99.361143999999996 26.928920999999999,-99.367053999999996 26.929033999999998,-99.379148999999998 26.934489999999997,-99.388253000000006 26.944216999999998,-99.393748000000002 26.960730000000002,-99.390189000000007 26.966348,-99.377312000000003 26.973818999999999,-99.376593 26.977716999999998,-99.378434999999996 26.980034,-99.385448615007036 26.981891053234623,-99.387366999999998 26.982399,-99.403694000000002 26.997355999999996,-99.407320999999996 27.005808999999999,-99.415475999999998 27.017239999999997,-99.420446999999996 27.016567999999999,-99.429379999999981 27.010833000000002,-99.432154999999995 27.010698999999995,-99.438721 27.01463,-99.445682828533535 27.022104842939122,-99.446523999999997 27.023008,-99.446589518313687 27.0234513503828,-99.446929167151652 27.025749691622671,-99.446969999999979 27.026026000000002,-99.446787747918748 27.026353589968604,-99.444062000000002 27.031253,-99.443973 27.036457999999996,-99.447729715193731 27.048260380671568,-99.452315999999996 27.062668999999996,-99.450282 27.067705,-99.439210578806851 27.075275465844946,-99.434470000000005 27.078517000000002,-99.429209 27.090981999999997,-99.430274999999995 27.094871999999999,-99.437646 27.100442,-99.442122999999995 27.106839,-99.441108999999997 27.110041999999996,-99.433369999999982 27.119218,-99.430581000000004 27.126611999999998,-99.431354999999996 27.13758,-99.438264999999987 27.144791999999995,-99.439971 27.151071999999996,-99.437950999999998 27.154121,-99.42998399999999 27.159148999999999,-99.426616441133064 27.174998569551711,-99.42634799999999 27.176261999999998,-99.426389092127664 27.176475083747437,-99.428025433058153 27.184960350328335,-99.432794999999999 27.209693,-99.441928000000004 27.217984999999995,-99.442101400955139 27.218265584747954,-99.445237999999989 27.223341,-99.443121431464945 27.230753685991843,-99.441406999999998 27.236757999999998,-99.441548999999995 27.249919999999999,-99.452207395848959 27.263806782859465,-99.452390999999992 27.264046,-99.452635348600225 27.264144272092288,-99.454218033886534 27.264780796280988,-99.462735864984637 27.268206496624611,-99.463308999999981 27.268436999999995,-99.463731957038988 27.268231398925973,-99.480688 27.259988999999997,-99.487909999999999 27.260721,-99.492407 27.264118,-99.496069429210138 27.270723950024919,-99.496615000000006 27.271707999999997,-99.496412995851571 27.272119287725655,-99.490870463706145 27.283404082904614,-99.487572835142558 27.290118173493504,-99.487513000000007 27.29024,-99.487552182270463 27.290674424182523,-99.487937000000002 27.294941,-99.493651777311726 27.30231355132117,-99.494603999999995 27.303542,-99.494999311050705 27.30367917804087,-99.501697839297435 27.306003653868146,-99.502036000000004 27.306121,-99.50260564894451 27.305998370990778,-99.511531000000005 27.304076999999999,-99.522353224815092 27.304131436852781,-99.523657999999983 27.304137999999995,-99.527521386758664 27.305370598210363,-99.529216737576675 27.305911493159478,-99.529653999999994 27.306051,-99.533911450776046 27.310119063512179,-99.536090758332008 27.312201427353024,-99.536443000000006 27.312538,-99.537771000000006 27.316072999999996,-99.53137599999998 27.323809,-99.52136037329538 27.324774325824137,-99.521259999999998 27.324784,-99.520793197388144 27.325167862222077,-99.515101491997058 27.329848278790703,-99.509737777509301 27.334258981108004,-99.504836999999995 27.338289,-99.507830999999996 27.348637,-99.507785758525344 27.353517859091919,-99.507778999999999 27.354247,-99.505884699626023 27.358359262089539,-99.503847413823948 27.362781925614613,-99.502763417847504 27.36513512979511,-99.502013099315448 27.366763966750881,-99.499076000000002 27.373139999999999,-99.492143999999996 27.380516999999998,-99.488110785984318 27.408328989964531,-99.487887470616073 27.409868914391197,-99.487633320470721 27.411621467383494,-99.487521 27.412396,-99.487591555014376 27.412624523015491,-99.489856740583164 27.419961308946796,-99.495313182879073 27.437634363915539,-99.495699000000002 27.438884000000002,-99.495681276107845 27.439260342274874,-99.495103999999998 27.451518,-99.489866073767956 27.458841813736395,-99.48498035355378 27.465673163249864,-99.484933241276849 27.465739036942171,-99.483818999999997 27.467296999999995,-99.483170086267094 27.470026063960816,-99.480813109028745 27.479938539705284,-99.480418999999998 27.481595999999996,-99.480219000000005 27.485795999999997,-99.483519 27.491095999999999,-99.494943552274876 27.498766770813134,-99.497518999999997 27.500495999999998,-99.501722168778215 27.500229993495459,-99.502529258718056 27.500178915086504,-99.513319999999993 27.499496,-99.516119999999361 27.498282666666942,-99.519319999999979 27.496896,-99.525819999999982 27.496696,-99.528319999999994 27.498895999999998,-99.525855930815595 27.516294999999385,-99.525849791073696 27.516338353233991,-99.525316190784537 27.520106149807926,-99.523876376642917 27.530272798702207,-99.522431296340699 27.540476632400054,-99.521918999999997 27.544094,-99.518818999999993 27.553194,-99.514319 27.556994,-99.511118999999994 27.564493999999996,-99.512219000000002 27.568093999999995,-99.515978000000004 27.572130999999999,-99.51621006287597 27.572263354504685,-99.516956092136581 27.572688844074506,-99.522907946893667 27.576083418863931,-99.530137999999994 27.580207,-99.536560517954015 27.595669560441458,-99.539721999999998 27.603280999999999,-99.549741780062789 27.610632655019803,-99.554405160028892 27.614054243170667,-99.554950000000005 27.614453999999999,-99.555217670042637 27.614437037021997,-99.556811999999994 27.614335999999998,-99.559466999999998 27.609075999999998,-99.562869000000006 27.607264,-99.580005999999997 27.602250999999995,-99.584175941853502 27.603675176957196,-99.584843000000006 27.603902999999999,-99.584876722760043 27.604178863233781,-99.585148000000004 27.606397999999999,-99.578360965974085 27.610254799100861,-99.578159999999983 27.610368999999999,-99.578158133228257 27.610639131051315,-99.578098999999995 27.619195999999999,-99.584782000000004 27.622006999999996,-99.591372000000007 27.627464,-99.592626330929548 27.632690692534315,-99.594037999999998 27.638573,-99.596231000000003 27.639857999999997,-99.603532999999999 27.641991999999998,-99.612907806834755 27.638651258855042,-99.615318942915422 27.637792043123689,-99.624515000000002 27.634515,-99.625321999999997 27.631136999999999,-99.638929000000005 27.626757999999999,-99.654323999999988 27.629615999999999,-99.665948 27.635967999999998,-99.665422000000007 27.640274999999999,-99.660175716081199 27.644678795569117,-99.659499999999994 27.645246,-99.659300532255756 27.646059100049566,-99.658294999999995 27.650158,-99.661845 27.655753,-99.668942 27.659973999999998,-99.672015651285406 27.660163655087903,-99.685812999999982 27.661014999999999,-99.699355999999995 27.655417,-99.704600999999997 27.654953999999996,-99.711511000000002 27.658365,-99.721518999999986 27.666154999999996,-99.723715999999996 27.673328,-99.727277746539684 27.678262316066267,-99.732288643517421 27.685204233237535,-99.732448000000005 27.685424999999999,-99.732610774853441 27.685596448480599,-99.757538999999994 27.711853,-99.758533999999997 27.717071,-99.770740000000004 27.732133999999999,-99.774900999999986 27.73354,-99.785365999999996 27.730354999999999,-99.788844999999981 27.730718,-99.796341999999981 27.735586,-99.801651000000007 27.741771,-99.805670000000006 27.758687999999999,-99.813085999999998 27.773952,-99.817390803736785 27.775433523363962,-99.819091999999998 27.776019000000002,-99.822192999999999 27.766855,-99.825793000000004 27.764373999999997,-99.835127 27.762881,-99.841707999999997 27.766463999999999,-99.843346625073153 27.773142384459568,-99.844736999999981 27.778808999999999,-99.849281022020321 27.790032142335203,-99.850876999999997 27.793973999999999,-99.857944055165163 27.794214491272228,-99.870065999999994 27.794626999999998,-99.877441689362087 27.799278597548025,-99.877677000000006 27.799427,-99.877679299916537 27.799779028327777,-99.877693551047656 27.801960325692491,-99.877840000000006 27.824375999999997,-99.876677795668783 27.832975173255242,-99.876002999999997 27.837968,-99.877201999999997 27.842179000000002,-99.882014999999996 27.850391999999996,-99.89364999999998 27.856193,-99.901486000000006 27.864162,-99.904385000000005 27.875283999999997,-99.901231999999993 27.884405999999995,-99.894091000000003 27.892949999999999,-99.893456 27.899208000000002,-99.895827999999995 27.904177999999998,-99.900080000000003 27.912141999999999,-99.905861237749605 27.914081496997749,-99.917461000000003 27.917973,-99.925935042520848 27.927688375003317,-99.93714199999998 27.940536999999999,-99.938541 27.954059,-99.932160999999979 27.96771,-99.931811999999994 27.980967,-99.962768999999994 27.983536,-99.984922999999995 27.990729000000002,-99.991446999999994 27.99456,-99.998749958954292 28.00705628754028,-100.000278657311796 28.009672084008166,-100.008630999999994 28.023963999999999,-100.012838999999985 28.037203000000002,-100.014975394500183 28.048814882934586,-100.016570970484992 28.057487270710915,-100.017914000000005 28.064786999999999,-100.028724999999994 28.073118,-100.046108000000004 28.079067999999999,-100.053122999999985 28.08473,-100.056983000000002 28.094207,-100.05559599999998 28.101140999999998,-100.056492999999989 28.104185999999995,-100.064147158981442 28.110644603904401,-100.067651999999995 28.113602,-100.075474 28.124881999999999,-100.083393 28.144034999999999,-100.090288999999984 28.148312999999998,-100.119627999999992 28.155588000000002,-100.12658652988236 28.159659080291213,-100.141098 28.168149,-100.159890345070792 28.168159605160877,-100.160589999999999 28.16816,-100.1644540887186 28.169825181963088,-100.168437999999995 28.171541999999999,-100.173949604741296 28.178834844700365,-100.174413 28.179448,-100.17569869464343 28.180169771489844,-100.185693999999998 28.185780999999999,-100.195825662217615 28.189941498404405,-100.196499000000003 28.190218000000002,-100.19841872968675 28.190245400986015,-100.202449991411854 28.190302940621361,-100.208059000000006 28.190382999999997,-100.21208061434919 28.196473071951928,-100.212104999999994 28.196509999999996,-100.212111438897693 28.196576571978802,-100.212136678181992 28.196837521783539,-100.213449999999995 28.210415999999999,-100.217564999999993 28.226934,-100.220284000000007 28.232209999999995,-100.22363 28.235223999999995,-100.227575000000002 28.235856999999999,-100.246200000000002 28.234092,-100.251633999999996 28.236177,-100.261135590980771 28.244561246718906,-100.267604000000006 28.250268999999999,-100.280518 28.267969,-100.289383999999998 28.273491,-100.293468000000004 28.278475,-100.294296000000003 28.284381,-100.287553999999986 28.301093000000002,-100.286470999999992 28.312295999999996,-100.288638999999989 28.316977999999995,-100.314198000000005 28.345859,-100.317245999999997 28.357382,-100.320392999999996 28.362116999999998,-100.341869000000003 28.384952999999996,-100.344399999999979 28.389662,-100.34934096344108 28.4019924953441,-100.349585999999988 28.402603999999997,-100.349394820211828 28.402858691740477,-100.345766407828719 28.407692501181913,-100.343945000000005 28.410119000000002,-100.337058999999996 28.427150999999995,-100.336185999999998 28.430180999999997,-100.337474638078888 28.440402915586755,-100.337648113426326 28.441778981052359,-100.337796999999995 28.442959999999999,-100.338752462381066 28.444650728533539,-100.341532999999998 28.449570999999995,-100.350785999999999 28.459246,-100.353875644654778 28.461269551534915,-100.357498000000007 28.463642,-100.35795880406117 28.464220845064407,-100.358193534884933 28.464515705266944,-100.367961112704847 28.47678537623738,-100.368288000000007 28.477195999999999,-100.368051363629903 28.477598261305609,-100.365982000000002 28.481116,-100.356642877924983 28.482149981508559,-100.352234999999979 28.482638,-100.344180999999992 28.486249,-100.337140000000005 28.491728999999999,-100.33381399999999 28.499251999999998,-100.338517999999993 28.501833,-100.362147999999991 28.508399,-100.379079000000004 28.511638999999999,-100.388859999999994 28.515747999999995,-100.405057999999983 28.535779999999999,-100.411413999999994 28.551898999999999,-100.40430324537553 28.563833042228197,-100.397270000000006 28.575637,-100.396799999999999 28.580400999999998,-100.398385000000005 28.584883999999999,-100.403243426032972 28.586668145075244,-100.425819035320046 28.594958517689108,-100.429856 28.596440999999995,-100.431892715674053 28.597943579291371,-100.447320000000005 28.609324999999998,-100.448648000000006 28.616773999999999,-100.447280739633683 28.625703494601449,-100.445528999999993 28.637143999999996,-100.44560646842767 28.637394606891831,-100.447014715516048 28.641950223113035,-100.447091 28.642196999999999,-100.447325484276334 28.642184618041064,-100.447599559425257 28.642170145483281,-100.456522261830528 28.641698981546444,-100.462866000000005 28.641363999999999,-100.474494000000007 28.647071,-100.479445543783555 28.654922981332383,-100.479495071011698 28.655001519842354,-100.479635999999999 28.655225000000002,-100.481416494659797 28.655591917738484,-100.492493911747701 28.657874710783531,-100.493322226012125 28.658045406716248,-100.495863 28.658568999999996,-100.496129521434568 28.658770241190073,-100.500353999999987 28.661960000000004,-100.502122125123847 28.667202406240314,-100.505211969634487 28.676363647108229,-100.509438609439442 28.688895431533517,-100.510054999999994 28.690722999999995,-100.510127443340068 28.69126843161186,-100.510538898440004 28.694366309458967,-100.51077198772829 28.696121257064849,-100.511998000000006 28.705352,-100.511351260759739 28.706743032691019,-100.510646631791559 28.708258576930099,-100.509872363628347 28.709923903942272,-100.509406561254394 28.710925770365975,-100.508636802312012 28.712581398765199,-100.507069450532313 28.715952521820881,-100.506701000000007 28.716745000000003,-100.506745928327234 28.717920131927187,-100.506786973330165 28.718993692782757,-100.507152057645129 28.728542729239727,-100.507513721430456 28.738002299344281,-100.507590113222051 28.740000380261673,-100.507613000000006 28.740599,-100.507694735304739 28.740708529390524,-100.51442566685138 28.749728313832868,-100.519226000000003 28.756160999999999,-100.533017 28.763279999999998,-100.537772000000004 28.780775999999996,-100.534846642084489 28.786410367511117,-100.532431000000003 28.791062999999998,-100.535830000000004 28.805887999999999,-100.546431879116881 28.824270186264151,-100.546968759195195 28.825201061771438,-100.547323999999989 28.825817,-100.548186025546428 28.826178082695296,-100.553129999999982 28.828249,-100.561442999999997 28.829174000000002,-100.570509999999999 28.826317,-100.574698999999995 28.828786999999998,-100.576846000000003 28.836168000000004,-100.572991999999999 28.848463999999996,-100.580501999999996 28.856007999999999,-100.591040000000007 28.863054000000002,-100.598061272695219 28.874286065303028,-100.598877000000002 28.875590999999996,-100.602654 28.887660000000004,-100.602394435759351 28.893839359355621,-100.602053999999995 28.901944,-100.615584686670886 28.902906942475386,-100.627205999999987 28.903734,-100.631611000000007 28.902838999999997,-100.633502414453218 28.905240591668694,-100.640568000000002 28.914211999999999,-100.639169999999979 28.916288999999999,-100.638857000000002 28.927621999999996,-100.651511999999997 28.943431999999998,-100.64789859018552 28.954344193790252,-100.646992999999995 28.957078999999997,-100.646600907687997 28.967547400926616,-100.64647463428885 28.970918751315974,-100.645893999999998 28.986421,-100.647406325643686 28.99295674936236,-100.647835962928511 28.994813493392339,-100.648681241069511 28.998466493719445,-100.65094599999999 29.008254000000004,-100.653757999999996 29.015356,-100.656109999999998 29.017223999999999,-100.660207999999997 29.031497000000002,-100.663212 29.048041999999995,-100.662508000000003 29.058106999999996,-100.664064999999994 29.073205999999999,-100.666359117032755 29.07896154562156,-100.668483863047285 29.084292168447689,-100.674655999999999 29.099777000000003,-100.684472 29.110657,-100.692326999999992 29.115227999999995,-100.70996599999998 29.119684000000003,-100.727461999999989 29.129122999999996,-100.737795000000006 29.139078999999999,-100.739115999999996 29.141658,-100.737590999999995 29.147406999999998,-100.739681000000004 29.150486000000004,-100.746139999999997 29.154149000000004,-100.752330696165359 29.155516457617566,-100.759726 29.157149999999998,-100.76337082361762 29.160348915845475,-100.772648999999987 29.168492,-100.775904999999995 29.173344,-100.772154104961558 29.17809434863841,-100.766030999999998 29.185848999999997,-100.767059000000003 29.195287,-100.768348510582513 29.197581465531123,-100.775064591152173 29.209531592641572,-100.785521000000003 29.228136999999997,-100.791371999999996 29.225944999999999,-100.795681000000002 29.227729999999998,-100.79704599999998 29.235585999999998,-100.795234211471239 29.241421249558652,-100.795010188783237 29.242142762180318,-100.794911999999997 29.242459,-100.795310930062826 29.24310735172228,-100.797670999999994 29.246943000000002,-100.805332448258866 29.251327106905226,-100.815767091023289 29.257298117587734,-100.823532999999998 29.261742000000002,-100.834039999999987 29.261399999999998,-100.839016 29.263259,-100.841581161127962 29.265429071012271,-100.848663999999999 29.271420999999997,-100.856469000000004 29.275663999999999,-100.864659000000003 29.276076,-100.874739696506666 29.279181633366278,-100.876048999999995 29.279585,-100.876625364221198 29.280115401513385,-100.878513170701353 29.281852663087207,-100.878882999999988 29.282193000000003,-100.879105716359817 29.283377353454046,-100.880504361011205 29.290815018226784,-100.882051999999987 29.299044999999996,-100.886842 29.307848,-100.895590728097048 29.309871687341737,-100.904835000000006 29.31201,-100.906461302333199 29.313095095005444,-100.914770068080642 29.318638836799305,-100.916744062319239 29.319955917421627,-100.92203960930695 29.323489191321695,-100.922232587658954 29.323617949573855,-100.924041970395777 29.324825198761538,-100.926468967605715 29.326444530233299,-100.926628772437255 29.326551154580446,-100.926677999999981 29.326584,-100.92692137104487 29.32669794102517,-100.927819078352698 29.327118228044156,-100.92782883100196 29.32712279402223,-100.930446231588661 29.328348203997709,-100.940614999999994 29.333109,-100.941560773525751 29.336361493535293,-100.943196 29.341985,-100.945807189162338 29.344363370184055,-100.948971999999998 29.347245999999998,-100.95603875001359 29.347290187325033,-100.964324999999988 29.347342,-100.971743000000004 29.351370999999997,-100.972915999999998 29.354545000000005,-100.995606999999993 29.363403000000005,-101.004206999999994 29.364771999999999,-101.010614000000004 29.368669,-101.010768998319776 29.36895846820963,-101.014103165002794 29.375185214807839,-101.024016000000003 29.393697999999997,-101.036603999999997 29.406107999999996,-101.038600000000002 29.410713999999999,-101.037642000000005 29.414681000000002,-101.043363999999997 29.42988,-101.056956999999983 29.440773,-101.06011415724447 29.458454662113137,-101.060150999999991 29.458660999999999,-101.063843258270609 29.460131584976065,-101.087148999999997 29.469414,-101.103699000000006 29.470549999999999,-101.115253999999993 29.468458999999996,-101.130037999999985 29.47842,-101.137502999999995 29.473541999999998,-101.144336999999993 29.473246,-101.151876999999999 29.477004999999998,-101.163854997623304 29.493316894569897,-101.168923969306405 29.50021992913986,-101.171662999999995 29.503950000000003,-101.173821000000004 29.514566000000002,-101.192719999999994 29.520285,-101.227418999999998 29.522349999999996,-101.235274999999987 29.524854,-101.254895000000005 29.520341999999996,-101.260836999999981 29.529933,-101.261174999999994 29.536777,-101.252755240314642 29.553001111955531,-101.244355179006547 29.569187266927752,-101.24384013276574 29.574337712700849,-101.242022713082847 29.59251185083151,-101.251352546644355 29.604174135250076,-101.252152766968493 29.604494220898598,-101.259127443101093 29.607284069726152,-101.265347312053251 29.607284069726152,-101.274677145614746 29.602619152945408,-101.277624046978673 29.599940160672645,-101.283229510623855 29.594844301688571,-101.297224215766221 29.587069435365102,-101.30733154801338 29.587846934050759,-101.312894947857018 29.594028488101586,-101.314328915651188 29.595621785307589,-101.313192213312618 29.602947206633093,-101.31110792457288 29.616379301091623,-101.30733154801338 29.640715970810437,-101.311218981175116 29.64849082206727,-101.316661381574889 29.655488204771718,-101.325213716450733 29.657820655628775,-101.350093282659174 29.654710721152696,-101.353062961800887 29.655502634567405,-101.361755552011104 29.657820655628775,-101.364595571422868 29.66106639883844,-101.367197952410862 29.664040554714198,-101.371300910394638 29.676075888592084,-101.372874548462477 29.680691889931673,-101.378860251896057 29.698249939417508,-101.396947999999995 29.713947,-101.398362000000006 29.717000000000002,-101.396293999999997 29.727055,-101.397008999999997 29.733962999999999,-101.400635999999992 29.738078999999999,-101.410024000000007 29.741498,-101.415583999999996 29.746534,-101.415509877418046 29.750619769974676,-101.415402087456428 29.756561346443686,-101.424731921017937 29.758116313681725,-101.430388403484372 29.756500180308258,-101.441059122217254 29.75345141196761,-101.446501522617027 29.755006409338922,-101.451652003139955 29.758440048234313,-101.453498905321467 29.759671311053037,-101.455223999999987 29.771874,-101.467493655663716 29.779885945414083,-101.475268506920557 29.780663444099741,-101.503223000000006 29.764581999999997,-101.522695143280473 29.759671311053037,-101.526552276219391 29.761451532447605,-101.532802460460985 29.764336242900427,-101.53746737724174 29.782995910023434,-101.53804719015173 29.783865628452077,-101.546797210803248 29.796990645299058,-101.56156944476453 29.794658179375361,-101.572592853930203 29.778735448896484,-101.575564187573463 29.774443514881042,-101.582561562744587 29.771333610538232,-101.598573641854728 29.773657690388074,-101.603680999999995 29.774398999999999,-101.607256216824311 29.773863608191139,-101.625957999999997 29.771063000000002,-101.630319 29.768729,-101.632632680380155 29.763891873249722,-101.63512799999998 29.758675,-101.646417999999997 29.754303999999998,-101.652400999999983 29.758794999999996,-101.65328091488901 29.761368862201802,-101.654578 29.765162999999998,-101.662452999999985 29.77128,-101.689992000000004 29.771212999999996,-101.706636000000003 29.762736999999998,-101.714223999999987 29.767659999999999,-101.735201999999987 29.771591999999998,-101.754322999999999 29.777661999999999,-101.760919284561496 29.782457957985276,-101.763273999999981 29.784169999999996,-101.776796131253491 29.789191504347542,-101.777161000000007 29.789327,-101.777360180704861 29.789301830227139,-101.785668 29.788251999999996,-101.791002820423358 29.783037559970925,-101.796869557069002 29.782618516634159,-101.806507764952315 29.786389987871868,-101.809441149516488 29.790161459109573,-101.813855730843954 29.79253854440006,-101.814888826583982 29.793094827432377,-101.818909248247508 29.792167038125061,-101.830044431332681 29.789597381341238,-101.831231874027822 29.789323356194672,-101.852603555202364 29.801894932400803,-101.862241763085706 29.800218726571018,-101.866487373818487 29.79821962567333,-101.875399999999985 29.794022999999999,-101.878152615094365 29.794637055896249,-101.892739000000006 29.797891,-101.912406000000004 29.797849999999997,-101.917556726002999 29.792675767854249,-101.917942403066036 29.792482929945557,-101.922585359733716 29.790161459109573,-101.929709258872364 29.789323356194672,-101.932572380438657 29.791613852338052,-101.938090312383324 29.796028195755184,-101.946471365894325 29.797704401584976,-101.952535620779244 29.796990962273608,-101.953595265032959 29.796866298670082,-101.959462001678588 29.799380623656123,-101.965427194081556 29.806464275410743,-101.966166845299441 29.8073426094683,-101.970357372054934 29.81027599403247,-101.974547898810414 29.81027599403247,-101.982165144097308 29.804870201524977,-101.987538526473998 29.801056829485908,-101.993568005272067 29.802652866652032,-102.001318622543394 29.804704498914084,-102.001786318660763 29.804828300723614,-102.021918999999997 29.802490999999996,-102.032489182844799 29.803756293694118,-102.034758999999994 29.804027999999999,-102.039012999999997 29.802655,-102.041088000000002 29.799609999999998,-102.038411999999994 29.792831999999997,-102.039226999999997 29.790977000000002,-102.041308736499772 29.78984019520162,-102.048982832584102 29.785649487466547,-102.050044 29.785069999999997,-102.053123037129694 29.785312127485501,-102.073645999999982 29.786926,-102.076299925656656 29.790865308882584,-102.077348 29.792421,-102.084438999999989 29.794962000000002,-102.091420021879856 29.792967151942147,-102.091815999999994 29.792853999999995,-102.098789196918744 29.792718427915432,-102.115682000000007 29.792389999999997,-102.142325999999997 29.802854,-102.159600999999995 29.814355999999997,-102.161673999999991 29.819486999999999,-102.181894 29.846033999999996,-102.182859740836193 29.846584944255238,-102.18326563789924 29.846816503951921,-102.184058205433814 29.847268654791659,-102.186149999999998 29.848461999999998,-102.187393471220204 29.848699156882201,-102.188384798592551 29.848888224473839,-102.188671999999997 29.848942999999998,-102.189026115519184 29.848805138880103,-102.189342793483831 29.848681852617602,-102.205381000000003 29.842438,-102.216284162639099 29.842976962035557,-102.227553 29.843533999999995,-102.261388999999994 29.853283,-102.264041000000006 29.855964,-102.261776999999995 29.864001999999999,-102.264954000000003 29.867805999999998,-102.268816999999984 29.867990999999996,-102.276754999999994 29.862977999999998,-102.281249000000003 29.863116999999999,-102.297330999999986 29.875194,-102.301381000000006 29.877673999999995,-102.315388999999996 29.879919999999998,-102.320618999999994 29.878979999999995,-102.320667125014978 29.878900015386019,-102.320698585434869 29.878847727619664,-102.324634000000003 29.872306999999996,-102.333383999999995 29.868046,-102.341032999999996 29.869305000000004,-102.349861000000004 29.862316999999997,-102.361383773688715 29.849029038788231,-102.364542 29.845386999999995,-102.363642671554629 29.839963091609825,-102.362514000000004 29.833155999999995,-102.369522000000003 29.820395,-102.377253999999994 29.800163,-102.377312999999987 29.789971,-102.385270832882995 29.770348713937391,-102.386677616883858 29.766879890389689,-102.391739211722737 29.765814289574276,-102.392906191083 29.765568609270456,-102.402175111261812 29.766775086101941,-102.412062000000006 29.768061999999997,-102.433301 29.776608,-102.460890018677347 29.77909171043791,-102.468946430597143 29.779816991558327,-102.469957868267898 29.780012383523857,-102.481595292961757 29.782260529257879,-102.490330613701886 29.783948039559665,-102.492674483475767 29.783853017496881,-102.508312776666344 29.783219030534834,-102.508509848222559 29.783087649355906,-102.512686811979108 29.780303003853621,-102.512942156326147 29.774953626291172,-102.513380999999995 29.76576,-102.526400256170959 29.758693706517125,-102.535832205630967 29.753574449155192,-102.539417050278132 29.751628749336795,-102.545492105079163 29.750899740311965,-102.551081152293932 29.752357753652575,-102.556670813570321 29.757783010503054,-102.559343229460382 29.760376824671383,-102.565661280990938 29.761591836573395,-102.572255912443325 29.757095496286663,-102.57574472309652 29.754716761401177,-102.57635337725236 29.754301769870359,-102.585948674897452 29.751239442391949,-102.587774480184081 29.750656738873374,-102.597160000000002 29.751608,-102.612879000000007 29.748181999999996,-102.622534000000002 29.736632,-102.630150999999984 29.734314999999999,-102.64566499999998 29.733910000000002,-102.661251958261417 29.736122779697027,-102.66726872436665 29.739732837494621,-102.670971460158171 29.741954477821469,-102.677191937153026 29.738261067251376,-102.678467215476147 29.736427653943998,-102.6852530581628 29.72667193704833,-102.688163999999986 29.722486999999997,-102.690237999999979 29.707481999999999,-102.695507594622001 29.699754690880447,-102.698346999999984 29.695590999999997,-102.699316999999994 29.685029,-102.693466 29.676507,-102.697798916570122 29.672550546488289,-102.711337549653422 29.6601882100483,-102.724231000000003 29.648415000000004,-102.736947999999984 29.641537999999997,-102.742030999999997 29.632142000000002,-102.74048425929719 29.62775763619268,-102.738427999999999 29.621928999999998,-102.739991000000003 29.599041,-102.746201999999997 29.592875000000003,-102.757065999999995 29.597798999999998,-102.761810999999994 29.598396999999999,-102.768340999999992 29.594733999999999,-102.766929734823805 29.591197739636346,-102.762241000000003 29.579448999999997,-102.766124000000005 29.572347999999998,-102.768792219428661 29.572598581791439,-102.773961 29.573084,-102.776343296957975 29.562015327831393,-102.777530999999996 29.556497,-102.77572499999998 29.552188999999995,-102.771428999999998 29.548545999999998,-102.79216136048494 29.533953841063816,-102.807296321997939 29.523301326891541,-102.808565712504773 29.522407885546979,-102.808691999999979 29.522319000000003,-102.808681334358837 29.522097795383676,-102.808577631171161 29.519946998869006,-102.807327 29.494009000000002,-102.813953999999995 29.482805999999997,-102.814096473430837 29.482483316434472,-102.814383778328263 29.481832608662831,-102.822314986984821 29.463869465126457,-102.82537225240516 29.456945161410285,-102.827007089548758 29.453242470491304,-102.830969999999979 29.444267,-102.832538999999997 29.433109000000002,-102.830570753051859 29.427471931628293,-102.827354999999983 29.418261999999995,-102.825211066354328 29.40389180477127,-102.824564449740322 29.399557712155943,-102.831802092379931 29.389471209449322,-102.832669213065941 29.388262775214326,-102.84047188579207 29.377388836904565,-102.840778422425643 29.376961642203423,-102.841560439245441 29.370344567434586,-102.842457529677418 29.362753791491347,-102.843015380341285 29.358033509958585,-102.843020777220957 29.357987843989019,-102.861629999999991 29.351638999999995,-102.871857000000006 29.352092999999996,-102.876866000000007 29.354058999999996,-102.879534000000007 29.353326999999997,-102.883721999999992 29.348058999999999,-102.881857488401977 29.34363024944906,-102.879805000000005 29.338754999999999,-102.890489000000002 29.309498999999995,-102.88922161316745 29.299205074185686,-102.888328 29.291947,-102.891022000000007 29.287113000000002,-102.902604999999994 29.279440999999998,-102.90311226801488 29.27677066200776,-102.906295999999998 29.260010999999995,-102.903188999999983 29.254028999999999,-102.887901999999997 29.245611999999998,-102.881135 29.246022,-102.871347 29.241624999999999,-102.870795537867835 29.239589944231255,-102.86823682221636 29.230147538772215,-102.866845999999995 29.225014999999999,-102.878020000000006 29.214697999999999,-102.890063999999995 29.208813999999997,-102.899231 29.208863,-102.908656596973657 29.219194069767902,-102.908787000000004 29.219336999999996,-102.909098471667448 29.219296482603067,-102.910575587951939 29.219104333804097,-102.912131000000002 29.218902,-102.912650757516516 29.218481184275788,-102.915803535402844 29.215928573746115,-102.915865999999994 29.215877999999996,-102.915845750043147 29.215583596781208,-102.915608148145267 29.212129230727648,-102.915554 29.211341999999998,-102.915202931298523 29.21076702044931,-102.914525807203304 29.209658028088604,-102.912447999999998 29.206254999999999,-102.91453363655873 29.20019781620671,-102.917367531146525 29.191967513425833,-102.917805 29.190697,-102.922897000000006 29.192704085059273,-102.925481999999988 29.193722999999995,-102.932612000000006 29.194113000000005,-102.944911000000005 29.188819999999996,-102.947155999999993 29.180776999999999,-102.95089 29.176834999999997,-102.953474999999997 29.176307999999995,-102.977266 29.186226,-102.981742305424802 29.185103060319207,-102.989431999999994 29.183174,-102.98978258837333 29.182935350109393,-102.991725524817895 29.181612768970929,-102.994653 29.17962,-102.994906329461855 29.17910907354543,-102.99809599999999 29.172675999999996,-102.995688 29.161218999999999,-103.00243399999998 29.150260999999997,-103.0050672680876 29.149386797638936,-103.008362000000005 29.148292999999995,-103.010324999999995 29.137821999999996,-103.015028 29.125769999999996,-103.016945338084582 29.124525732477775,-103.024896087692937 29.119366048020158,-103.032982999999987 29.114118,-103.033302941039096 29.107355634443419,-103.034095953658579 29.105913798143234,-103.035682683422891 29.103028844591982,-103.04044215980575 29.099351067768175,-103.049126083320303 29.097714968852063,-103.055369601981923 29.096538655622457,-103.061557539334615 29.093936906572154,-103.06671291432167 29.091769303506382,-103.074407490743866 29.088534080562461,-103.076354546596249 29.085721668416742,-103.076667707631657 29.079576983004682,-103.076847 29.076059,-103.091926967746744 29.064237268591206,-103.100265999999991 29.057699999999997,-103.101359249603803 29.049403674773888,-103.102531654124817 29.040506667933872,-103.100975335951205 29.030701853789079,-103.100368259199087 29.026877266486249,-103.101607999999999 29.018122999999999,-103.107810999999998 29.013812,-103.117237999999986 29.000208999999998,-103.113922000000002 28.988546999999997,-103.115062910480361 28.985887850893185,-103.115327999999991 28.98527,-103.115773294260094 28.985147329619764,-103.126748000000006 28.982123999999995,-103.134930999999995 28.983525,-103.143274000000005 28.978073999999999,-103.156645999999995 28.972830999999999,-103.163865 28.972099,-103.165923000000006 28.974001999999999,-103.166234999999986 28.978836000000005,-103.174329720990258 28.980505274886987,-103.182663652045193 28.982223879127538,-103.194928465619142 28.984753100989199,-103.195705106971403 28.984913258196226,-103.207825367468075 28.987412670652219,-103.227338454203803 28.991436614861634,-103.227579101883322 28.991486240676846,-103.227800999999999 28.991532000000003,-103.228011662384262 28.991347921912006,-103.228737472224623 28.990713704806197,-103.239108999999985 28.981650999999996,-103.245121150470112 28.980239630911282,-103.2474464632202 28.980649978816817,-103.249155161185584 28.980951512720708,-103.25190330878641 28.984768118238364,-103.253285000000005 28.986686999999996,-103.26030800838916 28.989731411362609,-103.266003072061508 28.990206003834011,-103.270357000000004 28.988113999999996,-103.270725571428585 28.987466542857135,-103.27232562100086 28.984655789108508,-103.273357000000004 28.982844,-103.273647076585334 28.982817854078331,-103.281189929980513 28.982137982403092,-103.282424051550748 28.983865752282551,-103.284749352823042 28.987121173462914,-103.285935817906974 28.994002716014545,-103.289257951411443 28.999697788883793,-103.296614077237592 29.004443676810233,-103.302399476821606 29.006455988366771,-103.312987409437454 29.010138745081029,-103.315449022736544 29.011725838031147,-103.323993942362023 29.017235063099889,-103.331021803791103 29.021766184756,-103.332920159881368 29.026986669752301,-103.332783823258595 29.028827200289001,-103.332445567409962 29.033393619832523,-103.334818511373186 29.039800579109659,-103.341462759988346 29.041224342728523,-103.347869719265475 29.037427630547988,-103.350815999999995 29.028566999999999,-103.355428000000003 29.021529,-103.355590463621823 29.021464336016578,-103.361777791205157 29.019001647792766,-103.361998 29.018913999999999,-103.382125000000002 29.024248999999998,-103.386095607142025 29.025822707722725,-103.399799910010643 29.031254261761571,-103.402689272115182 29.032399429564627,-103.427474921518822 29.04222295692054,-103.427754276336316 29.042333676218103,-103.430481680804888 29.047455485683194,-103.434668000000002 29.055316999999995,-103.439550459717495 29.058547821156772,-103.449722032594721 29.065278554178825,-103.453029264571228 29.067467015663059,-103.457386392383299 29.068596640465525,-103.460381908910477 29.067681344107211,-103.463195887793432 29.066821517562918,-103.469166763983068 29.069242141692889,-103.471264639062966 29.073115142802621,-103.471299587628792 29.074897490538035,-103.471426016715213 29.08134526859719,-103.474814887995407 29.086670637304994,-103.484429000000006 29.094524,-103.49531945696836 29.1087608679228,-103.500928937954981 29.116094025764934,-103.503236 29.119109999999996,-103.506163032831353 29.119368513261239,-103.513192088151087 29.119989313955617,-103.524613000000002 29.120998,-103.524225442342612 29.124905426308125,-103.523383999999993 29.133389,-103.525026999999994 29.137353999999998,-103.539240927934515 29.144791265038371,-103.551909954693073 29.151420179312847,-103.558678999999984 29.154961999999998,-103.579462000000007 29.149964999999998,-103.592359999999999 29.150259999999999,-103.598960126757959 29.155019048637598,-103.606437999999997 29.160411,-103.607894091053709 29.162314354517299,-103.610539999999986 29.165772999999998,-103.624537921955991 29.163185608071569,-103.629433693714475 29.1622806680118,-103.638195234739996 29.160661174732635,-103.645634999999999 29.159286000000002,-103.653180000000006 29.162863999999995,-103.656807999999984 29.169098999999999,-103.660202999999996 29.170933999999999,-103.667724667668963 29.172878689431396,-103.669696386484915 29.173388467437,-103.688670000000002 29.178293999999998,-103.688830238367032 29.178273608722382,-103.690116124218548 29.178109972160996,-103.697314000000006 29.177194,-103.699305464408098 29.178139630948273,-103.713769999999997 29.185008,-103.724743000000004 29.191469999999999,-103.73193762439729 29.198544108660482,-103.742175000000003 29.20861,-103.750912464183997 29.219357091602017,-103.755265634411842 29.22471149629115,-103.75594348727293 29.225545256136954,-103.768569999999997 29.227360999999995,-103.777623396259372 29.232265264832392,-103.780085146052983 29.242351446713872,-103.780352362214714 29.243446273985068,-103.781659908552058 29.248803500057083,-103.789034484601103 29.257501704713096,-103.792700821322356 29.259284649416337,-103.795120675584712 29.260461427946989,-103.80876361213285 29.267096007175422,-103.816641821688407 29.27092719156084,-103.818617217853202 29.271599921312173,-103.838302999999982 29.278303999999999,-103.854966933859771 29.281484400071786,-103.856892999999999 29.281852,-103.880606 29.284961999999997,-103.896615144488038 29.284634799403065,-103.910231251371073 29.284356508561018,-103.916269383748329 29.284233099060927,-103.91710599999999 29.284215999999997,-103.91776286712728 29.284516760669142,-103.918698764585329 29.284945281345607,-103.918909999999997 29.285042,-103.918905327188597 29.285488562070029,-103.918900778480648 29.285923264066316,-103.918857000000003 29.290106999999995,-103.924975999999987 29.293913000000003,-103.943697999999983 29.294945999999996,-103.965795999999983 29.298586999999998,-103.975234999999998 29.296016999999999,-103.983459597310627 29.299165977024781,-103.998789342279238 29.305035323921498,-104.012357062242771 29.310230038851625,-104.018558084893087 29.312604243583909,-104.038281999999995 29.320155999999997,-104.047006656168747 29.325575022319434,-104.055595999999994 29.330909999999996,-104.056467149578211 29.334496091467582,-104.057243999999997 29.337694000000003,-104.068917843404819 29.342306667996301,-104.075923999999986 29.345075,-104.082149999999999 29.345922999999996,-104.091021999999995 29.353691999999995,-104.093326000000005 29.359926000000002,-104.098377999999983 29.366755999999999,-104.106466999999981 29.373127,-104.122882935723638 29.379859019095424,-104.125474999999994 29.380922000000002,-104.132831527553293 29.381873417846823,-104.136236243923818 29.382313748953422,-104.143691999999987 29.383277999999997,-104.1467332019064 29.385415391432094,-104.148888696362661 29.386930297552944,-104.151718842950046 29.388919356896473,-104.157422367906094 29.392927859373117,-104.166562999999996 29.399352,-104.180069999999986 29.412763999999999,-104.181273000000004 29.426265,-104.182051945448123 29.427144615030393,-104.195989999999995 29.442884000000003,-104.208194000000006 29.448201,-104.212529153241931 29.452438774515159,-104.213947876032222 29.456222068892099,-104.21370324326665 29.462011765001886,-104.213238514637069 29.473010445135856,-104.218538498245692 29.476600759818915,-104.220568643482977 29.477976020723915,-104.227547514371139 29.480496161448666,-104.229081071868791 29.481049944541308,-104.233824999999996 29.486544999999996,-104.233486999999997 29.492733999999995,-104.235847000000007 29.496744,-104.238313284768751 29.498023301020304,-104.246870092866089 29.50246185307569,-104.254473621536903 29.506405923975272,-104.260293266516271 29.50942466611497,-104.26168489846043 29.511073814728768,-104.264155000000002 29.514001,-104.271046277211582 29.51559593462645,-104.274575430964404 29.516412730896519,-104.293481117436073 29.520788310787555,-104.306646311930564 29.523835296697214,-104.308812834933008 29.524336722260216,-104.311570786550874 29.52540915148019,-104.318073989469781 29.527937921306467,-104.320711000000003 29.526326414398167,-104.326090351466348 29.523039031981277,-104.327483437129615 29.522187701603762,-104.334811000000002 29.519462999999998,-104.338113000000007 29.519967,-104.353150868059984 29.530471948300562,-104.369085650105362 29.541603450512167,-104.37074044290263 29.542759433043344,-104.371174999999994 29.543062999999997,-104.371454921502831 29.543072731712495,-104.371996954766473 29.543091575966443,-104.375901661123379 29.543227326450971,-104.381040999999996 29.543405999999997,-104.394588999999982 29.556087000000002,-104.394583075653415 29.556197720561212,-104.394577025204526 29.556310797858156,-104.394552364240909 29.55677168847231,-104.394503136758885 29.55769170460702,-104.394351 29.560534999999998,-104.39571704642303 29.563607040276512,-104.39636925661604 29.56507376640522,-104.397848504811165 29.56840038104859,-104.399550133070164 29.572227096202102,-104.399591 29.572319,-104.399981791506633 29.572551361916329,-104.452301000000006 29.60366,-104.466520000000003 29.609296,-104.483502 29.627740999999997,-104.486693164979016 29.629712817604439,-104.493658999999994 29.634016999999997,-104.503232654335022 29.63787621670291,-104.507568060311556 29.63962385355849,-104.51068846437596 29.64315687341222,-104.513969549435132 29.646871821353749,-104.51818442992635 29.651644041921735,-104.53325150001281 29.668703453669117,-104.535568725458901 29.671327089370656,-104.539761023554547 29.676073741438437,-104.540155514025756 29.678572204873163,-104.540559188867974 29.681128836544634,-104.537934834631798 29.684482179324355,-104.535770155740693 29.687248158943191,-104.536302269386866 29.690440851131939,-104.537991394981006 29.693268523024599,-104.544269904764263 29.703779029587054,-104.545505621253113 29.70584767433138,-104.552240999999995 29.717122999999997,-104.555600999999996 29.731220999999998,-104.554914970831931 29.738152096413199,-104.554660236582549 29.740725729903364,-104.557361904757329 29.745049367744027,-104.565950999999998 29.758794999999996,-104.565687999999994 29.770461999999998,-104.571279565966023 29.778773775962186,-104.586447318468245 29.801320404476364,-104.592472 29.810276000000002,-104.594023000000007 29.809220999999997,-104.599148999999997 29.811007,-104.610166000000007 29.819117999999996,-104.610205623651026 29.819231101342197,-104.610356932717465 29.819662996386217,-104.613081011852316 29.827438579869643,-104.615248982559379 29.833626813172685,-104.619039 29.844444999999997,-104.624350000000007 29.845221999999996,-104.629290740007292 29.852171499068138,-104.629713747950376 29.852766489555783,-104.630103000000005 29.853313999999997,-104.630111961493199 29.853664893019587,-104.630290851730521 29.860669455113747,-104.630338938536084 29.862552324858758,-104.630359999999996 29.863376999999996,-104.630588419131911 29.86393398222631,-104.633274999999998 29.870484999999999,-104.63616345635748 29.872800876528242,-104.645854762904364 29.880571071602066,-104.65678299999999 29.889332999999997,-104.658422170930251 29.891285606400047,-104.65864999999998 29.891556999999999,-104.658665881124946 29.891956296855856,-104.659041999999999 29.901413000000002,-104.661965712024596 29.903547518850328,-104.666224133352003 29.906656470935726,-104.672326999999996 29.911111999999996,-104.679772 29.924658999999998,-104.680850906343153 29.932111041680564,-104.684321999999995 29.956085999999999,-104.679660999999982 29.975271999999997,-104.680379178583593 29.977083,-104.685479 29.989943,-104.689640999999995 30.014949999999999,-104.693591999999995 30.019077000000003,-104.701242868742796 30.021046973658397,-104.702310999999995 30.021321999999998,-104.702447580064685 30.021555813412469,-104.7030116881661 30.022521518330599,-104.703997999999999 30.02421,-104.703882705803636 30.024660825787098,-104.703121214098445 30.027638426639932,-104.701101999999992 30.035533999999998,-104.706873999999999 30.050685,-104.706630611705322 30.051708605996314,-104.703831250551389 30.063481739403372,-104.703581999999997 30.06453,-104.699792220462342 30.065066336345112,-104.698848962238912 30.065199827927678,-104.698233000000002 30.065286999999998,-104.697787990647399 30.065651654776563,-104.69277799999999 30.069756999999996,-104.687313590037505 30.080921966773531,-104.685080632167896 30.08548438075637,-104.685002999999995 30.085643,-104.685554782105299 30.093963293324606,-104.685687 30.095957000000002,-104.686861171517634 30.098036494960315,-104.692093999999983 30.107303999999996,-104.693655813605488 30.119154117533654,-104.695366000000007 30.13213,-104.692122999999995 30.138662999999998,-104.690080458880587 30.149079251722458,-104.687506999999997 30.162202999999998,-104.687296000000003 30.179464000000003,-104.702787999999998 30.211735999999995,-104.707897632633845 30.218501061672534,-104.711235999999985 30.222920999999999,-104.713166 30.237956999999998,-104.722357186598074 30.248308653999679,-104.724410584274111 30.250621311025988,-104.72532436157617 30.251650460675243,-104.73347160041142 30.260826359409911,-104.733822000000004 30.261220999999999,-104.734059376092361 30.261231667834558,-104.737359999999995 30.261379999999996,-104.740448 30.259454000000002,-104.749663999999996 30.26126,-104.751566999999994 30.263643999999999,-104.754655151309422 30.272796681105522,-104.757893999999993 30.282395999999999,-104.761634 30.301147999999998,-104.779356000000007 30.313188,-104.790279572675416 30.323632238875831,-104.797291 30.330335999999999,-104.809794338457337 30.334925849121163,-104.810755485390246 30.338091979227556,-104.81211787963197 30.342579864771171,-104.813478341684558 30.347061385458392,-104.814379749150064 30.356375955470707,-104.814778573671205 30.360497153782266,-104.817595751374526 30.365914799658352,-104.824313633436745 30.370465624210016,-104.837492999999995 30.373909,-104.849824017938076 30.383147747051474,-104.859521 30.390413000000002,-104.857439999999997 30.408957,-104.852419999999995 30.418792,-104.861074000000002 30.428896999999996,-104.86474141169117 30.441297336779865,-104.865463293164552 30.443738179024677,-104.868454614768496 30.453852504447951,-104.869872 30.458644999999997,-104.86871099999999 30.463229999999996,-104.866118999999983 30.46479,-104.866094000000004 30.467379999999999,-104.870137228360662 30.483875070981508,-104.873288503237063 30.496731258693877,-104.873335488188886 30.496922942181985,-104.876786999999979 30.511004000000003,-104.878566789651714 30.514416830422793,-104.880108146577356 30.517372454871531,-104.88208573587417 30.521164575423189,-104.889375999999999 30.535143999999995,-104.890392881954469 30.540947215529823,-104.892228000000003 30.551419999999997,-104.895440150997459 30.560421421221292,-104.899000999999998 30.570399999999996,-104.909330873116318 30.584188648619556,-104.909747767935556 30.584745133303247,-104.918689620637082 30.596681007395873,-104.924796 30.604831999999998,-104.927016167130404 30.604700501077968,-104.934922481779466 30.604232215677584,-104.939873000000006 30.603939,-104.953391370086464 30.606003357240429,-104.967167000000003 30.608106999999997,-104.971627504383378 30.61006529240159,-104.972071 30.61026,-104.972794851616513 30.611297344530712,-104.980135850742045 30.621817657146149,-104.980290999999994 30.622039999999995,-104.982191641583043 30.62882153037463,-104.983981 30.635206,-104.985513855292751 30.652294791670293,-104.9863 30.661059000000002,-105.001239999999996 30.672583000000003,-105.002056999999994 30.680971999999997,-105.006614566555172 30.685839873047019,-105.006800999999996 30.686039,-105.007528432885024 30.6859080282745,-105.007959930235828 30.685830338698263,-105.020141999999993 30.683637,-105.035888798004834 30.686138071331488,-105.042930223005172 30.687256464175281,-105.044973600167665 30.685364445024991,-105.049769587265445 30.680923708581364,-105.049884734287517 30.6808170907847,-105.050688284649809 30.681171184306308,-105.054688384336032 30.682933873306403,-105.062333999999993 30.686302999999995,-105.062477471553692 30.692159292631892,-105.062625999999995 30.698222,-105.084504902225902 30.710918832086001,-105.098281999999998 30.718914000000002,-105.108075999999997 30.730049999999995,-105.110705999999993 30.737749999999995,-105.110681999999983 30.743366000000002,-105.113815999999986 30.746001,-105.119547104826722 30.748125675649064,-105.123265000000004 30.749504000000005,-105.140207000000004 30.752502,-105.152361999999982 30.751451999999997,-105.157640215066564 30.754007791997694,-105.16015278062757 30.757058756266805,-105.160271207191187 30.758203550015399,-105.161229588477383 30.767467931854636,-105.164076390339474 30.771453450048199,-105.164818961888187 30.77249304906519,-105.164868027003308 30.772491740665838,-105.170370203038615 30.772345016388588,-105.178279098267282 30.772134113115257,-105.183436 30.776644999999995,-105.185930999999997 30.784391999999997,-105.195143999999999 30.792138,-105.195988495740664 30.791702299374609,-105.203522176185984 30.787815448176353,-105.206160999999994 30.786453999999996,-105.212916518294108 30.785414778041517,-105.215967484302155 30.786491589369188,-105.216685356202021 30.789542555377231,-105.215888956387687 30.792967070566242,-105.214890669496626 30.797259699168034,-105.218659510882389 30.801566944478708,-105.222008841883465 30.801829013843189,-105.231580057313238 30.802577916338681,-105.238364256021057 30.803108747911697,-105.249792715464977 30.799033957074698,-105.255416052233826 30.797028969328842,-105.261224946310648 30.798054073736733,-105.261360733612406 30.798078036329223,-105.27276013440985 30.808707209360072,-105.27887297001547 30.814407016614517,-105.283004544196217 30.818259431108679,-105.287237620233441 30.822206489243744,-105.289317685342255 30.822206489243744,-105.295630129130572 30.822206489243744,-105.300778681061615 30.818848737795758,-105.303672944509898 30.816961174571279,-105.314862960890409 30.816961174571279,-105.316949659843416 30.82296045428,-105.31766045482081 30.825003996727105,-105.320108268786385 30.827451797139727,-105.322675464925993 30.828439452154051,-105.330102631610075 30.831296841312803,-105.347695000000002 30.838065,-105.353219571709047 30.842032277683753,-105.358103536812379 30.84553952616983,-105.359771122039604 30.846737044096301,-105.360672052753856 30.84738401593513,-105.36720323988537 30.847875849249167,-105.377416999999994 30.848644999999998,-105.387780492422849 30.851314552204784,-105.394242074789418 30.852979003795937,-105.396689881978517 30.855426817761515,-105.396237319899697 30.858492407966825,-105.394628539050657 30.86939005724841,-105.394248999999988 30.871960999999999,-105.395681745186749 30.87649980844607,-105.399608999999998 30.888940999999996,-105.399828021807267 30.889112280223049,-105.402824820246408 30.891455847338634,-105.413505 30.899808,-105.430088999999995 30.905791999999998,-105.44547819369545 30.915748838601054,-105.448693870984556 30.917829388134351,-105.452149246331331 30.920065022782566,-105.4597280766598 30.924968540917344,-105.469954295993247 30.931584924947412,-105.472488639470896 30.933224650164071,-105.476269681741059 30.935670991952524,-105.488027000000002 30.943277999999999,-105.495516502166126 30.9493992090351,-105.4968561000139 30.950494069316512,-105.497422439936116 30.953962910943051,-105.497963910074574 30.957279424722472,-105.502256687477072 30.962680017552614,-105.507558525965123 30.966493977230062,-105.533087999999992 30.984859,-105.541468808393844 30.984769556162778,-105.543675999999991 30.984745999999998,-105.557430349577899 30.990228688381027,-105.570063935625512 31.008532833135739,-105.575218046011173 31.016000355201566,-105.578084306850855 31.020153131231776,-105.578407858220658 31.020621907958049,-105.57911399999999 31.021644999999999,-105.580554486932016 31.024917232759986,-105.581339666024604 31.026700857930102,-105.581404000000006 31.026847000000004,-105.581361569643192 31.027041810483581,-105.581235244876609 31.027621805343596,-105.579823718925667 31.034102543987302,-105.579541999999989 31.035395999999995,-105.579765234089464 31.036249085539566,-105.579847333127134 31.036562825712579,-105.585323000000002 31.057487999999996,-105.592709163135751 31.0626132919136,-105.595921000000004 31.064841999999999,-105.598772999999994 31.074925999999998,-105.60333 31.082624999999997,-105.627348999999995 31.098545,-105.641890000000004 31.098321999999996,-105.646730999999988 31.113907999999999,-105.647031366805422 31.114192798578223,-105.648833999999994 31.115902000000002,-105.662869191777489 31.12063916934996,-105.673930643060629 31.124372639388369,-105.709491 31.136374999999997,-105.717005999999998 31.141438,-105.717653520299876 31.143411480377267,-105.719539999999995 31.149160999999996,-105.742677999999998 31.164897,-105.763531 31.164121000000005,-105.773256999999987 31.166896999999999,-105.774148788612138 31.168976038235485,-105.780021000000005 31.182666,-105.779878030009812 31.18682806893737,-105.779724999999999 31.191282999999995,-105.782894999999996 31.197562999999999,-105.790659746923424 31.200723362140888,-105.794386000000003 31.20224,-105.818835000000007 31.230680999999997,-105.825806058218902 31.23733997673531,-105.835722000000004 31.246811999999995,-105.851073632158958 31.265902599748792,-105.86604427072389 31.284519412988434,-105.869353000000004 31.288633999999998,-105.869862116496506 31.288859823963843,-105.876014999999981 31.291588999999995,-105.890871999999987 31.290013999999996,-105.895034999999993 31.290977999999999,-105.903460999999993 31.306768999999999,-105.908770999999987 31.312773999999997,-105.914613899052299 31.312859252963214,-105.93196564998388 31.313112430054005,-105.932552999999999 31.313120999999995,-105.933375187723101 31.313903465142818,-105.938451999999984 31.318735,-105.948091000000005 31.340069,-105.945903 31.352809999999998,-105.953942999999995 31.364749,-105.970101 31.365936999999995,-105.997579969562565 31.386863626037869,-106.00418474278807 31.391893495117941,-106.004925999999998 31.392457999999998,-106.006143777923754 31.392558937255828,-106.022866323827969 31.393945009265412,-106.080091217088636 31.398688175961098,-106.080258 31.398702,-106.080335505244278 31.398768097394733,-106.096409750603954 31.412476405141465,-106.100621535494 31.416068265421309,-106.102641400977276 31.417790830744398,-106.10264993125142 31.41779810546371,-106.106876999999997 31.421403000000005,-106.112168999999994 31.423577999999996,-106.132782000000006 31.425367000000005,-106.143572676566535 31.431101721097118,-106.158218000000005 31.438885000000003,-106.175305198785026 31.455910533348611,-106.175674999999998 31.456278999999995,-106.17677981450808 31.456634312625521,-106.182946895641223 31.45861766980741,-106.20560859826729 31.465905761156737,-106.205826999999999 31.465975999999998,-106.205998876707866 31.466165148890862,-106.212686244283063 31.473524541419071,-106.218538531147885 31.479964934554566,-106.218843000000007 31.480299999999996,-106.218893022078106 31.480498686193428,-106.223908999999992 31.500422,-106.236804000000006 31.513376,-106.242649095206133 31.530650094003715,-106.245874455325477 31.540182047193959,-106.246202999999994 31.541153,-106.246406806009631 31.541315626597875,-106.254779999999997 31.547997000000002,-106.280345588488331 31.561810530102129,-106.280548572587122 31.561920205925162,-106.280811 31.562061999999997,-106.287785 31.584444999999999,-106.292254713772053 31.594651759250389,-106.295141086978958 31.601242900860864,-106.303535999999994 31.620412999999996,-106.308594276522342 31.627497440426588,-106.330970256390501 31.658836434185069,-106.33473699999999 31.664111999999999,-106.338265602146336 31.671883697950737,-106.346992532059133 31.691104641686092,-106.349537999999995 31.696711,-106.357472918704602 31.702103016258707,-106.368303742040567 31.709462886938788,-106.370138999999995 31.710709999999999,-106.373839000000004 31.714809999999996,-106.378039 31.72831,-106.381039 31.732109999999999,-106.38595139194058 31.734759025425479,-106.394642915450532 31.739445961452269,-106.404086535473255 31.744538468290354,-106.417940000000002 31.752009,-106.421739999999616 31.752623660686648,-106.431540999999996 31.754208999999996,-106.434644983693715 31.755853956158482,-106.444263765046571 31.76095142933643,-106.451540999999992 31.764807999999999,-106.467641999999998 31.759607999999997,-106.470742 31.753508,-106.472156160715315 31.752506597443457,-106.47367184987327 31.751433300058491,-106.475016438009845 31.750481163584279,-106.475542000000004 31.750108999999998,-106.48261401078824 31.748321568701869,-106.484641999999994 31.747809000000004,-106.486162292248409 31.747994847970777,-106.488078402545341 31.748229082678503,-106.489542 31.748407999999998,-106.507341999999994 31.761208,-106.509102011460428 31.762827435120251,-106.511609062807707 31.765134242258316,-106.523643000000007 31.776206999999996,-106.528643000000002 31.781807,-106.528542999999999 31.783906999999996,-106.528542999999999 31.784407000000002,-106.527996999999999 31.786944999999999,-106.527623000000006 31.789119000000003,-106.527737999999985 31.789760999999995,-106.527942999999993 31.790507000000002,-106.530514999999994 31.792103,-106.532480000000007 31.791913999999998,-106.533 31.791829,-106.533043000000006 31.791906999999995,-106.534743000000006 31.796106999999999,-106.535154000000006 31.797088999999996,-106.535342999999997 31.797507,-106.535842999999986 31.798607,-106.542096999999998 31.802145999999997,-106.542143999999993 31.802106999999996,-106.544713999999999 31.804286999999999,-106.545344 31.805007,-106.546561898485905 31.806561850400339,-106.546615562760394 31.806630361790774,-106.547143999999989 31.807304999999996,-106.551861034152338 31.808599471053657,-106.558443999999994 31.810406,-106.560680020141419 31.810752754512048,-106.560847305685968 31.810778696593822,-106.562944999999999 31.811104,-106.56344399999999 31.812605999999995,-106.566844000000003 31.813305999999997,-106.569123704016391 31.811582321353455,-106.570943999999997 31.810205999999997,-106.577243999999993 31.810406,-106.581344 31.813905999999996,-106.582144 31.815505999999999,-106.588044999999994 31.822105999999998,-106.589044999999984 31.822705999999997,-106.593826000000007 31.824901,-106.602727000000002 31.825023999999996,-106.605266999999998 31.827911999999998,-106.603310537982878 31.834798487166189,-106.601945 31.839604999999999,-106.60204499999999 31.844404999999998,-106.605244999999982 31.845904999999998,-106.605845000000002 31.846304999999997,-106.614637000000002 31.846489999999996,-106.621857000000006 31.852854,-106.625763000000006 31.856276,-106.627808000000002 31.860592999999998,-106.629708357956787 31.861913746439043,-106.635925999999998 31.866235,-106.635879999999986 31.871514,-106.634872999999999 31.874477999999996,-106.630798999999996 31.879696999999997,-106.629271361585637 31.8835303997664,-106.629197000000005 31.883717000000004,-106.629948941610351 31.885072003811555,-106.630443527558498 31.88596325099838,-106.630530381920593 31.886119763139838,-106.630691999999982 31.886410999999999,-106.633926999999986 31.889183999999997,-106.635073463799642 31.889856364267651,-106.636317332120683 31.890585853164694,-106.638154 31.891662999999998,-106.638364165758659 31.89171923904625,-106.642899999999983 31.892932999999999,-106.645296000000002 31.894859,-106.645645999999999 31.895648999999995,-106.645478999999995 31.898669999999999,-106.640839999999997 31.904598,-106.63512839833713 31.908732779117901,-106.633668 31.90979,-106.633408736085542 31.909871832166754,-106.625946999999996 31.912227,-106.62344499999999 31.914034,-106.618336531290581 31.916262323146238,-106.614677480394235 31.917858407661853,-106.614345999999998 31.918002999999995,-106.611846 31.920003,-106.616063629645311 31.921863544491501,-106.623932999999994 31.925334999999997,-106.624022586877501 31.92530240401349,-106.628663000000003 31.923614,-106.629746999999995 31.926570000000002,-106.625321999999983 31.930053000000004,-106.622529 31.934863000000004,-106.622117000000003 31.936620999999999,-106.622377 31.940863,-106.623659000000004 31.945509999999995,-106.616135999999983 31.948439,-106.614701999999994 31.956,-106.617707999999993 31.956008,-106.622819000000007 31.952891,-106.625123000000002 31.954530999999999,-106.625534999999985 31.957475999999996,-106.624298999999993 31.961054,-106.620453999999981 31.963402999999996,-106.619370999999987 31.964777000000005,-106.618745000000004 31.966954999999995,-106.619568999999998 31.971578,-106.621872999999994 31.972933,-106.623215999999999 31.972909999999999,-106.626465999999994 31.97069,-106.630114000000006 31.971257999999999,-106.638186000000005 31.976819999999996,-106.639528999999996 31.980347999999996,-106.63649199999999 31.985719,-106.631181999999995 31.989809,-106.629494617643616 31.990072722748106,-106.628337072326531 31.990253636712819,-106.62822051159516 31.990271854111079,-106.626910882874782 31.990476537349483,-106.623567999999992 31.990998999999999,-106.619448000000006 31.994733,-106.618486000000004 32.000494999999994,-106.599096000000003 32.000731000000002,-106.598639000000006 32.000753999999993,-106.595332999999997 32.000777999999997,-106.587971999999979 32.000748999999999,-106.582805114232855 32.000751357586125,-106.566056000000003 32.000759000000002,-106.565141999999994 32.000736000000003,-106.564298514026802 32.00073927393025,-106.562131862706067 32.000747683631808,-106.55942760630407 32.000758180008894,-106.517043115844388 32.000922692365819,-106.411074999999983 32.001334,-106.409326934223301 32.001349629127162,-106.409108574114072 32.001351581443814,-106.394297999999992 32.001483999999998,-106.376861000000005 32.001171999999997,-106.32356972407176 32.001457096670784,-106.313306999999995 32.001511999999998,-106.205915000000005 32.001761999999999,-106.200699 32.001784999999998,-106.18183999999998 32.002049999999997,-106.125534000000002 32.002532999999993,-106.05045734599986 32.002412317859424,-105.998002999999997 32.002327999999999,-105.900599999999997 32.002099999999992,-105.886159000000006 32.001969999999993,-105.854061000000002 32.00235,-105.750527000000005 32.002206,-105.731362000000004 32.001564000000002,-105.563520259526442 32.001015604709174,-105.429281000000003 32.000577,-105.428582000000006 32.000599999999999,-105.427048999999997 32.000638000000002,-105.390395999999981 32.000607000000002,-105.340142768272344 32.000583616714373,-105.200871148394683 32.000518812363367,-105.153993999999997 32.000497000000003,-105.150310000000005 32.000497000000003,-105.14824 32.000484999999998,-105.132915999999994 32.000518,-105.131377 32.000523999999999,-105.118039999999993 32.000484999999998,-105.078604999999996 32.000532999999997,-105.077045999999996 32.000578999999995,-104.918272000000002 32.000495999999991,-104.643525999999994 32.000442999999997,-104.640917999999999 32.000396000000002,-104.531936999999999 32.000311000000004,-104.531756 32.000117000000003,-104.024520999999993 32.000010000000003,-103.980179000000007 32.000124999999997,-103.875476000000006 32.000554,-103.748317 32.000197999999997,-103.72373965094468 32.000208021677786,-103.713395184678689 32.000212239744897,-103.713395184670219 32.000212239744904,-103.713395184654971 32.000212239744911,-103.713395184639609 32.000212239744918,-103.60161412595366 32.000257819670985,-103.326500999999993 32.00036999999999,-103.278520999999998 32.000419,-103.270382999999995 32.000326,-103.267707999999999 32.000323999999992,-103.267633000000004 32.000475000000002,-103.215641000000005 32.000512999999998,-103.133028835827503 32.000473953106116,-103.088697999999994 32.000452999999993,-103.085875999999985 32.000464999999998,-103.064422999999991 32.000518,-103.064344000000006 32.087051000000002,-103.064347999999995 32.123041,-103.064421999999993 32.145006000000002,-103.064695999999998 32.522193,-103.064761000000004 32.587983,-103.064787999999993 32.600397,-103.064761000000004 32.601863000000002,-103.064814999999996 32.624536999999997,-103.064633 32.646419999999992,-103.064864 32.682647000000003,-103.064797999999996 32.690761000000002,-103.064798999999994 32.708694,-103.064826999999994 32.726627999999998,-103.064807000000002 32.777302999999996,-103.064698000000007 32.783602000000002,-103.064711000000003 32.784593,-103.064699000000005 32.827531,-103.064672000000002 32.828470000000003,-103.064888999999994 32.849359,-103.064915999999982 32.857259999999997,-103.064807000000002 32.857695999999997,-103.064862000000005 32.868346000000003,-103.064700999999985 32.879354999999997,-103.064569000000006 32.900013999999999,-103.064656999999997 32.959097,-103.064678999999998 32.964373000000002,-103.064625000000007 32.999898999999999,-103.064452000000003 33.010289999999998,-103.06398 33.038693000000002,-103.063904999999991 33.042054999999998,-103.063382198608849 33.066417104805645,-103.0628188509327 33.092668632365545,-103.062136190569035 33.12448003074244,-103.060102999999984 33.219225000000002,-103.059719999999999 33.256262,-103.059241999999998 33.260370999999992,-103.057856 33.315233999999997,-103.057486999999995 33.32947699999999,-103.056655000000006 33.388437999999994,-103.052609999999987 33.570599,-103.051664000000002 33.629489,-103.051362999999995 33.64195,-103.051535 33.650486999999998,-103.051086999999981 33.658186,-103.050532000000004 33.672407999999997,-103.050147999999993 33.701971,-103.049608000000006 33.737766,-103.049096000000006 33.746270000000003,-103.047346000000005 33.824674999999999,-103.046907000000004 33.850299999999997,-103.045643999999996 33.901536999999998,-103.045698000000002 33.90629899999999,-103.044893000000002 33.945616999999999,-103.043949999999981 33.974629,-103.043616999999998 34.003633,-103.043531000000002 34.018014,-103.043554999999984 34.032713999999991,-103.043745999999999 34.037294000000003,-103.043771000000007 34.041538000000003,-103.043720999999991 34.042319999999997,-103.043767000000003 34.043544999999995,-103.043744000000004 34.049985999999997,-103.04368599999998 34.063077999999997,-103.043515999999983 34.079382000000003,-103.043569000000005 34.087947,-103.043571175003294 34.092846731402311,-103.043572866326429 34.096656853966635,-103.04358003846437 34.112813863799865,-103.043644 34.256903,-103.043718999999982 34.289440999999997,-103.043935999999988 34.302584999999993,-103.043978999999979 34.312763999999994,-103.043947553639484 34.376410480771497,-103.043947499824213 34.37651940122479,-103.043946000000005 34.379555000000003,-103.043943999999982 34.37966,-103.043919000000002 34.380915999999992,-103.043693000000005 34.383578,-103.043629999999993 34.384689999999999,-103.043614000000005 34.384968999999998,-103.043612999999993 34.388679000000003,-103.043612999999993 34.390442,-103.043606047260084 34.391254973944719,-103.043584999999993 34.393715999999998,-103.043610999999999 34.397105000000003,-103.043582999999998 34.400677999999999,-103.043537999999998 34.405462999999997,-103.043582 34.455657000000002,-103.043587999999986 34.459662000000002,-103.043588999999997 34.459774000000003,-103.043593999999985 34.46266,-103.043434927764125 34.510540742996007,-103.043071999999981 34.619782,-103.043277851519235 34.65183038816317,-103.0432796163159 34.65210514391012,-103.043285999999995 34.653098999999997,-103.042827000000003 34.671187999999994,-103.042768999999993 34.747360999999998,-103.042770000000004 34.792223999999997,-103.042781000000005 34.850242999999999,-103.042520999999979 34.899546,-103.0425974544018 35.032467348285799,-103.042641999999987 35.109912999999999,-103.043261 35.125058000000003,-103.042519999999996 35.135596,-103.042599999999993 35.142766000000002,-103.042710999999997 35.144734999999997,-103.042568000000003 35.159317999999999,-103.042394999999999 35.178573,-103.042338999999984 35.181922,-103.042366 35.182786,-103.042377000000002 35.183149,-103.042496999999997 35.211862000000004,-103.042775000000006 35.241236999999998,-103.042366 35.250056,-103.041554000000005 35.622487,-103.041484634909168 35.651235429903174,-103.041145999999998 35.791583000000003,-103.041916999999998 35.796441000000002,-103.041715999999994 35.814072000000003,-103.042186 35.825216999999995,-103.04130499999998 35.837693999999999,-103.040823999999986 36.055230999999992,-103.041387523024824 36.229129564686382,-103.041674 36.317534000000002,-103.041745000000006 36.318266999999999,-103.041923999999995 36.500439,-103.00243399999998 36.500397)),((-96.818513748151517 28.172441936006489,-96.816443421354066 28.174808025412563,-96.791958210781445 28.188687337716829,-96.733036581469989 28.190913261798631,-96.70383764358462 28.198245729538105,-96.697421731775194 28.2029594609741,-96.702659211994316 28.211208487181011,-96.703313894801497 28.216445964862743,-96.686815839850283 28.218410020896432,-96.662461568376486 28.227313732447904,-96.66062845144161 28.228884976259902,-96.663116248646261 28.233205895474203,-96.651855673914184 28.251275190431315,-96.607991796426646 28.277069769155677,-96.608122730450688 28.280081317680857,-96.611527096272326 28.281390688369981,-96.610479598706064 28.283092866206033,-96.592934048725994 28.296972182316367,-96.581018783574592 28.302209665072866,-96.553260151988255 28.302340591484768,-96.546975176740276 28.305614018207578,-96.542130508742858 28.315958034472228,-96.528905880514458 28.322504882843088,-96.476269225261575 28.330753906512612,-96.45099839278295 28.337038879223222,-96.434107525610045 28.344764159184386,-96.418918843885365 28.35484630740093,-96.415252604940861 28.362833452872817,-96.417216660974546 28.367154372087118,-96.412895739222876 28.36951123780511,-96.403206408302779 28.371475291301415,-96.401242352269094 28.366892498964241,-96.400558825492723 28.362187299887704,-96.398667286465624 28.349166496619617,-96.397846 28.343512999999998,-96.413700000000006 28.327342999999999,-96.439098999999999 28.319051999999999,-96.495600517783487 28.293964130304811,-96.547774000000004 28.270797999999999,-96.587113635820756 28.248878526668094,-96.611036668198281 28.235548960715661,-96.621533999999983 28.229699999999998,-96.694665999999998 28.18212,-96.758140999999995 28.136872999999998,-96.830820125734775 28.079724674840076,-96.849624000000006 28.064938999999999,-96.854049189790473 28.060788472935577,-96.855594496383262 28.059339080448503,-96.859762278796424 28.055429983997605,-96.896530613737951 28.020943786452513,-96.898080497387397 28.019490100997579,-96.929052999999996 27.990439999999996,-96.96699599999998 27.950531000000002,-97.001440999999986 27.911442,-97.031660000000002 27.869974999999997,-97.041798999999997 27.852925999999997,-97.045408776308051 27.837452569961062,-97.045409609838757 27.837448997003069,-97.04598 27.835004,-97.050599498412936 27.830109781194331,-97.058265753683145 27.821987615677948,-97.076304165860961 27.802876463727326,-97.079565315161531 27.799421374709375,-97.083535350812468 27.795215242050556,-97.085211615730273 27.793439290085495,-97.085394999999991 27.793244999999999,-97.11422230692618 27.755303327915222,-97.116276999999997 27.752599,-97.117304906633777 27.751048809529347,-97.118830196202964 27.748748513687826,-97.139140047561696 27.718119138409879,-97.139351757288111 27.717799858049549,-97.143807202733072 27.711080581371732,-97.165547551982726 27.678293865995041,-97.166583141799606 27.676732088482499,-97.166681999999994 27.676583,-97.184850261879149 27.644709535797791,-97.192144670654784 27.631912600211269,-97.198729900630283 27.620359811436909,-97.201865999999995 27.614857999999998,-97.211651066704889 27.596044174137351,-97.213608899397855 27.592279833590187,-97.221943360361436 27.576255098965802,-97.265194083077162 27.493096589152017,-97.265746568141566 27.492034321708481,-97.276090999999994 27.472145,-97.304469999999995 27.407734,-97.326522999999995 27.347611999999998,-97.347445832595042 27.277936119324231,-97.350397999999998 27.268104999999998,-97.363400999999996 27.210366,-97.370941000000002 27.161165999999998,-97.377001000000007 27.101020999999999,-97.379130000000004 27.047996,-97.378361999999996 26.992877,-97.370730999999992 26.909706,-97.365301177044699 26.875333999999995,-97.365282052674758 26.875212938438843,-97.364726000000005 26.871692999999997,-97.363633430415348 26.866515420001111,-97.352028350385282 26.811520085064032,-97.35141299999998 26.808603999999999,-97.350529648372714 26.805138580575584,-97.333027999999999 26.736478999999996,-97.304204860681779 26.646364129642233,-97.300690000000003 26.635375,-97.297812715808362 26.627503004299889,-97.297022484076606 26.625340999999999,-97.287871455917369 26.600304594305239,-97.275119000000004 26.565415000000002,-97.269391999999982 26.554046,-97.269132970349304 26.553256905349773,-97.257954534248029 26.519203490608863,-97.229844 26.433568999999999,-97.223724090442104 26.411478908273114,-97.206682644704898 26.34996703527348,-97.194643999999997 26.306512999999999,-97.185844000000003 26.267102999999995,-97.177979856301576 26.220346386353309,-97.177168840972797 26.215524458900923,-97.173264999999986 26.192314,-97.170387765328073 26.167037808112223,-97.169872392484734 26.162510314053797,-97.167099005951158 26.138146416702778,-97.161470999999992 26.088705,-97.158662630175101 26.080176913346069,-97.154270970414501 26.066840900880429,-97.161462285840642 26.067639941946975,-97.169842256221145 26.077853024187579,-97.171781452365479 26.102521767945923,-97.179531587141199 26.146202099560895,-97.178745972847352 26.177103221942961,-97.183983445454302 26.214289306886101,-97.194458400817808 26.271639686993655,-97.214884565299002 26.353606215503973,-97.226930759399721 26.385554824668418,-97.240286324189555 26.405980989149626,-97.240845398636537 26.411470089808617,-97.243166933615896 26.434263367616055,-97.247618791929028 26.456260775909261,-97.254165635225121 26.471187589585856,-97.262545605605609 26.482971915638458,-97.27642492679071 26.521729238684483,-97.292399243108349 26.528014213932472,-97.310730412457033 26.556558470596535,-97.308111681228326 26.5712234060755,-97.308635417324538 26.576722756880109,-97.317015387705027 26.597672667607057,-97.318434072834165 26.60022630157264,-97.324871601690262 26.611813856840271,-97.338489044677715 26.647428701777493,-97.33639404954522 26.666021744249065,-97.345821512417203 26.700589103038251,-97.363105189274393 26.710540307081217,-97.370437657013895 26.723895871871047,-97.370961403259614 26.736203954318924,-97.367557047587525 26.740393934434408,-97.364152671616353 26.758986971196869,-97.364646278833362 26.767121661774897,-97.368866408127118 26.774699404876429,-97.370437646864346 26.781508126370166,-97.368342661881371 26.795649318140761,-97.373056398392137 26.808481136684847,-97.387459455673451 26.820789208983193,-97.383531343606066 26.875520854055946,-97.385626348888096 26.88887641440536,-97.391649435788921 26.901970109878395,-97.389554460955466 26.945964918852653,-97.390340075249313 27.05228571820243,-97.389816329003565 27.067212531879022,-97.386411973331462 27.083186832972341,-97.387459455673422 27.090519300711819,-97.390601943297412 27.094185534581555,-97.390078197051665 27.156511519247964,-97.377508246555678 27.199458835730731,-97.379865109736301 27.202863196477598,-97.386673841379576 27.204696313412462,-97.382221972916923 27.229050589961044,-97.37488951532697 27.25026236588155,-97.373318276589728 27.276449754290233,-97.372896734486858 27.277942715507475,-97.367033301341749 27.298709035706306,-97.36467643816114 27.302637142698917,-97.359962701650375 27.304732132756659,-97.357605838469766 27.307874620380655,-97.362319574980518 27.32672953597509,-97.366771423144115 27.333276389420721,-97.36179581858525 27.359987519000377,-97.346607126710992 27.390364889744752,-97.336132171347501 27.402411088920228,-97.331156576938184 27.412362295500575,-97.329585328051422 27.418123524502818,-97.330894688591016 27.425455992242295,-97.329847196099536 27.434359703793774,-97.317277255753083 27.463689574751687,-97.293708603647858 27.497209429631152,-97.282971770086746 27.521563701104967,-97.267627232015485 27.541048841138782,-97.26651977444007 27.542455137362143,-97.266473727822444 27.542513609294531,-97.257831889393842 27.556392930479635,-97.261144559602045 27.562355746269706,-97.261759991311692 27.563463525096239,-97.260450620622564 27.56739163716362,-97.260303240478223 27.567589679048492,-97.252732825146552 27.577762415194865,-97.252070650242061 27.578652211895708,-97.247885553160842 27.581360217573209,-97.247618802078478 27.581532821322067,-97.236881968517352 27.598292751933528,-97.24107194863285 27.602482732049012,-97.241084821027414 27.602523494839662,-97.242643187370078 27.607458346757408,-97.231683715414945 27.631671123728168,-97.231553918442799 27.631957884363242,-97.231382612637987 27.632336350521356,-97.221955159915538 27.632860099304484,-97.221711030183002 27.632638163711842,-97.219074540339648 27.630241360463614,-97.217418907944051 27.630677052710489,-97.214098935780783 27.631550728615359,-97.200743370990949 27.650143776161688,-97.197339005169326 27.664546838517776,-97.19760088336696 27.678426154628117,-97.203474366386629 27.684532651921231,-97.20308902068453 27.688000774441392,-97.200450811776179 27.688974477466285,-97.190006537429824 27.692829222058965,-97.188284576858237 27.695272543577584,-97.170627865440125 27.720325976082009,-97.166176017276527 27.732372180332245,-97.161200407642937 27.734074342943998,-97.153606061705801 27.733288721037997,-97.147321086457822 27.735383711095739,-97.130823034043985 27.751619892924076,-97.127942424617643 27.75580987303956,-97.127680546420009 27.759999858229808,-97.125046985317312 27.763143140340585,-97.103326269871417 27.789067861139614,-97.102999946318647 27.791923200131116,-97.10255066693685 27.795854405604921,-97.102495980878558 27.796332909939515,-97.102278777379922 27.798233445813956,-97.100865886772965 27.802472121847156,-97.098874421707819 27.808446522979796,-97.095168997779496 27.812151946908138,-97.092851314507953 27.81446963017968,-97.092589446459854 27.819183356540908,-97.098874421707819 27.822849590410645,-97.104263831428213 27.822227735056668,-97.126109297533233 27.819707102786651,-97.130299287798252 27.820492727230029,-97.134489267913736 27.825206463740791,-97.132394272781227 27.827301438574235,-97.10670775348396 27.832389859144307,-97.087681973298601 27.836158807756469,-97.056712719518927 27.842293721800239,-97.055822986229373 27.843403727743151,-97.04322620548075 27.859119113080268,-97.013634476624247 27.906780143237341,-97.017955395838555 27.911493874673329,-97.016384146951765 27.917255079570445,-96.985744902767337 27.954048356415132,-96.977888688782102 27.976438572489602,-96.978805242174786 27.978271691961854,-96.980900237307296 27.978271691961854,-96.986006780964971 27.976176699366729,-96.986661461234775 27.980759491703903,-96.978281501003806 28.001709402430844,-96.967806540565562 28.020040576854303,-96.966759042999328 28.020367911280101,-96.965187799187319 28.013297317932185,-96.962569062883844 28.012380759464751,-96.952617853766114 28.01643980428749,-96.946987563862692 28.02652194996665,-96.932453562407773 28.035425661518129,-96.926430465357427 28.043412814602167,-96.929572952981431 28.051399967686208,-96.927085150701998 28.057292130712504,-96.906004298338829 28.076147047258459,-96.890946545563423 28.076801730065643,-96.886232814127425 28.084396073465374,-96.88832780925992 28.086622002621937,-96.889113433703315 28.099453823703399,-96.886887499471996 28.117130312782294,-96.879424092633712 28.131402425890027,-96.874972236857971 28.133235547899659,-96.87078225420511 28.13127149186597,-96.86462821551855 28.126295887307109,-96.857164811217643 28.115559058820768,-96.845380482627661 28.108881273888468,-96.830128556765757 28.111822717849165,-96.827049318353744 28.112416571196771,-96.816574357915513 28.119618104912195,-96.810420321766344 28.126034014184238,-96.810944073086844 28.136378030448888,-96.816836228500989 28.158048094801106,-96.820248352517055 28.163388807027481,-96.822859330626116 28.167475552598326,-96.818513748151517 28.172441936006489)))'); \ No newline at end of file
diff --git a/django/contrib/gis/tests/geoapp/sql/ks.wkt b/django/contrib/gis/tests/geoapp/sql/ks.wkt
new file mode 100644
index 0000000000..8bfd38c86e
--- /dev/null
+++ b/django/contrib/gis/tests/geoapp/sql/ks.wkt
@@ -0,0 +1 @@
+POLYGON ((-102.051743999999999 40.003078000000002,-101.916696000000002 40.003141999999997,-101.904176000000007 40.003162000000003,-101.861740775252272 40.002907997451267,-101.841025000000002 40.002783999999991,-101.832160999999999 40.002932999999999,-101.807687 40.002797999999999,-101.804861999999986 40.002752,-101.783266423091504 40.002735966476642,-101.748492901329186 40.002710149056902,-101.627071 40.00262,-101.625809000000004 40.002710999999998,-101.579641080501318 40.002654627564297,-101.54227299999998 40.002608999999993,-101.417209 40.002423999999998,-101.411050023557621 40.002364583193085,-101.409952999999987 40.002353999999997,-101.387325211262052 40.00246006676732,-101.374325999999996 40.002520999999994,-101.342859000000004 40.002580000000002,-101.324035999999992 40.002695999999993,-101.293991000000005 40.002558999999998,-101.286555000000007 40.002558999999998,-101.248672999999997 40.002543000000003,-101.215033000000005 40.002555,-101.19221899999998 40.002490999999999,-101.186892990733696 40.002481867883319,-101.178804999999997 40.002468,-101.168704000000005 40.002547,-101.130906999999993 40.002426999999997,-101.104950380573442 40.002382874850099,-101.104950380567658 40.002382874850092,-101.060316999999998 40.002307000000002,-101.027686000000003 40.002255999999996,-100.962089380046322 40.00217532965339,-100.937427 40.002144999999999,-100.764559455237134 40.002296963384197,-100.758829999999989 40.002301999999993,-100.752183000000002 40.002127999999992,-100.7388309887763 40.002228385746484,-100.733295999999996 40.002270000000003,-100.729904000000005 40.002110999999999,-100.721127999999993 40.002068999999999,-100.683435000000003 40.002234,-100.660229999999984 40.002161999999998,-100.645444999999995 40.001882999999999,-100.626504856699498 40.001892789287538,-100.600944999999996 40.001905999999998,-100.594756999999987 40.001976999999997,-100.567238000000003 40.001888999999998,-100.551885999999996 40.001888999999998,-100.514429898999168 40.001844039098764,-100.511064999999988 40.00184,-100.487159000000005 40.001767,-100.477018 40.001752000000003,-100.475853999999998 40.001767999999998,-100.468772999999985 40.001724000000003,-100.447071999999991 40.001795,-100.439081000000002 40.001773999999997,-100.402449685831499 40.001800164690437,-100.390079999999998 40.001809000000002,-100.290126736823893 40.001691651381378,-100.231651999999997 40.001623000000002,-100.229478999999998 40.001692999999996,-100.215406000000002 40.001629,-100.196958999999993 40.001494,-100.19359 40.001573,-100.190323000000006 40.001586000000003,-100.188181 40.001541000000003,-100.177823000000004 40.001593,-99.990926000000002 40.001503,-99.986610999999996 40.001550000000002,-99.948166999999998 40.001812999999999,-99.944417 40.001584,-99.930432999999979 40.001516000000002,-99.906657999999993 40.001511999999998,-99.850154757615712 40.001444140609848,-99.813400999999999 40.001399999999997,-99.775639999999981 40.001646999999998,-99.772120999999984 40.001804,-99.764213999999996 40.001550999999999,-99.756834999999995 40.001342,-99.746628 40.001820000000002,-99.737774855821357 40.001824224692157,-99.731959000000003 40.001826999999992,-99.719639 40.001807999999997,-99.628345999999993 40.001866,-99.625979999999984 40.001865000000002,-99.515340365578794 40.002008435606839,-99.501791999999995 40.002026,-99.498998999999984 40.00195699999999,-99.497659999999982 40.001911999999997,-99.493464999999986 40.001936999999998,-99.480727999999999 40.001942,-99.423564999999996 40.002270000000003,-99.412644999999998 40.001867999999995,-99.403389000000004 40.001969000000003,-99.366747146128873 40.001962496644857,-99.290702999999979 40.001949000000003,-99.286655999999994 40.002017000000002,-99.282966999999999 40.001879000000002,-99.254012000000003 40.002074,-99.25036999999999 40.00195699999999,-99.216375999999997 40.002015999999998,-99.197591999999986 40.002032999999997,-99.188905000000005 40.002023,-99.186961999999994 40.001976999999997,-99.178965000000005 40.001976999999997,-99.169815999999997 40.001925,-99.123032999999992 40.002164999999998,-99.113510000000005 40.002192999999998,-99.085596999999993 40.002132999999994,-99.067047050731574 40.00217023690761,-99.020337999999995 40.00226399999999,-99.018700999999993 40.002333,-98.992135000000005 40.002192,-98.972286999999994 40.002245000000002,-98.971721000000002 40.002268,-98.961009000000004 40.002316999999998,-98.96091899999999 40.002271,-98.953888072580213 40.002253239016738,-98.934791999999987 40.002204999999996,-98.8435956659672 40.002348607685946,-98.842134005327992 40.002350909376077,-98.834455999999989 40.002363000000003,-98.820589999999982 40.002319,-98.777203 40.002358999999998,-98.774940999999998 40.002336,-98.729330606936671 40.002229113826232,-98.726294999999993 40.002222000000003,-98.710403999999997 40.002180000000003,-98.693095999999997 40.002372999999999,-98.691443000000007 40.002504999999999,-98.690286999999998 40.002547999999997,-98.672819000000004 40.002364,-98.669723999999988 40.002409999999998,-98.653832999999992 40.002268999999998,-98.652494000000004 40.002245000000002,-98.640709999999984 40.002493,-98.616372379820518 40.002409030470169,-98.613754999999998 40.002400000000002,-98.593342000000007 40.002475999999994,-98.575219000000004 40.002479999999991,-98.560578000000007 40.002274,-98.543186000000006 40.002285,-98.523053000000004 40.002336,-98.506634585466017 40.002329436673158,-98.504454999999979 40.002328565375151,-98.50084801790743 40.002327123469641,-98.490532999999999 40.002322999999997,-98.441997554675297 40.002366263566756,-98.391848301995964 40.002410965650498,-98.274015000000006 40.002516,-98.268218000000005 40.002490000000002,-98.25000799999998 40.002307000000002,-98.213290432425865 40.002506421375415,-98.193483 40.002614,-98.179315000000003 40.002482999999998,-98.172269 40.002437999999991,-98.156873151934732 40.002445128178877,-98.142031000000003 40.002451999999998,-98.099659000000003 40.002226999999998,-98.076034000000007 40.002300999999996,-98.068701000000004 40.002355,-98.050056999999981 40.002277999999997,-98.047469000000007 40.002186000000002,-98.042767978165202 40.002191261754177,-98.014411999999979 40.002223,-98.010157000000007 40.002153,-97.972185999999994 40.002113999999999,-97.931810999999996 40.002049999999997,-97.876261 40.002102,-97.85745 40.002065000000002,-97.838378999999989 40.001909999999995,-97.821597999999994 40.002003999999992,-97.819426000000007 40.001957999999995,-97.777154999999993 40.002167,-97.770775999999998 40.001976999999997,-97.769204000000002 40.001995,-97.767746000000002 40.001994000000003,-97.714825952022949 40.001974503868432,-97.706952472912022 40.001971603221314,-97.701160424072398 40.001969469388285,-97.61370959051284 40.001937251863488,-97.595964207410262 40.001930714334961,-97.593671575073259 40.001929869712491,-97.51530799999999 40.001900999999997,-97.511381 40.001899000000002,-97.510264000000006 40.001835,-97.48896951184885 40.0019310946697,-97.481234094494141 40.001966001936331,-97.463284999999999 40.00204699999999,-97.444661999999994 40.001957999999995,-97.425443 40.002048000000002,-97.417825999999991 40.002023999999999,-97.415833000000006 40.002000999999993,-97.369102999999996 40.00206,-97.350896000000006 40.001930000000002,-97.350272000000004 40.001975999999999,-97.256541388870858 40.001563097676062,-97.24516899999999 40.001513000000003,-97.245080000000002 40.001466999999998,-97.202309999999997 40.00144199999999,-97.200190000000006 40.001548999999997,-97.181775000000002 40.001550000000002,-97.165136038800085 40.001526729909067,-97.164288093539042 40.001525544031956,-97.157705785150654 40.001516338474417,-97.144150390621661 40.001497380844818,-97.142447999999987 40.001494999999998,-97.137865999999988 40.001814000000003,-97.049662999999995 40.001322999999999,-97.030802999999992 40.001342,-97.009164999999996 40.001463,-96.918187714380807 40.001505032225388,-96.916093000000004 40.001505999999999,-96.880459000000002 40.001448000000003,-96.878253 40.001466,-96.875056999999998 40.001448000000003,-96.873812 40.001449999999998,-96.868892342573133 40.001444286089438,-96.805301797100199 40.001370429180717,-96.693246065483095 40.001240282633297,-96.622400999999996 40.001157999999997,-96.610348999999999 40.000881,-96.604883999999984 40.000891000000003,-96.581788013355691 40.000963078853125,-96.580851999999993 40.000965999999998,-96.570853999999997 40.001090999999995,-96.557862999999998 40.000968,-96.538977000000003 40.000850999999997,-96.527110999999991 40.001030999999998,-96.469944999999996 40.000965999999998,-96.467535999999996 40.001035000000002,-96.463639999999998 40.000967000000003,-96.354812913341547 40.000735780492882,-96.350953725714731 40.00072758106856,-96.341811057717251 40.000708156095854,-96.304554999999993 40.000629000000004,-96.301066000000006 40.000632000000003,-96.239171999999996 40.000691000000003,-96.223838999999998 40.000729,-96.220170999999993 40.00072,-96.154364999999984 40.000495,-96.154246 40.00045,-96.147166999999982 40.000478999999999,-96.125936999999979 40.000432000000004,-96.125788 40.000467,-96.089781000000002 40.000518999999997,-96.081394999999986 40.000602999999998,-96.051691000000005 40.000726999999998,-96.02409 40.000718999999997,-96.014716997898134 40.000662392993569,-96.010677999999999 40.000638000000002,-95.995389500007406 40.000603953777215,-95.958139000000003 40.000520999999999,-95.901560435593936 40.000482839492363,-95.882524000000004 40.00047,-95.788023999999993 40.000452000000003,-95.784575000000004 40.000463000000003,-95.672891827756033 40.000336669594915,-95.658762261555324 40.000320686938032,-95.63965170807073 40.000299070038061,-95.565216789143676 40.000214872989645,-95.463103327781397 40.00009936736172,-95.455130658279359 40.000090349077695,-95.452048066669519 40.000086862204618,-95.438655850967621 40.000071713601649,-95.436011808705814 40.000068722793607,-95.426269559489981 40.00005770284973,-95.42148745056565 40.000052293567869,-95.41484447973599 40.000044779372317,-95.375257000000005 40.0,-95.339895999999982 39.999999000000003,-95.326448603970363 39.999998574530281,-95.30829 39.999997999999998,-95.308403999999996 39.993758,-95.307779999999994 39.990617999999998,-95.307111000000006 39.989114,-95.302506999999991 39.984357000000003,-95.289715 39.977705999999998,-95.274756999999994 39.972115000000002,-95.269885999999985 39.969396000000003,-95.261854 39.960617999999997,-95.257651999999993 39.954886000000002,-95.250253999999998 39.948644000000002,-95.241382999999999 39.944949,-95.236761 39.943930999999999,-95.231114000000005 39.943784,-95.220212000000004 39.944432999999997,-95.216440000000006 39.943953,-95.213736999999995 39.943205999999996,-95.204427999999993 39.938949,-95.201277000000005 39.934193999999998,-95.200689999999994 39.928154999999997,-95.20201 39.922438,-95.205744999999993 39.915168999999999,-95.206326000000004 39.912120999999999,-95.206195999999991 39.909557,-95.205732999999981 39.908275000000003,-95.202631127107011 39.904826841138963,-95.201935000000006 39.904052999999998,-95.19982446963148 39.902956959499498,-95.199773390195176 39.902930432929807,-95.199730682369619 39.902908253904485,-95.199347000000003 39.902709000000002,-95.193815999999984 39.900689999999997,-95.189565000000002 39.899959000000003,-95.179452999999995 39.900061999999991,-95.172296000000003 39.902025999999999,-95.159833999999989 39.906984,-95.156023999999988 39.907243,-95.153185481864639 39.906665666721331,-95.151701132402337 39.906363761184394,-95.149656999999991 39.905947999999995,-95.148243978290679 39.905255611516672,-95.146055000000004 39.904183000000003,-95.143801999999994 39.901917999999995,-95.142562999999981 39.897992000000002,-95.142444999999995 39.895419999999994,-95.143403000000006 39.889355999999992,-95.142718000000002 39.885888999999992,-95.140601000000004 39.88168799999999,-95.137091999999996 39.878350999999995,-95.134747000000004 39.876852,-95.128165999999993 39.874164999999998,-95.105912000000004 39.869163999999998,-95.090958483530287 39.863446088154532,-95.090158000000002 39.86314,-95.085003 39.861882999999999,-95.081534000000005 39.861718000000003,-95.079786043666886 39.861878094210859,-95.052535000000006 39.864373999999998,-95.042141999999998 39.864804999999997,-95.037767000000002 39.865541999999998,-95.034318031759739 39.867229060943565,-95.032053000000005 39.868336999999997,-95.031002514960235 39.869148692103728,-95.027930999999981 39.871521999999999,-95.025918959417425 39.87568321107333,-95.025422000000006 39.876711,-95.025119000000004 39.878833,-95.02586205726584 39.885935119809076,-95.025947000000002 39.886747,-95.025771840138887 39.887478608302466,-95.025475064075451 39.888718183571669,-95.025239999999997 39.889699999999998,-95.024388999999999 39.891202,-95.021897459019584 39.893924778577606,-95.019088516216428 39.896994416745422,-95.018742999999986 39.89737199999999,-95.018224596337973 39.897611313155366,-95.013151999999991 39.899952999999996,-95.010684182587667 39.900289758615472,-95.008439999999993 39.900596,-95.003818999999993 39.900400999999995,-94.990284000000003 39.897010000000002,-94.989784913598129 39.896958718834505,-94.987823822157509 39.896757216540813,-94.986975 39.89667,-94.985308455245701 39.896814869812808,-94.979390624873346 39.897329296428744,-94.977748999999989 39.897472,-94.963345000000004 39.901136,-94.959276000000003 39.901671,-94.958440298615102 39.901548064610132,-94.95153999999998 39.900532999999996,-94.943866999999983 39.898130000000002,-94.935306395585215 39.893779379194363,-94.934493000000003 39.893366,-94.929574000000002 39.888753999999992,-94.927897000000002 39.88611199999999,-94.927358999999996 39.883966,-94.927251999999996 39.880257999999991,-94.928466 39.876344000000003,-94.931084167287821 39.873075003673321,-94.931462999999994 39.872602,-94.938790999999995 39.866954,-94.940742999999998 39.864409999999999,-94.942407000000003 39.861065999999994,-94.942566999999983 39.856601999999995,-94.939767000000003 39.851930000000003,-94.937655000000007 39.849786000000002,-94.926149999999993 39.841321999999998,-94.916917999999995 39.836137999999998,-94.909941999999987 39.834426,-94.903156999999979 39.833849999999998,-94.892677000000006 39.834377999999994,-94.889493000000002 39.834026,-94.886932999999999 39.833098,-94.881012999999996 39.828921999999991,-94.878676999999996 39.826521999999997,-94.877043999999998 39.823754,-94.876543999999996 39.820594,-94.875944000000004 39.813293999999999,-94.87632679569893 39.807169268817198,-94.876344000000003 39.806894,-94.876705972386588 39.80614007495069,-94.880932 39.797338000000003,-94.884084 39.794234000000003,-94.890292000000002 39.791626,-94.892965000000004 39.791097999999991,-94.912908274541266 39.790276806342419,-94.92474489359239 39.789789416146199,-94.925605000000004 39.789753999999995,-94.925940683661906 39.789631963361245,-94.927258709273417 39.789152799691166,-94.929653999999999 39.788281999999995,-94.93035270914757 39.787827111232048,-94.930442023078356 39.787768964141691,-94.930979872832452 39.787418801541357,-94.932726000000002 39.786282,-94.932913349551853 39.786043884763131,-94.935059195246907 39.783316584105528,-94.935205999999994 39.78313,-94.935782000000003 39.778905999999999,-94.935301999999993 39.77561,-94.935036741896766 39.775108050050804,-94.934624304242575 39.774327591105198,-94.934262000000004 39.773642000000002,-94.929652999999988 39.769098,-94.929421387607832 39.768921584953624,-94.928626586797606 39.768316199289764,-94.926229000000006 39.76648999999999,-94.923991330811134 39.765173947104167,-94.916788999999994 39.760937999999996,-94.912293000000005 39.759337999999993,-94.906244 39.759417999999997,-94.905921454535701 39.759501730763866,-94.900921941190049 39.760799572828766,-94.899156000000005 39.761257999999998,-94.899025621234756 39.761323457651685,-94.895268000000002 39.76321,-94.895041000000006 39.763350000000003,-94.894070999999997 39.763945999999997,-94.893918999999997 39.76404,-94.893724000000006 39.764159999999997,-94.893646000000004 39.764208000000004,-94.883923999999993 39.770186000000002,-94.881460000000004 39.771258000000003,-94.881422 39.771258000000003,-94.874706321154179 39.772392308082928,-94.871144 39.772993999999997,-94.869643999999994 39.772894,-94.867142999999999 39.771693999999997,-94.865243000000007 39.770094,-94.863142999999994 39.767294,-94.860742999999999 39.763094000000002,-94.859442999999999 39.753694000000003,-94.860369889104035 39.749534984666809,-94.860371 39.74953,-94.862942999999987 39.742994000000003,-94.870142999999999 39.734594,-94.875642999999997 39.730494,-94.884142999999995 39.726793999999998,-94.891743999999989 39.724893999999999,-94.899315999999999 39.724041999999997,-94.900553640444031 39.724102079633198,-94.901582061073228 39.724152002964722,-94.902612000000005 39.724201999999998,-94.906055088082866 39.724933471502588,-94.907014260749904 39.725137244236571,-94.907785666538786 39.725301126582274,-94.910067999999995 39.725785999999999,-94.911087398893699 39.726157408899255,-94.918323999999998 39.728793999999994,-94.93000499999998 39.735370000000003,-94.939221000000003 39.74157799999999,-94.944740999999979 39.744377,-94.948658825773634 39.745572502168315,-94.948680784417533 39.745579202723142,-94.948725999999994 39.745593,-94.952629999999999 39.745961,-94.955286 39.745688999999999,-94.960086000000004 39.743065,-94.963779819772341 39.740240978767318,-94.964692434782606 39.73954326086956,-94.965317999999982 39.739064999999989,-94.965565209393333 39.738728671232884,-94.970224508542714 39.732389687437191,-94.970421999999985 39.732120999999999,-94.971205999999981 39.729304999999997,-94.971078000000006 39.723146,-94.968452999999997 39.707402000000002,-94.968980999999999 39.692954,-94.969909 39.689050000000002,-94.971316999999999 39.686410000000002,-94.976096392737759 39.68160006801152,-94.976325000000003 39.68137,-94.981556999999995 39.678634000000002,-94.984149000000002 39.677849999999992,-94.986445080691666 39.677537608069159,-94.990587390516794 39.676974028501114,-94.993556999999996 39.676569999999998,-94.998766892420107 39.676509388876212,-95.001379 39.676479,-95.004602740773237 39.676177881356345,-95.008105239221649 39.675850724907868,-95.009022999999999 39.675764999999998,-95.010225986948086 39.675477408241932,-95.013209713780839 39.674764104372102,-95.015309999999985 39.674261999999999,-95.018317999999994 39.672868999999999,-95.021521942351953 39.670631293568427,-95.024595000000005 39.668484999999997,-95.027643999999995 39.665453999999997,-95.037464 39.652904999999997,-95.039049000000006 39.649639,-95.044554000000005 39.644370000000002,-95.049518000000006 39.637875999999999,-95.053366999999994 39.630347,-95.054924999999997 39.624994999999991,-95.055024819926729 39.623527163368095,-95.055152000000007 39.621656999999992,-95.054958456554544 39.620961328886679,-95.053131423647116 39.614394255464305,-95.053011999999981 39.613965,-95.052555891387243 39.613278556984888,-95.047910999999999 39.606287999999999,-95.046445000000006 39.601605999999997,-95.046361000000005 39.599556999999997,-95.047165000000007 39.595117000000002,-95.049277000000004 39.589582999999998,-95.054804000000004 39.582487999999998,-95.056897000000006 39.580567000000002,-95.059518999999995 39.579132,-95.064519000000004 39.577114999999999,-95.066275551338904 39.576786470694117,-95.068266439890465 39.576414113098046,-95.069315000000003 39.576217999999997,-95.072159999999982 39.576121999999991,-95.075842551355763 39.576644128527029,-95.076688000000004 39.576763999999997,-95.088569515113861 39.580713698327401,-95.089515000000006 39.581028000000003,-95.09068217809525 39.58095107619048,-95.095736000000002 39.580618,-95.099095000000005 39.579690999999997,-95.100375015351446 39.579100080742663,-95.10182940536555 39.578428661399109,-95.103228 39.577782999999997,-95.106109962410699 39.575487768136732,-95.106244982404746 39.575380236480051,-95.106274453941239 39.575356764970024,-95.106406000000007 39.575251999999999,-95.107454000000004 39.573842999999997,-95.108931052511622 39.56997896968771,-95.109155613535791 39.569391508783276,-95.112830712234896 39.559777298955126,-95.112877844119652 39.559653999999995,-95.113077000000004 39.559132999999996,-95.113262990573148 39.557121201967142,-95.113516735173974 39.554376531201555,-95.113557 39.553940999999995,-95.113330390574859 39.553319942050457,-95.109694540741444 39.543355336910984,-95.109303999999995 39.542284999999993,-95.106595999999996 39.537657000000003,-95.106363136618171 39.537386330858773,-95.106309238275287 39.537323682029822,-95.102887999999993 39.533346999999999,-95.096713422649174 39.527826015970483,-95.095319522838992 39.526579663685382,-95.092703999999998 39.524241000000004,-95.082713999999996 39.516711999999998,-95.077440999999993 39.513551999999997,-95.059460999999985 39.506143000000002,-95.05637999999999 39.503971999999997,-95.052176999999986 39.499995999999996,-95.050551999999996 39.497514000000002,-95.049844999999991 39.494414999999989,-95.048370000000006 39.480420000000002,-95.047133000000002 39.474970999999996,-95.045715999999999 39.472459,-95.040779999999998 39.466386999999997,-95.03749999999998 39.463689000000002,-95.033407999999994 39.460875999999992,-95.028497999999999 39.458286999999999,-95.015825000000007 39.452809000000002,-94.995767999999998 39.448174000000002,-94.990172 39.446192000000003,-94.982144000000005 39.440551999999997,-94.978797999999998 39.436241000000003,-94.976606000000004 39.426701,-94.972952000000006 39.421705000000003,-94.968547467194298 39.418879728230785,-94.966981164652054 39.417875029083376,-94.966065999999998 39.417287999999999,-94.965430539155946 39.417093446959996,-94.954817000000006 39.413843999999997,-94.951209000000006 39.411706999999993,-94.947863999999996 39.408603999999997,-94.946292999999983 39.405645999999997,-94.946662000000003 39.399717000000003,-94.946226999999993 39.395648,-94.945577 39.393850999999998,-94.942038999999994 39.389499,-94.939696999999995 39.387949999999996,-94.938205659338905 39.38711651736979,-94.938199994953891 39.387113351650086,-94.938198708293527 39.387112632559479,-94.937157999999982 39.386530999999998,-94.933651999999995 39.385545999999998,-94.932170703908099 39.385397898493565,-94.923109999999994 39.384492000000002,-94.919224999999997 39.385173999999999,-94.915858999999998 39.386347999999998,-94.909581000000003 39.388865000000003,-94.901822999999993 39.392797999999999,-94.896448416922993 39.39340032396553,-94.894979000000006 39.393565000000002,-94.891845000000004 39.393312999999999,-94.888971999999995 39.392431999999999,-94.888058227506249 39.391822741147728,-94.885025999999996 39.389800999999999,-94.880978999999996 39.383899,-94.879281000000006 39.37977999999999,-94.879087999999996 39.375702999999994,-94.881359999999987 39.370382999999997,-94.885216 39.366911000000002,-94.890928000000002 39.364030999999997,-94.896832000000003 39.363135,-94.899023999999997 39.362431,-94.902496999999997 39.360382999999999,-94.90716104958679 39.35683832231404,-94.907297 39.356735,-94.907510470967722 39.356484333333356,-94.909408999999997 39.354254999999995,-94.910016999999996 39.352542999999997,-94.91007929967077 39.352122876579188,-94.910166635146069 39.351533921963672,-94.910234386079424 39.351077037464393,-94.910640999999998 39.348334999999999,-94.910055514481613 39.342727430625168,-94.908683540921714 39.329587162119807,-94.908064999999993 39.323663000000003,-94.906599414484603 39.317389801180319,-94.905982468129508 39.31474906332776,-94.905548856768945 39.312893060899633,-94.905328999999995 39.311951999999998,-94.904604536115073 39.31007473956825,-94.903592654247163 39.307452709910535,-94.903137 39.306272,-94.902341179156608 39.304705098857582,-94.900693838394318 39.301461629999167,-94.900362755471093 39.300809756886117,-94.900048999999996 39.300192000000003,-94.895217000000002 39.29420799999999,-94.889432625546704 39.288730528394183,-94.887056 39.286479999999997,-94.882576 39.283327999999997,-94.881425972827699 39.282735692772164,-94.879585687759075 39.281787876778168,-94.878319999999988 39.281135999999996,-94.869470269042495 39.278423959123423,-94.867567999999991 39.277841000000002,-94.866576416802303 39.277461598502107,-94.857072000000002 39.273825000000002,-94.850573678793964 39.270595179638669,-94.850470600187833 39.270543947117169,-94.846320000000006 39.268481,-94.844203868589133 39.266965084952687,-94.840994595225254 39.264666085108807,-94.837855000000005 39.262416999999999,-94.836102527271095 39.260730409704507,-94.834879550067882 39.259553409087879,-94.832501320107042 39.257264586268427,-94.832102355305352 39.256880620143498,-94.831470999999993 39.256273,-94.827487000000005 39.249888999999996,-94.826571473591798 39.245793223963304,-94.825663000000006 39.241728999999999,-94.826110999999983 39.238289000000002,-94.826405091238243 39.237538367125239,-94.827108391663188 39.2357432765168,-94.827791000000005 39.234000999999999,-94.828117769197533 39.233533772937683,-94.83244435695299 39.227347452739551,-94.834698551534771 39.224124319346686,-94.834896 39.223841999999998,-94.834917496024659 39.223414229109203,-94.835039139715306 39.220993519665384,-94.835046603087861 39.220844998551456,-94.835055999999994 39.220658,-94.833551999999997 39.217793999999998,-94.831678999999994 39.215938,-94.823791 39.209873999999999,-94.820687000000007 39.208626000000002,-94.811662999999996 39.206594000000003,-94.800359054554335 39.206051410618606,-94.799662999999995 39.206018,-94.798924306591658 39.206116812235138,-94.793913945984244 39.206787029303406,-94.788135068391796 39.207560047994349,-94.787343000000007 39.207666000000003,-94.783838000000003 39.207154000000003,-94.781518000000005 39.206145999999997,-94.780294078498926 39.205273290755756,-94.778971577769184 39.204330290235411,-94.777838000000003 39.203522,-94.775537999999997 39.200602000000003,-94.770897097034492 39.191141697801093,-94.770859400196969 39.191064854247678,-94.770337999999995 39.190002,-94.763137999999998 39.179903000000003,-94.75233799999998 39.173202999999994,-94.74193799999999 39.170203,-94.736536999999998 39.169203000000003,-94.723636999999997 39.169002999999989,-94.714136999999994 39.170403,-94.696331999999998 39.178562999999997,-94.687235999999999 39.183503000000002,-94.680335999999983 39.184303,-94.669134999999997 39.182003000000002,-94.663835000000006 39.179102999999998,-94.660314999999997 39.168050999999991,-94.662434999999988 39.157602999999995,-94.650734999999983 39.154102999999999,-94.640034999999997 39.153102999999994,-94.623934000000006 39.156602999999997,-94.615834000000007 39.160003000000003,-94.608834000000002 39.160502999999999,-94.601732999999996 39.15960299999999,-94.596033000000006 39.157702999999998,-94.591932999999997 39.155003,-94.589933000000002 39.140402999999999,-94.592533000000003 39.135902999999992,-94.600433999999993 39.128503000000002,-94.605733999999998 39.122204000000004,-94.607033999999999 39.119404000000003,-94.607354 39.113444,-94.607234000000005 39.089604,-94.607333999999994 39.081703999999995,-94.607275518421304 39.072346947409343,-94.607234000000005 39.065703999999997,-94.607342812841125 39.057404745686583,-94.60738379566331 39.05427894858029,-94.607437239929951 39.050202705779334,-94.607518499034526 39.044004999999999,-94.607559479691474 39.040879368039988,-94.607612854426819 39.036808428453341,-94.60764748233197 39.034167326647299,-94.607654028188094 39.033668068249817,-94.60769507925167 39.030537066312085,-94.607898722639391 39.015005000000002,-94.607914652765047 39.013789994834404,-94.607991843462372 39.007902590176151,-94.608087526605189 39.000604749887366,-94.608092759229436 39.000205652880325,-94.608190956218394 38.992716079262479,-94.608212339138063 38.991085184540211,-94.608264438806202 38.98711149548862,-94.608279957450691 38.985927874365181,-94.608301211867541 38.984306780669819,-94.608333999999999 38.981805999999999,-94.608294286905348 38.97390309416464,-94.608273484679671 38.969763451253407,-94.608249262127771 38.964943163424849,-94.608207879518076 38.956708024096379,-94.608134000000007 38.942005999999999,-94.608134000000007 38.940005999999997,-94.607866 38.937398000000002,-94.607977999999989 38.936869999999992,-94.608002838442587 38.912906322207348,-94.608006216770249 38.909646973100827,-94.608010407202343 38.90560412040071,-94.608022064178897 38.894357681354862,-94.60802273861259 38.893706999999999,-94.608033000000006 38.883806999999997,-94.608033000000006 38.869207000000003,-94.608033000000006 38.868107000000002,-94.607992999999993 38.867271000000002,-94.608033000000006 38.861207,-94.608033000000006 38.855007,-94.608033000000006 38.850107,-94.608033000000006 38.847206999999997,-94.607624999999999 38.827559999999991,-94.607668973053535 38.825816299300072,-94.608041 38.811064000000002,-94.608617609754887 38.781926100280451,-94.609398999999996 38.742440000000002,-94.60945599999998 38.74069999999999,-94.609507757106428 38.73815999467709,-94.609625656590424 38.7323740198146,-94.610322172686637 38.698192151600097,-94.61071084056907 38.679118085101081,-94.61073851283922 38.677760054904219,-94.611602000000005 38.635384000000002,-94.611464999999995 38.625011,-94.611857999999998 38.620485000000002,-94.611908 38.609271999999997,-94.611905562149673 38.605890005062435,-94.611886999999996 38.580139000000003,-94.611902 38.580109999999998,-94.612176000000005 38.576546,-94.612156999999996 38.549816999999997,-94.612272000000004 38.547916999999998,-94.612464742072774 38.518760616499996,-94.612644000000003 38.491644,-94.612725999999995 38.484366999999999,-94.612696 38.483153999999999,-94.612865999999997 38.477570999999998,-94.613365000000002 38.403421999999999,-94.613264999999998 38.392426,-94.613275404637193 38.388718047420433,-94.613328999999993 38.369617999999996,-94.613311999999993 38.364407,-94.613085455228386 38.3436360393057,-94.612999999999985 38.335800999999996,-94.612825 38.324387000000002,-94.612787999999995 38.320141999999997,-94.612673 38.314832000000003,-94.612673 38.302526999999998,-94.612689368276676 38.301464114946214,-94.612843999999996 38.291422999999995,-94.612848999999997 38.289914000000003,-94.612707829046002 38.272362044447966,-94.612691999999996 38.270394000000003,-94.612613999999994 38.237766,-94.612634999999997 38.226987,-94.612658999999994 38.219251,-94.61265866950464 38.21872154645218,-94.612657999999982 38.217649000000002,-94.612821999999994 38.203918000000002,-94.612848 38.200713999999998,-94.613073 38.190551999999997,-94.61341774677895 38.168183959706163,-94.613422 38.16790799999999,-94.613748 38.160632999999997,-94.613855999999998 38.149768999999999,-94.613889466360249 38.136312911169284,-94.613919497343275 38.124238112111762,-94.614061000000007 38.067343,-94.614088999999993 38.065900999999997,-94.614054999999993 38.060088,-94.613980999999995 38.036949,-94.614211999999981 37.992462000000003,-94.614464999999996 37.987798999999995,-94.614511123427164 37.979395512107736,-94.614514360688489 37.978805697169918,-94.614557000000005 37.971036999999995,-94.614561999999992 37.951517000000003,-94.614593999999997 37.949977999999994,-94.614611999999994 37.944361999999998,-94.614754000000005 37.940769000000003,-94.614834999999999 37.936700000000002,-94.614778 37.934199999999997,-94.615181000000007 37.915944000000003,-94.615392999999983 37.906391999999997,-94.61546899999999 37.901775,-94.615706000000003 37.886842999999999,-94.615921 37.878331000000003,-94.615834000000007 37.872509999999998,-94.616 37.863126,-94.616282760205394 37.851281931678621,-94.616426000000004 37.845281999999997,-94.616433230053673 37.842955730230052,-94.61645 37.837560000000003,-94.616861999999998 37.819456000000002,-94.6176681324215 37.775831003788085,-94.617720999999989 37.77297,-94.617737774720197 37.764628336555312,-94.617744979193901 37.761045725680312,-94.617807999999997 37.729706999999998,-94.617975 37.722175999999997,-94.61780499999999 37.690178000000003,-94.617650999999995 37.687671000000002,-94.617687000000004 37.686652999999993,-94.617885 37.682214000000002,-94.617733999999999 37.673127,-94.617576 37.653671000000003,-94.617517909436387 37.643988652624088,-94.61747699999998 37.637169999999998,-94.617472819127315 37.636539916507168,-94.6173 37.610495,-94.617428000000004 37.609521999999998,-94.617283 37.571896000000002,-94.617315000000005 37.571498999999996,-94.617080999999999 37.567013000000003,-94.61711240153133 37.563155381499406,-94.617159999999984 37.557307999999999,-94.617186000000004 37.553485000000002,-94.617167532949537 37.551779056391354,-94.616988484457494 37.535238968895172,-94.616907999999981 37.527804000000003,-94.616788999999997 37.521509999999999,-94.616880369657522 37.506771761864755,-94.617022999999989 37.483764999999998,-94.617182999999997 37.469664999999999,-94.617180000000005 37.465203000000002,-94.617221999999998 37.460476,-94.617204999999984 37.46037299999999,-94.617200999999994 37.454788,-94.617131999999998 37.439818000000002,-94.617265000000003 37.425535999999994,-94.617510999999993 37.410908999999997,-94.617557000000005 37.396374999999999,-94.61759158917468 37.381725975861251,-94.617625000000004 37.367576,-94.617626 37.367444999999989,-94.617536999999999 37.364355000000003,-94.617636000000005 37.338417,-94.617694999999998 37.336841999999997,-94.617648000000003 37.323588999999998,-94.61807499999999 37.240436000000003,-94.618157999999994 37.237596999999994,-94.618122999999997 37.229334,-94.61815 37.228121000000002,-94.618218999999996 37.207771999999999,-94.618305000000007 37.207337000000003,-94.618319 37.188774000000002,-94.618504999999985 37.181184000000002,-94.618472999999994 37.174782,-94.618351000000004 37.160210999999997,-94.618071999999998 37.132345,-94.61807499999999 37.129755000000003,-94.61816441512984 37.118929895303054,-94.618212 37.113168999999992,-94.618150999999997 37.103968000000002,-94.618059000000002 37.096676000000002,-94.618088 37.093670999999993,-94.618089999999995 37.093494,-94.618085255103864 37.089305442941992,-94.618082 37.086432000000002,-94.61811999999999 37.085934000000002,-94.617981999999998 37.075077,-94.617954311863897 37.070346986543974,-94.617947706480578 37.069218577181687,-94.617910161110728 37.062804634983031,-94.617893975984089 37.060039701061122,-94.617874999999998 37.056798,-94.617877538275181 37.056339390079508,-94.617964999999998 37.040537,-94.617972200190749 37.032971759572447,-94.617994999999979 37.009015999999995,-94.618027702303792 37.004829720380044,-94.618080000000006 36.998134999999998,-94.625223999999989 36.998671999999999,-94.699735000000004 36.998804999999997,-94.701796999999999 36.998814000000003,-94.711286363060864 36.99879670415919,-94.712770000000006 36.99879399999999,-94.722629184733563 36.998741903378082,-94.732834603466486 36.998687977231512,-94.736330645670293 36.998669503899912,-94.737183000000002 36.998665000000003,-94.739323999999996 36.998686999999997,-94.745992043692311 36.998700535427304,-94.749560781475736 36.99870777958963,-94.749834600019099 36.998708335412474,-94.777257000000006 36.998764,-94.831280000000007 36.998812,-94.831539962039543 36.998812565955092,-94.840925999999996 36.998832999999998,-94.846637705524785 36.998860673615503,-94.849800999999999 36.998875999999996,-94.853196999999994 36.998874,-94.896852168601683 36.999075231107383,-94.904605402657381 36.99911097010289,-94.9407882710602 36.999277757196154,-94.995293000000004 36.999528999999995,-95.007620000000003 36.999513999999998,-95.011432999999997 36.999535000000002,-95.030323999999993 36.999516999999997,-95.037857000000002 36.999496999999998,-95.049498999999983 36.999580000000002,-95.073509 36.999509000000003,-95.1405498515593 36.999533623834409,-95.155186999999998 36.999538999999999,-95.155372 36.999540000000003,-95.159067907556633 36.999536629205572,-95.177300999999986 36.999519999999997,-95.195307 36.999564999999997,-95.267905305061163 36.999446910377756,-95.285983101167361 36.999417504731007,-95.322564999999997 36.999357999999994,-95.328057999999999 36.999364999999997,-95.328326999999987 36.999366000000002,-95.331209999999999 36.999380000000002,-95.377252424658963 36.999296311678272,-95.381753803085687 36.999288129815376,-95.407683000000006 36.999240999999998,-95.511578 36.999234999999999,-95.522414951940931 36.999281058114107,-95.534401000000003 36.999332000000003,-95.573598000000004 36.999309999999994,-95.601517312742303 36.999317968253862,-95.612139999999997 36.999321000000002,-95.615933999999996 36.999364999999997,-95.621011943860609 36.999361983160732,-95.624350000000007 36.999360000000003,-95.630078999999995 36.999319999999997,-95.638122589416028 36.999320470082949,-95.664300999999995 36.999321999999999,-95.674044398562955 36.999333876292773,-95.686452000000003 36.999349000000002,-95.696658999999997 36.999215,-95.71038 36.999370999999996,-95.710782524132014 36.999362783399121,-95.714887000000004 36.999279,-95.718053999999995 36.999254999999998,-95.741907999999995 36.999243999999997,-95.746466244276931 36.999250838506164,-95.759905000000003 36.999270999999993,-95.768719000000004 36.999205000000003,-95.786761999999996 36.999309999999994,-95.807979999999986 36.999124000000002,-95.819364496908179 36.999150471530008,-95.866899000000004 36.999260999999997,-95.873943999999995 36.999299999999998,-95.875256999999991 36.999302,-95.877150999999998 36.999304000000002,-95.910179999999997 36.999336,-95.928122000000002 36.999245000000002,-95.936991999999989 36.999267999999994,-95.964270378114222 36.999093604402042,-96.00081 36.99886,-96.095164142267308 36.998935940299688,-96.14121 36.998972999999999,-96.143207000000004 36.999133999999998,-96.147143 36.999021999999997,-96.149709 36.99904,-96.152383999999998 36.999050999999994,-96.154016999999982 36.999161,-96.184768000000005 36.999211000000003,-96.200028000000003 36.999028000000003,-96.217571000000007 36.999070000000003,-96.235320025971774 36.999130675786525,-96.27480962492784 36.999265672629733,-96.276368000000005 36.999270999999993,-96.279078999999996 36.999271999999991,-96.381556872639493 36.999226629434901,-96.394272 36.999220999999999,-96.415412000000003 36.999113,-96.500287999999998 36.998643,-96.525212323286397 36.998711038495294,-96.525495980566973 36.998711812823821,-96.551130926932458 36.998781791180214,-96.551130927020779 36.998781791180456,-96.624487489749981 36.998982040153741,-96.705431000000004 36.999203,-96.710481999999999 36.999270999999993,-96.731983006833033 36.99928335311408,-96.736589999999993 36.999285999999998,-96.741269999999986 36.999239000000003,-96.749837999999997 36.998987999999997,-96.792060000000006 36.999179999999996,-96.795198999999997 36.99886,-96.822790999999995 36.999181999999998,-96.867517000000007 36.999217000000002,-96.876289999999997 36.999232999999997,-96.902083000000005 36.999155000000002,-96.903509999999997 36.999132000000003,-96.917092999999994 36.999181999999998,-96.921914999999998 36.999150999999998,-96.924934279563146 36.999131784030439,-96.934641999999997 36.999070000000003,-96.967371 36.999066999999997,-96.975561999999996 36.999018999999997,-97.030081999999979 36.998928999999997,-97.039783999999983 36.999000000000002,-97.045562883576096 36.99899981011751,-97.100651999999997 36.998998,-97.104275999999999 36.999020000000002,-97.120284999999996 36.999014000000003,-97.122596999999999 36.999035999999997,-97.147721000000004 36.999110999999999,-97.202000013134437 36.999050609464689,-97.255829185181881 36.998990719420135,-97.342808466604069 36.998893946743877,-97.362376892203329 36.998872175019791,-97.364929972745273 36.99886933447624,-97.372421000000003 36.998860999999998,-97.384924999999996 36.998843,-97.462279999999993 36.998685000000002,-97.472860999999995 36.998721000000003,-97.527292000000003 36.998749999999994,-97.545899999999989 36.998708999999991,-97.546497999999985 36.998746999999995,-97.564536000000004 36.998711,-97.582460039051355 36.99869862770732,-97.606549 36.998682000000002,-97.637136999999996 36.999090000000002,-97.650465999999994 36.999003999999999,-97.692180007144742 36.998844793059916,-97.697103999999982 36.998826,-97.768704 36.998749999999994,-97.783432000000005 36.998961,-97.783489000000003 36.998846999999998,-97.802297999999979 36.998713000000002,-97.965379045838461 36.998468720211747,-98.033955000000006 36.998365999999997,-98.03989 36.998348999999997,-98.045341999999991 36.998327000000003,-98.111985000000004 36.998133000000003,-98.128185436781749 36.99814624647324,-98.147452 36.998162,-98.177595999999994 36.998008999999996,-98.190367496841162 36.998003995168112,-98.208218000000002 36.997996999999998,-98.219498999999999 36.997824,-98.237712000000002 36.99797199999999,-98.346187999999984 36.997962,-98.347186011230875 36.997961873429141,-98.354073 36.997960999999997,-98.408991 36.998513000000003,-98.418267999999998 36.998538000000003,-98.420209 36.998516000000002,-98.476584655565659 36.998733519956424,-98.485495952453391 36.998767903324406,-98.544871999999984 36.998997000000003,-98.622244241689657 36.999025734091177,-98.714511999999999 36.99906,-98.718464999999995 36.999179999999996,-98.761596999999995 36.999425000000002,-98.791936000000007 36.999254999999998,-98.793711000000002 36.999226999999991,-98.797451999999993 36.999228999999993,-98.811832237742053 36.99924038482925,-98.869449000000003 36.999285999999998,-98.880009 36.999262999999999,-98.880579999999995 36.999308999999997,-98.994371 36.999493,-99.000846251360556 36.99951188908193,-99.029336999999998 36.999594999999999,-99.044703416105833 36.999312701167916,-99.049695 36.999220999999999,-99.124882999999997 36.99942,-99.12944899999998 36.999422000000003,-99.215429691089184 36.999525607779709,-99.221470798208784 36.999532887387339,-99.22594390512576 36.999538277535649,-99.248119999999986 36.999564999999997,-99.277506000000002 36.999578999999997,-99.375390999999993 37.000176999999994,-99.375813215185289 37.000169016042221,-99.396673054015949 36.999774562980598,-99.407015 36.999578999999997,-99.456202999999988 36.999471,-99.484333000000007 36.999625999999999,-99.500394999999983 36.99957599999999,-99.500394999999983 36.999637,-99.502664999999993 36.999645,-99.504092999999997 36.999648,-99.508573999999982 36.999657999999997,-99.541115670095081 36.999572526667627,-99.558068000000006 36.999527999999998,-99.625399000000002 36.999670999999999,-99.648651999999998 36.999603999999998,-99.657657999999998 37.000197,-99.675479899119665 37.000294824261658,-99.700804554289192 37.000433831091229,-99.722499410223932 37.000552913981863,-99.774254999999997 37.000836999999997,-99.774816 37.000841,-99.786016000000004 37.000931,-99.875408999999991 37.001658999999997,-99.904897139036905 37.001652107487203,-99.995200999999994 37.001631000000003,-100.001285999999993 37.001699000000002,-100.002562999999995 37.001705999999999,-100.005706000000004 37.001725999999998,-100.08949117994996 37.002091554886341,-100.115721999999991 37.002206,-100.187546999999995 37.002082,-100.19237099999998 37.002035999999997,-100.193753999999998 37.002133,-100.201675999999992 37.002080999999997,-100.269984573601874 37.001795796937508,-100.395563941387664 37.001271475927872,-100.434302684862132 37.001109733298897,-100.434343961694367 37.0011095609592,-100.436759028295029 37.001099477534027,-100.462594151135718 37.000991610310841,-100.526354155903263 37.000725398506596,-100.551597999999998 37.000619999999998,-100.552683000000002 37.000734999999999,-100.591328000000004 37.000376000000003,-100.591413000000003 37.000399000000002,-100.629769999999994 37.000025,-100.63332699999998 36.999935999999998,-100.675551999999996 36.999687999999999,-100.734516999999997 36.999059000000003,-100.756894000000003 36.999356999999996,-100.759718826764541 36.999297806889686,-100.765484 36.999177000000003,-100.806116000000003 36.999091,-100.814277000000004 36.999085,-100.850054835707368 36.998687920265262,-100.855633999999981 36.998626000000002,-100.891659999999987 36.998604,-100.904274 36.998745,-100.904588000000004 36.998561000000002,-100.945565999999985 36.998151999999997,-100.958261085233985 36.99812508251128,-100.996501999999992 36.998044,-101.012641000000002 36.998176,-101.053589000000002 36.997966999999996,-101.066742000000005 36.997920999999998,-101.096255470166753 36.997758490771822,-101.211485999999979 36.997123999999999,-101.212908999999996 36.997044000000002,-101.283204233333976 36.996668964004151,-101.357796999999991 36.996271,-101.359673999999998 36.996231999999999,-101.37818 36.996164,-101.413867999999994 36.996008000000003,-101.415004999999994 36.995966000000003,-101.485326 36.995610999999997,-101.519065999999995 36.99554599999999,-101.555239 36.99541399999999,-101.600396000000003 36.995152999999995,-101.601592999999994 36.995094999999999,-101.672152845644291 36.994768289529276,-101.672152845650672 36.994768289529254,-101.718235173867967 36.994554916342196,-101.761767880686108 36.994353348566563,-101.826607533764985 36.994053124077894,-101.862548907230888 36.993886706153717,-101.881050066963184 36.993801040963412,-101.899294480822903 36.993716564573397,-101.902439999999999 36.993701999999999,-101.905152836625547 36.993689460946754,-101.93521516037174 36.99355050931414,-102.000446999999994 36.993248999999992,-102.000446999999994 36.993271999999997,-102.028206999999981 36.993124999999999,-102.042240000000007 36.993082999999999,-102.041951999999995 37.024741999999996,-102.04195 37.030805,-102.041921000000002 37.032178000000002,-102.041748999999996 37.034396999999998,-102.04191999999999 37.035083,-102.041983000000002 37.106551000000003,-102.041808999999986 37.111972999999999,-102.042091999999997 37.125020999999997,-102.042135000000002 37.125020999999997,-102.042121535383529 37.12671399835564,-102.042001999999997 37.141744000000003,-102.041962999999996 37.258164,-102.041663999999997 37.29764999999999,-102.041816999999995 37.309489999999997,-102.041973999999996 37.352612999999998,-102.042089000000004 37.352818999999997,-102.041523999999995 37.375017999999997,-102.041585760607518 37.389190434149839,-102.041675999999981 37.409897999999991,-102.041668999999999 37.434739999999998,-102.041754999999995 37.434854999999992,-102.041800999999992 37.469487999999998,-102.041786000000002 37.506065999999997,-102.04201599999999 37.535260999999998,-102.041899 37.541186000000003,-102.041893999999999 37.557977,-102.041618 37.607868000000003,-102.041584999999998 37.644281999999997,-102.041581999999991 37.654494999999997,-102.041694000000007 37.665680999999999,-102.041573999999997 37.680436,-102.041876000000002 37.723875,-102.041989965869121 37.73854062916552,-102.042158 37.760164000000003,-102.042668000000006 37.788758,-102.042952999999997 37.803534999999997,-102.043032999999994 37.824145999999999,-102.043218999999993 37.86792899999999,-102.043714531331204 37.914003914798144,-102.043845000000005 37.926135000000002,-102.043844000000007 37.928101999999996,-102.044644000000005 38.045532,-102.044255000000007 38.113010999999993,-102.044450868202546 38.120049353793199,-102.044589000000002 38.125012999999996,-102.044415729020699 38.133607343100145,-102.044251000000003 38.141777999999995,-102.044296878804843 38.175558844899406,-102.044398 38.250014999999998,-102.044510721728557 38.262483349316234,-102.044567999999998 38.268819,-102.044612999999998 38.312323999999997,-102.044944 38.384419,-102.044441999999989 38.415801999999999,-102.044936000000007 38.41968,-102.045323999999979 38.453646999999997,-102.045262999999991 38.505395,-102.045261999999994 38.505531999999995,-102.045112000000003 38.523783999999999,-102.045222999999993 38.543796999999998,-102.045188999999979 38.558731999999992,-102.045210999999995 38.581608999999993,-102.045287999999999 38.615248999999999,-102.045074 38.669617000000002,-102.045102 38.674945999999998,-102.045159999999996 38.675221,-102.045126999999994 38.686725000000003,-102.045156000000006 38.688555,-102.045211999999992 38.697566999999999,-102.045375000000007 38.754338999999995,-102.045287000000002 38.755527999999998,-102.045371000000003 38.770063999999998,-102.045447999999993 38.783453000000002,-102.045333999999997 38.799463000000003,-102.045387999999988 38.813391999999993,-102.046570999999986 39.047038,-102.047133999999986 39.129700999999997,-102.047188612927897 39.133146793270186,-102.047250000000005 39.13702,-102.047851021058236 39.220289738242592,-102.048449000000005 39.30313799999999,-102.04895999999998 39.37371199999999,-102.049100972149461 39.394064428437375,-102.049166999999983 39.403596999999998,-102.049369999999996 39.418210000000002,-102.049368999999999 39.423333,-102.049678999999998 39.506183,-102.049672999999999 39.536690999999998,-102.049553999999986 39.538932000000003,-102.049763758475066 39.568170000775439,-102.04980599999999 39.574058,-102.049954 39.592331,-102.050258163748609 39.627242889069393,-102.050421999999983 39.646047999999993,-102.050099000000003 39.653812000000002,-102.05059399999999 39.67559399999999,-102.050898693231389 39.741794606053567,-102.051254 39.818992,-102.051317999999995 39.833311000000002,-102.051362999999995 39.843471,-102.051569 39.849805000000003,-102.051743999999999 40.003078000000002)) \ No newline at end of file
diff --git a/django/contrib/gis/tests/geoapp/sql/nz.wkt b/django/contrib/gis/tests/geoapp/sql/nz.wkt
new file mode 100644
index 0000000000..7e7b5933c1
--- /dev/null
+++ b/django/contrib/gis/tests/geoapp/sql/nz.wkt
@@ -0,0 +1 @@
+MULTIPOLYGON (((174.616364000000004 -36.100861000000002,174.634978999999987 -36.124718,174.708862000000011 -36.205559,174.781096999999988 -36.266945,174.812744000000009 -36.339165,174.768311000000011 -36.34639,174.710784999999987 -36.525832999999999,174.708587999999992 -36.533332999999999,174.70773299999999 -36.541671999999998,174.714690999999988 -36.595832999999999,174.717194000000006 -36.603057999999997,174.774414000000007 -36.730277999999998,174.808319000000012 -36.805275000000002,174.854400999999996 -36.847777999999998,174.896636999999998 -36.878334000000002,175.011658000000011 -36.871941,175.020813000000004 -36.873610999999997,175.055542000000003 -36.880279999999999,175.076629999999994 -36.890839,175.082458000000003 -36.895279000000002,175.087463000000014 -36.900832999999999,175.091644000000002 -36.925559999999997,175.161652000000004 -36.955559,175.221069 -36.937775000000002,175.230255 -36.939438000000003,175.278320000000008 -36.965279000000002,175.310516000000007 -36.995002999999997,175.319976999999994 -37.005836000000002,175.323853000000014 -37.012222,175.328856999999999 -37.026947,175.330261000000007 -37.035277999999998,175.330535999999995 -37.044449,175.321899000000002 -37.06472,175.31942699999999 -37.095275999999998,175.317748999999992 -37.144165,175.319121999999993 -37.152495999999999,175.328856999999999 -37.168892,175.373290999999995 -37.216659999999997,175.385254000000003 -37.225830000000002,175.404967999999997 -37.228050000000003,175.579131999999987 -37.244446000000003,175.58914200000001 -37.169449,175.551636000000002 -37.024718999999997,175.547484999999995 -37.009171000000002,175.542480000000012 -36.994446000000003,175.536102 -36.980826999999998,175.524993999999992 -36.961669999999998,175.498566000000011 -36.927222999999998,175.484406000000007 -36.920279999999998,175.476348999999999 -36.917777999999998,175.464416999999997 -36.90889,175.435241999999988 -36.866942999999999,175.46691899999999 -36.809998,175.509430000000009 -36.776108,175.486358999999993 -36.679726000000002,175.463593000000003 -36.621383999999999,175.378296000000006 -36.570557,175.366364000000004 -36.561667999999997,175.361633000000012 -36.556389000000003,175.356628 -36.541671999999998,175.353850999999992 -36.525002,175.35244800000001 -36.489998,175.353577 -36.481940999999999,175.360229000000004 -36.478050000000003,175.538025000000005 -36.514724999999999,175.542755 -36.519996999999996,175.604950000000002 -36.622771999999998,175.631072999999986 -36.710555999999997,175.763610999999997 -36.713614999999997,175.840789999999998 -36.754173000000002,175.733582000000013 -36.805832000000002,175.701629999999994 -36.844161999999997,175.707458000000003 -36.869995000000003,175.709960999999993 -36.875275000000002,175.714690999999988 -36.880828999999999,175.720519999999993 -36.885277000000002,175.735779000000008 -36.891387999999999,175.74383499999999 -36.893889999999999,175.758330999999998 -36.876106,175.761382999999995 -36.869446000000003,175.757751000000013 -36.863059999999997,175.753051999999997 -36.857779999999998,175.749114999999989 -36.851394999999997,175.75 -36.843055999999997,175.752196999999995 -36.835555999999997,175.756378000000012 -36.830002,175.765533000000005 -36.828055999999997,175.808013999999986 -36.824173000000002,175.817200000000014 -36.825836000000002,175.833587999999992 -36.830832999999998,175.845519999999993 -36.839722000000002,175.849120999999997 -36.846107000000003,175.878570999999994 -36.914444000000003,175.881072999999986 -36.921669,175.918304000000006 -37.067504999999997,175.917480000000012 -37.075836000000002,175.915253000000007 -37.083061,175.898314999999997 -37.115004999999996,175.884154999999993 -37.168892,175.883330999999998 -37.176949,175.887206999999989 -37.244163999999998,175.892212 -37.249724999999998,175.921082000000013 -37.251671000000002,175.927185000000009 -37.256110999999997,175.93081699999999 -37.262504999999997,175.936371000000008 -37.278885000000002,175.940093999999988 -37.299717,175.974396000000013 -37.418059999999997,175.976074000000011 -37.453055999999997,176.026931999999988 -37.483108999999999,176.035583000000003 -37.487282,176.059417999999994 -37.502502,176.088287000000008 -37.525557999999997,176.093291999999991 -37.531112999999998,176.165526999999997 -37.613892,176.169433999999995 -37.620277000000002,176.167205999999993 -37.625832000000003,176.160247999999996 -37.624167999999997,176.082458000000003 -37.602500999999997,176.066924999999998 -37.59639,176.061095999999992 -37.591942000000003,176.057189999999991 -37.585555999999997,176.062744000000009 -37.580832999999998,176.070800999999989 -37.577781999999999,176.088287000000008 -37.580002,176.095245000000006 -37.576110999999997,176.090239999999994 -37.570838999999999,176.062468999999993 -37.546669,176.023087000000004 -37.528221000000002,176.018767999999994 -37.526057999999999,176.013931000000014 -37.524554999999999,176.007598999999999 -37.524222999999999,175.955535999999995 -37.521110999999998,175.946349999999995 -37.523055999999997,175.940796000000006 -37.527779000000002,175.953583000000009 -37.558891000000003,175.994415000000004 -37.638893000000003,176.071899000000002 -37.655273,176.14498900000001 -37.675277999999999,176.242187999999999 -37.709442000000003,176.267486999999988 -37.676392,176.488281 -37.756667999999998,176.521636999999998 -37.769447,176.527771 -37.773887999999999,176.537475999999998 -37.784447,176.549712999999997 -37.793334999999999,176.656646999999992 -37.855559999999997,176.671082000000013 -37.862502999999997,176.686645999999996 -37.868332000000002,176.759154999999993 -37.892775999999998,176.784149000000014 -37.900275999999998,176.80304000000001 -37.903328000000002,176.819702000000007 -37.904442000000003,176.838287000000008 -37.907501000000003,176.917755 -37.926108999999997,176.943848000000003 -37.932502999999997,177.08273299999999 -37.967216,177.107468000000011 -37.987220999999998,177.159424 -38.013336000000002,177.415253000000007 -37.982498,177.47357199999999 -37.962502,177.545806999999996 -37.919167000000002,177.552459999999996 -37.915000999999997,177.571625000000012 -37.902222000000002,177.599120999999997 -37.878051999999997,177.603577 -37.872498,177.646941999999996 -37.805,177.732178000000005 -37.682502999999997,177.738861000000014 -37.678336999999999,177.746917999999994 -37.675277999999999,177.791931000000005 -37.666946000000003,177.849396000000013 -37.657218999999998,177.858856000000003 -37.656661999999997,177.868010999999996 -37.654442000000003,177.875792999999987 -37.651389999999999,178.0 -37.592224000000002,178.006653 -37.588332999999999,178.012206999999989 -37.583328000000002,178.018004999999988 -37.550831000000002,178.05581699999999 -37.542777999999998,178.064972000000012 -37.542228999999999,178.187744000000009 -37.546951,178.281921000000011 -37.560828999999998,178.306915000000004 -37.568061999999998,178.311919999999986 -37.573334000000003,178.312468999999993 -37.578887999999999,178.306915000000004 -37.583610999999998,178.321075000000008 -37.602500999999997,178.336365 -37.618332000000002,178.34970100000001 -37.626944999999999,178.367737000000005 -37.630828999999999,178.448028999999991 -37.645279000000002,178.457458000000003 -37.646667,178.468018 -37.646949999999997,178.488861000000014 -37.644165,178.497192000000013 -37.646667,178.504424999999998 -37.649994,178.550536999999991 -37.6875,178.555542000000003 -37.692497000000003,178.559692000000013 -37.698883000000002,178.56552099999999 -37.713332999999999,178.562468999999993 -37.719994,178.483306999999996 -37.826393000000003,178.455230999999998 -37.860000999999997,178.449982000000006 -37.865004999999996,178.429687999999999 -37.876944999999999,178.419983000000002 -37.887779000000002,178.350525000000005 -38.004722999999998,178.347473000000008 -38.011116,178.347197999999992 -38.019722000000002,178.348846000000009 -38.027779000000002,178.354950000000002 -38.032218999999998,178.360229000000004 -38.037506,178.364136000000002 -38.043616999999998,178.375792999999987 -38.072777000000002,178.378296000000006 -38.089995999999999,178.377746999999999 -38.09861,178.353850999999992 -38.185555,178.319976999999994 -38.248055,178.318024000000008 -38.255561999999998,178.317474000000004 -38.263893000000003,178.320800999999989 -38.398612999999997,178.302459999999996 -38.528885000000002,178.300536999999991 -38.536391999999999,178.296356000000003 -38.541946000000003,178.158874999999995 -38.649169999999998,178.074982000000006 -38.713889999999999,178.068297999999999 -38.717773,178.060241999999988 -38.721107000000003,178.050812000000008 -38.721381999999998,178.044433999999995 -38.717216,177.928864000000004 -38.722220999999998,177.941070999999994 -38.793616999999998,177.923858999999993 -38.918334999999999,177.917786000000007 -38.942802,177.909697999999992 -38.969718999999998,177.897705000000002 -39.047942999999997,177.893859999999989 -39.064776999999999,177.906708000000009 -39.064278000000002,177.923034999999999 -39.089165,177.942200000000014 -39.091942000000003,177.967743000000013 -39.098334999999999,177.991332999999997 -39.115004999999996,177.996612999999996 -39.120277000000002,177.999390000000005 -39.127495000000003,177.909973000000008 -39.256950000000003,177.898865 -39.267502,177.874968999999993 -39.286118000000002,177.868010999999996 -39.290283000000002,177.861908 -39.285834999999999,177.844970999999987 -39.251396,177.839416999999997 -39.236946000000003,177.824127000000004 -39.193053999999997,177.823577999999998 -39.183883999999999,177.826629999999994 -39.177222999999998,177.841644000000002 -39.152779000000002,177.822021000000007 -39.114445000000003,177.823195999999996 -39.110115,177.82351700000001 -39.105110000000003,177.82119800000001 -39.101275999999999,177.816696000000007 -39.099274,177.680266999999986 -39.075279000000002,177.628845000000013 -39.071114,177.426085999999998 -39.064163,177.387755999999996 -39.077781999999999,177.246917999999994 -39.128334000000002,177.206085000000002 -39.143616000000002,177.149138999999991 -39.165000999999997,177.054961999999989 -39.204445,176.935790999999995 -39.349997999999999,176.931365999999997 -39.355559999999997,176.903870000000012 -39.398055999999997,176.898865 -39.412216,176.89776599999999 -39.438048999999999,176.899414000000007 -39.446387999999999,176.946625000000012 -39.664444000000003,177.01080300000001 -39.654998999999997,177.107178000000005 -39.660828000000002,177.116913000000011 -39.662216,177.120789000000002 -39.66861,177.119110000000006 -39.676108999999997,177.115783999999991 -39.682502999999997,177.08273299999999 -39.729996,177.073577999999998 -39.741385999999999,177.068024000000008 -39.746108999999997,177.059692000000013 -39.749167999999997,177.050262000000004 -39.751396,177.033874999999995 -39.757506999999997,177.028045999999989 -39.762504999999997,177.023590000000013 -39.768059,177.020263999999997 -39.774718999999997,176.894713999999993 -40.034728999999999,176.890533000000005 -40.049728000000002,176.889983999999998 -40.058052000000004,176.89498900000001 -40.082779000000002,176.893035999999995 -40.090279000000002,176.874114999999989 -40.121383999999999,176.834136999999998 -40.181671,176.808319000000012 -40.216659999999997,176.796935999999988 -40.226387000000003,176.687195000000003 -40.321387999999999,176.644135000000006 -40.379997000000003,176.628296000000006 -40.421944000000003,176.539977999999991 -40.495002999999997,176.521362000000011 -40.513893000000003,176.500823999999994 -40.535004,176.441924999999998 -40.600281000000003,176.405243000000013 -40.643889999999999,176.386108000000007 -40.675002999999997,176.35522499999999 -40.688606,176.349396000000013 -40.693610999999997,176.288574000000011 -40.793892,176.239136000000002 -40.90889,176.22079500000001 -40.931671,176.195526 -40.941665999999998,176.172760000000011 -40.952224999999999,176.158600000000007 -40.959999000000003,176.152771 -40.964722000000002,176.142212 -40.975273,176.134154999999993 -40.987502999999997,176.120789000000002 -41.013618,176.11300700000001 -41.035277999999998,176.098297000000002 -41.087218999999997,176.087463000000014 -41.116112,176.080811000000011 -41.129165999999998,176.062195000000003 -41.151938999999999,175.984679999999997 -41.231383999999998,175.955230999999998 -41.255279999999999,175.819121999999993 -41.347220999999998,175.743561 -41.392226999999998,175.736358999999993 -41.396110999999998,175.557738999999998 -41.485000999999997,175.471069 -41.541389000000002,175.427459999999996 -41.564444999999999,175.323028999999991 -41.614449,175.313292999999987 -41.616394,175.230804000000006 -41.620834000000002,175.222197999999992 -41.618332000000002,175.21691899999999 -41.612777999999999,175.184692000000013 -41.535834999999999,175.181915000000004 -41.519447,175.181091000000009 -41.500838999999999,175.188568000000004 -41.461112999999997,175.193024000000008 -41.446106,175.193848000000003 -41.437775000000002,175.191070999999994 -41.430557,175.186095999999992 -41.425002999999997,175.080261000000007 -41.385559,175.063018999999997 -41.380279999999999,175.05304000000001 -41.378608999999997,175.045532000000009 -41.378608999999997,175.027190999999988 -41.381667999999998,174.993286000000012 -41.393332999999998,174.985779000000008 -41.397224,174.972747999999996 -41.405830000000002,174.960509999999999 -41.415275999999999,174.949982000000006 -41.425559999999997,174.944976999999994 -41.431114,174.94165000000001 -41.437775000000002,174.936919999999986 -41.443328999999999,174.918578999999994 -41.448051,174.908600000000007 -41.448334000000003,174.872467 -41.429442999999999,174.86605800000001 -41.425002999999997,174.861084000000005 -41.419724000000002,174.861633000000012 -41.347496,174.863861000000014 -41.340279000000002,174.870789000000002 -41.327224999999999,174.87912 -41.315002,174.883881000000002 -41.309441,174.894440000000003 -41.290000999999997,174.89776599999999 -41.282501000000003,174.899993999999992 -41.275002,174.901916999999997 -41.258338999999999,174.901916999999997 -41.251114,174.898865 -41.234444000000003,174.89498900000001 -41.228050000000003,174.887482000000006 -41.224442000000003,174.827179 -41.218887000000002,174.818848000000003 -41.221938999999999,174.787475999999998 -41.244446000000003,174.778045999999989 -41.255836000000002,174.774414000000007 -41.262222,174.771087999999992 -41.278053,174.778594999999996 -41.281387000000002,174.796082000000013 -41.286949,174.818024000000008 -41.284728999999999,174.824127000000004 -41.289169,174.829407000000003 -41.294724000000002,174.833313000000004 -41.301108999999997,174.832184000000012 -41.309441,174.82995600000001 -41.316665999999998,174.826355000000007 -41.323334000000003,174.821625000000012 -41.328887999999999,174.815796000000006 -41.333610999999998,174.807189999999991 -41.336387999999999,174.744689999999991 -41.347496,174.700531000000012 -41.344444000000003,174.671906000000007 -41.338332999999999,174.654694000000006 -41.333061,174.648314999999997 -41.328612999999997,174.629669000000007 -41.315002,174.59191899999999 -41.27861,174.591644000000002 -41.271385000000002,174.594116000000014 -41.263893000000003,174.601074000000011 -41.250838999999999,174.608306999999996 -41.237777999999999,174.61300700000001 -41.232216,174.619110000000006 -41.23111,174.627746999999999 -41.233887000000003,174.637482000000006 -41.235557999999997,174.648590000000013 -41.234444000000003,174.666931000000005 -41.229720999999998,174.681365999999997 -41.221938999999999,174.694702000000007 -41.213614999999997,174.712738000000002 -41.199440000000003,174.718567000000007 -41.194716999999997,174.800812000000008 -41.100281000000003,174.844421000000011 -41.041671999999998,174.874390000000005 -41.018059,174.882721000000004 -41.015006999999997,174.892486999999988 -41.013061999999998,174.901093000000003 -41.010283999999999,174.908324999999991 -41.006393000000003,174.932189999999991 -40.987502999999997,174.94165000000001 -40.976387000000003,174.945251000000013 -40.969718999999998,174.947478999999987 -40.962218999999997,175.014983999999998 -40.84861,175.09857199999999 -40.755836000000002,175.112731999999994 -40.738892,175.120789000000002 -40.726944000000003,175.127746999999999 -40.713614999999997,175.164153999999996 -40.631943,175.169708000000014 -40.616942999999999,175.171906000000007 -40.609726000000002,175.187468999999993 -40.530830000000002,175.23800700000001 -40.329726999999998,175.23135400000001 -40.280830000000002,175.201629999999994 -40.181671,175.196349999999995 -40.166946000000003,175.178314 -40.134171000000002,175.15554800000001 -40.095832999999999,175.071625000000012 -40.003059,175.055542000000003 -39.987777999999999,175.022217000000012 -39.958053999999997,174.986358999999993 -39.93,174.974120999999997 -39.920836999999999,174.960784999999987 -39.912773,174.938873 -39.902222000000002,174.923034999999999 -39.895836000000003,174.836638999999991 -39.865004999999996,174.828307999999993 -39.862502999999997,174.790802000000014 -39.854720999999998,174.781096999999988 -39.853057999999997,174.751373 -39.865555,174.740509000000003 -39.866661,174.729674999999986 -39.865836999999999,174.57607999999999 -39.829169999999998,174.558013999999986 -39.824722,174.549408 -39.822226999999998,174.542205999999993 -39.818610999999997,174.523865 -39.805,174.421356000000003 -39.726944000000003,174.410521999999986 -39.716942000000003,174.376068000000004 -39.678612,174.353577 -39.639999000000003,174.348846000000009 -39.634444999999999,174.336638999999991 -39.625557,174.316070999999994 -39.613892,174.30886799999999 -39.610283000000003,174.217194000000006 -39.579726999999998,174.208862000000011 -39.577224999999999,174.040802000000014 -39.552779999999998,173.997741999999988 -39.551392,173.986908 -39.550552000000003,173.970245000000006 -39.545279999999998,173.963012999999989 -39.541671999999998,173.871062999999992 -39.483330000000002,173.851898000000006 -39.470551,173.839966000000004 -39.461387999999999,173.810790999999995 -39.4375,173.79525799999999 -39.421944000000003,173.786652000000004 -39.409996,173.775817999999987 -39.390839,173.769713999999993 -39.376944999999999,173.762206999999989 -39.354720999999998,173.754424999999998 -39.305,173.751923000000005 -39.288612,173.751647999999989 -39.269996999999996,173.781921000000011 -39.191383000000002,173.785247999999996 -39.184998,173.800536999999991 -39.169167000000002,173.82995600000001 -39.145836000000003,173.844421000000011 -39.138336000000002,173.868010999999996 -39.128883000000002,173.892761000000007 -39.120552000000004,174.011108000000007 -39.073334000000003,174.114685000000009 -39.024445,174.187744000000009 -38.988608999999997,174.209136999999998 -38.977218999999998,174.226623999999987 -38.972496,174.248016000000007 -38.970551,174.259978999999987 -38.970275999999998,174.281372000000005 -38.969994,174.293029999999987 -38.969994,174.313292999999987 -38.972496,174.351348999999999 -38.979438999999999,174.375244000000009 -38.979163999999997,174.384704999999997 -38.977218999999998,174.392761000000007 -38.974442000000003,174.456359999999989 -38.940277000000002,174.546082000000013 -38.871941,174.557738999999998 -38.860557999999997,174.568024000000008 -38.850281000000003,174.587738000000002 -38.828887999999999,174.594421000000011 -38.815834000000002,174.603302000000014 -38.786118000000002,174.608582000000013 -38.763061999999998,174.625518999999997 -38.677779999999998,174.642486999999988 -38.590836000000003,174.681091000000009 -38.379165999999998,174.724396000000013 -38.185828999999998,174.838561999999996 -38.157218999999998,174.848021999999986 -38.156944000000003,174.85635400000001 -38.154167,174.926636000000002 -38.116112,174.932465000000008 -38.111389000000003,174.940246999999999 -38.101112,174.898590000000013 -38.075004999999997,174.877166999999986 -38.064163,174.892486999999988 -37.976387000000003,174.893585000000002 -37.969994,174.868286000000012 -37.943610999999997,174.861084000000005 -37.939995000000003,174.85522499999999 -37.944716999999997,174.834686000000005 -37.963614999999997,174.830261000000007 -37.969161999999997,174.828033000000005 -37.976661999999997,174.828583000000009 -37.995002999999997,174.822754000000003 -37.999724999999998,174.814696999999995 -38.002502,174.804137999999995 -38.001944999999999,174.797211000000004 -37.998336999999999,174.791077 -37.993614,174.786376999999987 -37.988334999999999,174.783874999999995 -37.980826999999998,174.783600000000007 -37.971663999999997,174.788025000000005 -37.868332000000002,174.788879000000009 -37.860000999999997,174.791077 -37.852783000000002,174.795532000000009 -37.846947,174.819702000000007 -37.829169999999998,174.826629999999994 -37.825279000000002,174.841339000000005 -37.818610999999997,174.872741999999988 -37.806106999999997,174.883330999999998 -37.805,174.903045999999989 -37.807502999999997,174.945251000000013 -37.810555,174.967467999999997 -37.809165999999998,174.975525000000005 -37.806389000000003,174.974975999999998 -37.75,174.974670000000003 -37.740836999999999,174.966644000000002 -37.739998,174.951355000000007 -37.743057,174.94442699999999 -37.745002999999997,174.93081699999999 -37.752502,174.906921000000011 -37.774169999999998,174.870789000000002 -37.783057999999997,174.861633000000012 -37.785004,174.848297000000002 -37.769722000000002,174.828307999999993 -37.710830999999999,174.764160000000004 -37.527779000000002,174.744415000000004 -37.487502999999997,174.724975999999998 -37.447220000000002,174.717467999999997 -37.425002999999997,174.714690999999988 -37.408607000000003,174.714690999999988 -37.399445,174.719116000000014 -37.393616000000002,174.725799999999992 -37.389999000000003,174.744415000000004 -37.385834000000003,174.760528999999991 -37.380279999999999,174.767486999999988 -37.376389000000003,174.773041000000006 -37.371665999999998,174.831635000000006 -37.308052000000004,174.840789999999998 -37.296951,174.840515000000011 -37.291389000000002,174.82995600000001 -37.290557999999997,174.821899000000002 -37.291671999999998,174.812744000000009 -37.293616999999998,174.804687999999999 -37.296393999999999,174.797760000000011 -37.300277999999999,174.766083000000009 -37.321114,174.754700000000014 -37.330559,174.751373 -37.336945,174.744965000000008 -37.359169,174.740509000000003 -37.364722999999998,174.733582000000013 -37.368606999999997,174.724120999999997 -37.368889000000003,174.717194000000006 -37.365279999999998,174.711365 -37.360557999999997,174.701629999999994 -37.349724000000002,174.69442699999999 -37.336945,174.660187000000008 -37.273311999999997,174.645813000000004 -37.236389000000003,174.639709000000011 -37.224442000000003,174.599975999999998 -37.153885000000002,174.578307999999993 -37.115555,174.569976999999994 -37.103614999999998,174.555542000000003 -37.087502,174.551909999999992 -37.080832999999998,174.549712999999997 -37.073616,174.55304000000001 -37.067222999999998,174.558593999999999 -37.0625,174.568848000000003 -37.061385999999999,174.644135000000006 -37.061110999999997,174.661376999999987 -37.065551999999997,174.664977999999991 -37.071944999999999,174.666381999999999 -37.080283999999999,174.661925999999994 -37.085830999999999,174.650542999999999 -37.095275999999998,174.646087999999992 -37.100838000000003,174.648590000000013 -37.108055,174.703856999999999 -37.197777000000002,174.733856000000003 -37.196106,174.716644000000002 -37.154167,174.72357199999999 -37.150275999999998,174.87912 -37.088889999999999,174.887482000000006 -37.059165999999998,174.795532000000009 -37.023055999999997,174.804413000000011 -36.972220999999998,174.824982000000006 -36.960830999999999,174.829407000000003 -36.955002,174.83273299999999 -36.948608,174.828033000000005 -36.943053999999997,174.818848000000003 -36.941383000000002,174.770263999999997 -36.936661,174.696625000000012 -36.93972,174.686095999999992 -36.940834000000002,174.659697999999992 -36.947495000000004,174.653045999999989 -36.951393000000003,174.641662999999994 -36.960830999999999,174.622467 -36.982216,174.619110000000006 -36.988892,174.617187999999999 -36.996108999999997,174.600525000000005 -37.022224,174.524688999999995 -37.045555,174.515533000000005 -37.045555,174.508605999999986 -37.041946000000003,174.502472000000012 -37.037506,174.498016000000007 -37.031944000000003,174.490783999999991 -37.019165,174.484679999999997 -37.005561999999998,174.459228999999993 -36.944031000000003,174.451904000000013 -36.923889000000003,174.446930000000009 -36.909163999999997,174.443024000000008 -36.893616000000002,174.439147999999989 -36.868606999999997,174.436645999999996 -36.852226000000002,174.43386799999999 -36.835555999999997,174.427764999999994 -36.812775000000002,174.422760000000011 -36.798057999999997,174.416655999999989 -36.784171999999998,174.409697999999992 -36.771385000000002,174.406096999999988 -36.765006999999997,174.390533000000005 -36.740279999999998,174.344299000000007 -36.679336999999997,174.301085999999998 -36.62722,174.284973000000008 -36.612777999999999,174.267486999999988 -36.599167,174.236908 -36.568061999999998,174.208862000000011 -36.535277999999998,174.187744000000009 -36.496948000000003,174.17804000000001 -36.467498999999997,174.177764999999994 -36.458336000000003,174.178864000000004 -36.449997000000003,174.181091000000009 -36.442497000000003,174.184417999999994 -36.436110999999997,174.189972000000012 -36.431389000000003,174.196930000000009 -36.427779999999998,174.20495600000001 -36.428612,174.24383499999999 -36.440834000000002,174.251923000000005 -36.443610999999997,174.257751000000013 -36.448051,174.300262000000004 -36.515839,174.348846000000009 -36.601944000000003,174.367919999999998 -36.629165999999998,174.370728000000014 -36.6325,174.422484999999995 -36.667220999999998,174.430542000000003 -36.668059999999997,174.453033000000005 -36.651108,174.456359999999989 -36.644722000000002,174.465515000000011 -36.582779000000002,174.465515000000011 -36.532218999999998,174.442474000000004 -36.414718999999998,174.422211000000004 -36.366112,174.41885400000001 -36.370834000000002,174.391937000000013 -36.395004,174.384978999999987 -36.398887999999999,174.377166999999986 -36.401665,174.303864000000004 -36.395279000000002,174.296935999999988 -36.391669999999998,174.285247999999996 -36.3825,174.276916999999997 -36.370552000000004,174.26998900000001 -36.357779999999998,174.268585000000002 -36.349442000000003,174.268585000000002 -36.342224000000002,174.292205999999993 -36.316947999999996,174.299988000000013 -36.314163,174.308013999999986 -36.316947999999996,174.325531000000012 -36.330283999999999,174.334686000000005 -36.332222000000002,174.36883499999999 -36.331673000000002,174.376891999999998 -36.330832999999998,174.421248999999989 -36.310611999999999,174.50692699999999 -36.267220000000002,174.518311000000011 -36.258057,174.521636999999998 -36.251396,174.519135000000006 -36.245834000000002,174.505248999999992 -36.231383999999998,174.413299999999992 -36.263061999999998,174.378296000000006 -36.286667,174.364685000000009 -36.294167000000002,174.346619000000004 -36.298057999999997,174.336365 -36.298889000000003,174.305237000000005 -36.287506,174.365233999999987 -36.260002,174.442200000000014 -36.169724000000002,174.396087999999992 -36.144447,174.396362000000011 -36.151938999999999,174.394135000000006 -36.159163999999997,174.373290999999995 -36.206389999999999,174.369965000000008 -36.213057999999997,174.358856000000003 -36.222220999999998,174.345245000000006 -36.229720999999998,174.337463000000014 -36.232773000000002,174.33273299999999 -36.229163999999997,174.307738999999998 -36.176949,174.282745000000006 -36.121108999999997,174.274993999999992 -36.118332000000002,174.239409999999992 -36.111389000000003,174.229126000000008 -36.112502999999997,174.195251000000013 -36.131110999999997,174.188568000000004 -36.144165,174.185790999999995 -36.171944000000003,174.191345000000013 -36.176392,174.19830300000001 -36.18,174.217743000000013 -36.182502999999997,174.226898000000006 -36.182502999999997,174.236084000000005 -36.180557,174.244110000000006 -36.183059999999998,174.287749999999988 -36.210281000000002,174.312468999999993 -36.236663999999998,174.314696999999995 -36.243889000000003,174.267212 -36.270279000000002,174.259430000000009 -36.273055999999997,174.251373 -36.272499000000003,174.065796000000006 -36.168334999999999,173.999114999999989 -36.121108999999997,173.994415000000004 -36.115836999999999,173.99105800000001 -36.109444000000003,173.931091000000009 -35.981940999999999,173.938568000000004 -35.934998,173.947478999999987 -35.923889000000003,173.948577999999998 -35.915550000000003,173.946075000000008 -35.908051,173.913879000000009 -35.86972,173.908324999999991 -35.874442999999999,173.903870000000012 -35.879997000000003,173.904967999999997 -35.888336000000002,173.921356000000003 -36.003059,173.980804000000006 -36.121383999999999,173.987731999999994 -36.134171000000002,173.992461999999989 -36.139724999999999,174.124390000000005 -36.263618,174.176085999999998 -36.276947,174.180542000000003 -36.282501000000003,174.198853000000014 -36.343887000000002,174.199982000000006 -36.352226000000002,174.198028999999991 -36.368606999999997,174.194702000000007 -36.375275000000002,174.189147999999989 -36.379722999999998,174.115233999999987 -36.40361,174.089966000000004 -36.411385000000003,174.080811000000011 -36.409438999999999,174.06942699999999 -36.400275999999998,174.065796000000006 -36.393889999999999,174.057465000000008 -36.374718,174.049133000000012 -36.353614999999998,174.044433999999995 -36.338889999999999,174.039703000000003 -36.323334000000003,174.031096999999988 -36.293059999999997,174.020537999999988 -36.273887999999999,173.82607999999999 -36.032501000000003,173.737457000000006 -35.933608999999997,173.727172999999993 -35.923614999999998,173.590515000000011 -35.778053,173.398865 -35.573891000000003,173.395537999999988 -35.567504999999997,173.398865 -35.553612,173.446625000000012 -35.440277000000002,173.465789999999998 -35.429169000000002,173.501923000000005 -35.419724000000002,173.506378000000012 -35.425277999999999,173.540253000000007 -35.430832000000002,173.629943999999995 -35.356667000000002,173.65554800000001 -35.322502,173.65554800000001 -35.313332000000003,173.564147999999989 -35.278053,173.556091000000009 -35.280830000000002,173.551636000000002 -35.286391999999999,173.549712999999997 -35.302779999999998,173.549712999999997 -35.321114,173.551909999999992 -35.328612999999997,173.566924999999998 -35.344161999999997,173.568024000000008 -35.361671,173.566924999999998 -35.36972,173.559143000000006 -35.372771999999998,173.439696999999995 -35.376106,173.416077 -35.384444999999999,173.410247999999996 -35.388893000000003,173.391356999999999 -35.423057999999997,173.39498900000001 -35.449722,173.396087999999992 -35.458053999999997,173.392761000000007 -35.482773000000002,173.386382999999995 -35.523330999999999,173.380524000000008 -35.528053,173.37384 -35.524169999999998,173.306915000000004 -35.449165,173.237731999999994 -35.370277000000002,173.154144000000002 -35.276665,173.103302000000014 -35.226104999999997,173.09191899999999 -35.216942000000003,173.087463000000014 -35.211387999999999,173.09191899999999 -35.1875,173.098846000000009 -35.183608999999997,173.119110000000006 -35.185555,173.12802099999999 -35.1875,173.134704999999997 -35.191108999999997,173.14498900000001 -35.191940000000002,173.152771 -35.189163,173.163879000000009 -35.179169000000002,173.168578999999994 -35.173614999999998,173.18081699999999 -35.156104999999997,173.187468999999993 -35.143332999999998,173.191924999999998 -35.128334000000002,173.196349999999995 -35.104446000000003,173.197478999999987 -35.09639,173.198577999999998 -35.078887999999999,173.198577999999998 -35.051108999999997,173.193848000000003 -35.027222000000002,173.189423000000005 -35.012779000000002,173.179413000000011 -34.993332000000002,173.175812000000008 -34.986946000000003,173.159149000000014 -34.958336000000003,173.151093000000003 -34.946663,173.137755999999996 -34.93,172.947204999999997 -34.716942000000003,172.828033000000005 -34.584442000000003,172.812468999999993 -34.568893000000003,172.722473000000008 -34.495277000000002,172.739136000000002 -34.435555,172.900817999999987 -34.414718999999998,172.911925999999994 -34.414718999999998,173.020813000000004 -34.422226000000002,173.038879000000009 -34.436942999999999,173.043304000000006 -34.517775999999998,173.039977999999991 -34.522224,173.033324999999991 -34.525832999999999,173.024414000000007 -34.527779000000002,173.016662999999994 -34.52861,173.007476999999994 -34.526947,172.997467 -34.498336999999999,172.984130999999991 -34.472771000000002,172.961914000000007 -34.465279000000002,172.955230999999998 -34.468887000000002,172.908324999999991 -34.544167000000002,172.912749999999988 -34.549728000000002,172.923858999999993 -34.558891000000003,172.936095999999992 -34.567222999999998,172.973021999999986 -34.581116000000002,173.053314 -34.665550000000003,173.057738999999998 -34.680283000000003,173.110503999999992 -34.791389000000002,173.120789000000002 -34.810555,173.128570999999994 -34.822502,173.133026 -34.828055999999997,173.13857999999999 -34.832504,173.151916999999997 -34.839995999999999,173.213593000000003 -34.871941,173.242737000000005 -34.884726999999998,173.273314999999997 -34.940834000000002,173.268859999999989 -34.946387999999999,173.262206999999989 -34.959167,173.259978999999987 -34.966659999999997,173.258881000000002 -34.974716,173.259978999999987 -34.983055,173.264709000000011 -35.014449999999997,173.269135000000006 -35.019722000000002,173.317474000000004 -35.018889999999999,173.328583000000009 -35.009444999999999,173.358856000000003 -34.98111,173.36300700000001 -34.975555,173.366364000000004 -34.968887000000002,173.373259999999988 -34.936774999999997,173.371246000000014 -34.927444,173.400817999999987 -34.863334999999999,173.426085999999998 -34.82,173.450806 -34.807777000000002,173.500274999999988 -34.864722999999998,173.499114999999989 -34.871108999999997,173.492461999999989 -34.874718,173.452453999999989 -34.887779000000002,173.443297999999999 -34.889724999999999,173.433319000000012 -34.890555999999997,173.413025000000005 -34.888893000000003,173.405243000000013 -34.892502,173.399719000000005 -34.897224,173.399719000000005 -34.906387000000002,173.402190999999988 -34.913887000000003,173.411590999999987 -34.931778,173.419128 -34.945830999999998,173.426909999999992 -34.957779000000002,173.431641000000013 -34.963332999999999,173.44165000000001 -34.973328000000002,173.454131999999987 -34.981667000000002,173.467467999999997 -34.988892,173.475525000000005 -34.991669000000002,173.493286000000012 -34.995277000000002,173.541655999999989 -34.988608999999997,173.561645999999996 -34.958893000000003,173.562468999999993 -34.950836000000002,173.566924999999998 -34.936110999999997,173.572478999999987 -34.931389000000003,173.579131999999987 -34.927779999999998,173.589416999999997 -34.928612,173.83914200000001 -35.004173000000002,174.101074000000011 -35.121108999999997,174.098297000000002 -35.161667,174.091644000000002 -35.158051,174.056641000000013 -35.155555999999997,174.021911999999986 -35.164161999999997,174.008026 -35.207504,174.008026 -35.215004,174.011382999999995 -35.221381999999998,174.018311000000011 -35.224997999999999,174.093841999999995 -35.225273,174.100525000000005 -35.228881999999999,174.143585000000002 -35.328612999999997,174.208008000000007 -35.323334000000003,174.218018 -35.322226999999998,174.247741999999988 -35.27861,174.319976999999994 -35.232773000000002,174.383881000000002 -35.337775999999998,174.461638999999991 -35.445273999999998,174.491913000000011 -35.485275,174.575806 -35.601944000000003,174.577179 -35.610000999999997,174.577147999999994 -35.618088,174.569976999999994 -35.648055999999997,174.563292999999987 -35.651665,174.530272999999994 -35.649445,174.520263999999997 -35.648612999999997,174.513306 -35.645004,174.505248999999992 -35.642502,174.479126000000008 -35.641945,174.47357199999999 -35.646393000000003,174.474975999999998 -35.654716,174.518311000000011 -35.724167,174.523041000000006 -35.729438999999999,174.554137999999995 -35.750281999999999,174.561919999999986 -35.753059,174.583862000000011 -35.764724999999999,174.60244800000001 -35.844444000000003,174.596924 -35.849167,174.58914200000001 -35.851944000000003,174.577758999999986 -35.852226000000002,174.560790999999995 -35.847777999999998,174.554961999999989 -35.843330000000002,174.538574000000011 -35.819450000000003,174.523314999999997 -35.796669,174.519713999999993 -35.790283000000002,174.49105800000001 -35.769447,174.361908 -35.723328000000002,174.357451999999995 -35.72361,174.34857199999999 -35.734726000000002,174.346924 -35.833061,174.350525000000005 -35.839438999999999,174.35522499999999 -35.845001000000003,174.360779000000008 -35.849442000000003,174.381348000000003 -35.851112,174.384704999999997 -35.844718999999998,174.385528999999991 -35.828887999999999,174.391083000000009 -35.824173000000002,174.398865 -35.821387999999999,174.437468999999993 -35.822777000000002,174.476074000000011 -35.824173000000002,174.486358999999993 -35.824722,174.519713999999993 -35.844718999999998,174.525542999999999 -35.849167,174.524414000000007 -35.855559999999997,174.521362000000011 -35.862220999999998,174.501373 -35.889999000000003,174.496917999999994 -35.895553999999997,174.487182999999987 -35.915000999999997,174.495513999999986 -35.988608999999997,174.498016000000007 -35.994163999999998,174.514160000000004 -36.008614,174.56942699999999 -36.037224000000002,174.578583000000009 -36.038894999999997,174.587738000000002 -36.038894999999997,174.596619000000004 -36.036667,174.606902999999988 -36.037506,174.612731999999994 -36.042228999999999,174.622192000000013 -36.053055,174.62912 -36.065834000000002,174.629394999999988 -36.075004999999997,174.616364000000004 -36.100861000000002)),((171.185241999999988 -44.938332000000003,171.182129000000003 -44.94173,171.175017999999994 -44.949902000000002,171.167923000000002 -44.959850000000003,171.165436 -44.966599000000002,171.164703000000003 -44.970275999999998,171.163299999999992 -44.978332999999999,171.149719000000005 -44.996665999999998,171.07995600000001 -45.067222999999998,171.02664200000001 -45.103332999999999,170.975525000000005 -45.151108,170.966063999999989 -45.163055,170.961914000000007 -45.169167000000002,170.921630999999991 -45.243057,170.873566000000011 -45.358055,170.873290999999995 -45.367218,170.876891999999998 -45.373885999999999,170.871338000000009 -45.424171,170.859955000000014 -45.487502999999997,170.855804000000006 -45.493889000000003,170.750274999999988 -45.61972,170.674682999999987 -45.745002999999997,170.616913000000011 -45.839438999999999,170.55886799999999 -45.881667999999998,170.554413000000011 -45.888053999999997,170.555542000000003 -45.896110999999998,170.591063999999989 -45.894165,170.600525000000005 -45.891669999999998,170.608582000000013 -45.888053999999997,170.658600000000007 -45.858612,170.718018 -45.817504999999997,170.724670000000003 -45.813057,170.773314999999997 -45.782775999999998,170.781096999999988 -45.786391999999999,170.790802000000014 -45.806946000000003,170.790802000000014 -45.84639,170.788879000000009 -45.863892,170.783051 -45.878334000000002,170.776366999999993 -45.882773999999998,170.699982000000006 -45.911667,170.664429000000013 -45.908332999999999,170.57330300000001 -45.916663999999997,170.550536999999991 -45.919167000000002,170.484406000000007 -45.926949,170.452453999999989 -45.931946000000003,170.424408 -45.939438000000003,170.382721000000004 -45.956108,170.342467999999997 -45.97361,170.315246999999999 -45.991385999999999,170.309692000000013 -45.996948000000003,170.294433999999995 -46.013893000000003,170.281646999999992 -46.029442000000003,170.263610999999997 -46.051940999999999,170.256378000000012 -46.065551999999997,170.253051999999997 -46.081947,170.252472000000012 -46.09111,170.254424999999998 -46.107779999999998,170.252777000000009 -46.115836999999999,170.240783999999991 -46.146949999999997,170.237731999999994 -46.154167,170.226623999999987 -46.165000999999997,170.214416999999997 -46.174720999999998,170.193848000000003 -46.188048999999999,170.169433999999995 -46.198608,170.067748999999992 -46.246665999999998,169.911925999999994 -46.340279000000002,169.863585999999998 -46.371383999999999,169.858001999999999 -46.376663,169.849396000000013 -46.389442000000003,169.848021999999986 -46.416946000000003,169.849975999999998 -46.433326999999998,169.852172999999993 -46.440834000000002,169.853850999999992 -46.457504,169.850799999999992 -46.464722000000002,169.845245000000006 -46.469994,169.701904000000013 -46.558052000000004,169.631348000000003 -46.581947,169.458008000000007 -46.623328999999998,169.266388000000006 -46.656387000000002,169.133026 -46.670836999999999,169.107727000000011 -46.669167000000002,169.097197999999992 -46.666946000000003,169.084411999999986 -46.657501000000003,169.067200000000014 -46.635002,169.061919999999986 -46.675002999999997,169.053864000000004 -46.678612,169.008026 -46.680832000000002,168.883330999999998 -46.667777999999998,168.878296000000006 -46.661942000000003,168.861908 -46.628334000000002,168.862457000000006 -46.619446000000003,168.864409999999992 -46.611114999999998,168.864959999999996 -46.603889000000002,168.844970999999987 -46.563614,168.835784999999987 -46.560555,168.823853000000014 -46.561110999999997,168.733306999999996 -46.577499000000003,168.640533000000005 -46.603889000000002,168.633605999999986 -46.606392,168.614685000000009 -46.611114999999998,168.593018 -46.614165999999997,168.568848000000003 -46.615004999999996,168.516937000000013 -46.614165999999997,168.492737000000005 -46.613334999999999,168.442138999999997 -46.601500999999999,168.436630000000008 -46.599666999999997,168.446625000000012 -46.584003000000003,168.442200000000014 -46.575004999999997,168.454407000000003 -46.574447999999997,168.490509000000003 -46.573059,168.502472000000012 -46.574173000000002,168.506103999999993 -46.578887999999999,168.499114999999989 -46.583328000000002,168.505553999999989 -46.588051,168.551636000000002 -46.594444000000003,168.561371000000008 -46.591942000000003,168.566924999999998 -46.586661999999997,168.563599000000011 -46.580002,168.550812000000008 -46.570557,168.541655999999989 -46.567504999999997,168.391356999999999 -46.540000999999997,168.361908 -46.544449,168.353577 -46.547783000000003,168.351623999999987 -46.556106999999997,168.352172999999993 -46.564444999999999,168.362731999999994 -46.583885000000002,168.348236000000014 -46.582165000000003,168.352904999999993 -46.584499,168.359267999999986 -46.585830999999999,168.365082 -46.592666999999999,168.367248999999987 -46.596668,168.367599000000013 -46.601497999999999,168.364928999999989 -46.605331,168.35775799999999 -46.604500000000002,168.351409999999987 -46.603164999999997,168.275269000000009 -46.557777000000002,168.269135000000006 -46.535561,168.268311000000011 -46.529167,168.27664200000001 -46.525832999999999,168.286102 -46.523330999999999,168.307738999999998 -46.520553999999997,168.318297999999999 -46.520836000000003,168.318848000000003 -46.529167,168.321075000000008 -46.536667,168.328856999999999 -46.540557999999997,168.339416999999997 -46.539169,168.386658000000011 -46.497779999999999,168.392486999999988 -46.492226000000002,168.395537999999988 -46.485000999999997,168.396087999999992 -46.477775999999999,168.394135000000006 -46.470275999999998,168.37384 -46.421944000000003,168.36883499999999 -46.416106999999997,168.359679999999997 -46.415000999999997,168.350249999999988 -46.417503000000004,168.250274999999988 -46.400832999999999,168.211090000000013 -46.355277999999998,168.206085000000002 -46.351394999999997,168.194702000000007 -46.345551,168.185516000000007 -46.342498999999997,168.174988000000013 -46.340279000000002,168.116364000000004 -46.343612999999998,168.063873 -46.351669,167.955535999999995 -46.371383999999999,167.893035999999995 -46.387222,167.850799999999992 -46.399445,167.832184000000012 -46.398612999999997,167.824401999999992 -46.394447,167.753875999999991 -46.333885000000002,167.776916999999997 -46.312775000000002,167.781372000000005 -46.306389000000003,167.783600000000007 -46.298340000000003,167.781372000000005 -46.290840000000003,167.778045999999989 -46.284171999999998,167.701904000000013 -46.209442000000003,167.596924 -46.166389000000002,167.556641000000013 -46.156387000000002,167.546356000000003 -46.154167,167.534424 -46.152779000000002,167.483032000000009 -46.149726999999999,167.471069 -46.149994,167.460236000000009 -46.151389999999999,167.451904000000013 -46.154716,167.446075000000008 -46.159996,167.415526999999997 -46.204720000000002,167.356628 -46.254447999999996,167.280272999999994 -46.273055999999997,167.261108000000007 -46.267775999999998,167.238555999999988 -46.263893000000003,167.086638999999991 -46.240555,167.001373 -46.229163999999997,166.966063999999989 -46.224716,166.949982000000006 -46.223885000000003,166.915253000000007 -46.226104999999997,166.883026 -46.229996,166.836365 -46.232498,166.823028999999991 -46.231667000000002,166.768035999999995 -46.22361,166.726348999999999 -46.214165,166.717467999999997 -46.210830999999999,166.705230999999998 -46.201110999999997,166.670806999999996 -46.161667,166.67025799999999 -46.15361,166.684417999999994 -46.145004,166.693848000000003 -46.142775999999998,166.709411999999986 -46.135277000000002,166.738861000000014 -46.119163999999998,166.761230000000012 -46.093612999999998,166.784911999999991 -46.064945000000002,166.804748999999987 -46.033279,166.82995600000001 -46.003891000000003,166.854674999999986 -45.994163999999998,166.886932000000002 -45.990279999999998,166.943297999999999 -45.956108,166.949127000000004 -45.950836000000002,166.946930000000009 -45.945273999999998,166.939147999999989 -45.944716999999997,166.929687999999999 -45.947220000000002,166.836365 -45.981383999999998,166.828033000000005 -45.984444000000003,166.791350999999992 -46.005004999999997,166.785797000000002 -46.010283999999999,166.781096999999988 -46.016396,166.759308000000004 -46.035553,166.762969999999996 -46.038387,166.764969000000008 -46.042392999999997,166.763656999999995 -46.047221999999998,166.760162000000008 -46.050392000000002,166.740982000000002 -46.066059000000003,166.737793000000011 -46.066558999999998,166.670532000000009 -46.087218999999997,166.615783999999991 -46.090836000000003,166.613585999999998 -46.086387999999999,166.617461999999989 -46.059722999999998,166.621062999999992 -46.052498,166.640807999999993 -46.015006999999997,166.661652000000004 -45.991942999999999,166.625792999999987 -45.967216,166.492461999999989 -46.013061999999998,166.484406000000007 -46.014449999999997,166.474975999999998 -46.002785000000003,166.467194000000006 -45.990555,166.465239999999994 -45.983055,166.464690999999988 -45.839438999999999,166.468841999999995 -45.823059,166.472473000000008 -45.815834000000002,166.476898000000006 -45.809722999999998,166.537475999999998 -45.798889000000003,166.613861000000014 -45.801108999999997,166.652190999999988 -45.800277999999999,166.699982000000006 -45.798889000000003,166.881348000000003 -45.779998999999997,166.890807999999993 -45.777779000000002,166.974120999999997 -45.735000999999997,166.987182999999987 -45.709724,166.923034999999999 -45.705832999999998,166.912475999999998 -45.705275999999998,166.887482000000006 -45.705002,166.854126000000008 -45.707779000000002,166.825806 -45.714722000000002,166.809417999999994 -45.721381999999998,166.787475999999998 -45.689995000000003,166.775817999999987 -45.662773,166.81153900000001 -45.617942999999997,166.811217999999997 -45.613109999999999,166.812531000000007 -45.608111999999998,166.816710999999998 -45.605606000000002,166.869689999999991 -45.588779000000002,166.881026999999989 -45.586112999999997,166.88736 -45.585278000000002,166.895203000000009 -45.585608999999998,166.901366999999993 -45.587108999999998,166.912871999999993 -45.590946000000002,166.980255 -45.578612999999997,166.991913000000011 -45.580002,167.0 -45.576949999999997,167.005829000000006 -45.571671000000002,167.032470999999987 -45.527779000000002,167.041350999999992 -45.501396,166.989685000000009 -45.519165,166.891693000000004 -45.544724000000002,166.796875 -45.569389,166.791199000000006 -45.570720999999999,166.784836000000013 -45.571556,166.777023000000014 -45.571219999999997,166.710509999999999 -45.579445,166.704407000000003 -45.574447999999997,166.697204999999997 -45.554718,166.699127000000004 -45.546669,166.757476999999994 -45.425277999999999,166.801361000000014 -45.353614999999998,166.821625000000012 -45.320557,166.86883499999999 -45.279724000000002,166.880797999999999 -45.279167,167.008330999999998 -45.341667,167.038299999999992 -45.357779999999998,167.146941999999996 -45.427222999999998,167.16885400000001 -45.472496,167.205230999999998 -45.477775999999999,167.211914000000007 -45.475273,167.21414200000001 -45.467216,167.209411999999986 -45.461387999999999,167.173584000000005 -45.422775,167.158019999999993 -45.406661999999997,167.134978999999987 -45.386116,167.12912 -45.381385999999999,167.115509000000003 -45.372222999999998,167.097747999999996 -45.366112,167.087463000000014 -45.363616999999998,167.061645999999996 -45.345001000000003,167.051085999999998 -45.333328000000002,167.081421000000006 -45.325333,167.08407600000001 -45.321666999999998,167.092407000000009 -45.316498000000003,167.097243999999989 -45.314498999999998,167.114227 -45.310333,167.163574000000011 -45.302833999999997,167.169922000000014 -45.302998000000002,167.173584000000005 -45.305999999999997,167.176422000000002 -45.309330000000003,167.17756700000001 -45.313834999999997,167.212738000000002 -45.313332000000003,167.218841999999995 -45.318336000000002,167.232178000000005 -45.327224999999999,167.239685000000009 -45.331116000000002,167.248566000000011 -45.334167,167.260254000000003 -45.335830999999999,167.270813000000004 -45.334442000000003,167.301636000000002 -45.329445,167.309692000000013 -45.326110999999997,167.307738999999998 -45.318610999999997,167.300262000000004 -45.314444999999999,167.19464099999999 -45.271445999999997,167.138290000000012 -45.268943999999998,167.099471999999992 -45.272114000000002,167.094146999999992 -45.271278000000002,167.08964499999999 -45.268776000000003,167.002196999999995 -45.201110999999997,166.996917999999994 -45.145836000000003,167.146362000000011 -45.001671000000002,167.198577999999998 -44.956108,167.204407000000003 -44.951110999999997,167.228302000000014 -44.930832000000002,167.24105800000001 -44.921387000000003,167.260528999999991 -44.907501000000003,167.267486999999988 -44.903053,167.312744000000009 -44.875,167.320800999999989 -44.871383999999999,167.393462999999997 -44.862999000000002,167.398987000000005 -44.861496000000002,167.404312000000004 -44.863498999999997,167.421798999999993 -44.894168999999998,167.422974000000011 -44.898665999999999,167.420638999999994 -44.908496999999997,167.417968999999999 -44.912166999999997,167.440796000000006 -44.928612,167.439972000000012 -44.9375,167.441924999999998 -44.945,167.459686000000005 -44.99472,167.497741999999988 -45.003891000000003,167.507202000000007 -45.001396,167.508224000000013 -45.0,167.511658000000011 -44.995277000000002,167.511108000000007 -44.986946000000003,167.47908000000001 -44.903446000000002,167.465912000000003 -44.876441999999997,167.462752999999992 -44.867947,167.461578000000003 -44.863444999999999,167.460097999999988 -44.853946999999998,167.459411999999986 -44.843944999999998,167.459914999999995 -44.838444000000003,167.448577999999998 -44.795279999999998,167.453033000000005 -44.788894999999997,167.458587999999992 -44.783614999999998,167.59970100000001 -44.683883999999999,167.743010999999996 -44.611671,167.838866999999993 -44.498610999999997,167.850249999999988 -44.488052000000003,167.949982000000006 -44.40361,167.963593000000003 -44.395004,168.034973000000008 -44.353614999999998,168.12802099999999 -44.316947999999996,168.141662999999994 -44.308052000000004,168.144713999999993 -44.300834999999999,168.144135000000006 -44.292503000000004,168.124099999999999 -44.251404,168.143311000000011 -44.253059,168.153594999999996 -44.251396,168.169708000000014 -44.24472,168.288299999999992 -44.172775,168.29385400000001 -44.167503000000004,168.336638999999991 -44.123885999999999,168.339966000000004 -44.116661,168.337738000000002 -44.109169,168.334411999999986 -44.102783000000002,168.336365 -44.094444000000003,168.369689999999991 -44.043334999999999,168.374968999999993 -44.037781000000003,168.383026 -44.034447,168.402771 -44.029724000000002,168.672211000000004 -43.987777999999999,168.676909999999992 -43.993614,168.683043999999995 -43.998336999999999,168.690246999999999 -44.002228000000002,168.715239999999994 -44.012222,168.723021999999986 -44.012504999999997,168.753875999999991 -44.010002,168.764160000000004 -44.008614,168.824401999999992 -43.988334999999999,168.858582000000013 -43.976661999999997,168.866364000000004 -43.973328000000002,168.879669000000007 -43.964447,168.885254000000003 -43.959167,168.961914000000007 -43.90361,169.080765000000014 -43.848472999999998,169.142212 -43.794167000000002,169.224396000000013 -43.743332000000002,169.271636999999998 -43.722496,169.387482000000006 -43.679169000000002,169.491318000000007 -43.643467,169.539153999999996 -43.633614,169.62661700000001 -43.613892,169.64498900000001 -43.608893999999999,169.652771 -43.605559999999997,169.660521999999986 -43.601944000000003,169.721619000000004 -43.573334000000003,169.728302000000014 -43.568893000000003,169.739136000000002 -43.558052000000004,169.767486999999988 -43.522773999999998,169.790526999999997 -43.496665999999998,169.871062999999992 -43.406661999999997,169.884154999999993 -43.397781000000002,169.961638999999991 -43.371941,170.021911999999986 -43.352500999999997,170.028594999999996 -43.347777999999998,170.033874999999995 -43.342498999999997,170.038025000000005 -43.336112999999997,170.049408 -43.306946000000003,170.111358999999993 -43.254173000000002,170.288299999999992 -43.107779999999998,170.418029999999987 -43.052498,170.523041000000006 -43.010559,170.531921000000011 -43.008057,170.583037999999988 -42.990555,170.674347000000012 -42.958739999999999,170.704407000000003 -42.945830999999998,170.750549000000007 -42.924720999999998,170.781096999999988 -42.910553,170.794128 -42.901389999999999,171.065796000000006 -42.648055999999997,171.108306999999996 -42.608055,171.149719000000005 -42.563614,171.153594999999996 -42.55722,171.196075000000008 -42.476661999999997,171.225799999999992 -42.433608999999997,171.230255 -42.40889,171.235779000000008 -42.394165,171.247467 -42.375,171.260254000000003 -42.366112,171.270537999999988 -42.355003000000004,171.297760000000011 -42.310279999999999,171.304413000000011 -42.296669,171.309692000000013 -42.281944000000003,171.31665000000001 -42.249724999999998,171.321075000000008 -42.224716,171.322754000000003 -42.207222000000002,171.324401999999992 -42.18972,171.326355000000007 -42.172226000000002,171.329131999999987 -42.155830000000002,171.343841999999995 -42.110832000000002,171.361084000000005 -42.067779999999999,171.461638999999991 -41.859726000000002,171.51080300000001 -41.764449999999997,171.533051 -41.766396,171.557738999999998 -41.766663,171.569121999999993 -41.766112999999997,171.650817999999987 -41.761391000000003,171.663025000000005 -41.757781999999999,171.685790999999995 -41.746948000000003,171.790526999999997 -41.696387999999999,171.85522499999999 -41.652779000000002,171.886658000000011 -41.629997000000003,171.942200000000014 -41.550277999999999,172.02276599999999 -41.443053999999997,172.053864000000004 -41.417503000000004,172.064972000000012 -41.40361,172.122192000000013 -41.277779000000002,172.111633000000012 -41.236114999999998,172.10522499999999 -41.153053,172.106078999999994 -40.911385000000003,172.10635400000001 -40.893059,172.108856000000003 -40.885559,172.113861000000014 -40.879997000000003,172.186645999999996 -40.813332000000003,172.218567000000007 -40.785834999999999,172.22470100000001 -40.781109,172.255248999999992 -40.776947,172.263884999999988 -40.774169999999998,172.271362000000011 -40.770553999999997,172.299408 -40.755004999999997,172.348297000000002 -40.727493000000003,172.382721000000004 -40.698334000000003,172.426909999999992 -40.657775999999998,172.478302000000014 -40.613892,172.513320999999991 -40.598441999999999,172.517639000000003 -40.596783000000002,172.523482999999999 -40.597946,172.522644000000014 -40.602943000000003,172.521132999999992 -40.607277000000003,172.520813000000004 -40.625,172.519440000000003 -40.631385999999999,172.525542999999999 -40.6325,172.534149000000014 -40.631667999999998,172.571899000000002 -40.617775000000002,172.596343999999988 -40.601394999999997,172.62802099999999 -40.573891000000003,172.631621999999993 -40.567222999999998,172.631621999999993 -40.559998,172.608582000000013 -40.556946000000003,172.601348999999999 -40.558891000000003,172.597014999999999 -40.553333000000002,172.589690999999988 -40.558838000000002,172.583862000000011 -40.560004999999997,172.581024000000014 -40.556671,172.581848000000008 -40.551665999999997,172.589843999999999 -40.541172000000003,172.627166999999986 -40.511947999999997,172.633330999999998 -40.509171000000002,172.661376999999987 -40.502785000000003,172.712188999999995 -40.495552000000004,172.817748999999992 -40.504173000000002,172.861358999999993 -40.507781999999999,172.981628 -40.527222000000002,172.991332999999997 -40.529167,172.989959999999996 -40.53389,172.978026999999997 -40.53389,172.945251000000013 -40.530830000000002,172.895263999999997 -40.524445,172.797211000000004 -40.516112999999997,172.739959999999996 -40.516945,172.731628 -40.519722000000002,172.656921000000011 -40.653328000000002,172.701355000000007 -40.748336999999999,172.855804000000006 -40.853057999999997,172.865509000000003 -40.853057999999997,172.875244000000009 -40.851112,172.907195999999999 -40.828887999999999,172.930266999999986 -40.802222999999998,172.935241999999988 -40.796669,172.976623999999987 -40.781944000000003,172.985229000000004 -40.781112999999998,173.002196999999995 -40.786667,173.008330999999998 -40.791114999999998,173.013306 -40.796669,173.020537999999988 -40.809722999999998,173.051085999999998 -40.869446000000003,173.059692000000013 -40.962775999999998,173.059692000000013 -40.971938999999999,173.056091000000009 -40.978606999999997,173.031646999999992 -41.027495999999999,173.075806 -41.291114999999998,173.079680999999994 -41.297500999999997,173.085784999999987 -41.302222999999998,173.105529999999987 -41.313332000000003,173.168029999999987 -41.316108999999997,173.188873 -41.313332000000003,173.198853000000014 -41.311385999999999,173.207184000000012 -41.308608999999997,173.272217000000012 -41.274445,173.278320000000008 -41.269722000000002,173.32607999999999 -41.222496,173.340515000000011 -41.205832999999998,173.351623999999987 -41.195549,173.377166999999986 -41.178055,173.426085999999998 -41.150275999999998,173.598021999999986 -41.053612,173.606628 -41.052498,173.639709000000011 -41.073616,173.672760000000011 -41.070557,173.720519999999993 -41.060279999999999,173.727753000000007 -41.056389000000003,173.739959999999996 -41.047226000000002,173.744689999999991 -41.032501000000003,173.743286000000012 -41.024169999999998,173.738281 -41.018608,173.72744800000001 -41.019447,173.718841999999995 -41.022499000000003,173.696930000000009 -41.033614999999998,173.690796000000006 -41.038338000000003,173.682189999999991 -41.041114999999998,173.676085999999998 -41.036391999999999,173.673584000000005 -41.029167,173.674682999999987 -41.020836000000003,173.678314 -41.014449999999997,173.696625000000012 -41.000281999999999,173.751373 -40.976944000000003,173.800262000000004 -40.969161999999997,173.913299999999992 -40.931671,173.984679999999997 -40.896949999999997,173.994415000000004 -40.896667,174.02276599999999 -40.913055,174.027771 -40.91861,174.030272999999994 -40.925834999999999,174.03054800000001 -40.935271999999998,174.02941899999999 -40.943610999999997,174.022217000000012 -40.947220000000002,173.929961999999989 -40.992226000000002,173.832184000000012 -40.995002999999997,173.821075000000008 -40.994163999999998,173.782195999999999 -41.009171000000002,173.778594999999996 -41.015555999999997,173.769713999999993 -41.09861,173.778594999999996 -41.114449,173.794433999999995 -41.109444000000003,173.822204999999997 -41.080832999999998,173.821899000000002 -41.062218,173.836638999999991 -41.055,173.846343999999988 -41.053055,173.93081699999999 -41.049446000000003,173.946625000000012 -41.055832000000002,173.953033000000005 -41.060555,173.917755 -41.087502,173.887482000000006 -41.103332999999999,173.848846000000009 -41.144165,173.820526 -41.245834000000002,173.763306 -41.267502,173.76080300000001 -41.273055999999997,173.775817999999987 -41.289726000000002,173.788025000000005 -41.290557999999997,173.806365999999997 -41.289444000000003,174.03720100000001 -41.218330000000002,174.09970100000001 -41.198334000000003,174.128845000000013 -41.187218,174.133605999999986 -41.181671,174.133605999999986 -41.176108999999997,174.126068000000004 -41.174171,174.008605999999986 -41.175277999999999,174.001099000000011 -41.178885999999999,174.001373 -41.186385999999999,174.000274999999988 -41.194716999999997,173.993010999999996 -41.198334000000003,173.981902999999988 -41.199440000000003,173.932738999999998 -41.199997000000003,173.908324999999991 -41.199997000000003,173.899719000000005 -41.197495000000004,173.893585000000002 -41.192771999999998,173.887206999999989 -41.169724000000002,173.88580300000001 -41.161667,173.888031000000012 -41.154167,173.89776599999999 -41.133614,173.902466000000004 -41.128334000000002,174.032745000000006 -40.999724999999998,174.084411999999986 -41.021385000000002,174.094116000000014 -41.023330999999999,174.246338000000009 -41.044724000000002,174.258330999999998 -41.035277999999998,174.299408 -41.003616,174.315246999999999 -41.000557,174.323853000000014 -41.003334000000002,174.323853000000014 -41.010834000000003,174.321625000000012 -41.018059,174.209960999999993 -41.197495000000004,174.161376999999987 -41.225555,174.152771 -41.226661999999997,174.114685000000009 -41.231383999999998,174.052185000000009 -41.235000999999997,174.02664200000001 -41.236114999999998,174.053864000000004 -41.254173000000002,174.206359999999989 -41.269447,174.214966000000004 -41.266663,174.291655999999989 -41.238892,174.303588999999988 -41.229720999999998,174.320800999999989 -41.220275999999998,174.326904000000013 -41.222771000000002,174.288574000000011 -41.276947,174.249114999999989 -41.322502,174.241637999999995 -41.326110999999997,174.231902999999988 -41.328055999999997,174.208587999999992 -41.329445,174.193572999999986 -41.320281999999999,174.155243000000013 -41.305,174.148041000000006 -41.308608999999997,174.111633000000012 -41.336661999999997,174.052764999999994 -41.421112,174.049133000000012 -41.427779999999998,174.044433999999995 -41.442497000000003,174.045806999999996 -41.450836000000002,174.049988000000013 -41.466392999999997,174.063873 -41.493057,174.084136999999998 -41.526108,174.097473000000008 -41.519447,174.096069 -41.511116,174.100799999999992 -41.505561999999998,174.108306999999996 -41.509171000000002,174.114685000000009 -41.513893000000003,174.125792999999987 -41.523887999999999,174.151093000000003 -41.551392,174.176085999999998 -41.578612999999997,174.178864000000004 -41.586112999999997,174.179961999999989 -41.594444000000003,174.179137999999995 -41.602783000000002,174.174133000000012 -41.608336999999999,174.163299999999992 -41.618606999999997,174.157195999999999 -41.623328999999998,174.193024000000008 -41.685555,174.287749999999988 -41.734444000000003,174.291655999999989 -41.740836999999999,174.289153999999996 -41.748336999999999,174.283324999999991 -41.762222,174.236358999999993 -41.837218999999997,174.212188999999995 -41.865279999999998,174.201355000000007 -41.875557,174.184143000000006 -41.890555999999997,174.17804000000001 -41.895004,174.164703000000003 -41.90361,174.157195999999999 -41.907218999999998,174.143585000000002 -41.915832999999999,174.088561999999996 -41.957779000000002,174.009154999999993 -42.027495999999999,173.979674999999986 -42.061110999999997,173.965239999999994 -42.086945,173.959136999999998 -42.100838000000003,173.954407000000003 -42.115555,173.953307999999993 -42.123885999999999,173.953583000000009 -42.133330999999998,173.956359999999989 -42.166389000000002,173.933319000000012 -42.196944999999999,173.928314 -42.202499000000003,173.884154999999993 -42.243614,173.87802099999999 -42.248055,173.870513999999986 -42.251944999999999,173.86300700000001 -42.255561999999998,173.834686000000005 -42.271385000000002,173.801361000000014 -42.293059999999997,173.794983000000002 -42.297500999999997,173.568572999999986 -42.476944000000003,173.558593999999999 -42.487777999999999,173.541350999999992 -42.511947999999997,173.533874999999995 -42.525002,173.531372000000005 -42.532218999999998,173.500823999999994 -42.599724000000002,173.480804000000006 -42.621941,173.466063999999989 -42.656944000000003,173.459960999999993 -42.670836999999999,173.448853000000014 -42.690277000000002,173.387755999999996 -42.793616999999998,173.351623999999987 -42.840836000000003,173.328033000000005 -42.898887999999999,173.328033000000005 -42.906387000000002,173.325806 -42.913612,173.285521999999986 -42.958053999999997,173.106902999999988 -43.057777000000002,173.099396000000013 -43.061385999999999,173.090515000000011 -43.064444999999999,173.026366999999993 -43.081947,172.975799999999992 -43.09111,172.953033000000005 -43.092773,172.935516000000007 -43.098334999999999,172.92025799999999 -43.105834999999999,172.838012999999989 -43.148055999999997,172.818024000000008 -43.160828000000002,172.797760000000011 -43.183059999999998,172.772217000000012 -43.219718999999998,172.76080300000001 -43.239165999999997,172.758026 -43.246665999999998,172.726944000000003 -43.415539000000003,172.726593000000008 -43.423355,172.775817999999987 -43.612220999999998,172.894135000000006 -43.61972,172.90554800000001 -43.620834000000002,173.059692000000013 -43.653053,173.100525000000005 -43.697220000000002,173.105529999999987 -43.703612999999997,173.114409999999992 -43.741385999999999,173.116913000000011 -43.762504999999997,173.116913000000011 -43.769996999999996,173.112182999999987 -43.825004999999997,173.110779000000008 -43.833328000000002,173.091644000000002 -43.856392,173.058593999999999 -43.871108999999997,173.006088000000005 -43.869498999999998,173.002242999999993 -43.868999000000002,172.999236999999994 -43.865668999999997,172.990905999999995 -43.849670000000003,172.965239999999994 -43.802222999999998,172.961365 -43.764449999999997,172.958862000000011 -43.756950000000003,172.951355000000007 -43.755279999999999,172.939972000000012 -43.756110999999997,172.927185000000009 -43.766112999999997,172.921906000000007 -43.771667,172.920532000000009 -43.824173000000002,172.920532000000009 -43.833328000000002,172.917572000000007 -43.869221000000003,172.923584000000005 -43.875884999999997,172.931243999999992 -43.881390000000003,172.937408000000005 -43.887886000000002,172.938904000000008 -43.892384,172.938247999999987 -43.896220999999997,172.870789000000002 -43.904442000000003,172.861633000000012 -43.901389999999999,172.811919999999986 -43.882216999999997,172.804413000000011 -43.878334000000002,172.745789000000002 -43.837775999999998,172.740783999999991 -43.832222000000002,172.736908 -43.825836000000002,172.715239999999994 -43.808334000000002,172.642761000000007 -43.772224,172.513031000000012 -43.729438999999999,172.495238999999998 -43.723885000000003,172.483582000000013 -43.722771000000002,172.472197999999992 -43.72361,172.424988000000013 -43.733612,172.413299999999992 -43.743614,172.390258999999986 -43.763893000000003,172.384978999999987 -43.77861,172.382445999999987 -43.795006,172.383330999999998 -43.8125,172.384704999999997 -43.820838999999999,172.394713999999993 -43.850281000000003,172.393311000000011 -43.858612,172.386932000000002 -43.863334999999999,172.367461999999989 -43.867775000000002,172.297211000000004 -43.881110999999997,172.286925999999994 -43.883057,172.275542999999999 -43.883887999999999,172.189696999999995 -43.909163999999997,172.050812000000008 -43.965279000000002,171.978577 -43.995834000000002,171.955230999999998 -44.006667999999998,171.941070999999994 -44.015006999999997,171.782470999999987 -44.076949999999997,171.654694000000006 -44.122498,171.583587999999992 -44.153885000000002,171.547211000000004 -44.173889000000003,171.538483000000014 -44.178775999999999,171.355559999999997 -44.285491999999998,171.346465999999992 -44.292186999999998,171.342467999999997 -44.295555,171.319976999999994 -44.316391000000003,171.293578999999994 -44.343612999999998,171.285521999999986 -44.356392,171.278594999999996 -44.369995000000003,171.271911999999986 -44.383887999999999,171.269135000000006 -44.391112999999997,171.275542999999999 -44.395836000000003,171.279144000000002 -44.402495999999999,171.278594999999996 -44.420836999999999,171.277190999999988 -44.428885999999999,171.275542999999999 -44.437218,171.26998900000001 -44.451942000000003,171.263306 -44.465553,171.254974000000004 -44.478332999999999,171.214966000000004 -44.533057999999997,171.208313000000004 -44.537506,171.200531000000012 -44.541114999999998,171.196075000000008 -44.560279999999999,171.192200000000014 -44.645836000000003,171.193024000000008 -44.663330000000002,171.20495600000001 -44.700279000000002,171.21414200000001 -44.739165999999997,171.215239999999994 -44.747498,171.207184000000012 -44.851112,171.198577999999998 -44.919998,171.195800999999989 -44.927498,171.185241999999988 -44.938332000000003)))
diff --git a/django/contrib/gis/tests/geoapp/sql/state.mysql.sql b/django/contrib/gis/tests/geoapp/sql/state.mysql.sql
new file mode 100644
index 0000000000..0796306e07
--- /dev/null
+++ b/django/contrib/gis/tests/geoapp/sql/state.mysql.sql
@@ -0,0 +1,5 @@
+-- State border data courtesy of U.S. Census Bureau Cartographic Boundary Files: http://www.census.gov/geo/www/cob/st2000.html
+-- Boundary file data is a product of the U.S. federal government and is public domain. See 17 U.S.C. 105.
+-- INSERT INTO geoapp_state (`name`, `poly`) VALUES ('Puerto Rico', NULL); MySQL spatial indices can't handle NULL values :-/
+INSERT INTO geoapp_state (`name`, `poly`) VALUES ('Colorado', GeomFromText('POLYGON ((-107.918420999999981 41.002035999999997,-107.69133582431418 41.002104250342249,-107.625624000000002 41.002124000000002,-107.521505363272311 41.002506710525772,-107.367442999999994 41.003073,-107.317794462401125 41.002967213367114,-107.305312956219666 41.00294061889776,-107.241193999999993 41.002803999999998,-107.000606000000005 41.003443999999995,-106.857772999999995 41.002662999999991,-106.453858999999994 41.002056999999994,-106.439563000000007 41.001978,-106.437419000000006 41.001794999999994,-106.430949999999996 41.001751999999996,-106.391852 41.001176,-106.386356000000006 41.001143999999996,-106.321164999999993 40.999122999999997,-106.217573000000002 40.997734,-106.194624254510543 40.99762614711792,-106.190540579491184 40.997606954952467,-106.061180999999991 40.996999000000002,-105.764246857267409 40.99689755617932,-105.730421000000007 40.996886000000003,-105.724804000000006 40.99691,-105.554417704421283 40.997390710823062,-105.412220703167577 40.997791891195448,-105.277137999999979 40.998173,-105.256527000000006 40.998190999999998,-105.254778999999999 40.99821,-105.173435761678107 40.998177015252317,-104.943370680568208 40.998083723679372,-104.855272999999997 40.998047999999997,-104.829503999999986 40.999270000000003,-104.675999000000004 41.000957,-104.497148999999993 41.001828000000003,-104.497057999999996 41.001804999999997,-104.467671999999979 41.001472999999997,-104.214691999999999 41.001657000000002,-104.214191 41.001567999999999,-104.211472999999998 41.001590999999998,-104.123585999999989 41.001625999999995,-104.104590000000002 41.001542999999991,-104.086067999999983 41.001562999999997,-104.066960999999992 41.001503999999997,-104.053248999999994 41.001405999999996,-104.039237999999997 41.001502000000002,-104.023382999999981 41.001887000000004,-104.018223000000006 41.001617000000003,-104.010804886779724 41.00161667450854,-103.972641999999979 41.001615,-103.971373 41.001524000000003,-103.953524999999999 41.001595999999999,-103.906323999999998 41.001387,-103.896207000000004 41.00175,-103.877966999999998 41.00167299999999,-103.858448999999993 41.001680999999998,-103.750497999999993 41.002054,-103.574522000000002 41.001721000000003,-103.497446999999994 41.001635,-103.486697000000007 41.001913999999999,-103.421975000000003 41.002006999999999,-103.421925000000002 41.001968999999995,-103.396990999999986 41.002558,-103.365313999999984 41.001846,-103.362978999999996 41.001843999999991,-103.077804 41.002298000000003,-103.076536000000004 41.002253000000003,-103.059537999999989 41.002367999999997,-103.057997999999998 41.002367999999997,-103.043443999999994 41.002344,-103.038703999999996 41.002251,-103.002026 41.002485999999998,-103.000101999999984 41.002400000000002,-102.982690000000005 41.002156999999997,-102.981482999999997 41.002111999999997,-102.963668999999982 41.002185999999995,-102.962522000000007 41.002071999999998,-102.960706000000002 41.002058999999996,-102.959623999999991 41.002094999999997,-102.944829999999996 41.002302999999998,-102.943109000000007 41.002051000000002,-102.925567999999998 41.002279999999999,-102.924029000000004 41.002141999999999,-102.906546999999989 41.002275999999995,-102.904796000000005 41.002206999999999,-102.887406999999982 41.002178,-102.885745999999997 41.002130999999999,-102.867822000000004 41.002183000000002,-102.865783999999991 41.001987999999997,-102.849262999999993 41.002301000000003,-102.846455000000006 41.002256000000003,-102.830302999999986 41.002350999999997,-102.827280000000002 41.002142999999997,-102.773545999999996 41.002414000000002,-102.766722999999999 41.00227499999999,-102.754616999999996 41.002360999999993,-102.739623999999992 41.002229999999997,-102.653462999999988 41.002332000000003,-102.621032999999997 41.002597000000002,-102.578695999999994 41.002291,-102.575738 41.002268,-102.575496 41.002200000000002,-102.566047999999995 41.002200000000002,-102.556788999999995 41.002218999999997,-102.517701071582451 41.002347335877943,-102.487954999999985 41.002444999999994,-102.470536999999979 41.002381999999997,-102.469223 41.002423999999998,-102.460334593696913 41.00241180236555,-102.387750989484957 41.002312195277327,-102.380372991932845 41.002302070389462,-102.379593 41.002301000000003,-102.364065999999994 41.002173999999997,-102.292833000000002 41.002206999999999,-102.292621999999994 41.002229999999997,-102.292552999999998 41.002206999999999,-102.291353999999998 41.002206999999999,-102.277803455573988 41.002233743569548,-102.272099999999995 41.002245000000002,-102.267811999999992 41.002383000000002,-102.231931000000003 41.002327,-102.212199999999982 41.002462,-102.209361 41.002442000000002,-102.209083936251005 41.002440229332002,-102.207776055197755 41.002431870883314,-102.191209999999998 41.002325999999996,-102.124972 41.002338000000002,-102.070598000000004 41.002423,-102.051614 41.002377000000003,-102.051291999999989 40.749591000000002,-102.051634432607003 40.582129592617228,-102.051725000000005 40.537838999999991,-102.051518999999999 40.520094,-102.051464999999993 40.440007999999999,-102.051839999999999 40.396396000000003,-102.051571999999993 40.393079999999998,-102.051797999999991 40.360069000000003,-102.051585542616536 40.350646145741024,-102.051309000000003 40.338380999999998,-102.051922000000005 40.235343999999998,-102.05189399999999 40.229192999999995,-102.051908999999995 40.162674000000003,-102.052001000000004 40.148358999999999,-102.051852600888665 40.064469617536822,-102.051743999999999 40.003078000000002,-102.051715564657869 39.978173027456265,-102.051569 39.849805000000003,-102.051362999999995 39.843471,-102.051317999999995 39.833311000000002,-102.051254 39.818992,-102.05059399999999 39.67559399999999,-102.050099000000003 39.653812000000002,-102.050421999999983 39.646047999999993,-102.049954 39.592331,-102.04980599999999 39.574058,-102.049553999999986 39.538932000000003,-102.049672999999999 39.536690999999998,-102.049678999999998 39.506183,-102.049368999999999 39.423333,-102.049369999999996 39.418210000000002,-102.049166999999983 39.403596999999998,-102.04895999999998 39.37371199999999,-102.048449000000005 39.30313799999999,-102.047250000000005 39.13702,-102.047133999999986 39.129700999999997,-102.046570999999986 39.047038,-102.045387999999988 38.813391999999993,-102.045333999999997 38.799463000000003,-102.045447999999993 38.783453000000002,-102.045371000000003 38.770063999999998,-102.045287000000002 38.755527999999998,-102.045375000000007 38.754338999999995,-102.045211999999992 38.697566999999999,-102.045156000000006 38.688555,-102.045126999999994 38.686725000000003,-102.045159999999996 38.675221,-102.045102 38.674945999999998,-102.045074 38.669617000000002,-102.045287999999999 38.615248999999999,-102.045210999999995 38.581608999999993,-102.045188999999979 38.558731999999992,-102.045222999999993 38.543796999999998,-102.045112000000003 38.523783999999999,-102.045261999999994 38.505531999999995,-102.045262999999991 38.505395,-102.045323999999979 38.453646999999997,-102.044936000000007 38.41968,-102.044441999999989 38.415801999999999,-102.044944 38.384419,-102.044612999999998 38.312323999999997,-102.044567999999998 38.268819,-102.044398 38.250014999999998,-102.044251000000003 38.141777999999995,-102.044535323623649 38.127675380028528,-102.044589000000002 38.125012999999996,-102.044540277332047 38.123262193231092,-102.044255000000007 38.113010999999993,-102.04462354493468 38.04908029653749,-102.044631007072184 38.047785855466316,-102.044644000000005 38.045532,-102.044620085883125 38.042021706570637,-102.044539342086111 38.030169526464491,-102.043844000000007 37.928101999999996,-102.043845000000005 37.926135000000002,-102.043218999999993 37.86792899999999,-102.043032999999994 37.824145999999999,-102.042952999999997 37.803534999999997,-102.042668000000006 37.788758,-102.042158 37.760164000000003,-102.041876000000002 37.723875,-102.041573999999997 37.680436,-102.041694000000007 37.665680999999999,-102.041581999999991 37.654494999999997,-102.041584999999998 37.644281999999997,-102.041618 37.607868000000003,-102.041779405839492 37.578691555295826,-102.041893999999999 37.557977,-102.041899 37.541186000000003,-102.04201599999999 37.535260999999998,-102.041786000000002 37.506065999999997,-102.041800999999992 37.469487999999998,-102.041754999999995 37.434854999999992,-102.041668999999999 37.434739999999998,-102.041675999999981 37.409897999999991,-102.041523999999995 37.375017999999997,-102.042089000000004 37.352818999999997,-102.041973999999996 37.352612999999998,-102.041816999999995 37.309489999999997,-102.041663999999997 37.29764999999999,-102.041962999999996 37.258164,-102.042001999999997 37.141744000000003,-102.042135000000002 37.125020999999997,-102.042091999999997 37.125020999999997,-102.041808999999986 37.111972999999999,-102.041983000000002 37.106551000000003,-102.04191999999999 37.035083,-102.041748999999996 37.034396999999998,-102.041921000000002 37.032178000000002,-102.04195 37.030805,-102.041951999999995 37.024741999999996,-102.042240000000007 36.993082999999999,-102.054502999999997 36.993108999999997,-102.184270999999995 36.993592999999997,-102.208315999999996 36.993729999999999,-102.260789000000003 36.994388,-102.270345681835295 36.994399933337462,-102.307593650497381 36.994446444520669,-102.355288000000002 36.994505999999994,-102.355367 36.994574999999998,-102.698142000000004 36.995148999999998,-102.742059999999981 36.997689,-102.759860000000003 37.000019000000002,-102.77856899999999 36.999242000000002,-102.806762000000006 37.000019000000002,-102.814616 37.000782999999998,-102.841988999999998 36.999597999999999,-102.979613 36.998548999999997,-102.985806999999994 36.998570999999998,-102.986975999999999 36.998524000000003,-103.002199000000005 37.000104,-103.086104969413952 37.000173865694038,-103.10540536532865 37.000189936488113,-103.155922000000004 37.000231999999997,-103.200631728472104 37.000060386509688,-103.327177769406262 36.999574653124313,-103.425678872433053 36.999196567220693,-103.733247000000006 36.998015999999993,-103.734363999999985 36.998041,-104.007854999999992 36.996239000000003,-104.215475488463966 36.994874432196589,-104.250535999999983 36.994644,-104.29757064295984 36.994053250381747,-104.338832999999994 36.993535,-104.355650525350313 36.993556531771581,-104.366447685535107 36.993570355564437,-104.399202882083287 36.993612292614962,-104.429769386650008 36.993651427444888,-104.480610316975273 36.993716519976395,-104.519256999999996 36.993765999999994,-104.624555999999998 36.994376999999993,-104.625545000000002 36.993599000000003,-104.645028999999994 36.993377999999993,-104.706112207267154 36.993426444188657,-104.732031000000006 36.993447000000003,-104.732119999999981 36.993484000000002,-104.839990412520109 36.993395592828207,-105.00055399999998 36.993264000000003,-105.029227999999989 36.99272899999999,-105.120800000000003 36.995427999999997,-105.155041964101514 36.995339147158163,-105.220613 36.995168999999997,-105.251295999999996 36.995604999999998,-105.419309999999996 36.995856000000003,-105.438102743613229 36.995968030697597,-105.442458999999999 36.995994000000003,-105.447254999999998 36.996016999999995,-105.465181999999999 36.995990999999997,-105.47087670692585 36.995978476706256,-105.508835999999988 36.99589499999999,-105.512484999999998 36.995776999999997,-105.533922000000004 36.995874999999998,-105.627469999999988 36.995679000000003,-105.664719999999988 36.995874,-105.716470999999999 36.995848999999993,-105.718407304549174 36.995846016149208,-105.996159000000006 36.995418,-105.997472000000002 36.995417000000003,-106.006633999999991 36.995342999999998,-106.099805867433119 36.994759106704976,-106.163971382218094 36.994356991615014,-106.201468999999989 36.994121999999997,-106.247704999999996 36.994266000000003,-106.248675000000006 36.99428799999999,-106.293278999999998 36.99389,-106.32542867882475 36.994109231664673,-106.343138999999979 36.994230000000002,-106.476277952851959 36.993839335051021,-106.500589000000005 36.993767999999996,-106.617159 36.992967,-106.617124999999987 36.993003999999999,-106.628652000000002 36.993175,-106.628732999999983 36.993160999999994,-106.661344 36.993243,-106.675625999999994 36.993122999999997,-106.750591 36.992460999999999,-106.782095289714647 36.992451749967366,-106.869795999999994 36.992425999999995,-106.877291999999983 37.00013899999999,-106.918886463342702 37.000128747161924,-106.95601836457638 37.000119594324254,-107.107262626744514 37.000082313330452,-107.255202723469637 37.000045846797775,-107.420912999999999 37.000004999999994,-107.422415013680663 37.000004989636103,-107.442181999144324 37.000004853243873,-107.481737001398656 37.00000458031429,-107.524086846417021 37.000004288100286,-107.600713640777798 37.000003759375268,-107.712477900838564 37.000002988201679,-107.855695499501934 37.000002000000002,-107.866308937617532 37.000001926767261,-107.869139908586362 37.000001907233546,-107.869180699306327 37.0000019069521,-108.000623000000004 37.000000999999997,-108.179187075278463 36.999293161624927,-108.187139540298872 36.999261637591275,-108.249358 36.999015,-108.250634999999988 36.999561,-108.288086000000007 36.999555,-108.288399999999996 36.999519999999997,-108.320464 36.999499,-108.320720999999992 36.99951,-108.379165570428881 36.999458977707043,-108.619688999999994 36.999248999999999,-108.620309000000006 36.999287000000002,-108.749269825405847 36.999139933822768,-108.954403999999997 36.998905999999998,-108.958867999999995 36.998913000000002,-109.045222999999993 36.999084000000003,-109.04516599999998 37.072741999999998,-109.045057999999997 37.074660999999999,-109.044995 37.086429000000003,-109.045188999999993 37.096270999999994,-109.045173000000005 37.109464000000003,-109.045202999999987 37.111957999999994,-109.045155999999992 37.112063999999997,-109.045995000000005 37.177278999999999,-109.045978000000005 37.201830999999999,-109.045801505106283 37.205070813598866,-109.045486999999994 37.210844000000002,-109.045559879533187 37.239775672002708,-109.04556019774752 37.239901996533845,-109.045583999999991 37.249350999999997,-109.046038999999993 37.249993000000003,-109.045898042273308 37.32693499054853,-109.045810000000003 37.374993000000003,-109.043799132325617 37.469028334242019,-109.043463783260819 37.484710450871816,-109.043424942780035 37.486526770085334,-109.043137000000002 37.499991999999999,-109.041915000000003 37.530653,-109.041865 37.530726,-109.041805999999994 37.604171,-109.042130999999998 37.617662000000003,-109.042089000000004 37.623795,-109.042269000000005 37.666066999999998,-109.041731999999996 37.711213999999998,-109.041759999999996 37.713182000000003,-109.041635999999997 37.740209999999998,-109.042097999999996 37.749989999999997,-109.042042148900066 37.754383999799849,-109.041460999999998 37.800105000000002,-109.041753999999997 37.83582599999999,-109.04172299999999 37.842050999999998,-109.041843999999998 37.872788,-109.041652818578953 37.881166902788557,-109.041058000000007 37.907235999999997,-109.043120999999985 37.97426,-109.042818999999994 37.997067999999999,-109.042819999999992 37.999301000000003,-109.041972403965843 38.131799166817459,-109.041836656974709 38.153019449536792,-109.041761999999991 38.16469,-109.054648 38.244920999999998,-109.060061999999988 38.275489,-109.059961999999999 38.49998699999999,-109.060253000000003 38.599327999999993,-109.059540999999996 38.719887999999997,-109.057388000000003 38.795455999999994,-109.057216044916757 38.799730849597076,-109.054188999999994 38.874983999999998,-109.05394299999999 38.904414000000003,-109.053797000000003 38.905283999999995,-109.053233000000006 38.942467,-109.053291999999985 38.942878,-109.052435999999986 38.999985000000002,-109.051587912503535 39.115734257770079,-109.051583515738272 39.116334340093104,-109.051580780636755 39.116707634089543,-109.051512000000002 39.126094999999999,-109.050764999999998 39.366677000000003,-109.051362999999981 39.497674000000004,-109.051040248333237 39.660472011844121,-109.050614999999993 39.874969999999998,-109.050872999999996 40.058914999999999,-109.050813000000005 40.059578999999992,-109.050944 40.180711999999993,-109.050972999999999 40.180849000000002,-109.050968715822648 40.22266241227041,-109.050945999999996 40.444367999999997,-109.050314 40.495092,-109.050697999999983 40.499963,-109.049954999999997 40.539901,-109.050073999999995 40.540357999999998,-109.050071964046666 40.540437104308737,-109.048044000000004 40.619230999999999,-109.048248999999998 40.653600999999995,-109.049087999999998 40.714562,-109.048455000000004 40.826081000000002,-109.050076000000004 41.000658999999999,-108.884137999999993 41.000093999999997,-108.631107999999998 41.00015599999999,-108.526667000000003 40.999608000000002,-108.500658999999999 41.000112,-108.250648999999996 41.000114000000004,-108.181227000000007 41.000454999999995,-108.089219003138552 41.001554139247368,-108.046538999999996 41.002063999999997,-107.923234122395939 41.0020370519008,-107.918420999999981 41.002035999999997))'));
+INSERT INTO geoapp_state (`name`, `poly`) VALUES ('Kansas', GeomFromText('POLYGON ((-102.051743999999999 40.003078000000002,-101.916696000000002 40.003141999999997,-101.904176000000007 40.003162000000003,-101.861740775252272 40.002907997451267,-101.841025000000002 40.002783999999991,-101.832160999999999 40.002932999999999,-101.807687 40.002797999999999,-101.804861999999986 40.002752,-101.783266423091504 40.002735966476642,-101.748492901329186 40.002710149056902,-101.627071 40.00262,-101.625809000000004 40.002710999999998,-101.579641080501318 40.002654627564297,-101.54227299999998 40.002608999999993,-101.417209 40.002423999999998,-101.411050023557621 40.002364583193085,-101.409952999999987 40.002353999999997,-101.387325211262052 40.00246006676732,-101.374325999999996 40.002520999999994,-101.342859000000004 40.002580000000002,-101.324035999999992 40.002695999999993,-101.293991000000005 40.002558999999998,-101.286555000000007 40.002558999999998,-101.248672999999997 40.002543000000003,-101.215033000000005 40.002555,-101.19221899999998 40.002490999999999,-101.186892990733696 40.002481867883319,-101.178804999999997 40.002468,-101.168704000000005 40.002547,-101.130906999999993 40.002426999999997,-101.104950380573442 40.002382874850099,-101.104950380567658 40.002382874850092,-101.060316999999998 40.002307000000002,-101.027686000000003 40.002255999999996,-100.962089380046322 40.00217532965339,-100.937427 40.002144999999999,-100.764559455237134 40.002296963384197,-100.758829999999989 40.002301999999993,-100.752183000000002 40.002127999999992,-100.7388309887763 40.002228385746484,-100.733295999999996 40.002270000000003,-100.729904000000005 40.002110999999999,-100.721127999999993 40.002068999999999,-100.683435000000003 40.002234,-100.660229999999984 40.002161999999998,-100.645444999999995 40.001882999999999,-100.626504856699498 40.001892789287538,-100.600944999999996 40.001905999999998,-100.594756999999987 40.001976999999997,-100.567238000000003 40.001888999999998,-100.551885999999996 40.001888999999998,-100.514429898999168 40.001844039098764,-100.511064999999988 40.00184,-100.487159000000005 40.001767,-100.477018 40.001752000000003,-100.475853999999998 40.001767999999998,-100.468772999999985 40.001724000000003,-100.447071999999991 40.001795,-100.439081000000002 40.001773999999997,-100.402449685831499 40.001800164690437,-100.390079999999998 40.001809000000002,-100.290126736823893 40.001691651381378,-100.231651999999997 40.001623000000002,-100.229478999999998 40.001692999999996,-100.215406000000002 40.001629,-100.196958999999993 40.001494,-100.19359 40.001573,-100.190323000000006 40.001586000000003,-100.188181 40.001541000000003,-100.177823000000004 40.001593,-99.990926000000002 40.001503,-99.986610999999996 40.001550000000002,-99.948166999999998 40.001812999999999,-99.944417 40.001584,-99.930432999999979 40.001516000000002,-99.906657999999993 40.001511999999998,-99.850154757615712 40.001444140609848,-99.813400999999999 40.001399999999997,-99.775639999999981 40.001646999999998,-99.772120999999984 40.001804,-99.764213999999996 40.001550999999999,-99.756834999999995 40.001342,-99.746628 40.001820000000002,-99.737774855821357 40.001824224692157,-99.731959000000003 40.001826999999992,-99.719639 40.001807999999997,-99.628345999999993 40.001866,-99.625979999999984 40.001865000000002,-99.515340365578794 40.002008435606839,-99.501791999999995 40.002026,-99.498998999999984 40.00195699999999,-99.497659999999982 40.001911999999997,-99.493464999999986 40.001936999999998,-99.480727999999999 40.001942,-99.423564999999996 40.002270000000003,-99.412644999999998 40.001867999999995,-99.403389000000004 40.001969000000003,-99.366747146128873 40.001962496644857,-99.290702999999979 40.001949000000003,-99.286655999999994 40.002017000000002,-99.282966999999999 40.001879000000002,-99.254012000000003 40.002074,-99.25036999999999 40.00195699999999,-99.216375999999997 40.002015999999998,-99.197591999999986 40.002032999999997,-99.188905000000005 40.002023,-99.186961999999994 40.001976999999997,-99.178965000000005 40.001976999999997,-99.169815999999997 40.001925,-99.123032999999992 40.002164999999998,-99.113510000000005 40.002192999999998,-99.085596999999993 40.002132999999994,-99.067047050731574 40.00217023690761,-99.020337999999995 40.00226399999999,-99.018700999999993 40.002333,-98.992135000000005 40.002192,-98.972286999999994 40.002245000000002,-98.971721000000002 40.002268,-98.961009000000004 40.002316999999998,-98.96091899999999 40.002271,-98.953888072580213 40.002253239016738,-98.934791999999987 40.002204999999996,-98.8435956659672 40.002348607685946,-98.842134005327992 40.002350909376077,-98.834455999999989 40.002363000000003,-98.820589999999982 40.002319,-98.777203 40.002358999999998,-98.774940999999998 40.002336,-98.729330606936671 40.002229113826232,-98.726294999999993 40.002222000000003,-98.710403999999997 40.002180000000003,-98.693095999999997 40.002372999999999,-98.691443000000007 40.002504999999999,-98.690286999999998 40.002547999999997,-98.672819000000004 40.002364,-98.669723999999988 40.002409999999998,-98.653832999999992 40.002268999999998,-98.652494000000004 40.002245000000002,-98.640709999999984 40.002493,-98.616372379820518 40.002409030470169,-98.613754999999998 40.002400000000002,-98.593342000000007 40.002475999999994,-98.575219000000004 40.002479999999991,-98.560578000000007 40.002274,-98.543186000000006 40.002285,-98.523053000000004 40.002336,-98.506634585466017 40.002329436673158,-98.504454999999979 40.002328565375151,-98.50084801790743 40.002327123469641,-98.490532999999999 40.002322999999997,-98.441997554675297 40.002366263566756,-98.391848301995964 40.002410965650498,-98.274015000000006 40.002516,-98.268218000000005 40.002490000000002,-98.25000799999998 40.002307000000002,-98.213290432425865 40.002506421375415,-98.193483 40.002614,-98.179315000000003 40.002482999999998,-98.172269 40.002437999999991,-98.156873151934732 40.002445128178877,-98.142031000000003 40.002451999999998,-98.099659000000003 40.002226999999998,-98.076034000000007 40.002300999999996,-98.068701000000004 40.002355,-98.050056999999981 40.002277999999997,-98.047469000000007 40.002186000000002,-98.042767978165202 40.002191261754177,-98.014411999999979 40.002223,-98.010157000000007 40.002153,-97.972185999999994 40.002113999999999,-97.931810999999996 40.002049999999997,-97.876261 40.002102,-97.85745 40.002065000000002,-97.838378999999989 40.001909999999995,-97.821597999999994 40.002003999999992,-97.819426000000007 40.001957999999995,-97.777154999999993 40.002167,-97.770775999999998 40.001976999999997,-97.769204000000002 40.001995,-97.767746000000002 40.001994000000003,-97.714825952022949 40.001974503868432,-97.706952472912022 40.001971603221314,-97.701160424072398 40.001969469388285,-97.61370959051284 40.001937251863488,-97.595964207410262 40.001930714334961,-97.593671575073259 40.001929869712491,-97.51530799999999 40.001900999999997,-97.511381 40.001899000000002,-97.510264000000006 40.001835,-97.48896951184885 40.0019310946697,-97.481234094494141 40.001966001936331,-97.463284999999999 40.00204699999999,-97.444661999999994 40.001957999999995,-97.425443 40.002048000000002,-97.417825999999991 40.002023999999999,-97.415833000000006 40.002000999999993,-97.369102999999996 40.00206,-97.350896000000006 40.001930000000002,-97.350272000000004 40.001975999999999,-97.256541388870858 40.001563097676062,-97.24516899999999 40.001513000000003,-97.245080000000002 40.001466999999998,-97.202309999999997 40.00144199999999,-97.200190000000006 40.001548999999997,-97.181775000000002 40.001550000000002,-97.165136038800085 40.001526729909067,-97.164288093539042 40.001525544031956,-97.157705785150654 40.001516338474417,-97.144150390621661 40.001497380844818,-97.142447999999987 40.001494999999998,-97.137865999999988 40.001814000000003,-97.049662999999995 40.001322999999999,-97.030802999999992 40.001342,-97.009164999999996 40.001463,-96.918187714380807 40.001505032225388,-96.916093000000004 40.001505999999999,-96.880459000000002 40.001448000000003,-96.878253 40.001466,-96.875056999999998 40.001448000000003,-96.873812 40.001449999999998,-96.868892342573133 40.001444286089438,-96.805301797100199 40.001370429180717,-96.693246065483095 40.001240282633297,-96.622400999999996 40.001157999999997,-96.610348999999999 40.000881,-96.604883999999984 40.000891000000003,-96.581788013355691 40.000963078853125,-96.580851999999993 40.000965999999998,-96.570853999999997 40.001090999999995,-96.557862999999998 40.000968,-96.538977000000003 40.000850999999997,-96.527110999999991 40.001030999999998,-96.469944999999996 40.000965999999998,-96.467535999999996 40.001035000000002,-96.463639999999998 40.000967000000003,-96.354812913341547 40.000735780492882,-96.350953725714731 40.00072758106856,-96.341811057717251 40.000708156095854,-96.304554999999993 40.000629000000004,-96.301066000000006 40.000632000000003,-96.239171999999996 40.000691000000003,-96.223838999999998 40.000729,-96.220170999999993 40.00072,-96.154364999999984 40.000495,-96.154246 40.00045,-96.147166999999982 40.000478999999999,-96.125936999999979 40.000432000000004,-96.125788 40.000467,-96.089781000000002 40.000518999999997,-96.081394999999986 40.000602999999998,-96.051691000000005 40.000726999999998,-96.02409 40.000718999999997,-96.014716997898134 40.000662392993569,-96.010677999999999 40.000638000000002,-95.995389500007406 40.000603953777215,-95.958139000000003 40.000520999999999,-95.901560435593936 40.000482839492363,-95.882524000000004 40.00047,-95.788023999999993 40.000452000000003,-95.784575000000004 40.000463000000003,-95.672891827756033 40.000336669594915,-95.658762261555324 40.000320686938032,-95.63965170807073 40.000299070038061,-95.565216789143676 40.000214872989645,-95.463103327781397 40.00009936736172,-95.455130658279359 40.000090349077695,-95.452048066669519 40.000086862204618,-95.438655850967621 40.000071713601649,-95.436011808705814 40.000068722793607,-95.426269559489981 40.00005770284973,-95.42148745056565 40.000052293567869,-95.41484447973599 40.000044779372317,-95.375257000000005 40.0,-95.339895999999982 39.999999000000003,-95.326448603970363 39.999998574530281,-95.30829 39.999997999999998,-95.308403999999996 39.993758,-95.307779999999994 39.990617999999998,-95.307111000000006 39.989114,-95.302506999999991 39.984357000000003,-95.289715 39.977705999999998,-95.274756999999994 39.972115000000002,-95.269885999999985 39.969396000000003,-95.261854 39.960617999999997,-95.257651999999993 39.954886000000002,-95.250253999999998 39.948644000000002,-95.241382999999999 39.944949,-95.236761 39.943930999999999,-95.231114000000005 39.943784,-95.220212000000004 39.944432999999997,-95.216440000000006 39.943953,-95.213736999999995 39.943205999999996,-95.204427999999993 39.938949,-95.201277000000005 39.934193999999998,-95.200689999999994 39.928154999999997,-95.20201 39.922438,-95.205744999999993 39.915168999999999,-95.206326000000004 39.912120999999999,-95.206195999999991 39.909557,-95.205732999999981 39.908275000000003,-95.202631127107011 39.904826841138963,-95.201935000000006 39.904052999999998,-95.19982446963148 39.902956959499498,-95.199773390195176 39.902930432929807,-95.199730682369619 39.902908253904485,-95.199347000000003 39.902709000000002,-95.193815999999984 39.900689999999997,-95.189565000000002 39.899959000000003,-95.179452999999995 39.900061999999991,-95.172296000000003 39.902025999999999,-95.159833999999989 39.906984,-95.156023999999988 39.907243,-95.153185481864639 39.906665666721331,-95.151701132402337 39.906363761184394,-95.149656999999991 39.905947999999995,-95.148243978290679 39.905255611516672,-95.146055000000004 39.904183000000003,-95.143801999999994 39.901917999999995,-95.142562999999981 39.897992000000002,-95.142444999999995 39.895419999999994,-95.143403000000006 39.889355999999992,-95.142718000000002 39.885888999999992,-95.140601000000004 39.88168799999999,-95.137091999999996 39.878350999999995,-95.134747000000004 39.876852,-95.128165999999993 39.874164999999998,-95.105912000000004 39.869163999999998,-95.090958483530287 39.863446088154532,-95.090158000000002 39.86314,-95.085003 39.861882999999999,-95.081534000000005 39.861718000000003,-95.079786043666886 39.861878094210859,-95.052535000000006 39.864373999999998,-95.042141999999998 39.864804999999997,-95.037767000000002 39.865541999999998,-95.034318031759739 39.867229060943565,-95.032053000000005 39.868336999999997,-95.031002514960235 39.869148692103728,-95.027930999999981 39.871521999999999,-95.025918959417425 39.87568321107333,-95.025422000000006 39.876711,-95.025119000000004 39.878833,-95.02586205726584 39.885935119809076,-95.025947000000002 39.886747,-95.025771840138887 39.887478608302466,-95.025475064075451 39.888718183571669,-95.025239999999997 39.889699999999998,-95.024388999999999 39.891202,-95.021897459019584 39.893924778577606,-95.019088516216428 39.896994416745422,-95.018742999999986 39.89737199999999,-95.018224596337973 39.897611313155366,-95.013151999999991 39.899952999999996,-95.010684182587667 39.900289758615472,-95.008439999999993 39.900596,-95.003818999999993 39.900400999999995,-94.990284000000003 39.897010000000002,-94.989784913598129 39.896958718834505,-94.987823822157509 39.896757216540813,-94.986975 39.89667,-94.985308455245701 39.896814869812808,-94.979390624873346 39.897329296428744,-94.977748999999989 39.897472,-94.963345000000004 39.901136,-94.959276000000003 39.901671,-94.958440298615102 39.901548064610132,-94.95153999999998 39.900532999999996,-94.943866999999983 39.898130000000002,-94.935306395585215 39.893779379194363,-94.934493000000003 39.893366,-94.929574000000002 39.888753999999992,-94.927897000000002 39.88611199999999,-94.927358999999996 39.883966,-94.927251999999996 39.880257999999991,-94.928466 39.876344000000003,-94.931084167287821 39.873075003673321,-94.931462999999994 39.872602,-94.938790999999995 39.866954,-94.940742999999998 39.864409999999999,-94.942407000000003 39.861065999999994,-94.942566999999983 39.856601999999995,-94.939767000000003 39.851930000000003,-94.937655000000007 39.849786000000002,-94.926149999999993 39.841321999999998,-94.916917999999995 39.836137999999998,-94.909941999999987 39.834426,-94.903156999999979 39.833849999999998,-94.892677000000006 39.834377999999994,-94.889493000000002 39.834026,-94.886932999999999 39.833098,-94.881012999999996 39.828921999999991,-94.878676999999996 39.826521999999997,-94.877043999999998 39.823754,-94.876543999999996 39.820594,-94.875944000000004 39.813293999999999,-94.87632679569893 39.807169268817198,-94.876344000000003 39.806894,-94.876705972386588 39.80614007495069,-94.880932 39.797338000000003,-94.884084 39.794234000000003,-94.890292000000002 39.791626,-94.892965000000004 39.791097999999991,-94.912908274541266 39.790276806342419,-94.92474489359239 39.789789416146199,-94.925605000000004 39.789753999999995,-94.925940683661906 39.789631963361245,-94.927258709273417 39.789152799691166,-94.929653999999999 39.788281999999995,-94.93035270914757 39.787827111232048,-94.930442023078356 39.787768964141691,-94.930979872832452 39.787418801541357,-94.932726000000002 39.786282,-94.932913349551853 39.786043884763131,-94.935059195246907 39.783316584105528,-94.935205999999994 39.78313,-94.935782000000003 39.778905999999999,-94.935301999999993 39.77561,-94.935036741896766 39.775108050050804,-94.934624304242575 39.774327591105198,-94.934262000000004 39.773642000000002,-94.929652999999988 39.769098,-94.929421387607832 39.768921584953624,-94.928626586797606 39.768316199289764,-94.926229000000006 39.76648999999999,-94.923991330811134 39.765173947104167,-94.916788999999994 39.760937999999996,-94.912293000000005 39.759337999999993,-94.906244 39.759417999999997,-94.905921454535701 39.759501730763866,-94.900921941190049 39.760799572828766,-94.899156000000005 39.761257999999998,-94.899025621234756 39.761323457651685,-94.895268000000002 39.76321,-94.895041000000006 39.763350000000003,-94.894070999999997 39.763945999999997,-94.893918999999997 39.76404,-94.893724000000006 39.764159999999997,-94.893646000000004 39.764208000000004,-94.883923999999993 39.770186000000002,-94.881460000000004 39.771258000000003,-94.881422 39.771258000000003,-94.874706321154179 39.772392308082928,-94.871144 39.772993999999997,-94.869643999999994 39.772894,-94.867142999999999 39.771693999999997,-94.865243000000007 39.770094,-94.863142999999994 39.767294,-94.860742999999999 39.763094000000002,-94.859442999999999 39.753694000000003,-94.860369889104035 39.749534984666809,-94.860371 39.74953,-94.862942999999987 39.742994000000003,-94.870142999999999 39.734594,-94.875642999999997 39.730494,-94.884142999999995 39.726793999999998,-94.891743999999989 39.724893999999999,-94.899315999999999 39.724041999999997,-94.900553640444031 39.724102079633198,-94.901582061073228 39.724152002964722,-94.902612000000005 39.724201999999998,-94.906055088082866 39.724933471502588,-94.907014260749904 39.725137244236571,-94.907785666538786 39.725301126582274,-94.910067999999995 39.725785999999999,-94.911087398893699 39.726157408899255,-94.918323999999998 39.728793999999994,-94.93000499999998 39.735370000000003,-94.939221000000003 39.74157799999999,-94.944740999999979 39.744377,-94.948658825773634 39.745572502168315,-94.948680784417533 39.745579202723142,-94.948725999999994 39.745593,-94.952629999999999 39.745961,-94.955286 39.745688999999999,-94.960086000000004 39.743065,-94.963779819772341 39.740240978767318,-94.964692434782606 39.73954326086956,-94.965317999999982 39.739064999999989,-94.965565209393333 39.738728671232884,-94.970224508542714 39.732389687437191,-94.970421999999985 39.732120999999999,-94.971205999999981 39.729304999999997,-94.971078000000006 39.723146,-94.968452999999997 39.707402000000002,-94.968980999999999 39.692954,-94.969909 39.689050000000002,-94.971316999999999 39.686410000000002,-94.976096392737759 39.68160006801152,-94.976325000000003 39.68137,-94.981556999999995 39.678634000000002,-94.984149000000002 39.677849999999992,-94.986445080691666 39.677537608069159,-94.990587390516794 39.676974028501114,-94.993556999999996 39.676569999999998,-94.998766892420107 39.676509388876212,-95.001379 39.676479,-95.004602740773237 39.676177881356345,-95.008105239221649 39.675850724907868,-95.009022999999999 39.675764999999998,-95.010225986948086 39.675477408241932,-95.013209713780839 39.674764104372102,-95.015309999999985 39.674261999999999,-95.018317999999994 39.672868999999999,-95.021521942351953 39.670631293568427,-95.024595000000005 39.668484999999997,-95.027643999999995 39.665453999999997,-95.037464 39.652904999999997,-95.039049000000006 39.649639,-95.044554000000005 39.644370000000002,-95.049518000000006 39.637875999999999,-95.053366999999994 39.630347,-95.054924999999997 39.624994999999991,-95.055024819926729 39.623527163368095,-95.055152000000007 39.621656999999992,-95.054958456554544 39.620961328886679,-95.053131423647116 39.614394255464305,-95.053011999999981 39.613965,-95.052555891387243 39.613278556984888,-95.047910999999999 39.606287999999999,-95.046445000000006 39.601605999999997,-95.046361000000005 39.599556999999997,-95.047165000000007 39.595117000000002,-95.049277000000004 39.589582999999998,-95.054804000000004 39.582487999999998,-95.056897000000006 39.580567000000002,-95.059518999999995 39.579132,-95.064519000000004 39.577114999999999,-95.066275551338904 39.576786470694117,-95.068266439890465 39.576414113098046,-95.069315000000003 39.576217999999997,-95.072159999999982 39.576121999999991,-95.075842551355763 39.576644128527029,-95.076688000000004 39.576763999999997,-95.088569515113861 39.580713698327401,-95.089515000000006 39.581028000000003,-95.09068217809525 39.58095107619048,-95.095736000000002 39.580618,-95.099095000000005 39.579690999999997,-95.100375015351446 39.579100080742663,-95.10182940536555 39.578428661399109,-95.103228 39.577782999999997,-95.106109962410699 39.575487768136732,-95.106244982404746 39.575380236480051,-95.106274453941239 39.575356764970024,-95.106406000000007 39.575251999999999,-95.107454000000004 39.573842999999997,-95.108931052511622 39.56997896968771,-95.109155613535791 39.569391508783276,-95.112830712234896 39.559777298955126,-95.112877844119652 39.559653999999995,-95.113077000000004 39.559132999999996,-95.113262990573148 39.557121201967142,-95.113516735173974 39.554376531201555,-95.113557 39.553940999999995,-95.113330390574859 39.553319942050457,-95.109694540741444 39.543355336910984,-95.109303999999995 39.542284999999993,-95.106595999999996 39.537657000000003,-95.106363136618171 39.537386330858773,-95.106309238275287 39.537323682029822,-95.102887999999993 39.533346999999999,-95.096713422649174 39.527826015970483,-95.095319522838992 39.526579663685382,-95.092703999999998 39.524241000000004,-95.082713999999996 39.516711999999998,-95.077440999999993 39.513551999999997,-95.059460999999985 39.506143000000002,-95.05637999999999 39.503971999999997,-95.052176999999986 39.499995999999996,-95.050551999999996 39.497514000000002,-95.049844999999991 39.494414999999989,-95.048370000000006 39.480420000000002,-95.047133000000002 39.474970999999996,-95.045715999999999 39.472459,-95.040779999999998 39.466386999999997,-95.03749999999998 39.463689000000002,-95.033407999999994 39.460875999999992,-95.028497999999999 39.458286999999999,-95.015825000000007 39.452809000000002,-94.995767999999998 39.448174000000002,-94.990172 39.446192000000003,-94.982144000000005 39.440551999999997,-94.978797999999998 39.436241000000003,-94.976606000000004 39.426701,-94.972952000000006 39.421705000000003,-94.968547467194298 39.418879728230785,-94.966981164652054 39.417875029083376,-94.966065999999998 39.417287999999999,-94.965430539155946 39.417093446959996,-94.954817000000006 39.413843999999997,-94.951209000000006 39.411706999999993,-94.947863999999996 39.408603999999997,-94.946292999999983 39.405645999999997,-94.946662000000003 39.399717000000003,-94.946226999999993 39.395648,-94.945577 39.393850999999998,-94.942038999999994 39.389499,-94.939696999999995 39.387949999999996,-94.938205659338905 39.38711651736979,-94.938199994953891 39.387113351650086,-94.938198708293527 39.387112632559479,-94.937157999999982 39.386530999999998,-94.933651999999995 39.385545999999998,-94.932170703908099 39.385397898493565,-94.923109999999994 39.384492000000002,-94.919224999999997 39.385173999999999,-94.915858999999998 39.386347999999998,-94.909581000000003 39.388865000000003,-94.901822999999993 39.392797999999999,-94.896448416922993 39.39340032396553,-94.894979000000006 39.393565000000002,-94.891845000000004 39.393312999999999,-94.888971999999995 39.392431999999999,-94.888058227506249 39.391822741147728,-94.885025999999996 39.389800999999999,-94.880978999999996 39.383899,-94.879281000000006 39.37977999999999,-94.879087999999996 39.375702999999994,-94.881359999999987 39.370382999999997,-94.885216 39.366911000000002,-94.890928000000002 39.364030999999997,-94.896832000000003 39.363135,-94.899023999999997 39.362431,-94.902496999999997 39.360382999999999,-94.90716104958679 39.35683832231404,-94.907297 39.356735,-94.907510470967722 39.356484333333356,-94.909408999999997 39.354254999999995,-94.910016999999996 39.352542999999997,-94.91007929967077 39.352122876579188,-94.910166635146069 39.351533921963672,-94.910234386079424 39.351077037464393,-94.910640999999998 39.348334999999999,-94.910055514481613 39.342727430625168,-94.908683540921714 39.329587162119807,-94.908064999999993 39.323663000000003,-94.906599414484603 39.317389801180319,-94.905982468129508 39.31474906332776,-94.905548856768945 39.312893060899633,-94.905328999999995 39.311951999999998,-94.904604536115073 39.31007473956825,-94.903592654247163 39.307452709910535,-94.903137 39.306272,-94.902341179156608 39.304705098857582,-94.900693838394318 39.301461629999167,-94.900362755471093 39.300809756886117,-94.900048999999996 39.300192000000003,-94.895217000000002 39.29420799999999,-94.889432625546704 39.288730528394183,-94.887056 39.286479999999997,-94.882576 39.283327999999997,-94.881425972827699 39.282735692772164,-94.879585687759075 39.281787876778168,-94.878319999999988 39.281135999999996,-94.869470269042495 39.278423959123423,-94.867567999999991 39.277841000000002,-94.866576416802303 39.277461598502107,-94.857072000000002 39.273825000000002,-94.850573678793964 39.270595179638669,-94.850470600187833 39.270543947117169,-94.846320000000006 39.268481,-94.844203868589133 39.266965084952687,-94.840994595225254 39.264666085108807,-94.837855000000005 39.262416999999999,-94.836102527271095 39.260730409704507,-94.834879550067882 39.259553409087879,-94.832501320107042 39.257264586268427,-94.832102355305352 39.256880620143498,-94.831470999999993 39.256273,-94.827487000000005 39.249888999999996,-94.826571473591798 39.245793223963304,-94.825663000000006 39.241728999999999,-94.826110999999983 39.238289000000002,-94.826405091238243 39.237538367125239,-94.827108391663188 39.2357432765168,-94.827791000000005 39.234000999999999,-94.828117769197533 39.233533772937683,-94.83244435695299 39.227347452739551,-94.834698551534771 39.224124319346686,-94.834896 39.223841999999998,-94.834917496024659 39.223414229109203,-94.835039139715306 39.220993519665384,-94.835046603087861 39.220844998551456,-94.835055999999994 39.220658,-94.833551999999997 39.217793999999998,-94.831678999999994 39.215938,-94.823791 39.209873999999999,-94.820687000000007 39.208626000000002,-94.811662999999996 39.206594000000003,-94.800359054554335 39.206051410618606,-94.799662999999995 39.206018,-94.798924306591658 39.206116812235138,-94.793913945984244 39.206787029303406,-94.788135068391796 39.207560047994349,-94.787343000000007 39.207666000000003,-94.783838000000003 39.207154000000003,-94.781518000000005 39.206145999999997,-94.780294078498926 39.205273290755756,-94.778971577769184 39.204330290235411,-94.777838000000003 39.203522,-94.775537999999997 39.200602000000003,-94.770897097034492 39.191141697801093,-94.770859400196969 39.191064854247678,-94.770337999999995 39.190002,-94.763137999999998 39.179903000000003,-94.75233799999998 39.173202999999994,-94.74193799999999 39.170203,-94.736536999999998 39.169203000000003,-94.723636999999997 39.169002999999989,-94.714136999999994 39.170403,-94.696331999999998 39.178562999999997,-94.687235999999999 39.183503000000002,-94.680335999999983 39.184303,-94.669134999999997 39.182003000000002,-94.663835000000006 39.179102999999998,-94.660314999999997 39.168050999999991,-94.662434999999988 39.157602999999995,-94.650734999999983 39.154102999999999,-94.640034999999997 39.153102999999994,-94.623934000000006 39.156602999999997,-94.615834000000007 39.160003000000003,-94.608834000000002 39.160502999999999,-94.601732999999996 39.15960299999999,-94.596033000000006 39.157702999999998,-94.591932999999997 39.155003,-94.589933000000002 39.140402999999999,-94.592533000000003 39.135902999999992,-94.600433999999993 39.128503000000002,-94.605733999999998 39.122204000000004,-94.607033999999999 39.119404000000003,-94.607354 39.113444,-94.607234000000005 39.089604,-94.607333999999994 39.081703999999995,-94.607275518421304 39.072346947409343,-94.607234000000005 39.065703999999997,-94.607342812841125 39.057404745686583,-94.60738379566331 39.05427894858029,-94.607437239929951 39.050202705779334,-94.607518499034526 39.044004999999999,-94.607559479691474 39.040879368039988,-94.607612854426819 39.036808428453341,-94.60764748233197 39.034167326647299,-94.607654028188094 39.033668068249817,-94.60769507925167 39.030537066312085,-94.607898722639391 39.015005000000002,-94.607914652765047 39.013789994834404,-94.607991843462372 39.007902590176151,-94.608087526605189 39.000604749887366,-94.608092759229436 39.000205652880325,-94.608190956218394 38.992716079262479,-94.608212339138063 38.991085184540211,-94.608264438806202 38.98711149548862,-94.608279957450691 38.985927874365181,-94.608301211867541 38.984306780669819,-94.608333999999999 38.981805999999999,-94.608294286905348 38.97390309416464,-94.608273484679671 38.969763451253407,-94.608249262127771 38.964943163424849,-94.608207879518076 38.956708024096379,-94.608134000000007 38.942005999999999,-94.608134000000007 38.940005999999997,-94.607866 38.937398000000002,-94.607977999999989 38.936869999999992,-94.608002838442587 38.912906322207348,-94.608006216770249 38.909646973100827,-94.608010407202343 38.90560412040071,-94.608022064178897 38.894357681354862,-94.60802273861259 38.893706999999999,-94.608033000000006 38.883806999999997,-94.608033000000006 38.869207000000003,-94.608033000000006 38.868107000000002,-94.607992999999993 38.867271000000002,-94.608033000000006 38.861207,-94.608033000000006 38.855007,-94.608033000000006 38.850107,-94.608033000000006 38.847206999999997,-94.607624999999999 38.827559999999991,-94.607668973053535 38.825816299300072,-94.608041 38.811064000000002,-94.608617609754887 38.781926100280451,-94.609398999999996 38.742440000000002,-94.60945599999998 38.74069999999999,-94.609507757106428 38.73815999467709,-94.609625656590424 38.7323740198146,-94.610322172686637 38.698192151600097,-94.61071084056907 38.679118085101081,-94.61073851283922 38.677760054904219,-94.611602000000005 38.635384000000002,-94.611464999999995 38.625011,-94.611857999999998 38.620485000000002,-94.611908 38.609271999999997,-94.611905562149673 38.605890005062435,-94.611886999999996 38.580139000000003,-94.611902 38.580109999999998,-94.612176000000005 38.576546,-94.612156999999996 38.549816999999997,-94.612272000000004 38.547916999999998,-94.612464742072774 38.518760616499996,-94.612644000000003 38.491644,-94.612725999999995 38.484366999999999,-94.612696 38.483153999999999,-94.612865999999997 38.477570999999998,-94.613365000000002 38.403421999999999,-94.613264999999998 38.392426,-94.613275404637193 38.388718047420433,-94.613328999999993 38.369617999999996,-94.613311999999993 38.364407,-94.613085455228386 38.3436360393057,-94.612999999999985 38.335800999999996,-94.612825 38.324387000000002,-94.612787999999995 38.320141999999997,-94.612673 38.314832000000003,-94.612673 38.302526999999998,-94.612689368276676 38.301464114946214,-94.612843999999996 38.291422999999995,-94.612848999999997 38.289914000000003,-94.612707829046002 38.272362044447966,-94.612691999999996 38.270394000000003,-94.612613999999994 38.237766,-94.612634999999997 38.226987,-94.612658999999994 38.219251,-94.61265866950464 38.21872154645218,-94.612657999999982 38.217649000000002,-94.612821999999994 38.203918000000002,-94.612848 38.200713999999998,-94.613073 38.190551999999997,-94.61341774677895 38.168183959706163,-94.613422 38.16790799999999,-94.613748 38.160632999999997,-94.613855999999998 38.149768999999999,-94.613889466360249 38.136312911169284,-94.613919497343275 38.124238112111762,-94.614061000000007 38.067343,-94.614088999999993 38.065900999999997,-94.614054999999993 38.060088,-94.613980999999995 38.036949,-94.614211999999981 37.992462000000003,-94.614464999999996 37.987798999999995,-94.614511123427164 37.979395512107736,-94.614514360688489 37.978805697169918,-94.614557000000005 37.971036999999995,-94.614561999999992 37.951517000000003,-94.614593999999997 37.949977999999994,-94.614611999999994 37.944361999999998,-94.614754000000005 37.940769000000003,-94.614834999999999 37.936700000000002,-94.614778 37.934199999999997,-94.615181000000007 37.915944000000003,-94.615392999999983 37.906391999999997,-94.61546899999999 37.901775,-94.615706000000003 37.886842999999999,-94.615921 37.878331000000003,-94.615834000000007 37.872509999999998,-94.616 37.863126,-94.616282760205394 37.851281931678621,-94.616426000000004 37.845281999999997,-94.616433230053673 37.842955730230052,-94.61645 37.837560000000003,-94.616861999999998 37.819456000000002,-94.6176681324215 37.775831003788085,-94.617720999999989 37.77297,-94.617737774720197 37.764628336555312,-94.617744979193901 37.761045725680312,-94.617807999999997 37.729706999999998,-94.617975 37.722175999999997,-94.61780499999999 37.690178000000003,-94.617650999999995 37.687671000000002,-94.617687000000004 37.686652999999993,-94.617885 37.682214000000002,-94.617733999999999 37.673127,-94.617576 37.653671000000003,-94.617517909436387 37.643988652624088,-94.61747699999998 37.637169999999998,-94.617472819127315 37.636539916507168,-94.6173 37.610495,-94.617428000000004 37.609521999999998,-94.617283 37.571896000000002,-94.617315000000005 37.571498999999996,-94.617080999999999 37.567013000000003,-94.61711240153133 37.563155381499406,-94.617159999999984 37.557307999999999,-94.617186000000004 37.553485000000002,-94.617167532949537 37.551779056391354,-94.616988484457494 37.535238968895172,-94.616907999999981 37.527804000000003,-94.616788999999997 37.521509999999999,-94.616880369657522 37.506771761864755,-94.617022999999989 37.483764999999998,-94.617182999999997 37.469664999999999,-94.617180000000005 37.465203000000002,-94.617221999999998 37.460476,-94.617204999999984 37.46037299999999,-94.617200999999994 37.454788,-94.617131999999998 37.439818000000002,-94.617265000000003 37.425535999999994,-94.617510999999993 37.410908999999997,-94.617557000000005 37.396374999999999,-94.61759158917468 37.381725975861251,-94.617625000000004 37.367576,-94.617626 37.367444999999989,-94.617536999999999 37.364355000000003,-94.617636000000005 37.338417,-94.617694999999998 37.336841999999997,-94.617648000000003 37.323588999999998,-94.61807499999999 37.240436000000003,-94.618157999999994 37.237596999999994,-94.618122999999997 37.229334,-94.61815 37.228121000000002,-94.618218999999996 37.207771999999999,-94.618305000000007 37.207337000000003,-94.618319 37.188774000000002,-94.618504999999985 37.181184000000002,-94.618472999999994 37.174782,-94.618351000000004 37.160210999999997,-94.618071999999998 37.132345,-94.61807499999999 37.129755000000003,-94.61816441512984 37.118929895303054,-94.618212 37.113168999999992,-94.618150999999997 37.103968000000002,-94.618059000000002 37.096676000000002,-94.618088 37.093670999999993,-94.618089999999995 37.093494,-94.618085255103864 37.089305442941992,-94.618082 37.086432000000002,-94.61811999999999 37.085934000000002,-94.617981999999998 37.075077,-94.617954311863897 37.070346986543974,-94.617947706480578 37.069218577181687,-94.617910161110728 37.062804634983031,-94.617893975984089 37.060039701061122,-94.617874999999998 37.056798,-94.617877538275181 37.056339390079508,-94.617964999999998 37.040537,-94.617972200190749 37.032971759572447,-94.617994999999979 37.009015999999995,-94.618027702303792 37.004829720380044,-94.618080000000006 36.998134999999998,-94.625223999999989 36.998671999999999,-94.699735000000004 36.998804999999997,-94.701796999999999 36.998814000000003,-94.711286363060864 36.99879670415919,-94.712770000000006 36.99879399999999,-94.722629184733563 36.998741903378082,-94.732834603466486 36.998687977231512,-94.736330645670293 36.998669503899912,-94.737183000000002 36.998665000000003,-94.739323999999996 36.998686999999997,-94.745992043692311 36.998700535427304,-94.749560781475736 36.99870777958963,-94.749834600019099 36.998708335412474,-94.777257000000006 36.998764,-94.831280000000007 36.998812,-94.831539962039543 36.998812565955092,-94.840925999999996 36.998832999999998,-94.846637705524785 36.998860673615503,-94.849800999999999 36.998875999999996,-94.853196999999994 36.998874,-94.896852168601683 36.999075231107383,-94.904605402657381 36.99911097010289,-94.9407882710602 36.999277757196154,-94.995293000000004 36.999528999999995,-95.007620000000003 36.999513999999998,-95.011432999999997 36.999535000000002,-95.030323999999993 36.999516999999997,-95.037857000000002 36.999496999999998,-95.049498999999983 36.999580000000002,-95.073509 36.999509000000003,-95.1405498515593 36.999533623834409,-95.155186999999998 36.999538999999999,-95.155372 36.999540000000003,-95.159067907556633 36.999536629205572,-95.177300999999986 36.999519999999997,-95.195307 36.999564999999997,-95.267905305061163 36.999446910377756,-95.285983101167361 36.999417504731007,-95.322564999999997 36.999357999999994,-95.328057999999999 36.999364999999997,-95.328326999999987 36.999366000000002,-95.331209999999999 36.999380000000002,-95.377252424658963 36.999296311678272,-95.381753803085687 36.999288129815376,-95.407683000000006 36.999240999999998,-95.511578 36.999234999999999,-95.522414951940931 36.999281058114107,-95.534401000000003 36.999332000000003,-95.573598000000004 36.999309999999994,-95.601517312742303 36.999317968253862,-95.612139999999997 36.999321000000002,-95.615933999999996 36.999364999999997,-95.621011943860609 36.999361983160732,-95.624350000000007 36.999360000000003,-95.630078999999995 36.999319999999997,-95.638122589416028 36.999320470082949,-95.664300999999995 36.999321999999999,-95.674044398562955 36.999333876292773,-95.686452000000003 36.999349000000002,-95.696658999999997 36.999215,-95.71038 36.999370999999996,-95.710782524132014 36.999362783399121,-95.714887000000004 36.999279,-95.718053999999995 36.999254999999998,-95.741907999999995 36.999243999999997,-95.746466244276931 36.999250838506164,-95.759905000000003 36.999270999999993,-95.768719000000004 36.999205000000003,-95.786761999999996 36.999309999999994,-95.807979999999986 36.999124000000002,-95.819364496908179 36.999150471530008,-95.866899000000004 36.999260999999997,-95.873943999999995 36.999299999999998,-95.875256999999991 36.999302,-95.877150999999998 36.999304000000002,-95.910179999999997 36.999336,-95.928122000000002 36.999245000000002,-95.936991999999989 36.999267999999994,-95.964270378114222 36.999093604402042,-96.00081 36.99886,-96.095164142267308 36.998935940299688,-96.14121 36.998972999999999,-96.143207000000004 36.999133999999998,-96.147143 36.999021999999997,-96.149709 36.99904,-96.152383999999998 36.999050999999994,-96.154016999999982 36.999161,-96.184768000000005 36.999211000000003,-96.200028000000003 36.999028000000003,-96.217571000000007 36.999070000000003,-96.235320025971774 36.999130675786525,-96.27480962492784 36.999265672629733,-96.276368000000005 36.999270999999993,-96.279078999999996 36.999271999999991,-96.381556872639493 36.999226629434901,-96.394272 36.999220999999999,-96.415412000000003 36.999113,-96.500287999999998 36.998643,-96.525212323286397 36.998711038495294,-96.525495980566973 36.998711812823821,-96.551130926932458 36.998781791180214,-96.551130927020779 36.998781791180456,-96.624487489749981 36.998982040153741,-96.705431000000004 36.999203,-96.710481999999999 36.999270999999993,-96.731983006833033 36.99928335311408,-96.736589999999993 36.999285999999998,-96.741269999999986 36.999239000000003,-96.749837999999997 36.998987999999997,-96.792060000000006 36.999179999999996,-96.795198999999997 36.99886,-96.822790999999995 36.999181999999998,-96.867517000000007 36.999217000000002,-96.876289999999997 36.999232999999997,-96.902083000000005 36.999155000000002,-96.903509999999997 36.999132000000003,-96.917092999999994 36.999181999999998,-96.921914999999998 36.999150999999998,-96.924934279563146 36.999131784030439,-96.934641999999997 36.999070000000003,-96.967371 36.999066999999997,-96.975561999999996 36.999018999999997,-97.030081999999979 36.998928999999997,-97.039783999999983 36.999000000000002,-97.045562883576096 36.99899981011751,-97.100651999999997 36.998998,-97.104275999999999 36.999020000000002,-97.120284999999996 36.999014000000003,-97.122596999999999 36.999035999999997,-97.147721000000004 36.999110999999999,-97.202000013134437 36.999050609464689,-97.255829185181881 36.998990719420135,-97.342808466604069 36.998893946743877,-97.362376892203329 36.998872175019791,-97.364929972745273 36.99886933447624,-97.372421000000003 36.998860999999998,-97.384924999999996 36.998843,-97.462279999999993 36.998685000000002,-97.472860999999995 36.998721000000003,-97.527292000000003 36.998749999999994,-97.545899999999989 36.998708999999991,-97.546497999999985 36.998746999999995,-97.564536000000004 36.998711,-97.582460039051355 36.99869862770732,-97.606549 36.998682000000002,-97.637136999999996 36.999090000000002,-97.650465999999994 36.999003999999999,-97.692180007144742 36.998844793059916,-97.697103999999982 36.998826,-97.768704 36.998749999999994,-97.783432000000005 36.998961,-97.783489000000003 36.998846999999998,-97.802297999999979 36.998713000000002,-97.965379045838461 36.998468720211747,-98.033955000000006 36.998365999999997,-98.03989 36.998348999999997,-98.045341999999991 36.998327000000003,-98.111985000000004 36.998133000000003,-98.128185436781749 36.99814624647324,-98.147452 36.998162,-98.177595999999994 36.998008999999996,-98.190367496841162 36.998003995168112,-98.208218000000002 36.997996999999998,-98.219498999999999 36.997824,-98.237712000000002 36.99797199999999,-98.346187999999984 36.997962,-98.347186011230875 36.997961873429141,-98.354073 36.997960999999997,-98.408991 36.998513000000003,-98.418267999999998 36.998538000000003,-98.420209 36.998516000000002,-98.476584655565659 36.998733519956424,-98.485495952453391 36.998767903324406,-98.544871999999984 36.998997000000003,-98.622244241689657 36.999025734091177,-98.714511999999999 36.99906,-98.718464999999995 36.999179999999996,-98.761596999999995 36.999425000000002,-98.791936000000007 36.999254999999998,-98.793711000000002 36.999226999999991,-98.797451999999993 36.999228999999993,-98.811832237742053 36.99924038482925,-98.869449000000003 36.999285999999998,-98.880009 36.999262999999999,-98.880579999999995 36.999308999999997,-98.994371 36.999493,-99.000846251360556 36.99951188908193,-99.029336999999998 36.999594999999999,-99.044703416105833 36.999312701167916,-99.049695 36.999220999999999,-99.124882999999997 36.99942,-99.12944899999998 36.999422000000003,-99.215429691089184 36.999525607779709,-99.221470798208784 36.999532887387339,-99.22594390512576 36.999538277535649,-99.248119999999986 36.999564999999997,-99.277506000000002 36.999578999999997,-99.375390999999993 37.000176999999994,-99.375813215185289 37.000169016042221,-99.396673054015949 36.999774562980598,-99.407015 36.999578999999997,-99.456202999999988 36.999471,-99.484333000000007 36.999625999999999,-99.500394999999983 36.99957599999999,-99.500394999999983 36.999637,-99.502664999999993 36.999645,-99.504092999999997 36.999648,-99.508573999999982 36.999657999999997,-99.541115670095081 36.999572526667627,-99.558068000000006 36.999527999999998,-99.625399000000002 36.999670999999999,-99.648651999999998 36.999603999999998,-99.657657999999998 37.000197,-99.675479899119665 37.000294824261658,-99.700804554289192 37.000433831091229,-99.722499410223932 37.000552913981863,-99.774254999999997 37.000836999999997,-99.774816 37.000841,-99.786016000000004 37.000931,-99.875408999999991 37.001658999999997,-99.904897139036905 37.001652107487203,-99.995200999999994 37.001631000000003,-100.001285999999993 37.001699000000002,-100.002562999999995 37.001705999999999,-100.005706000000004 37.001725999999998,-100.08949117994996 37.002091554886341,-100.115721999999991 37.002206,-100.187546999999995 37.002082,-100.19237099999998 37.002035999999997,-100.193753999999998 37.002133,-100.201675999999992 37.002080999999997,-100.269984573601874 37.001795796937508,-100.395563941387664 37.001271475927872,-100.434302684862132 37.001109733298897,-100.434343961694367 37.0011095609592,-100.436759028295029 37.001099477534027,-100.462594151135718 37.000991610310841,-100.526354155903263 37.000725398506596,-100.551597999999998 37.000619999999998,-100.552683000000002 37.000734999999999,-100.591328000000004 37.000376000000003,-100.591413000000003 37.000399000000002,-100.629769999999994 37.000025,-100.63332699999998 36.999935999999998,-100.675551999999996 36.999687999999999,-100.734516999999997 36.999059000000003,-100.756894000000003 36.999356999999996,-100.759718826764541 36.999297806889686,-100.765484 36.999177000000003,-100.806116000000003 36.999091,-100.814277000000004 36.999085,-100.850054835707368 36.998687920265262,-100.855633999999981 36.998626000000002,-100.891659999999987 36.998604,-100.904274 36.998745,-100.904588000000004 36.998561000000002,-100.945565999999985 36.998151999999997,-100.958261085233985 36.99812508251128,-100.996501999999992 36.998044,-101.012641000000002 36.998176,-101.053589000000002 36.997966999999996,-101.066742000000005 36.997920999999998,-101.096255470166753 36.997758490771822,-101.211485999999979 36.997123999999999,-101.212908999999996 36.997044000000002,-101.283204233333976 36.996668964004151,-101.357796999999991 36.996271,-101.359673999999998 36.996231999999999,-101.37818 36.996164,-101.413867999999994 36.996008000000003,-101.415004999999994 36.995966000000003,-101.485326 36.995610999999997,-101.519065999999995 36.99554599999999,-101.555239 36.99541399999999,-101.600396000000003 36.995152999999995,-101.601592999999994 36.995094999999999,-101.672152845644291 36.994768289529276,-101.672152845650672 36.994768289529254,-101.718235173867967 36.994554916342196,-101.761767880686108 36.994353348566563,-101.826607533764985 36.994053124077894,-101.862548907230888 36.993886706153717,-101.881050066963184 36.993801040963412,-101.899294480822903 36.993716564573397,-101.902439999999999 36.993701999999999,-101.905152836625547 36.993689460946754,-101.93521516037174 36.99355050931414,-102.000446999999994 36.993248999999992,-102.000446999999994 36.993271999999997,-102.028206999999981 36.993124999999999,-102.042240000000007 36.993082999999999,-102.041951999999995 37.024741999999996,-102.04195 37.030805,-102.041921000000002 37.032178000000002,-102.041748999999996 37.034396999999998,-102.04191999999999 37.035083,-102.041983000000002 37.106551000000003,-102.041808999999986 37.111972999999999,-102.042091999999997 37.125020999999997,-102.042135000000002 37.125020999999997,-102.042121535383529 37.12671399835564,-102.042001999999997 37.141744000000003,-102.041962999999996 37.258164,-102.041663999999997 37.29764999999999,-102.041816999999995 37.309489999999997,-102.041973999999996 37.352612999999998,-102.042089000000004 37.352818999999997,-102.041523999999995 37.375017999999997,-102.041585760607518 37.389190434149839,-102.041675999999981 37.409897999999991,-102.041668999999999 37.434739999999998,-102.041754999999995 37.434854999999992,-102.041800999999992 37.469487999999998,-102.041786000000002 37.506065999999997,-102.04201599999999 37.535260999999998,-102.041899 37.541186000000003,-102.041893999999999 37.557977,-102.041618 37.607868000000003,-102.041584999999998 37.644281999999997,-102.041581999999991 37.654494999999997,-102.041694000000007 37.665680999999999,-102.041573999999997 37.680436,-102.041876000000002 37.723875,-102.041989965869121 37.73854062916552,-102.042158 37.760164000000003,-102.042668000000006 37.788758,-102.042952999999997 37.803534999999997,-102.043032999999994 37.824145999999999,-102.043218999999993 37.86792899999999,-102.043714531331204 37.914003914798144,-102.043845000000005 37.926135000000002,-102.043844000000007 37.928101999999996,-102.044644000000005 38.045532,-102.044255000000007 38.113010999999993,-102.044450868202546 38.120049353793199,-102.044589000000002 38.125012999999996,-102.044415729020699 38.133607343100145,-102.044251000000003 38.141777999999995,-102.044296878804843 38.175558844899406,-102.044398 38.250014999999998,-102.044510721728557 38.262483349316234,-102.044567999999998 38.268819,-102.044612999999998 38.312323999999997,-102.044944 38.384419,-102.044441999999989 38.415801999999999,-102.044936000000007 38.41968,-102.045323999999979 38.453646999999997,-102.045262999999991 38.505395,-102.045261999999994 38.505531999999995,-102.045112000000003 38.523783999999999,-102.045222999999993 38.543796999999998,-102.045188999999979 38.558731999999992,-102.045210999999995 38.581608999999993,-102.045287999999999 38.615248999999999,-102.045074 38.669617000000002,-102.045102 38.674945999999998,-102.045159999999996 38.675221,-102.045126999999994 38.686725000000003,-102.045156000000006 38.688555,-102.045211999999992 38.697566999999999,-102.045375000000007 38.754338999999995,-102.045287000000002 38.755527999999998,-102.045371000000003 38.770063999999998,-102.045447999999993 38.783453000000002,-102.045333999999997 38.799463000000003,-102.045387999999988 38.813391999999993,-102.046570999999986 39.047038,-102.047133999999986 39.129700999999997,-102.047188612927897 39.133146793270186,-102.047250000000005 39.13702,-102.047851021058236 39.220289738242592,-102.048449000000005 39.30313799999999,-102.04895999999998 39.37371199999999,-102.049100972149461 39.394064428437375,-102.049166999999983 39.403596999999998,-102.049369999999996 39.418210000000002,-102.049368999999999 39.423333,-102.049678999999998 39.506183,-102.049672999999999 39.536690999999998,-102.049553999999986 39.538932000000003,-102.049763758475066 39.568170000775439,-102.04980599999999 39.574058,-102.049954 39.592331,-102.050258163748609 39.627242889069393,-102.050421999999983 39.646047999999993,-102.050099000000003 39.653812000000002,-102.05059399999999 39.67559399999999,-102.050898693231389 39.741794606053567,-102.051254 39.818992,-102.051317999999995 39.833311000000002,-102.051362999999995 39.843471,-102.051569 39.849805000000003,-102.051743999999999 40.003078000000002))')); \ No newline at end of file
diff --git a/django/contrib/gis/tests/geoapp/sql/state.postgresql_psycopg2.sql b/django/contrib/gis/tests/geoapp/sql/state.postgresql_psycopg2.sql
new file mode 100644
index 0000000000..d27af333cf
--- /dev/null
+++ b/django/contrib/gis/tests/geoapp/sql/state.postgresql_psycopg2.sql
@@ -0,0 +1,5 @@
+-- State border data courtesy of U.S. Census Bureau Cartographic Boundary Files: http://www.census.gov/geo/www/cob/st2000.html
+-- Boundary file data is a product of the U.S. federal government and is public domain. See 17 U.S.C. 105.
+INSERT INTO geoapp_state ("name", "poly") VALUES ('Puerto Rico', NULL);
+INSERT INTO geoapp_state ("name", "poly") VALUES ('Colorado', 'SRID=4326;POLYGON ((-107.918420999999981 41.002035999999997,-107.69133582431418 41.002104250342249,-107.625624000000002 41.002124000000002,-107.521505363272311 41.002506710525772,-107.367442999999994 41.003073,-107.317794462401125 41.002967213367114,-107.305312956219666 41.00294061889776,-107.241193999999993 41.002803999999998,-107.000606000000005 41.003443999999995,-106.857772999999995 41.002662999999991,-106.453858999999994 41.002056999999994,-106.439563000000007 41.001978,-106.437419000000006 41.001794999999994,-106.430949999999996 41.001751999999996,-106.391852 41.001176,-106.386356000000006 41.001143999999996,-106.321164999999993 40.999122999999997,-106.217573000000002 40.997734,-106.194624254510543 40.99762614711792,-106.190540579491184 40.997606954952467,-106.061180999999991 40.996999000000002,-105.764246857267409 40.99689755617932,-105.730421000000007 40.996886000000003,-105.724804000000006 40.99691,-105.554417704421283 40.997390710823062,-105.412220703167577 40.997791891195448,-105.277137999999979 40.998173,-105.256527000000006 40.998190999999998,-105.254778999999999 40.99821,-105.173435761678107 40.998177015252317,-104.943370680568208 40.998083723679372,-104.855272999999997 40.998047999999997,-104.829503999999986 40.999270000000003,-104.675999000000004 41.000957,-104.497148999999993 41.001828000000003,-104.497057999999996 41.001804999999997,-104.467671999999979 41.001472999999997,-104.214691999999999 41.001657000000002,-104.214191 41.001567999999999,-104.211472999999998 41.001590999999998,-104.123585999999989 41.001625999999995,-104.104590000000002 41.001542999999991,-104.086067999999983 41.001562999999997,-104.066960999999992 41.001503999999997,-104.053248999999994 41.001405999999996,-104.039237999999997 41.001502000000002,-104.023382999999981 41.001887000000004,-104.018223000000006 41.001617000000003,-104.010804886779724 41.00161667450854,-103.972641999999979 41.001615,-103.971373 41.001524000000003,-103.953524999999999 41.001595999999999,-103.906323999999998 41.001387,-103.896207000000004 41.00175,-103.877966999999998 41.00167299999999,-103.858448999999993 41.001680999999998,-103.750497999999993 41.002054,-103.574522000000002 41.001721000000003,-103.497446999999994 41.001635,-103.486697000000007 41.001913999999999,-103.421975000000003 41.002006999999999,-103.421925000000002 41.001968999999995,-103.396990999999986 41.002558,-103.365313999999984 41.001846,-103.362978999999996 41.001843999999991,-103.077804 41.002298000000003,-103.076536000000004 41.002253000000003,-103.059537999999989 41.002367999999997,-103.057997999999998 41.002367999999997,-103.043443999999994 41.002344,-103.038703999999996 41.002251,-103.002026 41.002485999999998,-103.000101999999984 41.002400000000002,-102.982690000000005 41.002156999999997,-102.981482999999997 41.002111999999997,-102.963668999999982 41.002185999999995,-102.962522000000007 41.002071999999998,-102.960706000000002 41.002058999999996,-102.959623999999991 41.002094999999997,-102.944829999999996 41.002302999999998,-102.943109000000007 41.002051000000002,-102.925567999999998 41.002279999999999,-102.924029000000004 41.002141999999999,-102.906546999999989 41.002275999999995,-102.904796000000005 41.002206999999999,-102.887406999999982 41.002178,-102.885745999999997 41.002130999999999,-102.867822000000004 41.002183000000002,-102.865783999999991 41.001987999999997,-102.849262999999993 41.002301000000003,-102.846455000000006 41.002256000000003,-102.830302999999986 41.002350999999997,-102.827280000000002 41.002142999999997,-102.773545999999996 41.002414000000002,-102.766722999999999 41.00227499999999,-102.754616999999996 41.002360999999993,-102.739623999999992 41.002229999999997,-102.653462999999988 41.002332000000003,-102.621032999999997 41.002597000000002,-102.578695999999994 41.002291,-102.575738 41.002268,-102.575496 41.002200000000002,-102.566047999999995 41.002200000000002,-102.556788999999995 41.002218999999997,-102.517701071582451 41.002347335877943,-102.487954999999985 41.002444999999994,-102.470536999999979 41.002381999999997,-102.469223 41.002423999999998,-102.460334593696913 41.00241180236555,-102.387750989484957 41.002312195277327,-102.380372991932845 41.002302070389462,-102.379593 41.002301000000003,-102.364065999999994 41.002173999999997,-102.292833000000002 41.002206999999999,-102.292621999999994 41.002229999999997,-102.292552999999998 41.002206999999999,-102.291353999999998 41.002206999999999,-102.277803455573988 41.002233743569548,-102.272099999999995 41.002245000000002,-102.267811999999992 41.002383000000002,-102.231931000000003 41.002327,-102.212199999999982 41.002462,-102.209361 41.002442000000002,-102.209083936251005 41.002440229332002,-102.207776055197755 41.002431870883314,-102.191209999999998 41.002325999999996,-102.124972 41.002338000000002,-102.070598000000004 41.002423,-102.051614 41.002377000000003,-102.051291999999989 40.749591000000002,-102.051634432607003 40.582129592617228,-102.051725000000005 40.537838999999991,-102.051518999999999 40.520094,-102.051464999999993 40.440007999999999,-102.051839999999999 40.396396000000003,-102.051571999999993 40.393079999999998,-102.051797999999991 40.360069000000003,-102.051585542616536 40.350646145741024,-102.051309000000003 40.338380999999998,-102.051922000000005 40.235343999999998,-102.05189399999999 40.229192999999995,-102.051908999999995 40.162674000000003,-102.052001000000004 40.148358999999999,-102.051852600888665 40.064469617536822,-102.051743999999999 40.003078000000002,-102.051715564657869 39.978173027456265,-102.051569 39.849805000000003,-102.051362999999995 39.843471,-102.051317999999995 39.833311000000002,-102.051254 39.818992,-102.05059399999999 39.67559399999999,-102.050099000000003 39.653812000000002,-102.050421999999983 39.646047999999993,-102.049954 39.592331,-102.04980599999999 39.574058,-102.049553999999986 39.538932000000003,-102.049672999999999 39.536690999999998,-102.049678999999998 39.506183,-102.049368999999999 39.423333,-102.049369999999996 39.418210000000002,-102.049166999999983 39.403596999999998,-102.04895999999998 39.37371199999999,-102.048449000000005 39.30313799999999,-102.047250000000005 39.13702,-102.047133999999986 39.129700999999997,-102.046570999999986 39.047038,-102.045387999999988 38.813391999999993,-102.045333999999997 38.799463000000003,-102.045447999999993 38.783453000000002,-102.045371000000003 38.770063999999998,-102.045287000000002 38.755527999999998,-102.045375000000007 38.754338999999995,-102.045211999999992 38.697566999999999,-102.045156000000006 38.688555,-102.045126999999994 38.686725000000003,-102.045159999999996 38.675221,-102.045102 38.674945999999998,-102.045074 38.669617000000002,-102.045287999999999 38.615248999999999,-102.045210999999995 38.581608999999993,-102.045188999999979 38.558731999999992,-102.045222999999993 38.543796999999998,-102.045112000000003 38.523783999999999,-102.045261999999994 38.505531999999995,-102.045262999999991 38.505395,-102.045323999999979 38.453646999999997,-102.044936000000007 38.41968,-102.044441999999989 38.415801999999999,-102.044944 38.384419,-102.044612999999998 38.312323999999997,-102.044567999999998 38.268819,-102.044398 38.250014999999998,-102.044251000000003 38.141777999999995,-102.044535323623649 38.127675380028528,-102.044589000000002 38.125012999999996,-102.044540277332047 38.123262193231092,-102.044255000000007 38.113010999999993,-102.04462354493468 38.04908029653749,-102.044631007072184 38.047785855466316,-102.044644000000005 38.045532,-102.044620085883125 38.042021706570637,-102.044539342086111 38.030169526464491,-102.043844000000007 37.928101999999996,-102.043845000000005 37.926135000000002,-102.043218999999993 37.86792899999999,-102.043032999999994 37.824145999999999,-102.042952999999997 37.803534999999997,-102.042668000000006 37.788758,-102.042158 37.760164000000003,-102.041876000000002 37.723875,-102.041573999999997 37.680436,-102.041694000000007 37.665680999999999,-102.041581999999991 37.654494999999997,-102.041584999999998 37.644281999999997,-102.041618 37.607868000000003,-102.041779405839492 37.578691555295826,-102.041893999999999 37.557977,-102.041899 37.541186000000003,-102.04201599999999 37.535260999999998,-102.041786000000002 37.506065999999997,-102.041800999999992 37.469487999999998,-102.041754999999995 37.434854999999992,-102.041668999999999 37.434739999999998,-102.041675999999981 37.409897999999991,-102.041523999999995 37.375017999999997,-102.042089000000004 37.352818999999997,-102.041973999999996 37.352612999999998,-102.041816999999995 37.309489999999997,-102.041663999999997 37.29764999999999,-102.041962999999996 37.258164,-102.042001999999997 37.141744000000003,-102.042135000000002 37.125020999999997,-102.042091999999997 37.125020999999997,-102.041808999999986 37.111972999999999,-102.041983000000002 37.106551000000003,-102.04191999999999 37.035083,-102.041748999999996 37.034396999999998,-102.041921000000002 37.032178000000002,-102.04195 37.030805,-102.041951999999995 37.024741999999996,-102.042240000000007 36.993082999999999,-102.054502999999997 36.993108999999997,-102.184270999999995 36.993592999999997,-102.208315999999996 36.993729999999999,-102.260789000000003 36.994388,-102.270345681835295 36.994399933337462,-102.307593650497381 36.994446444520669,-102.355288000000002 36.994505999999994,-102.355367 36.994574999999998,-102.698142000000004 36.995148999999998,-102.742059999999981 36.997689,-102.759860000000003 37.000019000000002,-102.77856899999999 36.999242000000002,-102.806762000000006 37.000019000000002,-102.814616 37.000782999999998,-102.841988999999998 36.999597999999999,-102.979613 36.998548999999997,-102.985806999999994 36.998570999999998,-102.986975999999999 36.998524000000003,-103.002199000000005 37.000104,-103.086104969413952 37.000173865694038,-103.10540536532865 37.000189936488113,-103.155922000000004 37.000231999999997,-103.200631728472104 37.000060386509688,-103.327177769406262 36.999574653124313,-103.425678872433053 36.999196567220693,-103.733247000000006 36.998015999999993,-103.734363999999985 36.998041,-104.007854999999992 36.996239000000003,-104.215475488463966 36.994874432196589,-104.250535999999983 36.994644,-104.29757064295984 36.994053250381747,-104.338832999999994 36.993535,-104.355650525350313 36.993556531771581,-104.366447685535107 36.993570355564437,-104.399202882083287 36.993612292614962,-104.429769386650008 36.993651427444888,-104.480610316975273 36.993716519976395,-104.519256999999996 36.993765999999994,-104.624555999999998 36.994376999999993,-104.625545000000002 36.993599000000003,-104.645028999999994 36.993377999999993,-104.706112207267154 36.993426444188657,-104.732031000000006 36.993447000000003,-104.732119999999981 36.993484000000002,-104.839990412520109 36.993395592828207,-105.00055399999998 36.993264000000003,-105.029227999999989 36.99272899999999,-105.120800000000003 36.995427999999997,-105.155041964101514 36.995339147158163,-105.220613 36.995168999999997,-105.251295999999996 36.995604999999998,-105.419309999999996 36.995856000000003,-105.438102743613229 36.995968030697597,-105.442458999999999 36.995994000000003,-105.447254999999998 36.996016999999995,-105.465181999999999 36.995990999999997,-105.47087670692585 36.995978476706256,-105.508835999999988 36.99589499999999,-105.512484999999998 36.995776999999997,-105.533922000000004 36.995874999999998,-105.627469999999988 36.995679000000003,-105.664719999999988 36.995874,-105.716470999999999 36.995848999999993,-105.718407304549174 36.995846016149208,-105.996159000000006 36.995418,-105.997472000000002 36.995417000000003,-106.006633999999991 36.995342999999998,-106.099805867433119 36.994759106704976,-106.163971382218094 36.994356991615014,-106.201468999999989 36.994121999999997,-106.247704999999996 36.994266000000003,-106.248675000000006 36.99428799999999,-106.293278999999998 36.99389,-106.32542867882475 36.994109231664673,-106.343138999999979 36.994230000000002,-106.476277952851959 36.993839335051021,-106.500589000000005 36.993767999999996,-106.617159 36.992967,-106.617124999999987 36.993003999999999,-106.628652000000002 36.993175,-106.628732999999983 36.993160999999994,-106.661344 36.993243,-106.675625999999994 36.993122999999997,-106.750591 36.992460999999999,-106.782095289714647 36.992451749967366,-106.869795999999994 36.992425999999995,-106.877291999999983 37.00013899999999,-106.918886463342702 37.000128747161924,-106.95601836457638 37.000119594324254,-107.107262626744514 37.000082313330452,-107.255202723469637 37.000045846797775,-107.420912999999999 37.000004999999994,-107.422415013680663 37.000004989636103,-107.442181999144324 37.000004853243873,-107.481737001398656 37.00000458031429,-107.524086846417021 37.000004288100286,-107.600713640777798 37.000003759375268,-107.712477900838564 37.000002988201679,-107.855695499501934 37.000002000000002,-107.866308937617532 37.000001926767261,-107.869139908586362 37.000001907233546,-107.869180699306327 37.0000019069521,-108.000623000000004 37.000000999999997,-108.179187075278463 36.999293161624927,-108.187139540298872 36.999261637591275,-108.249358 36.999015,-108.250634999999988 36.999561,-108.288086000000007 36.999555,-108.288399999999996 36.999519999999997,-108.320464 36.999499,-108.320720999999992 36.99951,-108.379165570428881 36.999458977707043,-108.619688999999994 36.999248999999999,-108.620309000000006 36.999287000000002,-108.749269825405847 36.999139933822768,-108.954403999999997 36.998905999999998,-108.958867999999995 36.998913000000002,-109.045222999999993 36.999084000000003,-109.04516599999998 37.072741999999998,-109.045057999999997 37.074660999999999,-109.044995 37.086429000000003,-109.045188999999993 37.096270999999994,-109.045173000000005 37.109464000000003,-109.045202999999987 37.111957999999994,-109.045155999999992 37.112063999999997,-109.045995000000005 37.177278999999999,-109.045978000000005 37.201830999999999,-109.045801505106283 37.205070813598866,-109.045486999999994 37.210844000000002,-109.045559879533187 37.239775672002708,-109.04556019774752 37.239901996533845,-109.045583999999991 37.249350999999997,-109.046038999999993 37.249993000000003,-109.045898042273308 37.32693499054853,-109.045810000000003 37.374993000000003,-109.043799132325617 37.469028334242019,-109.043463783260819 37.484710450871816,-109.043424942780035 37.486526770085334,-109.043137000000002 37.499991999999999,-109.041915000000003 37.530653,-109.041865 37.530726,-109.041805999999994 37.604171,-109.042130999999998 37.617662000000003,-109.042089000000004 37.623795,-109.042269000000005 37.666066999999998,-109.041731999999996 37.711213999999998,-109.041759999999996 37.713182000000003,-109.041635999999997 37.740209999999998,-109.042097999999996 37.749989999999997,-109.042042148900066 37.754383999799849,-109.041460999999998 37.800105000000002,-109.041753999999997 37.83582599999999,-109.04172299999999 37.842050999999998,-109.041843999999998 37.872788,-109.041652818578953 37.881166902788557,-109.041058000000007 37.907235999999997,-109.043120999999985 37.97426,-109.042818999999994 37.997067999999999,-109.042819999999992 37.999301000000003,-109.041972403965843 38.131799166817459,-109.041836656974709 38.153019449536792,-109.041761999999991 38.16469,-109.054648 38.244920999999998,-109.060061999999988 38.275489,-109.059961999999999 38.49998699999999,-109.060253000000003 38.599327999999993,-109.059540999999996 38.719887999999997,-109.057388000000003 38.795455999999994,-109.057216044916757 38.799730849597076,-109.054188999999994 38.874983999999998,-109.05394299999999 38.904414000000003,-109.053797000000003 38.905283999999995,-109.053233000000006 38.942467,-109.053291999999985 38.942878,-109.052435999999986 38.999985000000002,-109.051587912503535 39.115734257770079,-109.051583515738272 39.116334340093104,-109.051580780636755 39.116707634089543,-109.051512000000002 39.126094999999999,-109.050764999999998 39.366677000000003,-109.051362999999981 39.497674000000004,-109.051040248333237 39.660472011844121,-109.050614999999993 39.874969999999998,-109.050872999999996 40.058914999999999,-109.050813000000005 40.059578999999992,-109.050944 40.180711999999993,-109.050972999999999 40.180849000000002,-109.050968715822648 40.22266241227041,-109.050945999999996 40.444367999999997,-109.050314 40.495092,-109.050697999999983 40.499963,-109.049954999999997 40.539901,-109.050073999999995 40.540357999999998,-109.050071964046666 40.540437104308737,-109.048044000000004 40.619230999999999,-109.048248999999998 40.653600999999995,-109.049087999999998 40.714562,-109.048455000000004 40.826081000000002,-109.050076000000004 41.000658999999999,-108.884137999999993 41.000093999999997,-108.631107999999998 41.00015599999999,-108.526667000000003 40.999608000000002,-108.500658999999999 41.000112,-108.250648999999996 41.000114000000004,-108.181227000000007 41.000454999999995,-108.089219003138552 41.001554139247368,-108.046538999999996 41.002063999999997,-107.923234122395939 41.0020370519008,-107.918420999999981 41.002035999999997))');
+INSERT INTO geoapp_state ("name", "poly") VALUES ('Kansas', 'SRID=4326;POLYGON ((-102.051743999999999 40.003078000000002,-101.916696000000002 40.003141999999997,-101.904176000000007 40.003162000000003,-101.861740775252272 40.002907997451267,-101.841025000000002 40.002783999999991,-101.832160999999999 40.002932999999999,-101.807687 40.002797999999999,-101.804861999999986 40.002752,-101.783266423091504 40.002735966476642,-101.748492901329186 40.002710149056902,-101.627071 40.00262,-101.625809000000004 40.002710999999998,-101.579641080501318 40.002654627564297,-101.54227299999998 40.002608999999993,-101.417209 40.002423999999998,-101.411050023557621 40.002364583193085,-101.409952999999987 40.002353999999997,-101.387325211262052 40.00246006676732,-101.374325999999996 40.002520999999994,-101.342859000000004 40.002580000000002,-101.324035999999992 40.002695999999993,-101.293991000000005 40.002558999999998,-101.286555000000007 40.002558999999998,-101.248672999999997 40.002543000000003,-101.215033000000005 40.002555,-101.19221899999998 40.002490999999999,-101.186892990733696 40.002481867883319,-101.178804999999997 40.002468,-101.168704000000005 40.002547,-101.130906999999993 40.002426999999997,-101.104950380573442 40.002382874850099,-101.104950380567658 40.002382874850092,-101.060316999999998 40.002307000000002,-101.027686000000003 40.002255999999996,-100.962089380046322 40.00217532965339,-100.937427 40.002144999999999,-100.764559455237134 40.002296963384197,-100.758829999999989 40.002301999999993,-100.752183000000002 40.002127999999992,-100.7388309887763 40.002228385746484,-100.733295999999996 40.002270000000003,-100.729904000000005 40.002110999999999,-100.721127999999993 40.002068999999999,-100.683435000000003 40.002234,-100.660229999999984 40.002161999999998,-100.645444999999995 40.001882999999999,-100.626504856699498 40.001892789287538,-100.600944999999996 40.001905999999998,-100.594756999999987 40.001976999999997,-100.567238000000003 40.001888999999998,-100.551885999999996 40.001888999999998,-100.514429898999168 40.001844039098764,-100.511064999999988 40.00184,-100.487159000000005 40.001767,-100.477018 40.001752000000003,-100.475853999999998 40.001767999999998,-100.468772999999985 40.001724000000003,-100.447071999999991 40.001795,-100.439081000000002 40.001773999999997,-100.402449685831499 40.001800164690437,-100.390079999999998 40.001809000000002,-100.290126736823893 40.001691651381378,-100.231651999999997 40.001623000000002,-100.229478999999998 40.001692999999996,-100.215406000000002 40.001629,-100.196958999999993 40.001494,-100.19359 40.001573,-100.190323000000006 40.001586000000003,-100.188181 40.001541000000003,-100.177823000000004 40.001593,-99.990926000000002 40.001503,-99.986610999999996 40.001550000000002,-99.948166999999998 40.001812999999999,-99.944417 40.001584,-99.930432999999979 40.001516000000002,-99.906657999999993 40.001511999999998,-99.850154757615712 40.001444140609848,-99.813400999999999 40.001399999999997,-99.775639999999981 40.001646999999998,-99.772120999999984 40.001804,-99.764213999999996 40.001550999999999,-99.756834999999995 40.001342,-99.746628 40.001820000000002,-99.737774855821357 40.001824224692157,-99.731959000000003 40.001826999999992,-99.719639 40.001807999999997,-99.628345999999993 40.001866,-99.625979999999984 40.001865000000002,-99.515340365578794 40.002008435606839,-99.501791999999995 40.002026,-99.498998999999984 40.00195699999999,-99.497659999999982 40.001911999999997,-99.493464999999986 40.001936999999998,-99.480727999999999 40.001942,-99.423564999999996 40.002270000000003,-99.412644999999998 40.001867999999995,-99.403389000000004 40.001969000000003,-99.366747146128873 40.001962496644857,-99.290702999999979 40.001949000000003,-99.286655999999994 40.002017000000002,-99.282966999999999 40.001879000000002,-99.254012000000003 40.002074,-99.25036999999999 40.00195699999999,-99.216375999999997 40.002015999999998,-99.197591999999986 40.002032999999997,-99.188905000000005 40.002023,-99.186961999999994 40.001976999999997,-99.178965000000005 40.001976999999997,-99.169815999999997 40.001925,-99.123032999999992 40.002164999999998,-99.113510000000005 40.002192999999998,-99.085596999999993 40.002132999999994,-99.067047050731574 40.00217023690761,-99.020337999999995 40.00226399999999,-99.018700999999993 40.002333,-98.992135000000005 40.002192,-98.972286999999994 40.002245000000002,-98.971721000000002 40.002268,-98.961009000000004 40.002316999999998,-98.96091899999999 40.002271,-98.953888072580213 40.002253239016738,-98.934791999999987 40.002204999999996,-98.8435956659672 40.002348607685946,-98.842134005327992 40.002350909376077,-98.834455999999989 40.002363000000003,-98.820589999999982 40.002319,-98.777203 40.002358999999998,-98.774940999999998 40.002336,-98.729330606936671 40.002229113826232,-98.726294999999993 40.002222000000003,-98.710403999999997 40.002180000000003,-98.693095999999997 40.002372999999999,-98.691443000000007 40.002504999999999,-98.690286999999998 40.002547999999997,-98.672819000000004 40.002364,-98.669723999999988 40.002409999999998,-98.653832999999992 40.002268999999998,-98.652494000000004 40.002245000000002,-98.640709999999984 40.002493,-98.616372379820518 40.002409030470169,-98.613754999999998 40.002400000000002,-98.593342000000007 40.002475999999994,-98.575219000000004 40.002479999999991,-98.560578000000007 40.002274,-98.543186000000006 40.002285,-98.523053000000004 40.002336,-98.506634585466017 40.002329436673158,-98.504454999999979 40.002328565375151,-98.50084801790743 40.002327123469641,-98.490532999999999 40.002322999999997,-98.441997554675297 40.002366263566756,-98.391848301995964 40.002410965650498,-98.274015000000006 40.002516,-98.268218000000005 40.002490000000002,-98.25000799999998 40.002307000000002,-98.213290432425865 40.002506421375415,-98.193483 40.002614,-98.179315000000003 40.002482999999998,-98.172269 40.002437999999991,-98.156873151934732 40.002445128178877,-98.142031000000003 40.002451999999998,-98.099659000000003 40.002226999999998,-98.076034000000007 40.002300999999996,-98.068701000000004 40.002355,-98.050056999999981 40.002277999999997,-98.047469000000007 40.002186000000002,-98.042767978165202 40.002191261754177,-98.014411999999979 40.002223,-98.010157000000007 40.002153,-97.972185999999994 40.002113999999999,-97.931810999999996 40.002049999999997,-97.876261 40.002102,-97.85745 40.002065000000002,-97.838378999999989 40.001909999999995,-97.821597999999994 40.002003999999992,-97.819426000000007 40.001957999999995,-97.777154999999993 40.002167,-97.770775999999998 40.001976999999997,-97.769204000000002 40.001995,-97.767746000000002 40.001994000000003,-97.714825952022949 40.001974503868432,-97.706952472912022 40.001971603221314,-97.701160424072398 40.001969469388285,-97.61370959051284 40.001937251863488,-97.595964207410262 40.001930714334961,-97.593671575073259 40.001929869712491,-97.51530799999999 40.001900999999997,-97.511381 40.001899000000002,-97.510264000000006 40.001835,-97.48896951184885 40.0019310946697,-97.481234094494141 40.001966001936331,-97.463284999999999 40.00204699999999,-97.444661999999994 40.001957999999995,-97.425443 40.002048000000002,-97.417825999999991 40.002023999999999,-97.415833000000006 40.002000999999993,-97.369102999999996 40.00206,-97.350896000000006 40.001930000000002,-97.350272000000004 40.001975999999999,-97.256541388870858 40.001563097676062,-97.24516899999999 40.001513000000003,-97.245080000000002 40.001466999999998,-97.202309999999997 40.00144199999999,-97.200190000000006 40.001548999999997,-97.181775000000002 40.001550000000002,-97.165136038800085 40.001526729909067,-97.164288093539042 40.001525544031956,-97.157705785150654 40.001516338474417,-97.144150390621661 40.001497380844818,-97.142447999999987 40.001494999999998,-97.137865999999988 40.001814000000003,-97.049662999999995 40.001322999999999,-97.030802999999992 40.001342,-97.009164999999996 40.001463,-96.918187714380807 40.001505032225388,-96.916093000000004 40.001505999999999,-96.880459000000002 40.001448000000003,-96.878253 40.001466,-96.875056999999998 40.001448000000003,-96.873812 40.001449999999998,-96.868892342573133 40.001444286089438,-96.805301797100199 40.001370429180717,-96.693246065483095 40.001240282633297,-96.622400999999996 40.001157999999997,-96.610348999999999 40.000881,-96.604883999999984 40.000891000000003,-96.581788013355691 40.000963078853125,-96.580851999999993 40.000965999999998,-96.570853999999997 40.001090999999995,-96.557862999999998 40.000968,-96.538977000000003 40.000850999999997,-96.527110999999991 40.001030999999998,-96.469944999999996 40.000965999999998,-96.467535999999996 40.001035000000002,-96.463639999999998 40.000967000000003,-96.354812913341547 40.000735780492882,-96.350953725714731 40.00072758106856,-96.341811057717251 40.000708156095854,-96.304554999999993 40.000629000000004,-96.301066000000006 40.000632000000003,-96.239171999999996 40.000691000000003,-96.223838999999998 40.000729,-96.220170999999993 40.00072,-96.154364999999984 40.000495,-96.154246 40.00045,-96.147166999999982 40.000478999999999,-96.125936999999979 40.000432000000004,-96.125788 40.000467,-96.089781000000002 40.000518999999997,-96.081394999999986 40.000602999999998,-96.051691000000005 40.000726999999998,-96.02409 40.000718999999997,-96.014716997898134 40.000662392993569,-96.010677999999999 40.000638000000002,-95.995389500007406 40.000603953777215,-95.958139000000003 40.000520999999999,-95.901560435593936 40.000482839492363,-95.882524000000004 40.00047,-95.788023999999993 40.000452000000003,-95.784575000000004 40.000463000000003,-95.672891827756033 40.000336669594915,-95.658762261555324 40.000320686938032,-95.63965170807073 40.000299070038061,-95.565216789143676 40.000214872989645,-95.463103327781397 40.00009936736172,-95.455130658279359 40.000090349077695,-95.452048066669519 40.000086862204618,-95.438655850967621 40.000071713601649,-95.436011808705814 40.000068722793607,-95.426269559489981 40.00005770284973,-95.42148745056565 40.000052293567869,-95.41484447973599 40.000044779372317,-95.375257000000005 40.0,-95.339895999999982 39.999999000000003,-95.326448603970363 39.999998574530281,-95.30829 39.999997999999998,-95.308403999999996 39.993758,-95.307779999999994 39.990617999999998,-95.307111000000006 39.989114,-95.302506999999991 39.984357000000003,-95.289715 39.977705999999998,-95.274756999999994 39.972115000000002,-95.269885999999985 39.969396000000003,-95.261854 39.960617999999997,-95.257651999999993 39.954886000000002,-95.250253999999998 39.948644000000002,-95.241382999999999 39.944949,-95.236761 39.943930999999999,-95.231114000000005 39.943784,-95.220212000000004 39.944432999999997,-95.216440000000006 39.943953,-95.213736999999995 39.943205999999996,-95.204427999999993 39.938949,-95.201277000000005 39.934193999999998,-95.200689999999994 39.928154999999997,-95.20201 39.922438,-95.205744999999993 39.915168999999999,-95.206326000000004 39.912120999999999,-95.206195999999991 39.909557,-95.205732999999981 39.908275000000003,-95.202631127107011 39.904826841138963,-95.201935000000006 39.904052999999998,-95.19982446963148 39.902956959499498,-95.199773390195176 39.902930432929807,-95.199730682369619 39.902908253904485,-95.199347000000003 39.902709000000002,-95.193815999999984 39.900689999999997,-95.189565000000002 39.899959000000003,-95.179452999999995 39.900061999999991,-95.172296000000003 39.902025999999999,-95.159833999999989 39.906984,-95.156023999999988 39.907243,-95.153185481864639 39.906665666721331,-95.151701132402337 39.906363761184394,-95.149656999999991 39.905947999999995,-95.148243978290679 39.905255611516672,-95.146055000000004 39.904183000000003,-95.143801999999994 39.901917999999995,-95.142562999999981 39.897992000000002,-95.142444999999995 39.895419999999994,-95.143403000000006 39.889355999999992,-95.142718000000002 39.885888999999992,-95.140601000000004 39.88168799999999,-95.137091999999996 39.878350999999995,-95.134747000000004 39.876852,-95.128165999999993 39.874164999999998,-95.105912000000004 39.869163999999998,-95.090958483530287 39.863446088154532,-95.090158000000002 39.86314,-95.085003 39.861882999999999,-95.081534000000005 39.861718000000003,-95.079786043666886 39.861878094210859,-95.052535000000006 39.864373999999998,-95.042141999999998 39.864804999999997,-95.037767000000002 39.865541999999998,-95.034318031759739 39.867229060943565,-95.032053000000005 39.868336999999997,-95.031002514960235 39.869148692103728,-95.027930999999981 39.871521999999999,-95.025918959417425 39.87568321107333,-95.025422000000006 39.876711,-95.025119000000004 39.878833,-95.02586205726584 39.885935119809076,-95.025947000000002 39.886747,-95.025771840138887 39.887478608302466,-95.025475064075451 39.888718183571669,-95.025239999999997 39.889699999999998,-95.024388999999999 39.891202,-95.021897459019584 39.893924778577606,-95.019088516216428 39.896994416745422,-95.018742999999986 39.89737199999999,-95.018224596337973 39.897611313155366,-95.013151999999991 39.899952999999996,-95.010684182587667 39.900289758615472,-95.008439999999993 39.900596,-95.003818999999993 39.900400999999995,-94.990284000000003 39.897010000000002,-94.989784913598129 39.896958718834505,-94.987823822157509 39.896757216540813,-94.986975 39.89667,-94.985308455245701 39.896814869812808,-94.979390624873346 39.897329296428744,-94.977748999999989 39.897472,-94.963345000000004 39.901136,-94.959276000000003 39.901671,-94.958440298615102 39.901548064610132,-94.95153999999998 39.900532999999996,-94.943866999999983 39.898130000000002,-94.935306395585215 39.893779379194363,-94.934493000000003 39.893366,-94.929574000000002 39.888753999999992,-94.927897000000002 39.88611199999999,-94.927358999999996 39.883966,-94.927251999999996 39.880257999999991,-94.928466 39.876344000000003,-94.931084167287821 39.873075003673321,-94.931462999999994 39.872602,-94.938790999999995 39.866954,-94.940742999999998 39.864409999999999,-94.942407000000003 39.861065999999994,-94.942566999999983 39.856601999999995,-94.939767000000003 39.851930000000003,-94.937655000000007 39.849786000000002,-94.926149999999993 39.841321999999998,-94.916917999999995 39.836137999999998,-94.909941999999987 39.834426,-94.903156999999979 39.833849999999998,-94.892677000000006 39.834377999999994,-94.889493000000002 39.834026,-94.886932999999999 39.833098,-94.881012999999996 39.828921999999991,-94.878676999999996 39.826521999999997,-94.877043999999998 39.823754,-94.876543999999996 39.820594,-94.875944000000004 39.813293999999999,-94.87632679569893 39.807169268817198,-94.876344000000003 39.806894,-94.876705972386588 39.80614007495069,-94.880932 39.797338000000003,-94.884084 39.794234000000003,-94.890292000000002 39.791626,-94.892965000000004 39.791097999999991,-94.912908274541266 39.790276806342419,-94.92474489359239 39.789789416146199,-94.925605000000004 39.789753999999995,-94.925940683661906 39.789631963361245,-94.927258709273417 39.789152799691166,-94.929653999999999 39.788281999999995,-94.93035270914757 39.787827111232048,-94.930442023078356 39.787768964141691,-94.930979872832452 39.787418801541357,-94.932726000000002 39.786282,-94.932913349551853 39.786043884763131,-94.935059195246907 39.783316584105528,-94.935205999999994 39.78313,-94.935782000000003 39.778905999999999,-94.935301999999993 39.77561,-94.935036741896766 39.775108050050804,-94.934624304242575 39.774327591105198,-94.934262000000004 39.773642000000002,-94.929652999999988 39.769098,-94.929421387607832 39.768921584953624,-94.928626586797606 39.768316199289764,-94.926229000000006 39.76648999999999,-94.923991330811134 39.765173947104167,-94.916788999999994 39.760937999999996,-94.912293000000005 39.759337999999993,-94.906244 39.759417999999997,-94.905921454535701 39.759501730763866,-94.900921941190049 39.760799572828766,-94.899156000000005 39.761257999999998,-94.899025621234756 39.761323457651685,-94.895268000000002 39.76321,-94.895041000000006 39.763350000000003,-94.894070999999997 39.763945999999997,-94.893918999999997 39.76404,-94.893724000000006 39.764159999999997,-94.893646000000004 39.764208000000004,-94.883923999999993 39.770186000000002,-94.881460000000004 39.771258000000003,-94.881422 39.771258000000003,-94.874706321154179 39.772392308082928,-94.871144 39.772993999999997,-94.869643999999994 39.772894,-94.867142999999999 39.771693999999997,-94.865243000000007 39.770094,-94.863142999999994 39.767294,-94.860742999999999 39.763094000000002,-94.859442999999999 39.753694000000003,-94.860369889104035 39.749534984666809,-94.860371 39.74953,-94.862942999999987 39.742994000000003,-94.870142999999999 39.734594,-94.875642999999997 39.730494,-94.884142999999995 39.726793999999998,-94.891743999999989 39.724893999999999,-94.899315999999999 39.724041999999997,-94.900553640444031 39.724102079633198,-94.901582061073228 39.724152002964722,-94.902612000000005 39.724201999999998,-94.906055088082866 39.724933471502588,-94.907014260749904 39.725137244236571,-94.907785666538786 39.725301126582274,-94.910067999999995 39.725785999999999,-94.911087398893699 39.726157408899255,-94.918323999999998 39.728793999999994,-94.93000499999998 39.735370000000003,-94.939221000000003 39.74157799999999,-94.944740999999979 39.744377,-94.948658825773634 39.745572502168315,-94.948680784417533 39.745579202723142,-94.948725999999994 39.745593,-94.952629999999999 39.745961,-94.955286 39.745688999999999,-94.960086000000004 39.743065,-94.963779819772341 39.740240978767318,-94.964692434782606 39.73954326086956,-94.965317999999982 39.739064999999989,-94.965565209393333 39.738728671232884,-94.970224508542714 39.732389687437191,-94.970421999999985 39.732120999999999,-94.971205999999981 39.729304999999997,-94.971078000000006 39.723146,-94.968452999999997 39.707402000000002,-94.968980999999999 39.692954,-94.969909 39.689050000000002,-94.971316999999999 39.686410000000002,-94.976096392737759 39.68160006801152,-94.976325000000003 39.68137,-94.981556999999995 39.678634000000002,-94.984149000000002 39.677849999999992,-94.986445080691666 39.677537608069159,-94.990587390516794 39.676974028501114,-94.993556999999996 39.676569999999998,-94.998766892420107 39.676509388876212,-95.001379 39.676479,-95.004602740773237 39.676177881356345,-95.008105239221649 39.675850724907868,-95.009022999999999 39.675764999999998,-95.010225986948086 39.675477408241932,-95.013209713780839 39.674764104372102,-95.015309999999985 39.674261999999999,-95.018317999999994 39.672868999999999,-95.021521942351953 39.670631293568427,-95.024595000000005 39.668484999999997,-95.027643999999995 39.665453999999997,-95.037464 39.652904999999997,-95.039049000000006 39.649639,-95.044554000000005 39.644370000000002,-95.049518000000006 39.637875999999999,-95.053366999999994 39.630347,-95.054924999999997 39.624994999999991,-95.055024819926729 39.623527163368095,-95.055152000000007 39.621656999999992,-95.054958456554544 39.620961328886679,-95.053131423647116 39.614394255464305,-95.053011999999981 39.613965,-95.052555891387243 39.613278556984888,-95.047910999999999 39.606287999999999,-95.046445000000006 39.601605999999997,-95.046361000000005 39.599556999999997,-95.047165000000007 39.595117000000002,-95.049277000000004 39.589582999999998,-95.054804000000004 39.582487999999998,-95.056897000000006 39.580567000000002,-95.059518999999995 39.579132,-95.064519000000004 39.577114999999999,-95.066275551338904 39.576786470694117,-95.068266439890465 39.576414113098046,-95.069315000000003 39.576217999999997,-95.072159999999982 39.576121999999991,-95.075842551355763 39.576644128527029,-95.076688000000004 39.576763999999997,-95.088569515113861 39.580713698327401,-95.089515000000006 39.581028000000003,-95.09068217809525 39.58095107619048,-95.095736000000002 39.580618,-95.099095000000005 39.579690999999997,-95.100375015351446 39.579100080742663,-95.10182940536555 39.578428661399109,-95.103228 39.577782999999997,-95.106109962410699 39.575487768136732,-95.106244982404746 39.575380236480051,-95.106274453941239 39.575356764970024,-95.106406000000007 39.575251999999999,-95.107454000000004 39.573842999999997,-95.108931052511622 39.56997896968771,-95.109155613535791 39.569391508783276,-95.112830712234896 39.559777298955126,-95.112877844119652 39.559653999999995,-95.113077000000004 39.559132999999996,-95.113262990573148 39.557121201967142,-95.113516735173974 39.554376531201555,-95.113557 39.553940999999995,-95.113330390574859 39.553319942050457,-95.109694540741444 39.543355336910984,-95.109303999999995 39.542284999999993,-95.106595999999996 39.537657000000003,-95.106363136618171 39.537386330858773,-95.106309238275287 39.537323682029822,-95.102887999999993 39.533346999999999,-95.096713422649174 39.527826015970483,-95.095319522838992 39.526579663685382,-95.092703999999998 39.524241000000004,-95.082713999999996 39.516711999999998,-95.077440999999993 39.513551999999997,-95.059460999999985 39.506143000000002,-95.05637999999999 39.503971999999997,-95.052176999999986 39.499995999999996,-95.050551999999996 39.497514000000002,-95.049844999999991 39.494414999999989,-95.048370000000006 39.480420000000002,-95.047133000000002 39.474970999999996,-95.045715999999999 39.472459,-95.040779999999998 39.466386999999997,-95.03749999999998 39.463689000000002,-95.033407999999994 39.460875999999992,-95.028497999999999 39.458286999999999,-95.015825000000007 39.452809000000002,-94.995767999999998 39.448174000000002,-94.990172 39.446192000000003,-94.982144000000005 39.440551999999997,-94.978797999999998 39.436241000000003,-94.976606000000004 39.426701,-94.972952000000006 39.421705000000003,-94.968547467194298 39.418879728230785,-94.966981164652054 39.417875029083376,-94.966065999999998 39.417287999999999,-94.965430539155946 39.417093446959996,-94.954817000000006 39.413843999999997,-94.951209000000006 39.411706999999993,-94.947863999999996 39.408603999999997,-94.946292999999983 39.405645999999997,-94.946662000000003 39.399717000000003,-94.946226999999993 39.395648,-94.945577 39.393850999999998,-94.942038999999994 39.389499,-94.939696999999995 39.387949999999996,-94.938205659338905 39.38711651736979,-94.938199994953891 39.387113351650086,-94.938198708293527 39.387112632559479,-94.937157999999982 39.386530999999998,-94.933651999999995 39.385545999999998,-94.932170703908099 39.385397898493565,-94.923109999999994 39.384492000000002,-94.919224999999997 39.385173999999999,-94.915858999999998 39.386347999999998,-94.909581000000003 39.388865000000003,-94.901822999999993 39.392797999999999,-94.896448416922993 39.39340032396553,-94.894979000000006 39.393565000000002,-94.891845000000004 39.393312999999999,-94.888971999999995 39.392431999999999,-94.888058227506249 39.391822741147728,-94.885025999999996 39.389800999999999,-94.880978999999996 39.383899,-94.879281000000006 39.37977999999999,-94.879087999999996 39.375702999999994,-94.881359999999987 39.370382999999997,-94.885216 39.366911000000002,-94.890928000000002 39.364030999999997,-94.896832000000003 39.363135,-94.899023999999997 39.362431,-94.902496999999997 39.360382999999999,-94.90716104958679 39.35683832231404,-94.907297 39.356735,-94.907510470967722 39.356484333333356,-94.909408999999997 39.354254999999995,-94.910016999999996 39.352542999999997,-94.91007929967077 39.352122876579188,-94.910166635146069 39.351533921963672,-94.910234386079424 39.351077037464393,-94.910640999999998 39.348334999999999,-94.910055514481613 39.342727430625168,-94.908683540921714 39.329587162119807,-94.908064999999993 39.323663000000003,-94.906599414484603 39.317389801180319,-94.905982468129508 39.31474906332776,-94.905548856768945 39.312893060899633,-94.905328999999995 39.311951999999998,-94.904604536115073 39.31007473956825,-94.903592654247163 39.307452709910535,-94.903137 39.306272,-94.902341179156608 39.304705098857582,-94.900693838394318 39.301461629999167,-94.900362755471093 39.300809756886117,-94.900048999999996 39.300192000000003,-94.895217000000002 39.29420799999999,-94.889432625546704 39.288730528394183,-94.887056 39.286479999999997,-94.882576 39.283327999999997,-94.881425972827699 39.282735692772164,-94.879585687759075 39.281787876778168,-94.878319999999988 39.281135999999996,-94.869470269042495 39.278423959123423,-94.867567999999991 39.277841000000002,-94.866576416802303 39.277461598502107,-94.857072000000002 39.273825000000002,-94.850573678793964 39.270595179638669,-94.850470600187833 39.270543947117169,-94.846320000000006 39.268481,-94.844203868589133 39.266965084952687,-94.840994595225254 39.264666085108807,-94.837855000000005 39.262416999999999,-94.836102527271095 39.260730409704507,-94.834879550067882 39.259553409087879,-94.832501320107042 39.257264586268427,-94.832102355305352 39.256880620143498,-94.831470999999993 39.256273,-94.827487000000005 39.249888999999996,-94.826571473591798 39.245793223963304,-94.825663000000006 39.241728999999999,-94.826110999999983 39.238289000000002,-94.826405091238243 39.237538367125239,-94.827108391663188 39.2357432765168,-94.827791000000005 39.234000999999999,-94.828117769197533 39.233533772937683,-94.83244435695299 39.227347452739551,-94.834698551534771 39.224124319346686,-94.834896 39.223841999999998,-94.834917496024659 39.223414229109203,-94.835039139715306 39.220993519665384,-94.835046603087861 39.220844998551456,-94.835055999999994 39.220658,-94.833551999999997 39.217793999999998,-94.831678999999994 39.215938,-94.823791 39.209873999999999,-94.820687000000007 39.208626000000002,-94.811662999999996 39.206594000000003,-94.800359054554335 39.206051410618606,-94.799662999999995 39.206018,-94.798924306591658 39.206116812235138,-94.793913945984244 39.206787029303406,-94.788135068391796 39.207560047994349,-94.787343000000007 39.207666000000003,-94.783838000000003 39.207154000000003,-94.781518000000005 39.206145999999997,-94.780294078498926 39.205273290755756,-94.778971577769184 39.204330290235411,-94.777838000000003 39.203522,-94.775537999999997 39.200602000000003,-94.770897097034492 39.191141697801093,-94.770859400196969 39.191064854247678,-94.770337999999995 39.190002,-94.763137999999998 39.179903000000003,-94.75233799999998 39.173202999999994,-94.74193799999999 39.170203,-94.736536999999998 39.169203000000003,-94.723636999999997 39.169002999999989,-94.714136999999994 39.170403,-94.696331999999998 39.178562999999997,-94.687235999999999 39.183503000000002,-94.680335999999983 39.184303,-94.669134999999997 39.182003000000002,-94.663835000000006 39.179102999999998,-94.660314999999997 39.168050999999991,-94.662434999999988 39.157602999999995,-94.650734999999983 39.154102999999999,-94.640034999999997 39.153102999999994,-94.623934000000006 39.156602999999997,-94.615834000000007 39.160003000000003,-94.608834000000002 39.160502999999999,-94.601732999999996 39.15960299999999,-94.596033000000006 39.157702999999998,-94.591932999999997 39.155003,-94.589933000000002 39.140402999999999,-94.592533000000003 39.135902999999992,-94.600433999999993 39.128503000000002,-94.605733999999998 39.122204000000004,-94.607033999999999 39.119404000000003,-94.607354 39.113444,-94.607234000000005 39.089604,-94.607333999999994 39.081703999999995,-94.607275518421304 39.072346947409343,-94.607234000000005 39.065703999999997,-94.607342812841125 39.057404745686583,-94.60738379566331 39.05427894858029,-94.607437239929951 39.050202705779334,-94.607518499034526 39.044004999999999,-94.607559479691474 39.040879368039988,-94.607612854426819 39.036808428453341,-94.60764748233197 39.034167326647299,-94.607654028188094 39.033668068249817,-94.60769507925167 39.030537066312085,-94.607898722639391 39.015005000000002,-94.607914652765047 39.013789994834404,-94.607991843462372 39.007902590176151,-94.608087526605189 39.000604749887366,-94.608092759229436 39.000205652880325,-94.608190956218394 38.992716079262479,-94.608212339138063 38.991085184540211,-94.608264438806202 38.98711149548862,-94.608279957450691 38.985927874365181,-94.608301211867541 38.984306780669819,-94.608333999999999 38.981805999999999,-94.608294286905348 38.97390309416464,-94.608273484679671 38.969763451253407,-94.608249262127771 38.964943163424849,-94.608207879518076 38.956708024096379,-94.608134000000007 38.942005999999999,-94.608134000000007 38.940005999999997,-94.607866 38.937398000000002,-94.607977999999989 38.936869999999992,-94.608002838442587 38.912906322207348,-94.608006216770249 38.909646973100827,-94.608010407202343 38.90560412040071,-94.608022064178897 38.894357681354862,-94.60802273861259 38.893706999999999,-94.608033000000006 38.883806999999997,-94.608033000000006 38.869207000000003,-94.608033000000006 38.868107000000002,-94.607992999999993 38.867271000000002,-94.608033000000006 38.861207,-94.608033000000006 38.855007,-94.608033000000006 38.850107,-94.608033000000006 38.847206999999997,-94.607624999999999 38.827559999999991,-94.607668973053535 38.825816299300072,-94.608041 38.811064000000002,-94.608617609754887 38.781926100280451,-94.609398999999996 38.742440000000002,-94.60945599999998 38.74069999999999,-94.609507757106428 38.73815999467709,-94.609625656590424 38.7323740198146,-94.610322172686637 38.698192151600097,-94.61071084056907 38.679118085101081,-94.61073851283922 38.677760054904219,-94.611602000000005 38.635384000000002,-94.611464999999995 38.625011,-94.611857999999998 38.620485000000002,-94.611908 38.609271999999997,-94.611905562149673 38.605890005062435,-94.611886999999996 38.580139000000003,-94.611902 38.580109999999998,-94.612176000000005 38.576546,-94.612156999999996 38.549816999999997,-94.612272000000004 38.547916999999998,-94.612464742072774 38.518760616499996,-94.612644000000003 38.491644,-94.612725999999995 38.484366999999999,-94.612696 38.483153999999999,-94.612865999999997 38.477570999999998,-94.613365000000002 38.403421999999999,-94.613264999999998 38.392426,-94.613275404637193 38.388718047420433,-94.613328999999993 38.369617999999996,-94.613311999999993 38.364407,-94.613085455228386 38.3436360393057,-94.612999999999985 38.335800999999996,-94.612825 38.324387000000002,-94.612787999999995 38.320141999999997,-94.612673 38.314832000000003,-94.612673 38.302526999999998,-94.612689368276676 38.301464114946214,-94.612843999999996 38.291422999999995,-94.612848999999997 38.289914000000003,-94.612707829046002 38.272362044447966,-94.612691999999996 38.270394000000003,-94.612613999999994 38.237766,-94.612634999999997 38.226987,-94.612658999999994 38.219251,-94.61265866950464 38.21872154645218,-94.612657999999982 38.217649000000002,-94.612821999999994 38.203918000000002,-94.612848 38.200713999999998,-94.613073 38.190551999999997,-94.61341774677895 38.168183959706163,-94.613422 38.16790799999999,-94.613748 38.160632999999997,-94.613855999999998 38.149768999999999,-94.613889466360249 38.136312911169284,-94.613919497343275 38.124238112111762,-94.614061000000007 38.067343,-94.614088999999993 38.065900999999997,-94.614054999999993 38.060088,-94.613980999999995 38.036949,-94.614211999999981 37.992462000000003,-94.614464999999996 37.987798999999995,-94.614511123427164 37.979395512107736,-94.614514360688489 37.978805697169918,-94.614557000000005 37.971036999999995,-94.614561999999992 37.951517000000003,-94.614593999999997 37.949977999999994,-94.614611999999994 37.944361999999998,-94.614754000000005 37.940769000000003,-94.614834999999999 37.936700000000002,-94.614778 37.934199999999997,-94.615181000000007 37.915944000000003,-94.615392999999983 37.906391999999997,-94.61546899999999 37.901775,-94.615706000000003 37.886842999999999,-94.615921 37.878331000000003,-94.615834000000007 37.872509999999998,-94.616 37.863126,-94.616282760205394 37.851281931678621,-94.616426000000004 37.845281999999997,-94.616433230053673 37.842955730230052,-94.61645 37.837560000000003,-94.616861999999998 37.819456000000002,-94.6176681324215 37.775831003788085,-94.617720999999989 37.77297,-94.617737774720197 37.764628336555312,-94.617744979193901 37.761045725680312,-94.617807999999997 37.729706999999998,-94.617975 37.722175999999997,-94.61780499999999 37.690178000000003,-94.617650999999995 37.687671000000002,-94.617687000000004 37.686652999999993,-94.617885 37.682214000000002,-94.617733999999999 37.673127,-94.617576 37.653671000000003,-94.617517909436387 37.643988652624088,-94.61747699999998 37.637169999999998,-94.617472819127315 37.636539916507168,-94.6173 37.610495,-94.617428000000004 37.609521999999998,-94.617283 37.571896000000002,-94.617315000000005 37.571498999999996,-94.617080999999999 37.567013000000003,-94.61711240153133 37.563155381499406,-94.617159999999984 37.557307999999999,-94.617186000000004 37.553485000000002,-94.617167532949537 37.551779056391354,-94.616988484457494 37.535238968895172,-94.616907999999981 37.527804000000003,-94.616788999999997 37.521509999999999,-94.616880369657522 37.506771761864755,-94.617022999999989 37.483764999999998,-94.617182999999997 37.469664999999999,-94.617180000000005 37.465203000000002,-94.617221999999998 37.460476,-94.617204999999984 37.46037299999999,-94.617200999999994 37.454788,-94.617131999999998 37.439818000000002,-94.617265000000003 37.425535999999994,-94.617510999999993 37.410908999999997,-94.617557000000005 37.396374999999999,-94.61759158917468 37.381725975861251,-94.617625000000004 37.367576,-94.617626 37.367444999999989,-94.617536999999999 37.364355000000003,-94.617636000000005 37.338417,-94.617694999999998 37.336841999999997,-94.617648000000003 37.323588999999998,-94.61807499999999 37.240436000000003,-94.618157999999994 37.237596999999994,-94.618122999999997 37.229334,-94.61815 37.228121000000002,-94.618218999999996 37.207771999999999,-94.618305000000007 37.207337000000003,-94.618319 37.188774000000002,-94.618504999999985 37.181184000000002,-94.618472999999994 37.174782,-94.618351000000004 37.160210999999997,-94.618071999999998 37.132345,-94.61807499999999 37.129755000000003,-94.61816441512984 37.118929895303054,-94.618212 37.113168999999992,-94.618150999999997 37.103968000000002,-94.618059000000002 37.096676000000002,-94.618088 37.093670999999993,-94.618089999999995 37.093494,-94.618085255103864 37.089305442941992,-94.618082 37.086432000000002,-94.61811999999999 37.085934000000002,-94.617981999999998 37.075077,-94.617954311863897 37.070346986543974,-94.617947706480578 37.069218577181687,-94.617910161110728 37.062804634983031,-94.617893975984089 37.060039701061122,-94.617874999999998 37.056798,-94.617877538275181 37.056339390079508,-94.617964999999998 37.040537,-94.617972200190749 37.032971759572447,-94.617994999999979 37.009015999999995,-94.618027702303792 37.004829720380044,-94.618080000000006 36.998134999999998,-94.625223999999989 36.998671999999999,-94.699735000000004 36.998804999999997,-94.701796999999999 36.998814000000003,-94.711286363060864 36.99879670415919,-94.712770000000006 36.99879399999999,-94.722629184733563 36.998741903378082,-94.732834603466486 36.998687977231512,-94.736330645670293 36.998669503899912,-94.737183000000002 36.998665000000003,-94.739323999999996 36.998686999999997,-94.745992043692311 36.998700535427304,-94.749560781475736 36.99870777958963,-94.749834600019099 36.998708335412474,-94.777257000000006 36.998764,-94.831280000000007 36.998812,-94.831539962039543 36.998812565955092,-94.840925999999996 36.998832999999998,-94.846637705524785 36.998860673615503,-94.849800999999999 36.998875999999996,-94.853196999999994 36.998874,-94.896852168601683 36.999075231107383,-94.904605402657381 36.99911097010289,-94.9407882710602 36.999277757196154,-94.995293000000004 36.999528999999995,-95.007620000000003 36.999513999999998,-95.011432999999997 36.999535000000002,-95.030323999999993 36.999516999999997,-95.037857000000002 36.999496999999998,-95.049498999999983 36.999580000000002,-95.073509 36.999509000000003,-95.1405498515593 36.999533623834409,-95.155186999999998 36.999538999999999,-95.155372 36.999540000000003,-95.159067907556633 36.999536629205572,-95.177300999999986 36.999519999999997,-95.195307 36.999564999999997,-95.267905305061163 36.999446910377756,-95.285983101167361 36.999417504731007,-95.322564999999997 36.999357999999994,-95.328057999999999 36.999364999999997,-95.328326999999987 36.999366000000002,-95.331209999999999 36.999380000000002,-95.377252424658963 36.999296311678272,-95.381753803085687 36.999288129815376,-95.407683000000006 36.999240999999998,-95.511578 36.999234999999999,-95.522414951940931 36.999281058114107,-95.534401000000003 36.999332000000003,-95.573598000000004 36.999309999999994,-95.601517312742303 36.999317968253862,-95.612139999999997 36.999321000000002,-95.615933999999996 36.999364999999997,-95.621011943860609 36.999361983160732,-95.624350000000007 36.999360000000003,-95.630078999999995 36.999319999999997,-95.638122589416028 36.999320470082949,-95.664300999999995 36.999321999999999,-95.674044398562955 36.999333876292773,-95.686452000000003 36.999349000000002,-95.696658999999997 36.999215,-95.71038 36.999370999999996,-95.710782524132014 36.999362783399121,-95.714887000000004 36.999279,-95.718053999999995 36.999254999999998,-95.741907999999995 36.999243999999997,-95.746466244276931 36.999250838506164,-95.759905000000003 36.999270999999993,-95.768719000000004 36.999205000000003,-95.786761999999996 36.999309999999994,-95.807979999999986 36.999124000000002,-95.819364496908179 36.999150471530008,-95.866899000000004 36.999260999999997,-95.873943999999995 36.999299999999998,-95.875256999999991 36.999302,-95.877150999999998 36.999304000000002,-95.910179999999997 36.999336,-95.928122000000002 36.999245000000002,-95.936991999999989 36.999267999999994,-95.964270378114222 36.999093604402042,-96.00081 36.99886,-96.095164142267308 36.998935940299688,-96.14121 36.998972999999999,-96.143207000000004 36.999133999999998,-96.147143 36.999021999999997,-96.149709 36.99904,-96.152383999999998 36.999050999999994,-96.154016999999982 36.999161,-96.184768000000005 36.999211000000003,-96.200028000000003 36.999028000000003,-96.217571000000007 36.999070000000003,-96.235320025971774 36.999130675786525,-96.27480962492784 36.999265672629733,-96.276368000000005 36.999270999999993,-96.279078999999996 36.999271999999991,-96.381556872639493 36.999226629434901,-96.394272 36.999220999999999,-96.415412000000003 36.999113,-96.500287999999998 36.998643,-96.525212323286397 36.998711038495294,-96.525495980566973 36.998711812823821,-96.551130926932458 36.998781791180214,-96.551130927020779 36.998781791180456,-96.624487489749981 36.998982040153741,-96.705431000000004 36.999203,-96.710481999999999 36.999270999999993,-96.731983006833033 36.99928335311408,-96.736589999999993 36.999285999999998,-96.741269999999986 36.999239000000003,-96.749837999999997 36.998987999999997,-96.792060000000006 36.999179999999996,-96.795198999999997 36.99886,-96.822790999999995 36.999181999999998,-96.867517000000007 36.999217000000002,-96.876289999999997 36.999232999999997,-96.902083000000005 36.999155000000002,-96.903509999999997 36.999132000000003,-96.917092999999994 36.999181999999998,-96.921914999999998 36.999150999999998,-96.924934279563146 36.999131784030439,-96.934641999999997 36.999070000000003,-96.967371 36.999066999999997,-96.975561999999996 36.999018999999997,-97.030081999999979 36.998928999999997,-97.039783999999983 36.999000000000002,-97.045562883576096 36.99899981011751,-97.100651999999997 36.998998,-97.104275999999999 36.999020000000002,-97.120284999999996 36.999014000000003,-97.122596999999999 36.999035999999997,-97.147721000000004 36.999110999999999,-97.202000013134437 36.999050609464689,-97.255829185181881 36.998990719420135,-97.342808466604069 36.998893946743877,-97.362376892203329 36.998872175019791,-97.364929972745273 36.99886933447624,-97.372421000000003 36.998860999999998,-97.384924999999996 36.998843,-97.462279999999993 36.998685000000002,-97.472860999999995 36.998721000000003,-97.527292000000003 36.998749999999994,-97.545899999999989 36.998708999999991,-97.546497999999985 36.998746999999995,-97.564536000000004 36.998711,-97.582460039051355 36.99869862770732,-97.606549 36.998682000000002,-97.637136999999996 36.999090000000002,-97.650465999999994 36.999003999999999,-97.692180007144742 36.998844793059916,-97.697103999999982 36.998826,-97.768704 36.998749999999994,-97.783432000000005 36.998961,-97.783489000000003 36.998846999999998,-97.802297999999979 36.998713000000002,-97.965379045838461 36.998468720211747,-98.033955000000006 36.998365999999997,-98.03989 36.998348999999997,-98.045341999999991 36.998327000000003,-98.111985000000004 36.998133000000003,-98.128185436781749 36.99814624647324,-98.147452 36.998162,-98.177595999999994 36.998008999999996,-98.190367496841162 36.998003995168112,-98.208218000000002 36.997996999999998,-98.219498999999999 36.997824,-98.237712000000002 36.99797199999999,-98.346187999999984 36.997962,-98.347186011230875 36.997961873429141,-98.354073 36.997960999999997,-98.408991 36.998513000000003,-98.418267999999998 36.998538000000003,-98.420209 36.998516000000002,-98.476584655565659 36.998733519956424,-98.485495952453391 36.998767903324406,-98.544871999999984 36.998997000000003,-98.622244241689657 36.999025734091177,-98.714511999999999 36.99906,-98.718464999999995 36.999179999999996,-98.761596999999995 36.999425000000002,-98.791936000000007 36.999254999999998,-98.793711000000002 36.999226999999991,-98.797451999999993 36.999228999999993,-98.811832237742053 36.99924038482925,-98.869449000000003 36.999285999999998,-98.880009 36.999262999999999,-98.880579999999995 36.999308999999997,-98.994371 36.999493,-99.000846251360556 36.99951188908193,-99.029336999999998 36.999594999999999,-99.044703416105833 36.999312701167916,-99.049695 36.999220999999999,-99.124882999999997 36.99942,-99.12944899999998 36.999422000000003,-99.215429691089184 36.999525607779709,-99.221470798208784 36.999532887387339,-99.22594390512576 36.999538277535649,-99.248119999999986 36.999564999999997,-99.277506000000002 36.999578999999997,-99.375390999999993 37.000176999999994,-99.375813215185289 37.000169016042221,-99.396673054015949 36.999774562980598,-99.407015 36.999578999999997,-99.456202999999988 36.999471,-99.484333000000007 36.999625999999999,-99.500394999999983 36.99957599999999,-99.500394999999983 36.999637,-99.502664999999993 36.999645,-99.504092999999997 36.999648,-99.508573999999982 36.999657999999997,-99.541115670095081 36.999572526667627,-99.558068000000006 36.999527999999998,-99.625399000000002 36.999670999999999,-99.648651999999998 36.999603999999998,-99.657657999999998 37.000197,-99.675479899119665 37.000294824261658,-99.700804554289192 37.000433831091229,-99.722499410223932 37.000552913981863,-99.774254999999997 37.000836999999997,-99.774816 37.000841,-99.786016000000004 37.000931,-99.875408999999991 37.001658999999997,-99.904897139036905 37.001652107487203,-99.995200999999994 37.001631000000003,-100.001285999999993 37.001699000000002,-100.002562999999995 37.001705999999999,-100.005706000000004 37.001725999999998,-100.08949117994996 37.002091554886341,-100.115721999999991 37.002206,-100.187546999999995 37.002082,-100.19237099999998 37.002035999999997,-100.193753999999998 37.002133,-100.201675999999992 37.002080999999997,-100.269984573601874 37.001795796937508,-100.395563941387664 37.001271475927872,-100.434302684862132 37.001109733298897,-100.434343961694367 37.0011095609592,-100.436759028295029 37.001099477534027,-100.462594151135718 37.000991610310841,-100.526354155903263 37.000725398506596,-100.551597999999998 37.000619999999998,-100.552683000000002 37.000734999999999,-100.591328000000004 37.000376000000003,-100.591413000000003 37.000399000000002,-100.629769999999994 37.000025,-100.63332699999998 36.999935999999998,-100.675551999999996 36.999687999999999,-100.734516999999997 36.999059000000003,-100.756894000000003 36.999356999999996,-100.759718826764541 36.999297806889686,-100.765484 36.999177000000003,-100.806116000000003 36.999091,-100.814277000000004 36.999085,-100.850054835707368 36.998687920265262,-100.855633999999981 36.998626000000002,-100.891659999999987 36.998604,-100.904274 36.998745,-100.904588000000004 36.998561000000002,-100.945565999999985 36.998151999999997,-100.958261085233985 36.99812508251128,-100.996501999999992 36.998044,-101.012641000000002 36.998176,-101.053589000000002 36.997966999999996,-101.066742000000005 36.997920999999998,-101.096255470166753 36.997758490771822,-101.211485999999979 36.997123999999999,-101.212908999999996 36.997044000000002,-101.283204233333976 36.996668964004151,-101.357796999999991 36.996271,-101.359673999999998 36.996231999999999,-101.37818 36.996164,-101.413867999999994 36.996008000000003,-101.415004999999994 36.995966000000003,-101.485326 36.995610999999997,-101.519065999999995 36.99554599999999,-101.555239 36.99541399999999,-101.600396000000003 36.995152999999995,-101.601592999999994 36.995094999999999,-101.672152845644291 36.994768289529276,-101.672152845650672 36.994768289529254,-101.718235173867967 36.994554916342196,-101.761767880686108 36.994353348566563,-101.826607533764985 36.994053124077894,-101.862548907230888 36.993886706153717,-101.881050066963184 36.993801040963412,-101.899294480822903 36.993716564573397,-101.902439999999999 36.993701999999999,-101.905152836625547 36.993689460946754,-101.93521516037174 36.99355050931414,-102.000446999999994 36.993248999999992,-102.000446999999994 36.993271999999997,-102.028206999999981 36.993124999999999,-102.042240000000007 36.993082999999999,-102.041951999999995 37.024741999999996,-102.04195 37.030805,-102.041921000000002 37.032178000000002,-102.041748999999996 37.034396999999998,-102.04191999999999 37.035083,-102.041983000000002 37.106551000000003,-102.041808999999986 37.111972999999999,-102.042091999999997 37.125020999999997,-102.042135000000002 37.125020999999997,-102.042121535383529 37.12671399835564,-102.042001999999997 37.141744000000003,-102.041962999999996 37.258164,-102.041663999999997 37.29764999999999,-102.041816999999995 37.309489999999997,-102.041973999999996 37.352612999999998,-102.042089000000004 37.352818999999997,-102.041523999999995 37.375017999999997,-102.041585760607518 37.389190434149839,-102.041675999999981 37.409897999999991,-102.041668999999999 37.434739999999998,-102.041754999999995 37.434854999999992,-102.041800999999992 37.469487999999998,-102.041786000000002 37.506065999999997,-102.04201599999999 37.535260999999998,-102.041899 37.541186000000003,-102.041893999999999 37.557977,-102.041618 37.607868000000003,-102.041584999999998 37.644281999999997,-102.041581999999991 37.654494999999997,-102.041694000000007 37.665680999999999,-102.041573999999997 37.680436,-102.041876000000002 37.723875,-102.041989965869121 37.73854062916552,-102.042158 37.760164000000003,-102.042668000000006 37.788758,-102.042952999999997 37.803534999999997,-102.043032999999994 37.824145999999999,-102.043218999999993 37.86792899999999,-102.043714531331204 37.914003914798144,-102.043845000000005 37.926135000000002,-102.043844000000007 37.928101999999996,-102.044644000000005 38.045532,-102.044255000000007 38.113010999999993,-102.044450868202546 38.120049353793199,-102.044589000000002 38.125012999999996,-102.044415729020699 38.133607343100145,-102.044251000000003 38.141777999999995,-102.044296878804843 38.175558844899406,-102.044398 38.250014999999998,-102.044510721728557 38.262483349316234,-102.044567999999998 38.268819,-102.044612999999998 38.312323999999997,-102.044944 38.384419,-102.044441999999989 38.415801999999999,-102.044936000000007 38.41968,-102.045323999999979 38.453646999999997,-102.045262999999991 38.505395,-102.045261999999994 38.505531999999995,-102.045112000000003 38.523783999999999,-102.045222999999993 38.543796999999998,-102.045188999999979 38.558731999999992,-102.045210999999995 38.581608999999993,-102.045287999999999 38.615248999999999,-102.045074 38.669617000000002,-102.045102 38.674945999999998,-102.045159999999996 38.675221,-102.045126999999994 38.686725000000003,-102.045156000000006 38.688555,-102.045211999999992 38.697566999999999,-102.045375000000007 38.754338999999995,-102.045287000000002 38.755527999999998,-102.045371000000003 38.770063999999998,-102.045447999999993 38.783453000000002,-102.045333999999997 38.799463000000003,-102.045387999999988 38.813391999999993,-102.046570999999986 39.047038,-102.047133999999986 39.129700999999997,-102.047188612927897 39.133146793270186,-102.047250000000005 39.13702,-102.047851021058236 39.220289738242592,-102.048449000000005 39.30313799999999,-102.04895999999998 39.37371199999999,-102.049100972149461 39.394064428437375,-102.049166999999983 39.403596999999998,-102.049369999999996 39.418210000000002,-102.049368999999999 39.423333,-102.049678999999998 39.506183,-102.049672999999999 39.536690999999998,-102.049553999999986 39.538932000000003,-102.049763758475066 39.568170000775439,-102.04980599999999 39.574058,-102.049954 39.592331,-102.050258163748609 39.627242889069393,-102.050421999999983 39.646047999999993,-102.050099000000003 39.653812000000002,-102.05059399999999 39.67559399999999,-102.050898693231389 39.741794606053567,-102.051254 39.818992,-102.051317999999995 39.833311000000002,-102.051362999999995 39.843471,-102.051569 39.849805000000003,-102.051743999999999 40.003078000000002))'); \ No newline at end of file
diff --git a/django/contrib/gis/tests/geoapp/sql/tx.wkt b/django/contrib/gis/tests/geoapp/sql/tx.wkt
new file mode 100644
index 0000000000..768f13fd11
--- /dev/null
+++ b/django/contrib/gis/tests/geoapp/sql/tx.wkt
@@ -0,0 +1 @@
+MULTIPOLYGON (((-103.00243399999998 36.500397,-102.90421904194784 36.500393342967676,-102.8402359524855 36.500390960558398,-102.840235952479716 36.500390960558398,-102.840235952474345 36.500390960558398,-102.840235952468362 36.500390960558398,-102.840235952461725 36.500390960558398,-102.840235952455885 36.500390960558398,-102.792077446284736 36.500389167377229,-102.643207699865854 36.500383624214699,-102.366462330167067 36.500373319605465,-102.250452999999979 36.500368999999999,-102.24499 36.500703999999999,-102.162463000000002 36.500326,-102.12545 36.500323999999999,-102.124752896301885 36.500398159967887,-102.122066000000004 36.500684,-101.930244999999999 36.500526,-101.925344139375468 36.500484781341967,-101.914929315957153 36.500397187533892,-101.826564999999988 36.499653999999992,-101.826498 36.499535000000002,-101.81449312121488 36.499579719643286,-101.788110000000003 36.499678000000003,-101.783359000000004 36.499709000000003,-101.781987 36.499718,-101.780609999999982 36.499727,-101.779435000000007 36.499733999999997,-101.773235954788092 36.499732939140301,-101.709314000000006 36.499721999999998,-101.698684999999998 36.499507999999999,-101.653707999999995 36.499572999999998,-101.649966000000006 36.499572999999998,-101.623914999999997 36.499527999999998,-101.414793008557069 36.499417763984319,-101.392608849457574 36.499406069885133,-101.340061173170298 36.499378370041477,-101.085155999999984 36.499243999999997,-101.052418000000003 36.499562999999995,-101.04533099999999 36.499540000000003,-100.977087999999995 36.499594999999999,-100.936058000000003 36.499602000000003,-100.918513000000004 36.499620999999998,-100.884174000000002 36.499682,-100.884079999999997 36.499682,-100.859656999999984 36.499687000000002,-100.850840000000005 36.49969999999999,-100.824235999999999 36.499617999999998,-100.824218000000002 36.499617999999998,-100.80619 36.499673999999999,-100.806172000000004 36.499634,-100.802909 36.499620999999998,-100.802886 36.499620999999998,-100.761810999999994 36.499617999999998,-100.761810999999994 36.499580000000002,-100.724361999999999 36.499580000000002,-100.724361000000002 36.499558,-100.708625999999995 36.499552999999999,-100.708628000000004 36.499520999999994,-100.657762999999989 36.499482999999991,-100.657762999999989 36.499499999999998,-100.648342999999997 36.499495000000003,-100.648343999999994 36.499462999999999,-100.592613999999998 36.499468999999998,-100.592555999999988 36.499468999999998,-100.592551 36.499428999999999,-100.583539000000002 36.499482999999991,-100.583378999999994 36.499442999999999,-100.578113999999999 36.499462999999999,-100.578113999999999 36.499439000000002,-100.546144999999996 36.499343000000003,-100.531215000000003 36.499341,-100.531215000000003 36.499290000000002,-100.530478000000002 36.49924,-100.530314000000004 36.499357000000003,-100.522227 36.499290999999999,-100.441064999999995 36.499490000000002,-100.441063999999997 36.499462,-100.433959000000002 36.499456000000002,-100.421327999999988 36.499447000000004,-100.421300999999985 36.499487999999999,-100.413634000000002 36.499443999999997,-100.41355 36.499468999999998,-100.378634000000005 36.499516999999997,-100.378591999999998 36.499445,-100.35185199999998 36.499487000000002,-100.351841999999991 36.499473000000002,-100.334463999999997 36.49942,-100.334440999999998 36.49944,-100.324150000000003 36.499679,-100.311244999999985 36.499631,-100.311018000000004 36.499687999999999,-100.310642999999985 36.499642,-100.253572851827684 36.499638031344489,-100.181220999999994 36.499633000000003,-100.090020999999993 36.499634,-100.000405999999984 36.499701999999999,-100.0004059967807 36.499497793115623,-100.00040222345956 36.260147946939995,-100.000399000000002 36.055677000000003,-100.000396170268971 35.879197994164429,-100.000394020347557 35.745115995014778,-100.000391999999991 35.619115,-100.000390396259149 35.519130234823749,-100.000386875554753 35.299632926398459,-100.000386874882437 35.299591010324292,-100.000386852473085 35.298193905884737,-100.000384999999994 35.182701999999999,-100.000381972929958 34.852568985943549,-100.000381605014198 34.812443999872983,-100.000381000000004 34.746460999999996,-100.000381000000004 34.570853999999997,-100.000381000000004 34.570647,-100.000381000000004 34.560509000000003,-99.998254592787575 34.560446149085699,-99.997501461048799 34.560423888524269,-99.985833 34.560079000000002,-99.974761999999998 34.561317999999993,-99.971554999999995 34.562179,-99.965608000000003 34.565843999999998,-99.958898000000005 34.571271000000003,-99.957540999999992 34.572708999999996,-99.95755299999999 34.574168999999998,-99.956716999999998 34.576523999999992,-99.954566999999997 34.578195,-99.94571999999998 34.579273,-99.930492488760507 34.576894921075187,-99.930189904388058 34.576847666503667,-99.929333999999997 34.576714000000003,-99.923210999999995 34.574551999999997,-99.921801000000002 34.570253,-99.915771000000007 34.565975000000002,-99.914151070156151 34.564995899308187,-99.898943000000003 34.555804000000002,-99.896006999999997 34.555529999999997,-99.89376 34.554219000000003,-99.887146999999999 34.549047000000002,-99.885392392967745 34.547401436342639,-99.884583851343237 34.546643143067669,-99.87806651563541 34.540530839522475,-99.87650823800611 34.539069404005723,-99.874403 34.537095,-99.873254000000003 34.535350999999999,-99.872356999999994 34.532096000000003,-99.868953000000005 34.52761499999999,-99.867217250163094 34.525864500605081,-99.853065999999998 34.511592999999998,-99.832903999999985 34.500067999999999,-99.825324999999992 34.497596,-99.818185999999997 34.487839999999991,-99.818738999999979 34.484975999999996,-99.814544624457952 34.476663062301249,-99.814312999999984 34.476204000000003,-99.793683999999999 34.453893999999998,-99.783787954821193 34.445078397966533,-99.782985999999994 34.444364,-99.775743000000006 34.444225000000003,-99.774224411180043 34.443216449834381,-99.765598999999995 34.437488000000002,-99.764825999999999 34.436433999999998,-99.764881999999986 34.435265999999999,-99.767647999999994 34.431854,-99.767234000000002 34.430501999999997,-99.754248000000004 34.421288999999994,-99.740907000000007 34.414763,-99.735679661059166 34.413018903486261,-99.730348000000006 34.411239999999992,-99.720258999999999 34.406295,-99.719721039768913 34.405807854123296,-99.716415999999995 34.402814999999997,-99.715089000000006 34.400753999999999,-99.714231999999996 34.397821999999998,-99.714838 34.394523999999997,-99.712682 34.390928000000002,-99.707900999999993 34.387538999999997,-99.696461999999997 34.381036000000002,-99.678282999999979 34.379798999999998,-99.672337448339604 34.378003970284972,-99.671377000000007 34.377713999999997,-99.666676988468737 34.374633899592595,-99.665992000000003 34.374184999999997,-99.665404581506792 34.374094751646162,-99.662705000000003 34.373679999999993,-99.659863615570984 34.374283464835351,-99.659362000000002 34.374389999999998,-99.654194000000004 34.376519000000002,-99.649662000000006 34.379885000000002,-99.630904999999998 34.376007,-99.628541546335526 34.375150829397036,-99.624196999999995 34.373576999999997,-99.600026 34.374687999999999,-99.596322999999998 34.377136999999998,-99.587595999999991 34.385866999999998,-99.587235087741874 34.386377538370702,-99.585718954359294 34.388522226586467,-99.585441999999986 34.388914,-99.584530999999984 34.391204999999999,-99.585306000000003 34.398122,-99.584479999999985 34.407673000000003,-99.580059999999989 34.416652999999997,-99.574366999999995 34.418281,-99.569695999999993 34.418418000000003,-99.563067665646059 34.417445690943012,-99.562203999999994 34.417318999999999,-99.561530791054494 34.417028950664999,-99.555986000000004 34.414639999999999,-99.549242000000007 34.412714999999992,-99.529786 34.411451999999997,-99.528744576810823 34.411579971493573,-99.523649999999989 34.412205999999998,-99.517623999999998 34.414493999999991,-99.514279999999999 34.414034999999998,-99.499874999999989 34.409607999999999,-99.497090999999983 34.407730999999991,-99.494103999999993 34.404755000000002,-99.490425999999999 34.399693999999997,-99.487218999999982 34.397955000000003,-99.477547 34.396355,-99.477019613816751 34.396364300212412,-99.474810232095294 34.396403261641368,-99.472297823530695 34.396447566809115,-99.470968999999997 34.396470999999991,-99.463286816319666 34.393024688790533,-99.452647999999996 34.388252,-99.445020999999983 34.379891999999998,-99.440759999999997 34.374122999999997,-99.430994999999982 34.373413999999997,-99.43081720973791 34.373532661492725,-99.420432000000005 34.380464000000003,-99.408847999999992 34.372776000000002,-99.407167999999999 34.372605,-99.406018176721332 34.372844364351735,-99.404336527339453 34.373194441551952,-99.402959999999979 34.373480999999998,-99.399602999999999 34.375078999999999,-99.397253000000006 34.377870999999999,-99.396160718377317 34.383134276834824,-99.391492 34.405631,-99.393918999999997 34.415273999999989,-99.396488000000005 34.417290999999999,-99.396901999999997 34.418688000000003,-99.397009999999995 34.424002999999999,-99.395768462359129 34.43494110377263,-99.394955999999993 34.442098999999999,-99.381011 34.456935999999999,-99.376037841709419 34.458617501802458,-99.375365000000002 34.458844999999997,-99.369609999999994 34.458699000000003,-99.358795 34.455862999999994,-99.354671999999994 34.451856999999997,-99.35478257092818 34.450383391084422,-99.354837000000003 34.449657999999999,-99.356770999999995 34.446542,-99.357101999999998 34.444915000000002,-99.356712999999999 34.442143999999999,-99.350407000000004 34.437083,-99.342020261837703 34.431514649700844,-99.341336999999996 34.431061,-99.341016600261696 34.430906286427735,-99.334036999999995 34.427536000000003,-99.331050066208874 34.424666026137302,-99.328674000000007 34.422383000000004,-99.325094009617374 34.416010263301388,-99.324222000000006 34.414458000000003,-99.321411663781888 34.411055277053073,-99.319798627189357 34.409102230797522,-99.319605999999979 34.408869000000003,-99.318363000000005 34.408295999999993,-99.316372999999999 34.408204999999995,-99.308273999999997 34.410013999999997,-99.299098 34.414227999999994,-99.294647999999981 34.415373000000002,-99.289922000000004 34.414731000000003,-99.287844819286008 34.413958196831629,-99.264167 34.405149000000002,-99.261320999999981 34.403498999999996,-99.261255940568432 34.403158389836314,-99.260996786434447 34.401801622187399,-99.259199386422964 34.392391568987605,-99.258998120407611 34.391337867029385,-99.258979999999994 34.391243000000003,-99.259239630132384 34.391043961974496,-99.260703756811225 34.389921531074158,-99.261190999999997 34.389547999999998,-99.262646013804954 34.388906249865343,-99.264243556741917 34.388201635660714,-99.264508000000006 34.388084999999997,-99.271031915197597 34.387722560266795,-99.271781628057255 34.38768090955238,-99.273607516746409 34.387579471291865,-99.273957999999993 34.38756,-99.27534 34.386598999999997,-99.274925999999994 34.384903999999999,-99.271845396288441 34.382114976063626,-99.271280999999988 34.381603999999996,-99.258696 34.372633999999998,-99.254722 34.372405,-99.251407999999984 34.375079999999997,-99.248969000000002 34.375984000000003,-99.242944999999992 34.372667999999997,-99.239138083830497 34.366035888164781,-99.237232999999989 34.362716999999996,-99.237183660287812 34.362563767173611,-99.235448627455725 34.357175329079247,-99.234251999999984 34.353459,-99.233273999999994 34.344101000000002,-99.23260599999999 34.342379999999999,-99.229993999999991 34.340538000000002,-99.226152999999982 34.339725999999999,-99.221975 34.340020000000003,-99.219768999999999 34.341377,-99.217335000000006 34.341520000000003,-99.213134999999994 34.340369000000003,-99.210957832415772 34.336710386428308,-99.210716000000005 34.336303999999998,-99.20972399999998 34.324934999999996,-99.211600000000004 34.313969999999998,-99.213476 34.310671999999997,-99.213233598142949 34.308226764636807,-99.211647999999997 34.292231999999991,-99.211468055040228 34.291676209875057,-99.209990337717599 34.287112032604114,-99.209742000000006 34.286344999999997,-99.209514950796304 34.286049346749877,-99.207560999999998 34.283504999999998,-99.203681000000003 34.281925999999999,-99.200221999999997 34.281151999999999,-99.196259999999995 34.281463000000002,-99.196052113016066 34.281264951942028,-99.19571031750732 34.280939333014615,-99.195605 34.280839,-99.194569999999985 34.272424,-99.196926000000005 34.260928999999997,-99.197153 34.244298,-99.19555299999999 34.24006,-99.191138999999993 34.23234,-99.190145999999984 34.229660000000003,-99.190036000000006 34.227186000000003,-99.192076 34.222192,-99.192683000000002 34.218825000000002,-99.192104 34.216693999999997,-99.189758414718312 34.214539281858485,-99.189510999999996 34.214312,-99.188483307800709 34.214128939694163,-99.159015999999994 34.20888,-99.143985 34.214762999999998,-99.138220000000004 34.219158999999998,-99.130609000000007 34.219408,-99.128513999999996 34.218766000000002,-99.127549000000002 34.217986000000003,-99.126614000000004 34.21532899999999,-99.127525000000006 34.213771,-99.130089999999996 34.212192000000002,-99.131552999999997 34.209352000000003,-99.131884999999997 34.207382000000003,-99.129791999999995 34.204402999999999,-99.126566999999994 34.203004,-99.119203999999996 34.201746999999997,-99.108757999999995 34.203400999999999,-99.102001344898341 34.205813362825268,-99.092190999999985 34.209316,-99.08119261238302 34.211229594305671,-99.079534999999993 34.211517999999991,-99.075978000000006 34.211221000000002,-99.06646499999998 34.208404000000002,-99.060343999999986 34.204760999999991,-99.059158999999994 34.202928999999997,-99.058800000000005 34.201256,-99.058083999999994 34.200569000000002,-99.048792000000006 34.198208999999999,-99.043470999999997 34.198208,-99.040961999999993 34.200842000000002,-99.039004000000006 34.204667,-99.037458999999998 34.206454,-99.036272999999994 34.206912000000003,-99.013074999999986 34.203221999999997,-99.005790000000005 34.206646999999997,-99.002916243275195 34.208781598893673,-99.002945441244265 34.209102775846141,-99.003147197273819 34.211322087284138,-99.003432988816769 34.214465787333673,-99.000760999999997 34.217643000000002,-98.99085199999999 34.221632999999997,-98.987293999999991 34.221223000000002,-98.981363999999999 34.217582999999991,-98.978684999999984 34.210231,-98.976586999999995 34.206291,-98.974131999999983 34.203566000000002,-98.969003 34.201298999999999,-98.966301999999999 34.201323000000002,-98.962469999999996 34.204667999999998,-98.962085000000002 34.206386000000002,-98.962306999999981 34.211312,-98.960791 34.213029999999996,-98.958474999999993 34.213854999999995,-98.952512999999982 34.212649999999996,-98.950395999999984 34.21168,-98.940219999999997 34.203685999999998,-98.928145 34.192689,-98.927456000000006 34.191155000000002,-98.923128999999989 34.185977999999999,-98.920704 34.183435000000003,-98.918333000000004 34.181831000000003,-98.909348999999992 34.177498999999997,-98.892677318093561 34.17250349095427,-98.87651287834953 34.167659972141138,-98.872921999999988 34.166584,-98.871543000000003 34.165026999999995,-98.871211000000002 34.163012000000002,-98.872229000000004 34.160446,-98.874954999999986 34.157031000000003,-98.874871999999996 34.155656999999998,-98.873271000000003 34.153596,-98.868116 34.149635000000004,-98.862549999999999 34.149110999999998,-98.860124999999996 34.149912999999998,-98.858418999999998 34.152732,-98.8579 34.159627,-98.857321999999982 34.161093999999999,-98.855585000000005 34.161620999999997,-98.854264541670545 34.16164976192438,-98.831114999999983 34.162154,-98.812953999999991 34.158444000000003,-98.806809999999984 34.155901,-98.804411553093104 34.153928907629435,-98.792015000000006 34.143735999999997,-98.779288744496085 34.140194111533035,-98.773070373738221 34.138463455122455,-98.767587610783494 34.136937528280072,-98.765569999999983 34.136375999999998,-98.764702233233265 34.135780085954792,-98.763778343962841 34.135145631382905,-98.761796999999987 34.133785000000003,-98.760558000000003 34.132387999999999,-98.759485999999995 34.128881999999997,-98.759653 34.126911999999997,-98.757118934362524 34.12470437936247,-98.757036999999983 34.124633000000003,-98.753813984496389 34.124468645349353,-98.749290999999999 34.124237999999998,-98.741966000000005 34.125529999999998,-98.740191287161664 34.126850584722824,-98.739461000000006 34.127394000000002,-98.737231999999992 34.130991999999999,-98.736819999999994 34.133374000000003,-98.735471000000004 34.135207999999999,-98.734286999999995 34.135758000000003,-98.730242646678789 34.1359250861193,-98.717536999999993 34.136450000000004,-98.716104 34.135947000000002,-98.70640034274598 34.134745066348501,-98.696517999999998 34.133521000000002,-98.690291400890658 34.133167457450512,-98.690072 34.133155000000002,-98.688275858887323 34.134465065675442,-98.685589983550884 34.136424083851644,-98.676900633591032 34.14276190388366,-98.676457484208683 34.143085127260051,-98.670573548505118 34.147376740066704,-98.655654999999982 34.158257999999996,-98.650582999999997 34.163113000000003,-98.648072999999997 34.164440999999997,-98.643223000000006 34.164530999999997,-98.635729999999995 34.161617999999997,-98.634085211037615 34.161100728840964,-98.630950281399748 34.160114822001631,-98.621666000000005 34.157195000000002,-98.620507214282355 34.157012478916968,-98.617663812339856 34.156564612849806,-98.616732999999996 34.156418000000002,-98.615748434938936 34.156446107485429,-98.612133570686254 34.156549305078279,-98.611829 34.156557999999997,-98.610173632571488 34.157093658210222,-98.610154152422197 34.157099961766605,-98.608852999999996 34.157521000000003,-98.603977999999998 34.160249,-98.599789 34.160570999999997,-98.577135999999996 34.148961999999997,-98.572451 34.145091,-98.560191000000003 34.133201999999997,-98.558593000000002 34.128253999999998,-98.550916999999998 34.119334000000002,-98.536257000000006 34.107343,-98.530610999999993 34.099843,-98.528199999999998 34.094960999999998,-98.504182 34.072370999999997,-98.487068052145446 34.063003092954936,-98.486783271268621 34.06284720836274,-98.486328 34.062598,-98.483944186894661 34.06241565608709,-98.482821069121968 34.062329745958955,-98.482039999999998 34.062269999999998,-98.475065999999998 34.064269000000003,-98.449033999999983 34.073461999999999,-98.446378999999993 34.075429999999997,-98.445784000000003 34.076827000000002,-98.445590305319797 34.079232123390703,-98.445584999999994 34.079298,-98.445259148452962 34.079797720749731,-98.443724000000003 34.082152,-98.442807999999999 34.083143999999997,-98.442148160210323 34.083427517317581,-98.441104460406791 34.083875970068213,-98.440092000000007 34.084311,-98.439068026005657 34.084479541105658,-98.434822808733685 34.08517828308225,-98.432126999999994 34.085622,-98.43151641213494 34.085605425226575,-98.43092946822253 34.085589492282431,-98.428479999999993 34.085523000000002,-98.425229999999999 34.084798999999997,-98.422252999999998 34.083036999999997,-98.419995 34.082487999999998,-98.419161945519861 34.082694545588339,-98.41804644206556 34.082971120917755,-98.417812999999995 34.083029000000003,-98.414426000000006 34.085073999999999,-98.400747497198822 34.098985940284976,-98.399776999999986 34.099972999999999,-98.398505572550647 34.104180252359392,-98.39838899999998 34.104565999999998,-98.398160000000004 34.121395999999997,-98.400493999999995 34.121777999999999,-98.400966999999994 34.122236,-98.398441000000005 34.128456,-98.384381000000005 34.146317000000003,-98.381237999999996 34.149453999999999,-98.367493999999994 34.156190999999993,-98.366862955318183 34.156357896864854,-98.364023000000003 34.157108999999998,-98.34173552164826 34.153594120579292,-98.339428832109121 34.153230340726623,-98.331172907733077 34.151928328079421,-98.326986688030772 34.151268134169193,-98.325445000000002 34.151024999999997,-98.324621914768684 34.150650086831803,-98.323612587945547 34.150190341106089,-98.322580000000002 34.149720000000002,-98.320651676675396 34.148059023851737,-98.318749999999994 34.146420999999997,-98.315432139066189 34.144301906683673,-98.312023538956254 34.142124858924547,-98.300208999999995 34.134579000000002,-98.299345719035045 34.134365643147696,-98.29862570169189 34.134187693395319,-98.293901000000005 34.133020000000002,-98.280321 34.130749999999999,-98.258217018239392 34.129574098564007,-98.256467 34.129480999999998,-98.254901718278489 34.129708262798985,-98.247953999999993 34.13071699999999,-98.241012999999995 34.133102999999998,-98.225282000000007 34.127245000000002,-98.223600000000005 34.125093,-98.216463000000005 34.121820999999997,-98.203710999999998 34.117676000000003,-98.200074999999998 34.116782999999998,-98.191455000000005 34.115752999999998,-98.169120000000007 34.114170999999999,-98.157411999999994 34.120466999999998,-98.154353999999998 34.122734,-98.142753999999996 34.136358999999999,-98.136769999999999 34.144992000000002,-98.130815999999996 34.150531999999998,-98.123377000000005 34.154539999999997,-98.114506000000006 34.154727,-98.109461999999979 34.154110999999993,-98.107064999999992 34.152531000000003,-98.101937000000007 34.146829999999994,-98.092021474678845 34.132735952269094,-98.090223999999992 34.130181,-98.089754999999982 34.128211,-98.090659999999986 34.12198,-98.092421000000002 34.116917,-98.095117999999999 34.11119,-98.096177285423778 34.109455137055363,-98.096466125075011 34.108982084942461,-98.099327999999986 34.104295,-98.101378023037029 34.101786489578267,-98.103538246996251 34.099143131812454,-98.104308999999986 34.098199999999999,-98.119416999999999 34.084474,-98.121038999999996 34.081265999999999,-98.120207999999991 34.072127000000002,-98.11802999999999 34.067064999999999,-98.114587 34.06228,-98.100919767943822 34.050244792175462,-98.099096110217346 34.048638900093685,-98.096177018664264 34.044625138601674,-98.096541898037387 34.040976263553816,-98.09727167092565 34.038969381040054,-98.097731364247636 34.038509687718062,-98.098001443813914 34.038239608151798,-98.102015208841422 34.03732738850595,-98.104022094890695 34.036232725638037,-98.104083244997014 34.036133356900422,-98.105481647738245 34.033860956680144,-98.105481647738245 34.032444902147553,-98.105481647738245 34.031306746267951,-98.103616999999986 34.029206999999992,-98.088202999999993 34.005481000000003,-98.085260000000005 34.003259,-98.082839000000007 34.002412,-98.055197000000007 33.995840999999999,-98.050169864666017 33.994989457544634,-98.041117 33.993456000000002,-98.027671999999981 33.993357000000003,-98.019485000000003 33.993803999999997,-98.018481521828946 33.993960861546498,-98.005667000000003 33.995964,-97.987387999999996 33.999822999999999,-97.982805999999997 34.001949000000003,-97.978243000000006 34.005386999999999,-97.974597608872358 34.00657735007583,-97.974172999999993 34.006715999999997,-97.973934144800623 34.006593661859519,-97.971670000000003 34.005434,-97.968339999999998 34.000529999999998,-97.965354903485249 33.996992503283089,-97.963375425210828 33.994646717187933,-97.96302799999998 33.994235000000003,-97.962715090700769 33.994009516348072,-97.958325000000002 33.990845999999998,-97.955849999999998 33.990136,-97.952687999999995 33.990113999999998,-97.947571999999994 33.991053,-97.946472999999997 33.990731999999994,-97.945729999999998 33.989839000000003,-97.945949999999982 33.988395999999995,-97.952184120103468 33.971402949359636,-97.95307606469359 33.968971674482539,-97.95691699999999 33.958502000000003,-97.960351000000003 33.951928000000002,-97.965737000000004 33.947392,-97.972662 33.944527,-97.974172999999993 33.942832000000003,-97.974062000000004 33.940289,-97.972493999999998 33.937907000000003,-97.971175000000002 33.937128999999999,-97.965952999999999 33.936191,-97.963425 33.936236999999998,-97.955511 33.938186000000002,-97.954466999999994 33.937773999999997,-97.953395 33.936444999999999,-97.952679000000003 33.929482,-97.953694999999996 33.924373000000003,-97.957155 33.914453999999999,-97.960615000000004 33.910353999999998,-97.961188664141474 33.909913087050903,-97.963139679674441 33.908413554571595,-97.964461 33.907398,-97.964803587866868 33.907309441163022,-97.9693952279504 33.906122503898267,-97.969873000000007 33.905999,-97.970298415583201 33.906261144464871,-97.973142999999993 33.908014,-97.976962999999998 33.912548999999999,-97.978803999999997 33.912548,-97.979984999999999 33.911402000000002,-97.983551999999989 33.904001999999991,-97.984539999999996 33.900703,-97.984566 33.899076999999998,-97.984416725907181 33.89872544733722,-97.984025057628415 33.897803036597892,-97.98383498894799 33.897355409354304,-97.983768999999995 33.897199999999991,-97.977858999999995 33.889929000000002,-97.974177999999995 33.886642999999999,-97.967776999999998 33.882429999999999,-97.958438 33.879179,-97.951215000000005 33.878424000000003,-97.946463999999992 33.878883000000002,-97.942729999999997 33.879845000000003,-97.938801999999995 33.879891,-97.936743000000007 33.879204,-97.933120450042608 33.877388671138185,-97.918328311832767 33.869976048610916,-97.905467000000002 33.863530999999995,-97.896737999999985 33.857984999999999,-97.877386999999999 33.850236000000002,-97.871447000000003 33.849001,-97.865764999999982 33.849392999999999,-97.835425213046037 33.857383352392631,-97.834333 33.857671000000003,-97.833886750888084 33.857971936447115,-97.833218553718808 33.858422547723912,-97.806802470257153 33.876236728393856,-97.805423000000005 33.877167,-97.803472999999997 33.880189999999999,-97.801578000000006 33.885137999999998,-97.784656999999982 33.890631999999997,-97.78061799999999 33.895533,-97.779683000000006 33.899242999999998,-97.780339999999995 33.904833000000004,-97.783716999999996 33.910559999999997,-97.772672 33.914382000000003,-97.765445999999997 33.913531999999989,-97.763769999999994 33.914240999999997,-97.762914903547767 33.914953098088951,-97.761142192227695 33.916429357685161,-97.760223999999994 33.917194000000002,-97.759399000000002 33.91881999999999,-97.759833999999984 33.92521,-97.762660999999994 33.930846000000003,-97.762767999999994 33.934396,-97.752956999999995 33.937049000000002,-97.738478 33.937421,-97.736553999999998 33.936574999999998,-97.735919542935619 33.936533987763056,-97.734773489745407 33.936459905200778,-97.733722999999998 33.936391999999998,-97.732266999999993 33.936691000000003,-97.725289000000004 33.941045000000003,-97.720699142354164 33.94461309292862,-97.716772000000006 33.947665999999998,-97.714693355370301 33.94981590741822,-97.712051708440285 33.952548118711093,-97.709683999999996 33.954996999999999,-97.708350195107343 33.95701014009046,-97.70415899999999 33.963335999999998,-97.69792099999998 33.977331,-97.69310999999999 33.983699,-97.688023 33.986606999999999,-97.671772000000004 33.991370000000003,-97.661489000000003 33.990817999999997,-97.656210000000002 33.989488,-97.633778000000007 33.981256999999999,-97.609091000000006 33.968093000000003,-97.589597999999995 33.953553999999997,-97.588828000000007 33.951881999999998,-97.591270649549756 33.930345579062646,-97.591514000000004 33.928199999999997,-97.595084 33.922953999999997,-97.596154999999996 33.922105999999999,-97.59697899999999 33.920228000000002,-97.597115000000002 33.917867999999999,-97.596955673755872 33.917077348335745,-97.596288999999985 33.913769000000002,-97.593782375104212 33.910260437761373,-97.589253999999997 33.903922,-97.587440999999984 33.902479,-97.582744000000005 33.900784999999999,-97.578907598302408 33.900207204108142,-97.558269999999993 33.897098999999997,-97.555002000000002 33.897281999999997,-97.551541 33.897947000000002,-97.543245999999996 33.901288999999998,-97.533617322522971 33.906127586572126,-97.532723000000004 33.906576999999999,-97.525277000000003 33.911750999999995,-97.519170999999986 33.913637999999999,-97.504870374844515 33.918353570482601,-97.500960000000006 33.919643,-97.495648860558163 33.919307898609453,-97.494857999999979 33.919257999999999,-97.492061582842766 33.918500058129531,-97.487115891787269 33.917159576320657,-97.48650499999998 33.916993999999995,-97.484158940985964 33.915822631562747,-97.460375999999982 33.903948,-97.458068999999995 33.901634999999999,-97.451065249608234 33.891558064966901,-97.450953999999996 33.891398000000002,-97.451469000000003 33.87093,-97.452287410342421 33.86882620086994,-97.455665873415143 33.860141550511862,-97.457616999999999 33.855125999999998,-97.459565999999995 33.853316,-97.461485999999994 33.849559999999997,-97.462857 33.841771999999999,-97.459067999999988 33.834581,-97.453056999999987 33.828536,-97.444192999999999 33.823773000000003,-97.426492999999994 33.819398,-97.410387 33.818845000000003,-97.403235695189224 33.818961304668854,-97.384901622687948 33.819259479377855,-97.372940999999997 33.819454,-97.368744000000007 33.821471000000003,-97.365506999999994 33.823762999999992,-97.358512999999988 33.830018000000003,-97.348337999999984 33.843876000000002,-97.340900078515631 33.860236176367188,-97.339391593410966 33.867629740388111,-97.337846311291798 33.870430566802547,-97.336524008254173 33.872827243260353,-97.33293952159849 33.874440259476913,-97.329175814777756 33.874440259476913,-97.327562805507441 33.873902588562437,-97.326564370247013 33.872737756024428,-97.326487449786001 33.872648016149064,-97.324157539016809 33.866016724171544,-97.322365295688968 33.864941382342593,-97.318243141591921 33.865120602507631,-97.31654836796514 33.865642075591225,-97.315913230822716 33.865837504006514,-97.314412999999988 33.866988999999997,-97.310479256695203 33.873361218982971,-97.307489695517361 33.878203969770759,-97.302471419756401 33.880175433263638,-97.299245387323282 33.880175433263638,-97.295170524880618 33.877119286431629,-97.294227111562321 33.876411726442917,-97.286921603026471 33.869423850720118,-97.28598279642199 33.868525862052032,-97.284253187903744 33.867526845294535,-97.279107999999979 33.864555000000003,-97.275347999999994 33.863225,-97.271531999999993 33.862560000000002,-97.257971626565464 33.863220416657512,-97.256624999999985 33.863286000000002,-97.255635999999996 33.863697999999999,-97.254234999999994 33.865322999999997,-97.249208999999993 33.875100999999994,-97.246418496348156 33.898356425448434,-97.246179999999981 33.900343999999997,-97.245398270620598 33.902084836575838,-97.245057441245748 33.90284383100218,-97.244945999999999 33.903092,-97.242092 33.906277000000003,-97.241794392023195 33.906436890220043,-97.238755934556053 33.908069304909361,-97.226522000000003 33.914642,-97.210920999999999 33.916063999999999,-97.210512235443105 33.915911440173737,-97.206141000000002 33.914279999999998,-97.185457999999997 33.9007,-97.180845000000005 33.895203999999993,-97.179608999999999 33.892249999999997,-97.170773789281327 33.861660975771436,-97.166629 33.847310999999998,-97.166824000000005 33.840395,-97.171627 33.835335,-97.180939422624874 33.831550006302521,-97.181369999999987 33.831375,-97.186254000000005 33.830894,-97.193690000000004 33.831307000000002,-97.195830999999998 33.830803000000003,-97.197477000000006 33.829794999999997,-97.199700000000007 33.827322000000002,-97.203513999999998 33.821824999999997,-97.204994999999997 33.81886999999999,-97.205652 33.809823999999999,-97.205556910941183 33.806237292333442,-97.205445103342427 33.802019970418343,-97.205431000000004 33.801487999999999,-97.205114487332324 33.800890302957832,-97.203236000000004 33.797342999999998,-97.194785999999993 33.785344000000002,-97.190397000000004 33.781153000000003,-97.187792000000002 33.769702000000002,-97.181842999999986 33.755869999999994,-97.173532726140948 33.740090726508434,-97.172577000695028 33.738276026602087,-97.172191999999995 33.737544999999997,-97.168438536634085 33.734131892706188,-97.163454368039083 33.729599677915004,-97.163149000000004 33.729322000000003,-97.162807288850388 33.729115696596551,-97.155066000000005 33.724442000000003,-97.152609597300682 33.723370138808036,-97.150103410774264 33.72227655424301,-97.149393999999987 33.721966999999999,-97.137529999999998 33.718663999999997,-97.126102000000003 33.716940999999998,-97.121101999999993 33.717174,-97.119522126797463 33.717502594273334,-97.114921749218269 33.718459416457094,-97.113264999999998 33.718803999999999,-97.112398501853761 33.719102240295193,-97.110065570752283 33.719905212653977,-97.108936 33.720294000000003,-97.108097026518521 33.720734123472262,-97.106518853348803 33.721562029324609,-97.104524999999995 33.722608,-97.097154000000003 33.727809,-97.094085000000007 33.730992,-97.092697209381924 33.732891057656268,-97.092130098039192 33.733667094850453,-97.091071999999983 33.735115,-97.089936943375889 33.737167271747261,-97.087911027802278 33.740830286618703,-97.086195000000004 33.743932999999998,-97.084820762198987 33.752363244406453,-97.084693 33.753146999999998,-97.08461299999999 33.759993,-97.085217999999998 33.765512,-97.087362453285593 33.77250304797397,-97.087851999999998 33.774099,-97.093101265647221 33.787040841586602,-97.093917000000005 33.789051999999998,-97.094675961767678 33.791977368936216,-97.095047178759813 33.793408200769441,-97.095235999999986 33.794136000000002,-97.095080023591905 33.79561056406444,-97.094877682854474 33.797523445530629,-97.094770999999994 33.798532000000002,-97.093897185962049 33.800360798466031,-97.09266432242093 33.802941048788071,-97.092111999999986 33.804096999999999,-97.087998999999982 33.808746999999997,-97.078589999999991 33.812755999999993,-97.067977124183287 33.814475679891196,-97.064604445188394 33.815487484896828,-97.062631847535258 33.816079264957295,-97.058622892638837 33.818751903281317,-97.055415722506638 33.823829921794093,-97.055412197115942 33.8238546000754,-97.055148464371385 33.82570077017467,-97.055682980641905 33.830778788687446,-97.057821087157734 33.834520485448607,-97.058282726048489 33.836367011192308,-97.058622892638837 33.837727655580807,-97.057553829022481 33.840133030590344,-97.055415722506638 33.841202089027483,-97.052208542016004 33.841736615656437,-97.048734113748537 33.840934820533782,-97.045339940802535 33.839496399893775,-97.041245000000004 33.837761,-97.038858000000005 33.838264000000002,-97.023899 33.844213000000003,-97.017857000000006 33.850141999999998,-97.010381749407998 33.858564100233409,-96.999664164722446 33.87063922351804,-96.985567000000003 33.886521999999999,-96.983970999999997 33.892082999999992,-96.984938999999997 33.904865999999991,-96.985275905099471 33.906070041818985,-96.988744999999994 33.918467999999997,-96.993996999999979 33.928978999999998,-96.995022999999989 33.932034999999999,-96.995140238436761 33.933014648420269,-96.996024643022366 33.940404763634284,-96.996183000000002 33.941727999999998,-96.996167702736543 33.941832622020257,-96.995421139189489 33.946938567064805,-96.995367999999999 33.947302,-96.994947208134789 33.948043840473474,-96.994456760007211 33.948908482357652,-96.994287999999983 33.949205999999997,-96.990835000000004 33.952700999999998,-96.988126301178397 33.954514162310069,-96.987892000000002 33.954670999999998,-96.982723774786024 33.956016867344054,-96.981537499896135 33.956325787441237,-96.981336999999982 33.956377999999994,-96.979415000000003 33.956178,-96.979347000000004 33.955129999999997,-96.980675999999988 33.951813999999999,-96.981031000000002 33.949159999999999,-96.97981799999998 33.941588000000003,-96.976955000000004 33.937452999999998,-96.973806999999979 33.935696999999998,-96.97254199999999 33.935794999999999,-96.952313000000004 33.944581999999997,-96.944610999999995 33.949216999999997,-96.933309804512817 33.955134148312766,-96.932252000000005 33.955688000000002,-96.924267999999998 33.959159,-96.922113999999979 33.959578999999998,-96.921429967464036 33.959451233053208,-96.919039990098355 33.959004821377064,-96.918617999999995 33.958925999999998,-96.91833921313939 33.958790334953079,-96.917063225391544 33.958169405626251,-96.916299999999993 33.957797999999997,-96.91417790611122 33.956157267456653,-96.911732563120111 33.95426660943896,-96.911336000000006 33.953960000000002,-96.910857206749995 33.953482904168467,-96.908421363636307 33.951055696608989,-96.907387 33.950024999999997,-96.905252999999988 33.947218999999997,-96.902433999999985 33.942017999999997,-96.901946611333699 33.940667581536225,-96.899441999999993 33.933728000000002,-96.896468999999996 33.91331799999999,-96.897193999999999 33.902954,-96.895728000000005 33.896414,-96.887761838797758 33.878628251663962,-96.883009999999999 33.868018999999997,-96.875280999999987 33.860505000000003,-96.87198767019855 33.857765462058182,-96.866438000000002 33.853149000000002,-96.85608999999998 33.84749,-96.850593000000003 33.847211,-96.845895999999996 33.848974999999996,-96.841592000000006 33.852893999999999,-96.840818999999996 33.863644999999998,-96.839777999999995 33.868395999999997,-96.837412999999984 33.871349000000002,-96.833926235310372 33.873661568818115,-96.832156999999995 33.874834999999997,-96.812777999999994 33.872646000000003,-96.794275999999996 33.868886000000003,-96.786859371055769 33.865207582975678,-96.783484999999999 33.863533999999994,-96.780568999999986 33.860098,-96.779588000000004 33.857939000000002,-96.777202000000003 33.848162000000002,-96.776765999999995 33.841976000000003,-96.770675999999995 33.829621000000003,-96.769378000000003 33.827477000000002,-96.766316855179326 33.825510582121247,-96.766234999999995 33.825457999999998,-96.761588000000003 33.824406000000003,-96.754041 33.824657999999999,-96.746233969152598 33.825673509073113,-96.746037999999984 33.825699,-96.741799282455162 33.826447231494264,-96.71318112067361 33.831498997677379,-96.712421999999989 33.831632999999997,-96.708134 33.833060000000003,-96.704457000000005 33.835020999999998,-96.700318655907978 33.838434731313264,-96.699573999999998 33.839049000000003,-96.695480719177567 33.844085960723298,-96.693127324791789 33.84698191524042,-96.690708 33.849958999999998,-96.688190999999989 33.854613,-96.687524326814838 33.85620885855986,-96.684726999999995 33.862904999999998,-96.682762564556768 33.871464102957781,-96.682209 33.873876000000003,-96.682102999999998 33.876645000000003,-96.683464 33.884217,-96.681051007513375 33.895708672998403,-96.680947000000003 33.89620399999999,-96.675306000000006 33.909114000000002,-96.673449000000005 33.912278,-96.670618000000005 33.914913999999996,-96.667186999999998 33.916939999999997,-96.665308436653305 33.917161206414967,-96.66440999999999 33.917267000000002,-96.659896000000003 33.916665999999999,-96.65150600931733 33.910998546998165,-96.644049999999979 33.905962000000002,-96.630116999999998 33.895422000000003,-96.628293999999997 33.894477000000002,-96.616355751891987 33.894625565889051,-96.614680358047494 33.89464641537834,-96.611821556077771 33.89468199182577,-96.607562 33.894734999999997,-96.592948000000007 33.895615999999997,-96.588319642127203 33.894847991673281,-96.587934000000004 33.894784,-96.58760387584924 33.894318075382706,-96.585452000000004 33.891280999999999,-96.585359999999994 33.888947999999999,-96.587494000000007 33.884250999999999,-96.590112000000005 33.880665,-96.597347999999982 33.875100999999994,-96.601685999999987 33.872822999999997,-96.611969999999999 33.869016000000002,-96.625399000000002 33.856541999999997,-96.628968999999998 33.852406999999999,-96.629746999999995 33.850866000000003,-96.630021999999983 33.847541,-96.629842405402627 33.847037300944812,-96.629577623992816 33.846294683138318,-96.629289999999997 33.845488000000003,-96.627812273090953 33.844523322531259,-96.626623854929747 33.84374750920842,-96.623154999999997 33.84148299999999,-96.622548607895212 33.841284829387497,-96.620258613641042 33.840536452948584,-96.605267599881515 33.835637348301233,-96.601258 33.834327000000002,-96.599141379811712 33.83346048638235,-96.597030984690946 33.832596521217091,-96.595164098773168 33.831832245189069,-96.592925999999991 33.830916000000002,-96.587067000000005 33.828009000000002,-96.573054340771023 33.81917200025552,-96.572936999999996 33.819097999999997,-96.568822993124115 33.818734252140963,-96.566549213959448 33.818533211567136,-96.566298000000003 33.818511,-96.551222999999993 33.81912899999999,-96.541502252916899 33.82118138128849,-96.537683599711926 33.821987629236112,-96.532865 33.823005000000002,-96.532141353898353 33.822830017549641,-96.529233999999988 33.822127000000002,-96.526655000000005 33.820891000000003,-96.526331240434345 33.820568979830284,-96.523863000000006 33.818114,-96.519910999999993 33.811346999999998,-96.517492044660074 33.805400310572544,-96.516583999999995 33.803167999999999,-96.515958999999995 33.798933999999996,-96.515952403498957 33.797370629253059,-96.5159410675722 33.794684014612457,-96.515912 33.787795000000003,-96.51191399999999 33.781477999999993,-96.502285999999998 33.773459999999993,-96.500268000000005 33.772582999999997,-96.486059999999995 33.773009999999999,-96.459153999999998 33.775232000000003,-96.456254 33.776035,-96.450509999999994 33.780588000000002,-96.448044999999993 33.781030999999999,-96.436454999999995 33.780050000000003,-96.430214000000007 33.778654000000003,-96.423664429058576 33.776393528613141,-96.422642999999994 33.776040999999999,-96.422322840041474 33.775682043625913,-96.420980388055867 33.774176915691271,-96.419961 33.773034000000003,-96.419583102042878 33.772404537625398,-96.417562000000004 33.769038000000002,-96.416145999999998 33.76609899999999,-96.413408000000004 33.757714,-96.411885201063754 33.755703128434462,-96.408468999999997 33.751191999999996,-96.403507000000005 33.746288999999997,-96.384116000000006 33.730141000000003,-96.383299027856694 33.729391180874664,-96.380090129695702 33.726446045924753,-96.379450023740389 33.7258585550397,-96.370956555983966 33.718063228581727,-96.370761536889887 33.717884239557762,-96.369590000000002 33.716808999999998,-96.369084597701828 33.715741445126696,-96.366945 33.711221999999999,-96.363253 33.701050000000002,-96.363143372320295 33.69469995601051,-96.363135 33.694215,-96.362964209763192 33.693778090504111,-96.362198000000006 33.691817999999998,-96.356236230636398 33.68737146600408,-96.355945999999989 33.687154999999997,-96.355455421824701 33.68710517164083,-96.352724507664888 33.686827790830883,-96.348305999999994 33.686378999999995,-96.346643697131185 33.686554630652331,-96.344174978865311 33.686815463144171,-96.342664999999997 33.686974999999997,-96.337175125435976 33.689043696356201,-96.321102999999994 33.695099999999996,-96.318759999999997 33.696753,-96.318590686098233 33.696960051986665,-96.318010443675675 33.697669623646739,-96.316924999999998 33.698996999999999,-96.314798583555884 33.702507526903553,-96.309963999999994 33.710489000000003,-96.308342766341951 33.715746247280322,-96.307034999999985 33.719987000000003,-96.307001890234133 33.720499786556005,-96.306595999999999 33.726785999999997,-96.307389 33.735005,-96.3061 33.741002000000002,-96.30525491425243 33.743702118680943,-96.304087485467235 33.747432149959735,-96.303009000000003 33.750878,-96.301705999999982 33.753756000000003,-96.294866999999996 33.764771000000003,-96.292482000000007 33.766418999999999,-96.277269000000004 33.769734999999997,-96.269895999999989 33.768405,-96.251497151236435 33.760405611313516,-96.248231999999987 33.758986,-96.23960043273749 33.754058875473291,-96.229595766085112 33.748347949873668,-96.229022999999998 33.748021,-96.220521000000005 33.747390000000003,-96.1999 33.752116999999998,-96.196336040977513 33.753254070097242,-96.186553999999987 33.756374999999998,-96.178059000000005 33.760517999999998,-96.174632999999986 33.763699000000003,-96.169932696734321 33.769534234627457,-96.169452000000007 33.770130999999999,-96.167888847884015 33.774482610028038,-96.162756999999985 33.788769000000002,-96.162122572851359 33.796140263149638,-96.162213638666273 33.796174412747511,-96.166837334419654 33.79790829445497,-96.170373408451042 33.799381659586444,-96.173025461119408 33.800560352833699,-96.175150000000002 33.801951000000003,-96.17734 33.805117000000003,-96.17895107878303 33.810509748931381,-96.178963999999993 33.810552999999999,-96.176910000000007 33.813934000000003,-96.175889999999981 33.814627000000002,-96.164217431250009 33.817001137011715,-96.150765000000007 33.816986999999997,-96.148792 33.819197000000003,-96.151629999999983 33.831945999999995,-96.150147000000004 33.835856,-96.148457006953691 33.837436961236868,-96.14806999999999 33.83779899999999,-96.147446683377808 33.837891494337825,-96.138904999999994 33.839159000000002,-96.128108733462625 33.839703753325978,-96.122951 33.839963999999995,-96.118168999999995 33.837883999999995,-96.109992999999989 33.832396000000003,-96.104074999999995 33.830730000000003,-96.099360000000004 33.830469999999998,-96.097448 33.832724999999996,-96.097637999999989 33.837935000000002,-96.099152999999987 33.842409000000004,-96.100785000000002 33.844230000000003,-96.101348999999999 33.845720999999998,-96.101472999999999 33.846708999999997,-96.100094999999996 33.847971,-96.084626 33.846656000000003,-96.063924 33.841522999999995,-96.055357999999984 33.838262,-96.049381559404907 33.836618570443349,-96.048833999999999 33.836468000000004,-96.044074587870469 33.838420736557822,-96.037191000000007 33.841245,-96.031783693249977 33.849934429642978,-96.031271075997878 33.850758194920559,-96.029462717056688 33.852402158173604,-96.025188419607474 33.852073366797306,-96.022229284477689 33.850922593794486,-96.021900493101384 33.849114234853282,-96.022507000000004 33.846130000000002,-96.022064891975305 33.843195970965255,-96.021407302851145 33.841880802274289,-96.019950829321616 33.840821548098475,-96.019598947095744 33.84056563358331,-96.005296 33.845505000000003,-96.000534603789163 33.849305889934179,-95.998351 33.851049000000003,-95.997709 33.852181999999992,-95.997673906338932 33.852568581878202,-95.997405462294296 33.855525685805766,-95.9977342536706 33.860950759443568,-95.997376655326022 33.862202357114477,-95.996747879541701 33.864403078452035,-95.993624351909531 33.866211440579008,-95.991487204777812 33.866869023331596,-95.988856861024331 33.866869023331596,-95.984753921632091 33.864671017651808,-95.984253769013037 33.864403078452035,-95.980965842506947 33.859306796190523,-95.9735403792467 33.856832331211713,-95.972155999999998 33.856371000000003,-95.971744371228908 33.856383941655046,-95.951609000000005 33.857016999999999,-95.945502988542614 33.859346036998218,-95.944283999999982 33.859811,-95.943359355023844 33.860365112733476,-95.941777921153459 33.861312819872232,-95.941266999999996 33.861618999999997,-95.936631000000006 33.870615,-95.93550004724635 33.874497995518659,-95.935325000000006 33.875098999999999,-95.935308000000006 33.878723999999998,-95.935637 33.880370999999997,-95.936817000000005 33.882385999999997,-95.937201999999999 33.884652000000003,-95.936131999999986 33.886825999999999,-95.935198 33.887100999999994,-95.922712000000004 33.883758,-95.915960999999996 33.881148000000003,-95.905343000000002 33.875629000000004,-95.893305999999995 33.868161,-95.887490999999997 33.863855999999998,-95.881292000000002 33.860627,-95.859469000000004 33.852455999999997,-95.849863999999997 33.844951999999999,-95.843772999999999 33.838949,-95.841300369514457 33.837329726167006,-95.840012000000002 33.836486,-95.839442445999168 33.836292954052603,-95.838335071878717 33.835917618112738,-95.837515999999994 33.835639999999998,-95.831947999999997 33.835160999999999,-95.828244999999995 33.836053999999997,-95.827967044704152 33.836191602640042,-95.826538854622555 33.836898632614485,-95.822787000000005 33.838755999999989,-95.821905415666805 33.839551758599306,-95.821112514659319 33.840267467546653,-95.820784000000003 33.840564,-95.819357999999994 33.842784999999999,-95.818975999999992 33.844456,-95.819524999999999 33.848438999999999,-95.820676999999989 33.850750999999995,-95.821665999999979 33.855443,-95.821665999999979 33.856633000000002,-95.82138191533943 33.857119395418813,-95.820824189768416 33.858074304994595,-95.820595999999995 33.858464999999995,-95.820256321913618 33.858527429344676,-95.805149 33.861303999999997,-95.800842000000003 33.861212000000002,-95.790314669347865 33.857829825250164,-95.789867 33.857685999999994,-95.789358977006231 33.85733891951336,-95.788304168820886 33.85661827626933,-95.787891000000002 33.856335999999999,-95.776255000000006 33.845145000000002,-95.773281999999995 33.843834,-95.772067000000007 33.843817,-95.763621999999984 33.847954,-95.758311274366889 33.849968021173019,-95.758015999999998 33.850079999999998,-95.757640875431136 33.850475976069447,-95.754310000000004 33.853991999999998,-95.753512999999984 33.856464000000003,-95.753688987366843 33.856976705401074,-95.75729390188404 33.867478931648478,-95.757457999999986 33.86795699999999,-95.758009454152003 33.868443703186436,-95.760805000000005 33.870911,-95.762558999999996 33.874366999999992,-95.76194240701966 33.883030946465368,-95.761915999999999 33.883401999999997,-95.758343999999994 33.890610999999993,-95.756366999999997 33.892625000000002,-95.747335000000007 33.895755999999999,-95.737508000000005 33.895966999999999,-95.729445045960333 33.893952819075864,-95.728448999999998 33.893704,-95.723226300470785 33.890698381785455,-95.717160861060378 33.887207774089354,-95.713910181462765 33.885337036216413,-95.713539999999981 33.885123999999998,-95.710877999999994 33.884551999999999,-95.696961999999999 33.885218000000002,-95.684831000000003 33.890231999999997,-95.676924999999983 33.897236999999997,-95.669978 33.905844000000002,-95.665338000000006 33.908132000000002,-95.659818 33.909092,-95.647272999999998 33.905976000000003,-95.636977999999999 33.906613,-95.609439392746168 33.923623282239362,-95.603656999999998 33.927194999999998,-95.599677999999983 33.934246999999999,-95.585944999999981 33.93448,-95.570311428427317 33.932892416047835,-95.564667905744443 33.932319318211334,-95.563423999999998 33.932192999999998,-95.562724847986416 33.932007581530534,-95.561592737930383 33.931707340510293,-95.561007000000004 33.931551999999996,-95.560415995740641 33.931042615914556,-95.559931936825777 33.930625407571753,-95.559414000000004 33.930179000000003,-95.558286100391328 33.928753215740784,-95.557777967458279 33.928110882033096,-95.556914999999989 33.927019999999999,-95.551147999999984 33.914566,-95.549144999999996 33.90795,-95.549475 33.901310999999993,-95.552330999999981 33.894419999999997,-95.55209457427955 33.888655441173519,-95.552085000000005 33.888421999999998,-95.551943532854764 33.888208369560985,-95.548485831718622 33.882986873004867,-95.548324999999991 33.882744000000002,-95.547838962671932 33.882363312195096,-95.545708294665019 33.880694470565629,-95.545197000000002 33.880293999999999,-95.54352178779898 33.880173169084813,-95.541265054919734 33.880010393826282,-95.539789999999996 33.879904000000003,-95.537358049249164 33.88037416967029,-95.534038375697051 33.881015963020303,-95.533282999999997 33.881161999999996,-95.531798241123994 33.881968630089013,-95.525321999999989 33.885486999999998,-95.521418133191162 33.888379988113826,-95.520137966641357 33.88932866459119,-95.515301759339067 33.891142240377064,-95.510062536063273 33.890134704348199,-95.506233872599807 33.886306036979761,-95.506495 33.878588999999998,-95.506084999999999 33.87639,-95.502407477038815 33.874787101867227,-95.502303999999995 33.874741999999998,-95.492028000000005 33.874822000000002,-95.480004545492946 33.87882505156746,-95.478574999999992 33.879300999999998,-95.477829321179073 33.879890044047791,-95.469962325642697 33.886104525088022,-95.467351237093553 33.886417854985297,-95.464924614258621 33.886709049048328,-95.462909526581015 33.885903021006229,-95.461498966768687 33.883686425341857,-95.46277824472287 33.878821065729895,-95.464211000000006 33.873372000000003,-95.463346 33.872312999999998,-95.461127233926518 33.871832054399569,-95.447370000000006 33.868850000000002,-95.418546279096461 33.866998581211959,-95.411345060268999 33.866536029139695,-95.407794999999979 33.866307999999989,-95.406882133018115 33.866362247208706,-95.404325916920058 33.866514150597617,-95.375232999999994 33.868243,-95.352338000000003 33.867789000000002,-95.339561303488324 33.868836967540759,-95.339121999999989 33.868873,-95.339014688391742 33.869073090388603,-95.33835013321854 33.870312202400832,-95.334854000000007 33.876830999999996,-95.334836460323601 33.877305631062114,-95.334523000000004 33.885787999999998,-95.333451999999994 33.886285999999998,-95.325571999999994 33.885703999999997,-95.310579050797429 33.880679668661742,-95.294789354523203 33.875388337067108,-95.287864786488143 33.87494634339312,-95.28344485260331 33.877745636185885,-95.281676877907344 33.882902226669891,-95.281529544303439 33.887616824907447,-95.281317419351268 33.889260797911334,-95.280350898312903 33.896751357029835,-95.279761569607459 33.899108654721076,-95.277846267017765 33.900876629417048,-95.275341635722626 33.901760616765031,-95.272542342929853 33.902055281117747,-95.267212735027385 33.900338966530455,-95.263849803053915 33.899255988324974,-95.261050510261143 33.899992642069066,-95.255746586173245 33.902939265610648,-95.253094626984378 33.90544389690578,-95.250884657186859 33.913105118684925,-95.250737329293145 33.917083057468233,-95.251326652288412 33.924154956252103,-95.253020000000006 33.927236999999998,-95.253623000000005 33.92971,-95.252905999999982 33.933647999999998,-95.250453815364224 33.936614470603772,-95.23166760862577 33.959340626388752,-95.231194814374604 33.959912577712174,-95.230491 33.960763999999998,-95.226393000000002 33.961953999999999,-95.219358 33.961567000000002,-95.184075000000007 33.950353,-95.174181557651636 33.944707625858101,-95.173657196254922 33.944408415920272,-95.168745999999999 33.941605999999993,-95.166685999999984 33.939728000000002,-95.161108999999982 33.937598,-95.149462 33.936335999999997,-95.131725657216535 33.936903570678005,-95.131056 33.936924999999995,-95.130760550144942 33.936820411866918,-95.124700000000004 33.934674999999991,-95.121184 33.931306999999997,-95.121974867397924 33.925542192115131,-95.122499622273722 33.921717137430115,-95.122365486317321 33.918632002634986,-95.119951031304154 33.915815139752631,-95.110963896232136 33.912998276870283,-95.103318123323447 33.913668959251616,-95.10214780889666 33.912991409673538,-95.100769532353866 33.912193461131935,-95.098489218495843 33.909913139475762,-95.095001673232161 33.904815960136006,-95.095247706914634 33.899772255341666,-95.095269945144935 33.899316370327696,-95.09392858558104 33.895962961020395,-95.090441035118587 33.893280234094433,-95.084002493615529 33.893280234094433,-95.079139333602001 33.898143394107954,-95.078905311676394 33.898377416033576,-95.074957661870556 33.900039583313315,-95.073630040977179 33.900598581227868,-95.071259538767663 33.901596686785098,-95.065491679645973 33.899584642240477,-95.06106518008815 33.895292278639054,-95.058834000000004 33.886812999999997,-95.049025 33.864089999999997,-95.046567999999994 33.862564999999996,-95.038661112238941 33.860609605793528,-95.037206999999995 33.86025,-95.033518790033554 33.860141698175291,-95.03143098776043 33.86008039125462,-95.030255193062573 33.860045864827867,-95.022324999999995 33.859813000000003,-95.016999191469623 33.861237606415294,-95.016422000000006 33.861392000000002,-95.008375999999984 33.866088999999995,-95.000223000000005 33.862504999999999,-94.995524000000003 33.857438000000002,-94.992810330111539 33.852698351540766,-94.992671 33.852454999999999,-94.992523097811741 33.852403566519136,-94.990494037024106 33.851697953840834,-94.988486999999992 33.850999999999999,-94.98739725328582 33.851074415574232,-94.983303000000006 33.851354,-94.981650000000002 33.852283999999997,-94.976208 33.859846999999995,-94.973410999999999 33.861730999999999,-94.971435 33.862122999999997,-94.968895000000003 33.860916000000003,-94.965888000000007 33.848421999999999,-94.964400999999995 33.837020999999993,-94.957676000000006 33.835003999999998,-94.949533421399437 33.825707838785306,-94.949112883549958 33.821754768331147,-94.948729542346143 33.818151347643564,-94.948715939727023 33.818023482549535,-94.944301522854289 33.81213759866646,-94.939560116480934 33.810502632153295,-94.935799688114457 33.810339132650462,-94.932366255585293 33.810993121156741,-94.928442330884351 33.812628087669893,-94.92451840618341 33.812791587172725,-94.924196338046286 33.812670811231236,-94.921902464831703 33.811810605997493,-94.919450010309433 33.810175636315982,-94.917815040627914 33.808704169305649,-94.917091634856007 33.805689966907131,-94.916834062621035 33.804616745101868,-94.916997555787162 33.801510305241678,-94.91961350347556 33.794152948011565,-94.920034399525505 33.790224602097751,-94.920103995647338 33.789575041141042,-94.920095560257593 33.789518805381888,-94.91961350347556 33.786305103362189,-94.913003475392784 33.779908559849432,-94.912450337640749 33.77937328682863,-94.911427000000003 33.778382999999998,-94.906244999999998 33.778191999999997,-94.902276 33.776288999999998,-94.89497736748055 33.771540270803243,-94.89019868072495 33.768431100796676,-94.888367999999986 33.76724,-94.887910246679809 33.766674529711281,-94.886225692565191 33.764593571999796,-94.885411379435553 33.764756432942491,-94.881447983999394 33.765549103837166,-94.879218389137634 33.764912090842074,-94.876033253179955 33.760771407616105,-94.875653319149677 33.757021753168047,-94.875534806260347 33.755852122792213,-94.875497398046861 33.755482932714841,-94.877080000000007 33.75222,-94.874668 33.749164,-94.870299604394191 33.746484207390097,-94.869443369718425 33.745958950164457,-94.869299999999996 33.745871,-94.8570941233355 33.742035460072337,-94.849295999999981 33.739584999999991,-94.841633779899112 33.739430990835892,-94.830804318260235 33.740068022348083,-94.828875382311935 33.74092532536806,-94.827937698058648 33.741342073027738,-94.826026615866809 33.743890180559411,-94.824752565187154 33.749304914465036,-94.82447272313469 33.749460382205008,-94.821885938813196 33.750897483986968,-94.817426749089677 33.752171534666616,-94.815635414888177 33.752066164468857,-94.813744972719192 33.751954964523563,-94.81275807295215 33.751896912919612,-94.812012015184067 33.751853028169073,-94.80914539498248 33.749304914465036,-94.798634446013509 33.744527205899239,-94.789716054221742 33.746119775421171,-94.777638928565466 33.753471071068567,-94.775064434371529 33.755038154868203,-94.770923763490302 33.754401129528375,-94.768057130944001 33.753445597691005,-94.766464573766783 33.750897483986968,-94.766146067269247 33.748030863785381,-94.766818924318841 33.746124416643802,-94.768057130944001 33.742616129879757,-94.767738636791165 33.737519908644046,-94.767244154304578 33.736926531576607,-94.76296091588064 33.731786662068515,-94.759138751496963 33.729557067206756,-94.758159820145337 33.729557067206756,-94.753087004596253 33.729557067206756,-94.750011775433265 33.728811557489699,-94.742576055627282 33.727008959675082,-94.742176780415733 33.726449974997927,-94.739390916583417 33.72254976995157,-94.737479828219207 33.716179498036198,-94.737788227808608 33.71500758055268,-94.73907239774114 33.71012773879076,-94.73746132453816 33.705563045258067,-94.73716130937693 33.704713004885136,-94.732383613155861 33.700253815161624,-94.728242929929891 33.699616789821789,-94.725694828570582 33.702483410023376,-94.724525908047042 33.704821269192259,-94.724102271393392 33.705668549067234,-94.721872664186904 33.707261118589173,-94.719006043985303 33.708216656598914,-94.714865360759347 33.707261118589173,-94.711043208720398 33.705668549067234,-94.709450639198465 33.699616789821789,-94.710289486124168 33.697309952648205,-94.710724689878106 33.696113138108018,-94.710724689878106 33.691653948384499,-94.710106194192988 33.688252279047049,-94.71008765219355 33.688150299756906,-94.707858069676533 33.686876245991066,-94.691547961569825 33.685092048879412,-94.684792000000002 33.684353000000002,-94.659166999999997 33.692138,-94.652265035786613 33.690979104454883,-94.649628372726468 33.688049476940073,-94.649099284135872 33.686462209886628,-94.648456523423718 33.684533926193204,-94.64818493525776 33.682632803768527,-94.647928021538007 33.680834402751707,-94.647870600191638 33.680432452214262,-94.648456523423718 33.673401362074948,-94.647827859209684 33.672301196274027,-94.646112824818204 33.669299876741562,-94.642890235687361 33.668420997570671,-94.635273213800133 33.669885811328072,-94.631328876730365 33.67284406472757,-94.630585813750528 33.673401362074948,-94.627656194751552 33.677795791992715,-94.62121101648988 33.681018386800773,-94.616816575217669 33.679553573043371,-94.614284398758912 33.677302743466427,-94.611543254774574 33.674866164477912,-94.611424034353576 33.674789522931938,-94.607441775118403 33.672229504256364,-94.60304734520065 33.671350625085473,-94.596895128555005 33.671350625085473,-94.593672545101384 33.673987285307021,-94.590449961647764 33.677502836053897,-94.590316660066918 33.67755410593854,-94.586641449284855 33.678967649811298,-94.579620000000006 33.677622999999997,-94.576973687569549 33.673401362074948,-94.5728722135906 33.669885811328072,-94.571305222138406 33.668005422800071,-94.569942586075811 33.666370260581196,-94.569356662843745 33.663440621711956,-94.571445361022185 33.660423619728157,-94.571993323065286 33.659632120703485,-94.572286279004103 33.656995454804722,-94.570821465246695 33.654944723492456,-94.568770728257221 33.65465176187643,-94.564669254278257 33.655823608340576,-94.563858010166513 33.65591721375597,-94.557052229552454 33.656702498865904,-94.552071876402621 33.653479904057846,-94.551192985877293 33.650257320604226,-94.551311999999982 33.644569999999995,-94.553536678805585 33.642054372646328,-94.552657799634687 33.638245860283412,-94.549142248887819 33.635902161677912,-94.543868917090279 33.635902161677912,-94.538888563940446 33.637952898667386,-94.538195599937964 33.637916426989378,-94.537583502619341 33.637884211439605,-94.533322276204103 33.637659937051346,-94.529220802225154 33.63443734792051,-94.528408204203203 33.630103504051213,-94.528341911699826 33.629749945032266,-94.52980672545722 33.627406252103981,-94.528927834931892 33.621839964367631,-94.526291174710352 33.619203298468861,-94.521363727720257 33.61686924674752,-94.520724886974008 33.61656663824732,-94.504615 33.620682000000002,-94.493418698303032 33.624467326832118,-94.492501061148843 33.624777568252533,-94.491502999999994 33.625115,-94.491295462081894 33.62531395337146,-94.487514000000004 33.628939000000003,-94.485874999999993 33.637867,-94.481313 33.638818999999998,-94.476415000000003 33.638947000000002,-94.466075000000004 33.636262000000002,-94.464185999999998 33.637655000000002,-94.461453000000006 33.643615999999994,-94.459197999999986 33.645145999999997,-94.454819999999998 33.644902999999999,-94.448637000000005 33.642766000000002,-94.446871000000002 33.640177999999999,-94.447513999999998 33.636254999999991,-94.448451000000006 33.634497000000003,-94.458816999999982 33.632444,-94.462736000000007 33.63091,-94.461129 33.625414999999997,-94.460285999999996 33.624420999999998,-94.45525499999998 33.622917,-94.452710999999994 33.622621000000002,-94.452325000000002 33.618817,-94.452961000000002 33.616985999999997,-94.454768999999999 33.615155999999992,-94.462335999999993 33.610567000000003,-94.469451000000007 33.60731599999999,-94.472166 33.604199,-94.471974000000003 33.602665000000002,-94.471151999999989 33.601588,-94.468086 33.599435999999997,-94.461794602929331 33.598691554192769,-94.458900358388505 33.598349085232492,-94.458231999999995 33.598269999999999,-94.454858239556387 33.593453869357283,-94.453995999999989 33.592222999999997,-94.453435550445548 33.592019500625121,-94.452150252013013 33.591552808439438,-94.451622 33.591360999999999,-94.449112 33.590893999999992,-94.442363999999998 33.591242999999999,-94.441536999999997 33.591501999999991,-94.439518000000007 33.594154000000003,-94.430358101189597 33.59122600196271,-94.430038999999994 33.591124,-94.429672337173542 33.590855074196774,-94.427920122643982 33.589569927010331,-94.427577999999983 33.589319000000003,-94.425982000000005 33.586424999999998,-94.413155000000003 33.569367999999997,-94.412481642075306 33.56890283335202,-94.412480771235352 33.568902231761562,-94.412480202418593 33.568901838813659,-94.412175000000005 33.568691,-94.408900999999986 33.568196999999998,-94.403341999999995 33.568424,-94.397341999999981 33.571607999999998,-94.385926999999995 33.581887999999999,-94.382886999999997 33.58326799999999,-94.379649 33.580607,-94.378075999999993 33.577019,-94.377759999999981 33.574609000000002,-94.378561000000005 33.571328999999999,-94.380090999999993 33.568942999999997,-94.382534000000007 33.567056999999998,-94.388052000000002 33.565511,-94.392357000000004 33.565286999999998,-94.394655618773015 33.564059042448399,-94.397398454287298 33.562313601959417,-94.399227012370631 33.559903231990447,-94.399393244337958 33.557077279687135,-94.399143896386974 33.555498071165481,-94.397957000000005 33.554389999999998,-94.392572999999999 33.551141999999999,-94.389515000000003 33.546778000000003,-94.386086000000006 33.544922999999997,-94.381666999999993 33.544035,-94.373392999999993 33.544471,-94.371597999999992 33.545000999999999,-94.363297000000003 33.544956999999997,-94.361350999999999 33.544612999999998,-94.358969999999999 33.54323,-94.355945000000006 33.54318,-94.348944999999986 33.548358999999998,-94.347382999999979 33.55107799999999,-94.34729 33.552197,-94.352653000000004 33.560611000000002,-94.352433000000005 33.56217199999999,-94.345512999999997 33.567312999999999,-94.344023000000007 33.567824000000002,-94.340576999999996 33.567878,-94.340047258358467 33.56768232744934,-94.338972839399958 33.567285465504582,-94.33842199999998 33.567081999999999,-94.337996277272822 33.566655299162022,-94.334939999999989 33.563592,-94.334379999999996 33.562536,-94.333929800646288 33.557825151092565,-94.333894999999998 33.557461000000004,-94.333202999999997 33.555365999999992,-94.331833000000003 33.553348,-94.33059 33.552692,-94.323660000000004 33.549835000000002,-94.319491999999997 33.548864000000002,-94.309582000000006 33.551673,-94.30641 33.555616,-94.306214999999995 33.557676,-94.307180999999986 33.559797000000003,-94.303577000000004 33.56828,-94.301022999999986 33.573022000000002,-94.298392000000007 33.576217999999997,-94.293257999999994 33.580418999999999,-94.289129000000003 33.582143999999992,-94.287025 33.582410000000003,-94.283581999999996 33.581890999999999,-94.282647999999995 33.580978000000002,-94.280849000000003 33.577187000000002,-94.280604999999994 33.574907999999994,-94.282171999999989 33.572989,-94.290372000000005 33.567905000000003,-94.291686999999996 33.563481000000003,-94.290901000000005 33.558872,-94.289439999999999 33.557634999999998,-94.287571999999997 33.557178,-94.279089999999997 33.557026,-94.275600999999995 33.557963999999998,-94.274473 33.558652000000002,-94.271997999999996 33.561517999999992,-94.270978999999997 33.563220999999999,-94.270853000000002 33.564782999999998,-94.265668999999988 33.573588999999998,-94.262754999999999 33.577354,-94.257801 33.582507999999997,-94.257524288354617 33.582703553652586,-94.252656000000002 33.586143999999997,-94.245931999999996 33.589113999999995,-94.242777000000004 33.589708999999999,-94.240178999999998 33.589536000000003,-94.236971999999994 33.587411000000003,-94.236362999999997 33.585991999999997,-94.236835999999997 33.580914,-94.237975000000006 33.577756999999998,-94.238867999999997 33.576721999999997,-94.244365999999999 33.573549,-94.251108000000002 33.56528,-94.252330999999984 33.561855,-94.252283000000006 33.560445,-94.251569000000003 33.558188,-94.250197 33.556764999999999,-94.237903999999986 33.552675,-94.233128263729824 33.552212399803537,-94.233017493976078 33.552201670126067,-94.231843999999981 33.552087999999998,-94.226392000000004 33.552911999999999,-94.222920999999999 33.554088,-94.21922099999999 33.556095999999997,-94.213604000000004 33.563133999999998,-94.21268334130005 33.563763266722709,-94.208078 33.566910999999998,-94.205634000000003 33.567228999999998,-94.203593999999981 33.566546000000002,-94.202594978382763 33.562850001484037,-94.201237000000006 33.557825999999999,-94.199485999999993 33.556085000000003,-94.197816999999986 33.555238000000003,-94.196394999999995 33.555123000000002,-94.193247999999997 33.556153999999999,-94.191332999999986 33.55766599999999,-94.189883999999992 33.562454000000002,-94.192482999999996 33.570425,-94.194399000000004 33.573678,-94.196366991504703 33.574779501237479,-94.201105911663163 33.575851400157113,-94.204265191768783 33.575005164570705,-94.207404999999994 33.574353000000002,-94.209665 33.573509999999999,-94.211329000000006 33.573774,-94.216140999999993 33.576391999999998,-94.217408000000006 33.579259999999998,-94.217197999999982 33.580736999999999,-94.214431000000005 33.583187000000002,-94.212997 33.583486999999991,-94.210966999999997 33.583143,-94.205788416261612 33.581380140341984,-94.203588205048902 33.580815984742067,-94.199751933850294 33.581098061448763,-94.196536237091394 33.581718635888464,-94.194464999999994 33.582886000000002,-94.190890999999979 33.587474,-94.183913000000004 33.594681999999999,-94.180879999999988 33.592612000000003,-94.176327 33.591076999999999,-94.162266000000002 33.588906,-94.161081999999993 33.587972,-94.162009999999995 33.580877,-94.161276999999998 33.579270999999999,-94.156782000000007 33.575749000000002,-94.152625999999998 33.575923000000003,-94.148731999999995 33.580196999999998,-94.146047999999993 33.581975,-94.144383000000005 33.582097999999995,-94.142160000000004 33.581389999999999,-94.141852 33.579590000000003,-94.143023999999983 33.577725,-94.145668999999984 33.575599999999994,-94.149506000000002 33.573602,-94.151257 33.571793,-94.151754999999994 33.569476000000002,-94.151455999999996 33.568387,-94.148520000000005 33.565677999999991,-94.145239000000004 33.564987000000002,-94.143401999999995 33.565504999999995,-94.136863999999989 33.570999999999998,-94.136045999999993 33.571387999999999,-94.135142000000002 33.571033,-94.134308000000004 33.569209,-94.133047999999988 33.557952999999998,-94.131382000000002 33.552934,-94.128658 33.550952000000002,-94.126897999999983 33.550646999999991,-94.123897999999997 33.552100000000003,-94.122878999999983 33.553111999999999,-94.12071899999998 33.560555,-94.120354999999989 33.5655,-94.119902152897509 33.566998927274319,-94.112842999999998 33.566991000000002,-94.103176000000005 33.570349999999998,-94.100106999999994 33.57256799999999,-94.097439999999992 33.573718999999997,-94.088943 33.575322,-94.082640999999995 33.575491999999997,-94.072670000000002 33.572234000000002,-94.072231491265512 33.572605318678747,-94.072031926011121 33.573523317998088,-94.072031926011121 33.573846369634623,-94.072031926011121 33.574161925883949,-94.071815412538413 33.574459631515609,-94.071712621294751 33.574600969288895,-94.071353404455635 33.574840447439463,-94.070395493400298 33.574561056392717,-94.069534727631535 33.574169799087244,-94.069517406590393 33.574161925883949,-94.068559493988133 33.573563230894273,-94.068280102941401 33.571966710019424,-94.06782332144887 33.570215714974232,-94.067801146640278 33.570130711574109,-94.066845999999998 33.568908999999998,-94.061283000000003 33.568804999999998,-94.056597999999994 33.567824999999999,-94.056095999999997 33.567252000000003,-94.055662999999996 33.561886999999999,-94.056442000000004 33.560997999999991,-94.059849999999997 33.559249,-94.061179999999993 33.559159,-94.066685000000007 33.560953999999995,-94.067984999999993 33.560960999999999,-94.071719999999999 33.559682000000002,-94.073744000000005 33.558284999999998,-94.073825999999997 33.555833999999997,-94.072156000000007 33.553863999999997,-94.069091999999998 33.553406000000003,-94.06547999999998 33.550908999999997,-94.061896000000004 33.549764000000003,-94.056095999999997 33.550725999999997,-94.051882000000006 33.552585,-94.050211999999988 33.551082999999998,-94.046040000000005 33.551321000000002,-94.043449999999993 33.552253,-94.043428000000006 33.551424999999995,-94.043374999999997 33.542315000000002,-94.043020107474533 33.494534442391668,-94.043008999999998 33.493039000000003,-94.043278999999998 33.491029999999995,-94.043271947583932 33.489425304099555,-94.043188 33.470323999999991,-94.043130608695648 33.460424000000003,-94.043089437732434 33.453322008844353,-94.043061045958495 33.448424427841935,-94.043010021810147 33.439622762252007,-94.042987999999994 33.435823999999997,-94.042987999999994 33.434442436873745,-94.042987999999994 33.431023999999994,-94.042886999999993 33.420225000000002,-94.042890126641851 33.419424334827802,-94.042891364631132 33.419107312620362,-94.042967439944888 33.399626074590046,-94.043053 33.377715999999999,-94.042868999999996 33.371169999999999,-94.043127999999996 33.358756999999997,-94.043066999999979 33.352097,-94.043066999999979 33.347351000000003,-94.043066999999979 33.339614667914582,-94.043066999999979 33.330497999999999,-94.042990000000003 33.271227000000003,-94.043049999999994 33.260903999999996,-94.043003999999996 33.250127999999997,-94.042730000000006 33.241822999999997,-94.042876000000007 33.215218999999998,-94.042891999999995 33.202666,-94.042874999999995 33.199784999999999,-94.042718999999991 33.160290999999994,-94.043184999999994 33.143476,-94.043076999999982 33.138162,-94.043007000000003 33.13389,-94.042951563372725 33.117233519058104,-94.042869999999994 33.092726999999996,-94.043036 33.079484999999998,-94.042963999999998 33.019219,-94.042986850316112 33.007494023677346,-94.043068075862834 32.965815492539427,-94.043087999999997 32.955592000000003,-94.043066999999979 32.937902999999999,-94.043092 32.910021,-94.042884999999998 32.898910999999998,-94.042859000000007 32.892771000000003,-94.042885999999996 32.880965000000003,-94.043025 32.880445999999999,-94.042784999999995 32.871485999999997,-94.042921087938623 32.829694015190334,-94.043025999999983 32.797476000000003,-94.042747000000006 32.786973000000003,-94.042828999999998 32.785277,-94.042937999999992 32.780557999999999,-94.043026999999995 32.776862999999999,-94.042946999999998 32.767991000000002,-94.042974715046569 32.757603400545236,-94.04314699999999 32.693030999999998,-94.042912999999999 32.655126999999993,-94.042779999999993 32.643465999999997,-94.042823999999996 32.640304999999998,-94.042925999999994 32.622014999999998,-94.042929 32.618259999999992,-94.042918999999998 32.610142000000003,-94.042939007208048 32.604544739553475,-94.043082999999996 32.564261000000002,-94.043142000000003 32.559502000000002,-94.043081 32.513612999999999,-94.042884999999998 32.505144999999999,-94.042911000000004 32.492851999999999,-94.043088999999995 32.486561000000002,-94.043071999999995 32.48429999999999,-94.042955000000006 32.480260999999999,-94.042995000000005 32.478003999999999,-94.042901999999998 32.472905999999995,-94.042874999999995 32.471347999999992,-94.042902999999981 32.470385999999998,-94.042907999999997 32.439890999999996,-94.042985999999999 32.435507,-94.042898999999991 32.400658999999997,-94.042923000000002 32.399918,-94.042900999999986 32.392282999999999,-94.042762999999994 32.373331999999998,-94.042738999999997 32.363559000000002,-94.042733519218956 32.277818574933548,-94.042732999999998 32.269696000000003,-94.042732 32.269620000000003,-94.042671451745775 32.225096273752321,-94.042662000000007 32.218145999999997,-94.042600205901905 32.185155675879351,-94.042565999999994 32.166893999999999,-94.042538999999991 32.166826,-94.042591000000002 32.158096999999998,-94.042681000000002 32.137956000000003,-94.042751999999993 32.125163,-94.042337000000003 32.119914,-94.042699999999996 32.056012000000003,-94.042717288248511 32.00695918811028,-94.042720000000003 31.999265,-94.042490448495869 31.997488887291052,-94.042251674184627 31.995641414801661,-94.041832999999997 31.992401999999998,-94.038411999999994 31.992436999999999,-94.029282999999992 31.995864999999998,-94.027080554152732 31.994823406342874,-94.018664 31.990842999999998,-94.011671046736083 31.979908989829021,-94.008352361284565 31.974719974671689,-94.002944198469422 31.966263903968002,-93.995504541226836 31.954631438414648,-93.994147015257326 31.952508844111783,-93.977461000000005 31.926418999999996,-93.971711999999982 31.920383999999995,-93.953546000000003 31.910562999999996,-93.943541310721315 31.908563758569336,-93.938002035663573 31.906916949339585,-93.935007833635339 31.903773037645127,-93.932462763507019 31.895538979891644,-93.931327794714704 31.894581351390723,-93.92767203678045 31.891496810199779,-93.923929283519882 31.889849995167665,-93.919587694495533 31.890748256066246,-93.915948999999998 31.892861000000003,-93.909557114944889 31.893143619429534,-93.905252294448232 31.890856686636408,-93.90476638821832 31.890598549301192,-93.901173350426333 31.885957535142037,-93.901888 31.880063,-93.898135577976262 31.874953416991548,-93.896981462364707 31.873381885463036,-93.889196542313442 31.867692899288475,-93.888241004857136 31.85786451213389,-93.888148571748644 31.856913771406646,-93.887306164689562 31.854968889155742,-93.884117000000003 31.847605999999995,-93.880377455095243 31.844791786271248,-93.879654915472827 31.84424803536659,-93.874821999999995 31.840611000000003,-93.874804231839249 31.835091218914506,-93.874787826198073 31.829994712349503,-93.874761000000007 31.821660999999999,-93.870917000000006 31.816836999999996,-93.868473098390325 31.815251608244314,-93.853390000000005 31.805467,-93.846187999999998 31.802021,-93.839950728453459 31.798597132180646,-93.836868453653821 31.794158659336233,-93.836868453653821 31.791454071635616,-93.836868453653821 31.788733862378688,-93.834649214842401 31.783309060642711,-93.831197070889573 31.780226788232302,-93.827450999999996 31.777740999999999,-93.823442999999997 31.775098,-93.822597999999985 31.773558999999995,-93.826519525540022 31.761832440276638,-93.827342999999999 31.759369999999997,-93.830112066651125 31.754555168030393,-93.830647423185951 31.745811043570992,-93.824579 31.734396999999998,-93.819048075401312 31.72885814427071,-93.818932598107111 31.728523867973351,-93.815657495541259 31.719043310199801,-93.815835943108667 31.711905251886723,-93.815525624652665 31.710796971318612,-93.814600367558683 31.707492480599399,-93.814586782471608 31.707443962415162,-93.811060073548262 31.705827553684028,-93.810303944025605 31.705480994217723,-93.807270273132957 31.704231833580664,-93.806045429297654 31.703104120446881,-93.803419352361757 31.700686292667093,-93.802693549340276 31.697783082925291,-93.802451615781152 31.693186330065117,-93.804479 31.685663999999999,-93.812820813246589 31.676953615984285,-93.81562111199878 31.674029590143711,-93.817425 31.672146,-93.821829497696953 31.673879806810671,-93.822051000000002 31.673966999999998,-93.822341750589956 31.673502431839047,-93.826462000000006 31.666919,-93.8257324849111 31.66154827530681,-93.825660999999997 31.661021999999996,-93.825228912080746 31.660277861177896,-93.81803699999999 31.647891999999999,-93.817707248836442 31.6409111211136,-93.816838000000004 31.622509,-93.818717000000007 31.614555999999997,-93.823976999999999 31.614227999999997,-93.825414416100287 31.615089707767993,-93.827851999999993 31.616550999999998,-93.838056999999992 31.606795000000002,-93.839382999999998 31.599074999999999,-93.837534908858984 31.593743346167731,-93.834924 31.586210999999999,-93.822958 31.568129999999996,-93.822219025006859 31.564792487143556,-93.820763999999997 31.558221000000003,-93.818582000000006 31.554825999999998,-93.798086999999995 31.534044000000002,-93.787687000000005 31.527343999999996,-93.781574079702807 31.525595412174177,-93.780834999999996 31.525383999999999,-93.777170583402579 31.525128039451072,-93.760062000000005 31.523933,-93.753860000000003 31.525331,-93.751899169046524 31.525601857922521,-93.749869902733366 31.526210635456998,-93.746826003263621 31.526007705679731,-93.743376259969125 31.525196002300419,-93.742401241878753 31.523787647735123,-93.74154991556837 31.522557958452786,-93.741111000000004 31.520101,-93.740752889151466 31.518711098615515,-93.740332360499409 31.517078940980245,-93.739317727342822 31.515049678599539,-93.734411826534469 31.513527159467717,-93.733432858180635 31.513223342063657,-93.726736285639134 31.511599931372594,-93.725924582259807 31.504091651519342,-93.728765551952293 31.496786301443361,-93.730997740177827 31.492118989316349,-93.733996137544537 31.48847587643743,-93.737167999999997 31.484621999999998,-93.741884999999982 31.483535,-93.745608448194673 31.481972669547908,-93.746355058504165 31.481633300507966,-93.747840636420193 31.480958036391328,-93.749869902733366 31.478928770078173,-93.749869902733366 31.475276095040186,-93.749626709600278 31.47120988033301,-93.749476 31.468689999999999,-93.709416000000004 31.442995,-93.706857276389258 31.44142369846492,-93.700929751125955 31.437783629836048,-93.697919763270235 31.429300939077926,-93.697603150134782 31.428408665937056,-93.704678 31.418899999999997,-93.704697874245824 31.418107106580852,-93.704878999999991 31.410881,-93.701611 31.409333999999998,-93.695865999999995 31.409391999999997,-93.689953513429003 31.406208353384852,-93.678362516190631 31.399967047179565,-93.675064666986117 31.398191282223291,-93.674659331220113 31.397973024503138,-93.674116999999981 31.397680999999995,-93.671643999999986 31.393352,-93.670181999999983 31.387184,-93.668532759396427 31.379357124595749,-93.668145986696857 31.37510269235548,-93.669064113561134 31.373151679996884,-93.669693055010129 31.371815184369147,-93.669512094168894 31.370548454097019,-93.668919524600994 31.366400452767671,-93.667402247962755 31.365414223393856,-93.665051865060306 31.363886475190469,-93.663891561951601 31.361952641672623,-93.663698175601809 31.360018811902275,-93.664665092360735 31.357698213179859,-93.665825387974422 31.355184231855155,-93.668439000000006 31.353011999999996,-93.669515978941746 31.350266666374935,-93.673736148309771 31.339509006758242,-93.677277000000004 31.330482999999997,-93.687850999999995 31.309835,-93.686922292404276 31.305369360695714,-93.686880000000002 31.305166,-93.686723586265984 31.304979085312567,-93.684737187533131 31.30260533533086,-93.684038999999999 31.301770999999995,-93.683824154244718 31.301752735987076,-93.675439999999995 31.30104,-93.668927999999994 31.297974999999997,-93.657003999999986 31.281735999999999,-93.647719584117951 31.27389987096868,-93.642516 31.269508000000002,-93.632650200244299 31.270182983909681,-93.620343000000005 31.271025000000002,-93.615257056394739 31.261768439618621,-93.61394199999998 31.259374999999995,-93.614287999999988 31.251631,-93.616308000000004 31.244595000000004,-93.616007481020262 31.233959925788763,-93.613835693061347 31.232449117569455,-93.609977782626956 31.229765355202261,-93.609827614285464 31.229660890324059,-93.608033931702224 31.227867209671889,-93.60740940488401 31.227242683526022,-93.605259887151632 31.224152751460338,-93.604319472818304 31.220794125122111,-93.604319472818304 31.215285983654958,-93.607287999999997 31.205403,-93.602442999999994 31.182541,-93.600307999999998 31.176157999999997,-93.598827999999997 31.174679,-93.595531708436056 31.171774432382691,-93.588772842417583 31.16581877494577,-93.588502999999989 31.165581,-93.588046655571759 31.165671453282986,-93.583339301771971 31.166604510813709,-93.579215000000005 31.167421999999995,-93.578993496784307 31.167654977688123,-93.574136071231791 31.172764031170193,-93.569563000000002 31.177574,-93.560942999999995 31.182481999999997,-93.552649000000002 31.185575,-93.548930999999996 31.186601,-93.535096999999993 31.185614,-93.533756450961803 31.184752004501149,-93.533306999999994 31.184463,-93.5330935917342 31.183965183917415,-93.531744000000003 31.180816999999998,-93.533193520062923 31.174490811082034,-93.53417786817559 31.170194787673282,-93.536829999999981 31.158620000000003,-93.540253000000007 31.156578999999997,-93.544009577425854 31.153014849431809,-93.544887639546317 31.148844041597808,-93.544887639546317 31.143136612291205,-93.544701999999987 31.135888999999999,-93.540277800652078 31.128868068802213,-93.539619249807799 31.121843550568837,-93.541375382556595 31.113501939154769,-93.541635919885238 31.113241401693255,-93.548470239502265 31.106407078590973,-93.549716998224596 31.105160319232844,-93.55112206776522 31.099540038044921,-93.551692642249563 31.097257738879012,-93.551034091405285 31.091111287020031,-93.546643772295099 31.082989189009115,-93.540128999999993 31.078002999999995,-93.53104031045666 31.074698717981779,-93.527873992025093 31.072210897922254,-93.526043656150705 31.070772777782928,-93.524020490083288 31.067083472240864,-93.523009982318626 31.065240780256033,-93.523659621286654 31.063941504256789,-93.525329858273139 31.060601035263321,-93.529255791555698 31.057567354514948,-93.532069000000007 31.055264,-93.531218761655126 31.051678447674814,-93.523247999999995 31.037841999999998,-93.516942620821894 31.032584114108545,-93.516407263768343 31.029550433360171,-93.516883288197775 31.024314186160638,-93.516942620821894 31.023661529978199,-93.539525999999995 31.008497999999999,-93.540062152267268 31.008345085566372,-93.540618575989114 31.008186389569964,-93.555580999999989 31.003918999999996,-93.562626264226125 31.00599480945781,-93.566016847371429 31.004567194682853,-93.567979815741779 31.001533515663564,-93.569764334642755 30.996715319472376,-93.571101253513504 30.991033414001794,-93.571905755076102 30.987614282198351,-93.567971999999997 30.977981,-93.560533000000007 30.971285999999999,-93.55046299120518 30.967360467203815,-93.549841 30.967117999999996,-93.539153617393822 30.956968324013513,-93.532549000000003 30.950695999999997,-93.526524876707626 30.939912016599852,-93.526293050708773 30.939497017171423,-93.526245000000003 30.939411,-93.526242458076936 30.939167805401102,-93.526231146824912 30.938085618677029,-93.526146999999995 30.930035,-93.526269219450654 30.929894609689271,-93.530935999999983 30.924533999999998,-93.542488999999989 30.920064,-93.54502991280485 30.920837107400992,-93.546884259495414 30.92151141825828,-93.549244331161987 30.921005686748707,-93.550358562122057 30.920030731622223,-93.551941554990407 30.918645608548566,-93.555650241837967 30.911228247920597,-93.555751501305451 30.910053639118178,-93.555774257662236 30.909789665608852,-93.556493125509377 30.9014508058257,-93.562447641167196 30.896531852982324,-93.563812214002311 30.895404595987301,-93.564247644832776 30.895044891882932,-93.567787752332634 30.888301832311882,-93.567450600170787 30.878524390216981,-93.566008182600839 30.875519355165832,-93.565853452041281 30.875197,-93.565427680666076 30.874309976760035,-93.563763247930751 30.87311591407202,-93.559394659034922 30.869981891957959,-93.55904186947815 30.86972880101742,-93.558616999999984 30.869423999999999,-93.558608112367665 30.868835818489011,-93.558593354020289 30.867859114376206,-93.558393833586933 30.854654896933653,-93.558352334289978 30.851908482785802,-93.558231866260058 30.843935935637496,-93.558171999999999 30.839973999999998,-93.553625999999994 30.835139999999999,-93.55374115920948 30.832414921630001,-93.554057 30.824940999999995,-93.561666000000002 30.807738999999998,-93.563243 30.806218000000005,-93.564501487304341 30.805543276361082,-93.569303000000005 30.802969,-93.578395 30.802046999999998,-93.584264999999988 30.796662999999995,-93.588934854633479 30.787551489258888,-93.589380999999989 30.786681000000002,-93.589895999999996 30.77776,-93.591925627378814 30.768225181611253,-93.592827999999997 30.763985999999996,-93.607757000000007 30.757656999999995,-93.611581311334461 30.752392350515215,-93.615058988962588 30.747604886281291,-93.619129 30.742001999999996,-93.617688 30.738479000000005,-93.609908791486006 30.729403419430973,-93.609718999999998 30.729181999999998,-93.609544 30.723138999999996,-93.61030547238029 30.720788970554505,-93.611192000000003 30.718053,-93.61618399999999 30.713980000000003,-93.616977218405893 30.712276394979256,-93.620773999999997 30.704122000000005,-93.621061387132315 30.696047232392139,-93.621092999999988 30.695159,-93.62235785978659 30.692974242186811,-93.629903999999996 30.679939999999995,-93.632922525899005 30.677439880221801,-93.638212999999993 30.673057999999997,-93.646373493696458 30.671658473870171,-93.653439445062318 30.670446661945991,-93.654970999999989 30.670183999999999,-93.666219386787546 30.661299653678171,-93.670353999999989 30.658033999999997,-93.670860468306827 30.657347728689221,-93.683099999999996 30.640763000000003,-93.685120999999981 30.625201,-93.684323003112922 30.617258061147268,-93.683396999999985 30.608040999999997,-93.680812614601606 30.602993111696524,-93.680648411741274 30.602453589051585,-93.679828117977763 30.599758343304948,-93.681234543283509 30.596101640780542,-93.683902548646543 30.593069810094963,-93.684328672415049 30.59258557751615,-93.684347894395486 30.592579170189346,-93.687282162286593 30.59160108089231,-93.689533999999995 30.592759,-93.692869000000002 30.594382000000003,-93.712453999999994 30.588479,-93.72107859525056 30.580404159651369,-93.727657631584904 30.574244488790981,-93.727844000000005 30.574069999999995,-93.727840097341868 30.573768021870688,-93.72780696123904 30.571204031383882,-93.727747245613443 30.566583382517752,-93.727745999999996 30.566486999999999,-93.725846999999987 30.556978,-93.728764326223569 30.546403128121515,-93.729195000000004 30.544841999999999,-93.736587760607577 30.541316766984647,-93.740252999999996 30.539569,-93.738909526480768 30.537838512460276,-93.732793 30.529960000000003,-93.727721000000003 30.525671000000003,-93.718711305261792 30.520890798500346,-93.714321999999996 30.518561999999996,-93.710116999999997 30.506399999999996,-93.713193644304937 30.50058809182816,-93.716678000000002 30.494005999999995,-93.71365216083376 30.483878530555742,-93.711446941284677 30.476497671106777,-93.710595424186792 30.473647647388944,-93.709703157003446 30.47066123332699,-93.708899372668625 30.467970970942378,-93.705844999999997 30.457747999999999,-93.697828 30.443837999999996,-93.6978 30.440583,-93.698862234241474 30.438260713588438,-93.702220303997905 30.430919206922557,-93.702664999999996 30.429947000000002,-93.722313999999997 30.420729,-93.729486046484141 30.413342592858086,-93.738025291703323 30.404548123662593,-93.738321805525445 30.404242747530638,-93.745333000000002 30.397022,-93.751243378615428 30.396311282781173,-93.751436999999996 30.396287999999998,-93.754787283332149 30.393127406185759,-93.75746720581121 30.390599218098316,-93.757654000000002 30.390422999999995,-93.757872622462301 30.389610210267922,-93.758470934573069 30.387385818798332,-93.75855399999999 30.387077,-93.758091991038413 30.3842338214119,-93.758032188807945 30.383865801664729,-93.757931393201204 30.383245510859378,-93.75589426835937 30.370709152880856,-93.756044740613035 30.365928314513319,-93.75610723110799 30.3639428524199,-93.756352000000007 30.356166000000002,-93.758519945992674 30.350935458285047,-93.760658351649255 30.34577618769989,-93.763244572034736 30.339536487238696,-93.765822 30.333317999999995,-93.764264999999995 30.330222999999997,-93.760690955159149 30.32995156504764,-93.760328 30.329923999999998,-93.747921244232074 30.314935395431327,-93.743830002049762 30.309992764786195,-93.741160171732417 30.306767342150266,-93.738698999999997 30.303793999999996,-93.734966161369201 30.301561360829975,-93.729390287632427 30.298226388348422,-93.724220000000003 30.295133999999997,-93.718684474451791 30.295009979388311,-93.714319430116035 30.294282471059141,-93.71311219174963 30.293184979315004,-93.711118400234781 30.291372437742464,-93.709949692759622 30.289928741213533,-93.708644873043468 30.288316906143507,-93.708448001046747 30.287627854154977,-93.707590519980414 30.284626670422831,-93.706607851977495 30.281187332412603,-93.706635817233519 30.280914670488997,-93.707189856385114 30.275512775340033,-93.709131999999997 30.271826999999995,-93.707538803456245 30.253087036355307,-93.707271000000006 30.249936999999996,-93.705637767078656 30.244573755694763,-93.705083000000002 30.242751999999996,-93.707646217538425 30.23733474070027,-93.713358999999997 30.225261,-93.71802168481895 30.219915738218987,-93.719219999999993 30.218541999999999,-93.720945999999998 30.209852,-93.717397000000005 30.193439,-93.710467999999992 30.180670999999997,-93.706634735424259 30.17682001000631,-93.705927274531248 30.176109277739844,-93.705791510460429 30.175972885881706,-93.703764000000007 30.173936,-93.703646997347349 30.173527735424756,-93.702964616901454 30.171146663230584,-93.701744610591902 30.166889619937699,-93.701686103512344 30.166685467574972,-93.697748000000004 30.152943999999998,-93.696083741705934 30.150925109485563,-93.688211999999979 30.141376,-93.69286799999999 30.135216999999997,-93.69498 30.135185,-93.698276000000007 30.138608000000005,-93.700984936503929 30.137486558544058,-93.701251999999997 30.137376,-93.7012922571502 30.136537706048752,-93.701585086407604 30.130439981942867,-93.701656556414648 30.128951727699913,-93.701742498922442 30.127162105630983,-93.701985639262489 30.122099077688652,-93.702366286953335 30.114172668214064,-93.702403861450691 30.11339023643033,-93.702436000000006 30.112720999999997,-93.70268530105453 30.112503701678254,-93.704703872918159 30.110744253531749,-93.710410303455276 30.105770356484715,-93.714491639657382 30.10221294069715,-93.723764999999986 30.094129999999996,-93.727140999999989 30.092110594495406,-93.7293848599641 30.090768395691203,-93.72996305770063 30.09042253796256,-93.732484999999997 30.088913999999995,-93.734084999999979 30.086129999999997,-93.731705540540531 30.081478540540548,-93.731605000000002 30.081282000000002,-93.729179922109864 30.079341937687897,-93.727017487667368 30.077611990133899,-93.71640499999998 30.069121999999997,-93.716151269697463 30.069056930886212,-93.707507094464489 30.066840132907302,-93.702179999999998 30.065473999999995,-93.700580000000002 30.063666,-93.699479012508235 30.0595596142199,-93.699395999999993 30.059249999999995,-93.699786698153744 30.05843348475733,-93.700658293446523 30.056611948527472,-93.700819999999993 30.056273999999998,-93.702099264262131 30.055460929156467,-93.703267223154896 30.054718601437116,-93.703940000000003 30.054290999999999,-93.704473210548429 30.054251542735575,-93.709782747672762 30.053858640136632,-93.710785394684464 30.05378444485228,-93.720804999999999 30.053042999999995,-93.729054152595779 30.045230570163486,-93.729990027439044 30.044344241966268,-93.737446000000006 30.037282999999999,-93.739158000000003 30.032626999999998,-93.739733999999999 30.023987000000002,-93.741078000000002 30.021571000000002,-93.744068611359822 30.019549890100706,-93.74834924745744 30.01665695787004,-93.753252045558341 30.013343557169065,-93.766227014667976 30.004574835541469,-93.782835629207284 29.993350429819579,-93.786934999999986 29.990579999999998,-93.789430999999993 29.987812000000002,-93.803328792953494 29.962666096659486,-93.807814999999991 29.954549,-93.813734999999994 29.935126,-93.816550000000007 29.920725999999995,-93.818997999999993 29.914822,-93.830374000000006 29.894358999999998,-93.838374000000002 29.882854999999999,-93.853129483564672 29.866348149842587,-93.854474509531912 29.864843479256791,-93.855140000000006 29.864098999999996,-93.857517787207271 29.862146563102172,-93.862474802662518 29.858076283033213,-93.863569999999996 29.857177,-93.864820388168837 29.856398395289631,-93.872445999999997 29.851650000000003,-93.890679000000006 29.843159000000004,-93.900728 29.836967,-93.911111176241661 29.828996955749506,-93.916359999999997 29.824967999999998,-93.922743999999994 29.818808,-93.927992000000003 29.809640000000002,-93.929208000000003 29.802952,-93.928808000000004 29.79708,-93.926503999999994 29.789559999999998,-93.922407000000007 29.785048,-93.898470000000003 29.771576999999997,-93.893861999999999 29.767289000000002,-93.890820999999988 29.761672999999995,-93.891780610698319 29.758916671398389,-93.892526767476923 29.756773455119472,-93.893828999999997 29.753032999999999,-93.891732576672823 29.744984915009951,-93.891637000000003 29.744618000000003,-93.891484462723341 29.744488863328282,-93.888820999999993 29.742234000000003,-93.873941000000002 29.737770000000005,-93.870019999999997 29.735482,-93.863203999999996 29.724059,-93.837970999999982 29.690618999999998,-93.852868 29.675885,-93.866980999999996 29.673085,-93.889989999999997 29.674012999999999,-93.930999999999997 29.679611999999999,-93.955443390383635 29.680262610936268,-93.955453232202885 29.68026287289646,-93.991585827226885 29.681224615973395,-94.000169999999997 29.681453101326589,-94.000222586816207 29.681454501032487,-94.001406000000003 29.681486,-94.010062765207763 29.679864152681674,-94.056505999999999 29.671163,-94.132576999999984 29.646217,-94.354166823921716 29.561457673765378,-94.370794193562546 29.555097613439198,-94.391123278008692 29.54732162684321,-94.45341877657637 29.523493256060661,-94.456196753642018 29.522430664556182,-94.45805240375158 29.521720868184531,-94.499046371673685 29.506040450016997,-94.499089575343746 29.506023924375612,-94.500455432020999 29.505501476685335,-94.500806999999995 29.505367,-94.552043946167103 29.48495633977835,-94.552044379602123 29.484956167115939,-94.568074121423052 29.478570587212708,-94.593696728539513 29.46836361027578,-94.594852999999986 29.467903,-94.599458690353401 29.465813271763974,-94.62931993394271 29.452264405230761,-94.631084 29.451464,-94.634656044789836 29.449584234717392,-94.661528069434993 29.435443006940758,-94.670389 29.430779999999999,-94.674924987623086 29.427889211977174,-94.680871144138621 29.42409972235215,-94.694158000000002 29.415631999999999,-94.708472999999998 29.403049000000003,-94.723958999999979 29.383268000000005,-94.730956033155138 29.369322304827527,-94.731047000000004 29.369140999999996,-94.731324722869132 29.369141342444962,-94.731537324603394 29.369141604592603,-94.742750849251038 29.369155431380086,-94.744595216508316 29.369157705569055,-94.744833999999997 29.369157999999999,-94.761491000000007 29.361882999999999,-94.772184717669788 29.3616343088914,-94.778690999999995 29.361483,-94.780073439975141 29.362532749099824,-94.782355999999993 29.364266,-94.782645420567292 29.368514320481975,-94.783130999999997 29.375641999999996,-94.766847999999996 29.393488999999999,-94.754099999999994 29.400999999999996,-94.743385419572206 29.410035318862811,-94.73704402931665 29.415382843516582,-94.727822669267709 29.423158969605012,-94.723817999999994 29.426535999999995,-94.716270519001597 29.430976788539081,-94.706539419927282 29.436702374764607,-94.706364999999991 29.436804999999996,-94.686385999999999 29.466508999999995,-94.681540999999996 29.471388999999999,-94.672399999999996 29.476842999999999,-94.665852999999998 29.478401000000002,-94.656737000000007 29.478032999999996,-94.645948000000004 29.473769,-94.628217000000006 29.475986000000002,-94.608557000000005 29.483344999999996,-94.594211 29.492127,-94.595122262498009 29.503650874486677,-94.595439999999996 29.507669,-94.591407000000004 29.513857999999999,-94.580274000000003 29.525295,-94.566674000000006 29.531987999999995,-94.553989999999985 29.529558999999999,-94.546993999999998 29.524379,-94.532347999999999 29.5178,-94.511044999999996 29.519649999999995,-94.495024999999984 29.525030999999998,-94.503428999999997 29.543249999999997,-94.509486999999993 29.542589999999997,-94.523742999999996 29.545987,-94.523871183237745 29.546315590042923,-94.5261306113389 29.55210749848424,-94.526336 29.552633999999998,-94.542531999999994 29.568999999999999,-94.546193009360195 29.571896121601313,-94.546385 29.572047999999995,-94.546803832691651 29.57214903106096,-94.55398799999999 29.573882,-94.570006000000006 29.572232,-94.578210999999982 29.567281,-94.593518000000003 29.561319,-94.625889999999998 29.552807999999999,-94.634988842169335 29.550728838088908,-94.643914431984982 29.54868926579681,-94.666855093063802 29.543447131924982,-94.691625000000002 29.537787000000002,-94.693243673136905 29.537529479678042,-94.718275999999989 29.533546999999995,-94.740699000000006 29.525857999999999,-94.757688999999999 29.524616999999999,-94.768675999999999 29.525659,-94.780938000000006 29.531093000000002,-94.785987568065153 29.540133852805589,-94.789123822994313 29.545749069554745,-94.789562096440733 29.546533763545689,-94.78971899677407 29.546814681200559,-94.790604999999999 29.548400999999998,-94.779438999999996 29.549472000000002,-94.772471009935998 29.548613672580952,-94.771052999999995 29.548438999999995,-94.762972090755014 29.555767305595641,-94.75523699999998 29.562781999999999,-94.750081379755628 29.56810096117977,-94.734626000000006 29.584046,-94.731874420576986 29.588423440241069,-94.724443803393115 29.600244680945409,-94.708741000000003 29.625226,-94.705273448792255 29.640626536822896,-94.703938528752261 29.6465553563269,-94.702680930363101 29.65214076491651,-94.702542126991759 29.652757236398369,-94.699660909360375 29.665553672721437,-94.69780371146922 29.673802100155214,-94.694887994254785 29.686751760487848,-94.693153999999993 29.694452999999999,-94.692434000000006 29.70361,-94.692611750388934 29.704808689927841,-94.695098387970873 29.721577752663908,-94.695317000000003 29.723051999999999,-94.695611486157915 29.72357178078331,-94.697558868014866 29.727008993840069,-94.705700105090941 29.741378628781629,-94.713878412983604 29.755813695314995,-94.714586470042065 29.757063446593907,-94.722078339612551 29.770286919851305,-94.724615999999983 29.774766,-94.735270999999997 29.785433,-94.738125273271791 29.786265833277604,-94.740919000000005 29.787080999999997,-94.749144589762409 29.783534045463153,-94.75591801041729 29.780613280409739,-94.771512 29.773888999999997,-94.792237999999998 29.767432999999997,-94.798897371247961 29.764438558858895,-94.816085 29.756710000000002,-94.81943931055217 29.753325616252695,-94.823987131664666 29.748737021482022,-94.851107999999996 29.721373000000003,-94.856932183541645 29.710462974624775,-94.860426638443812 29.703917062844585,-94.864167858487249 29.696908903620852,-94.865007000000006 29.695336999999999,-94.865123196353878 29.694545038919138,-94.867438000000007 29.678768000000002,-94.872550999999987 29.67125,-94.893107 29.661335999999999,-94.915413 29.656613999999998,-94.921317999999999 29.658177999999999,-94.928410408640929 29.669495826038883,-94.930071799099807 29.672147016790593,-94.930110565443542 29.672208878811933,-94.930656833967475 29.673080595662611,-94.931474856161643 29.67438596783704,-94.934166999999988 29.678681999999998,-94.935264231405057 29.686686879688732,-94.935319060033862 29.687086883348073,-94.935997030967087 29.692033037575822,-94.936088999999996 29.692703999999999,-94.936280063994801 29.692851065945039,-94.941277009519624 29.696697319220664,-94.942680999999993 29.697778,-94.942922907078852 29.697804516058127,-94.95311095436017 29.698921254167477,-94.965343618259496 29.700262107971746,-94.965962999999988 29.70033,-94.972666000000004 29.684869999999997,-94.980123280315652 29.679059463608382,-94.986438191421769 29.674139034277729,-94.988580124776774 29.672470090483102,-95.001800051879343 29.662169436052462,-95.002396227716986 29.661704909944582,-95.005398 29.659365999999995,-95.011683000000005 29.649802000000005,-95.013860566469219 29.644103309100927,-95.014229369455222 29.643138151779844,-95.015636 29.639457,-95.015582911847446 29.639202042718885,-95.014543866006605 29.634211997110764,-95.013498999999996 29.629193999999998,-95.006633444897872 29.623869765921089,-95.00056235200779 29.61916163683599,-95.000370188745762 29.619012614335521,-94.997782627529062 29.617005962082896,-94.997731096758997 29.616965999999998,-94.995478872439179 29.615219401320278,-94.993499353954022 29.613684285860323,-94.988871000000003 29.610095,-94.988045541621688 29.608923290953985,-94.982835617337045 29.60152798723708,-94.982705999999993 29.601344000000005,-94.982886347998431 29.601051719777942,-94.983895794498991 29.599415764569699,-94.98693593300419 29.594488776939745,-94.988992999999994 29.591155,-94.991605757589539 29.588791109774153,-94.991811610459919 29.588604864563266,-94.992208959522046 29.588245363334387,-95.006677600766466 29.575154872369662,-95.007235451984087 29.574650156950938,-95.007670000000005 29.574256999999996,-95.00815781845921 29.573398130166158,-95.016627 29.558487,-95.018253 29.554884999999999,-95.016926355758628 29.548485488141377,-95.015164999999996 29.539988999999998,-95.012091452887788 29.536262245236642,-95.011587670186657 29.535651395780732,-95.011086587278399 29.535043819893005,-95.001666768519442 29.523622047865974,-94.999580999999992 29.521093,-94.989064037839412 29.515168017977793,-94.982063906682782 29.511224326765198,-94.981915999999998 29.511140999999995,-94.981645984265953 29.511070508097891,-94.961088181447877 29.505703566689924,-94.958443000000003 29.505013000000002,-94.958183821928699 29.504969740154092,-94.957844913785792 29.504913172428417,-94.95747910332102 29.504852114391142,-94.955724072517796 29.504559179260749,-94.952845264169682 29.504078672538427,-94.930551536860648 29.500357589179547,-94.927405495678158 29.499832478177321,-94.909464999999997 29.496837999999997,-94.913072085311995 29.488019044482122,-94.913385000000005 29.487254,-94.917178632618899 29.481741136316387,-94.925104227340569 29.470223752399235,-94.925293406029382 29.469948840084836,-94.925914000000006 29.469047,-94.930860999999993 29.450503999999999,-94.923011455799639 29.448810114938265,-94.920334997737442 29.448232551169699,-94.919400999999993 29.448030999999997,-94.916063708203708 29.446327523795176,-94.890799999999984 29.433432,-94.888257132054065 29.420136433311271,-94.887299999999996 29.415132,-94.887087039327696 29.40154064293051,-94.886938304445962 29.392048238229908,-94.886925408340758 29.391225196262944,-94.886904215833582 29.389872669858736,-94.886764190565785 29.380936121184895,-94.886591910643261 29.369941049100753,-94.886536208040312 29.366386054846032,-94.886982892003275 29.364738908620176,-94.888420210858001 29.359438798199445,-94.888544709543254 29.358979709544975,-94.888781730376067 29.358105695694917,-94.894234145274325 29.337999926591962,-94.894147383920654 29.327241695272729,-94.894002695197727 29.309300588032027,-94.893993580875261 29.308170430590454,-94.891329624021282 29.304475264201969,-94.888683946869179 29.30080545353194,-94.886599269217157 29.297913803549264,-94.886536208040312 29.297826331584119,-94.885816422022174 29.297499155955627,-94.884216982863776 29.296772137788121,-94.876917125093229 29.293454018939102,-94.875951551627523 29.293015121686942,-94.86617837453683 29.293883848703121,-94.865126326153927 29.293977364132552,-94.861112574100105 29.294855372432302,-94.849730461009372 29.297345209778594,-94.825607939204673 29.30577638202961,-94.824952733476934 29.30600538596191,-94.823862547308252 29.313200608971236,-94.822547126780194 29.321882377573708,-94.82230657170463 29.344254498409398,-94.810695999999993 29.353434999999998,-94.797913847039041 29.344567105809805,-94.79693012269928 29.343884625840758,-94.784895000000006 29.335535,-94.779995 29.334935000000002,-94.777063999999996 29.336811,-94.773074869484503 29.336485139838025,-94.745528999999991 29.334235,-94.744945 29.33641,-94.731319999999997 29.338066,-94.722529999999992 29.331445999999996,-94.731082 29.331833,-94.769694999999999 29.304936,-94.780304129101268 29.295750693651897,-94.786095000000003 29.290737,-94.793321795438203 29.286014946162535,-94.795651468635626 29.284492716516493,-94.803695000000005 29.279236999999998,-94.809348860129617 29.275904173901317,-94.81020919937113 29.275397022855465,-94.819018398045671 29.270204194137058,-94.82210781776098 29.268383049216432,-94.825036245866656 29.266656805306088,-94.825782574142963 29.266216861214712,-94.826962003659688 29.265521613475173,-94.833188167130103 29.261851427154124,-94.844390135018429 29.255248113651685,-94.870677905110114 29.23975205180561,-94.881596387366812 29.233315846843187,-94.896165027201874 29.224727954332334,-94.925556066041452 29.207402583865772,-94.927613957028456 29.206189502425392,-94.940693735267132 29.198479261054111,-94.968741214129224 29.181945889621023,-94.978383546115566 29.176261947153485,-94.981700088962569 29.174306918145966,-95.026218999999998 29.148064000000002,-95.076832914261459 29.114498139229923,-95.081772999999998 29.111222,-95.084611040272236 29.108948681405003,-95.100241410561338 29.096428488590096,-95.110484 29.088224,-95.116308293211759 29.081343778536318,-95.119264367911811 29.077851775668329,-95.119484217932538 29.077592067446851,-95.122403192505772 29.074143890856067,-95.122524999999996 29.074000000000002,-95.122638295373392 29.073709965581063,-95.125134000000003 29.067321,-95.183550616106302 29.028323983126334,-95.191390999999996 29.023089999999996,-95.192301227546167 29.02243038040822,-95.237672480263356 28.989550945676651,-95.238923999999997 28.988644,-95.240558404572027 28.987315672512366,-95.251568580535192 28.978367386619187,-95.251619678822578 28.978325857575001,-95.272266000000002 28.961545999999995,-95.29656403895315 28.934716691525271,-95.297146999999981 28.934073,-95.309703999999996 28.928262,-95.334686660244515 28.911063042846731,-95.353450999999993 28.898145,-95.376979000000006 28.876159999999999,-95.377903963555724 28.874482723635413,-95.38239 28.866347999999999,-95.416173999999998 28.859482,-95.436326577581042 28.85908617652915,-95.439594 28.859022000000003,-95.449516932572138 28.854239851149391,-95.480746000949352 28.839189657836059,-95.485144835951402 28.837069731735976,-95.486768999999995 28.836286999999995,-95.506945757563287 28.824808612805594,-95.536465934189138 28.808014833314715,-95.564052739104355 28.79232093268277,-95.564094788066555 28.792297011382839,-95.564132228771385 28.792275711681647,-95.568135999999981 28.789997999999997,-95.576201168007842 28.785870627961152,-95.606319447682353 28.770457515020929,-95.613122366343802 28.766976102576891,-95.695711236705606 28.724711019702028,-95.715243498124195 28.714715330888584,-95.812504000000004 28.664942,-95.854124934570734 28.646410960033691,-95.884026000000006 28.633098,-95.920915435374582 28.618912188118028,-95.97832748198536 28.596834417485056,-96.000681999999983 28.588238,-96.000998496292368 28.588108377001081,-96.024040703743012 28.578671299526803,-96.035336417502748 28.574045070633311,-96.05294532761279 28.566833233429691,-96.077867999999995 28.556625999999998,-96.194412 28.502223999999998,-96.220123346321373 28.492065891861738,-96.220376184174313 28.491966,-96.226882700448613 28.487451845000788,-96.241923733725443 28.477016528665938,-96.244750999999994 28.475055,-96.270391000000004 28.461929999999999,-96.303212000000002 28.441870999999999,-96.321560000000005 28.425148,-96.328817 28.423658999999997,-96.341616999999999 28.417333999999997,-96.371116999999998 28.397660999999999,-96.372100999999986 28.393874999999998,-96.370716999999985 28.387667,-96.378616389014681 28.383909329746462,-96.379349732835649 28.386024690464755,-96.381702691108558 28.392811896356477,-96.381863685354148 28.393276290946375,-96.375880899310658 28.401794149460329,-96.37413840285555 28.404274990018202,-96.340801887331921 28.432913073072363,-96.338559687910475 28.434839257985413,-96.335119195902806 28.437794848703732,-96.312964581561445 28.451131053409146,-96.280819757359396 28.470480970729877,-96.274497619264608 28.474286648703266,-96.268341347214189 28.477992481854848,-96.252027698910211 28.484249764669329,-96.250247000000002 28.484932771712327,-96.223824788704931 28.495067307260509,-96.218978121459415 28.500382701101032,-96.21505000939203 28.509679222336811,-96.145447855080619 28.544740658174199,-96.10473518795402 28.559498996555909,-96.046210731424992 28.586980036018211,-96.032979113622659 28.589015683181284,-96.007533711461477 28.59970275682273,-95.986159544454679 28.60631857558586,-95.982088289576367 28.614461085342473,-95.98565064745685 28.621076904105603,-95.983106103295938 28.641942154390655,-95.97852589224803 28.650593590730978,-95.986065974637228 28.655467849280154,-95.996337701374344 28.658736120211515,-96.002953500413568 28.656191585912577,-96.006515878017979 28.648049056432036,-96.010005951759737 28.648641710656278,-96.010506546843942 28.648726717396318,-96.011440067305529 28.648885239790378,-96.014343010193883 28.649378192516537,-96.026200716522851 28.65139176594381,-96.03348799089656 28.652629228032097,-96.039323368019012 28.651170385770797,-96.047737442142406 28.649066870151618,-96.049244844336243 28.648218956037223,-96.052682972641108 28.646285007998213,-96.05836686193534 28.643087818836001,-96.072165030584017 28.635326345489485,-96.092812363862251 28.627145317384699,-96.098878916233431 28.624741586366319,-96.099137163186526 28.624639261986079,-96.099760206508392 28.62447226081035,-96.102639895829256 28.623700385909448,-96.141413249033207 28.613307536255487,-96.148501276515404 28.611407654045699,-96.187178316202875 28.593595864643298,-96.198374286842139 28.586980055742131,-96.221784081288092 28.580364246840958,-96.228908787187095 28.580873158631725,-96.233997875508891 28.596649310733014,-96.233997875508891 28.601738394123839,-96.222292978285921 28.607336389305434,-96.214150448805384 28.613443281484855,-96.212623728226021 28.62260364440889,-96.2309444244882 28.64143324753087,-96.208552463485731 28.662298487953962,-96.214659365527126 28.665351929112688,-96.192267404524671 28.68774389011514,-96.1912495908051 28.694359708878277,-96.195829762405154 28.698939880478335,-96.202445561444364 28.700975507917487,-96.208747675276499 28.700187749031503,-96.21684000834783 28.699176214258408,-96.221467818495611 28.69859774191346,-96.222801895007663 28.698430983480506,-96.223384071149837 28.698294,-96.224163927167865 28.698110503315906,-96.227000018566372 28.697443183508955,-96.229623268039219 28.696825944469072,-96.231453341209956 28.69639533631743,-96.233964222112746 28.695240331316239,-96.23422531976 28.695120226420762,-96.234426397558138 28.695027730650764,-96.243315632596989 28.690938683290845,-96.256898753233088 28.684690448956413,-96.263514562134276 28.683672635236839,-96.268603640594122 28.688761723558645,-96.287942160437836 28.68316371851509,-96.304227224329892 28.671458831154069,-96.305245042980445 28.660262850652849,-96.303866760710434 28.646480081370939,-96.303718312539132 28.644995605411349,-96.322902111893882 28.641863561491792,-96.322903115546453 28.641863397630402,-96.328654788116609 28.640924350533034,-96.373438710121519 28.626674919011112,-96.376492171004159 28.620059100247982,-96.384634680760783 28.615987845369677,-96.473693647496702 28.573239550803915,-96.48794308888057 28.569677192923439,-96.482854000558774 28.580364266564878,-96.480309456397848 28.596649335387912,-96.485907441717487 28.60784531588914,-96.490487633041468 28.610898766909834,-96.510843966604781 28.614970031650095,-96.510335069606953 28.617514575811001,-96.497612348802434 28.625148188569788,-96.496594535082863 28.630746183751381,-96.49964797624159 28.635835272073191,-96.506263795004728 28.638379806372129,-96.513590449607946 28.639711925390898,-96.518002756430107 28.640514162994929,-96.524548246905439 28.641704252172264,-96.541744210187403 28.644830790950802,-96.545449731689985 28.645504522133091,-96.555118991611849 28.64601343885484,-96.5632615210924 28.64448670841351,-96.564664053901609 28.647882315216158,-96.572092291837293 28.665866475800886,-96.572930781014264 28.667896502859467,-96.570386236853366 28.674003385176928,-96.559190266214102 28.687235002979271,-96.559699163211917 28.6913062775815,-96.561225893653244 28.696395346179383,-96.566823878972883 28.697922096344637,-96.575158129308363 28.702846874961025,-96.578019859474111 28.704537895383844,-96.57828826199534 28.705826226653553,-96.579938546079447 28.713747585140421,-96.580564403635009 28.716751699466613,-96.584126761515478 28.722858581784067,-96.584439828543964 28.722940967911413,-96.591359183115401 28.724761852179114,-96.593796021437342 28.725403125944972,-96.611342043876562 28.720366765465901,-96.616906294097589 28.718769618875786,-96.625254999999996 28.716373230030175,-96.632357663078409 28.714334501780041,-96.638120426114043 28.71268037463507,-96.643733366943522 28.711069252030907,-96.64589364157122 28.710449172933409,-96.648758110223909 28.709626963981723,-96.65548660082564 28.704200766225345,-96.664534272187169 28.696904262901135,-96.657918463285995 28.687743919701024,-96.642136214348383 28.67476740345478,-96.635017595423747 28.668914316579048,-96.634564255386636 28.662567599984854,-96.634358790297441 28.659691108644115,-96.634304719917793 28.658934128568227,-96.633999771842213 28.654664885057134,-96.627892869800831 28.650084693733149,-96.626425176648581 28.649921620227584,-96.623312698200763 28.64957579673532,-96.621378075676532 28.648286046719594,-96.615940371111847 28.64466090565978,-96.615679075580019 28.64448670841351,-96.614055987266909 28.642701311583636,-96.613585709918453 28.642184006591457,-96.613038272810982 28.641581825879328,-96.612716570908134 28.641227953848528,-96.611999586497333 28.640439271135588,-96.610589997120172 28.638888723093881,-96.610589997120172 28.638695619081329,-96.610589997120172 28.63634418879494,-96.61975034032028 28.62769274259265,-96.620390401117646 28.626519297452973,-96.620672695530928 28.626001757543317,-96.621575870071126 28.624345937066781,-96.622336527533278 28.62295139797671,-96.622803791340985 28.622094747411062,-96.621924089240224 28.619379144726071,-96.621515564809087 28.618118047314677,-96.621338841511317 28.617572510068054,-96.620571817957583 28.61520474122884,-96.620437729127232 28.614790814755992,-96.617253050911174 28.604959849584038,-96.615239196090883 28.598743166058551,-96.614649885719274 28.596923990196654,-96.613008078443599 28.591855801497097,-96.611528402529856 28.587288105363601,-96.611113505533794 28.586007336117376,-96.611098903979951 28.585962261746474,-96.608298572876635 28.583628658523324,-96.608045443097311 28.583417717585569,-96.607377235577218 28.583437664220053,-96.600365219155734 28.58364697962633,-96.593251058093557 28.583859344147964,-96.573948594733835 28.584435541167107,-96.565297148531556 28.582399903865994,-96.564279334811971 28.57629300182461,-96.563658896232639 28.575155527088082,-96.562968608029692 28.573889994257026,-96.561225893653244 28.570695006643017,-96.557566061723506 28.569051817003789,-96.543745727976315 28.562846769979732,-96.536289388489891 28.559499026141786,-96.535271536438941 28.559346348925885,-96.526111211846271 28.557972305562419,-96.524846286909124 28.55686549700842,-96.523547686998668 28.555729222873186,-96.522039937244045 28.554409942750958,-96.516783301381025 28.541093122164042,-96.514406314623301 28.535071417976255,-96.512075206364955 28.532603188828926,-96.505754868421008 28.525911074776143,-96.496773944100411 28.520225902118948,-96.493684489370622 28.518270192113103,-96.482894459981281 28.511439806078794,-96.464303363514816 28.49967112954555,-96.450283853050735 28.49079639296917,-96.41974938229167 28.46738661824714,-96.410828816467941 28.459457253614527,-96.410588999643707 28.459244083835621,-96.409758652296418 28.458206146634446,-96.408886828651134 28.457116363910039,-96.40506625078595 28.452340627696451,-96.402446489887097 28.449065917053971,-96.402758256176753 28.447714917044181,-96.403973200604497 28.442450108152798,-96.407195206365273 28.441281062045864,-96.417343901660857 28.437598792799108,-96.461479843413926 28.421584870195201,-96.476120924474287 28.411702150055138,-96.481836236149007 28.407844318412668,-96.504737094149291 28.397666161492985,-96.511137484289378 28.396220910815867,-96.520513236388609 28.394103803612502,-96.534249520963641 28.388796609353736,-96.542905217114992 28.385452367272176,-96.559699173073881 28.377818734789468,-96.57038624671533 28.368658381727396,-96.577905378446388 28.364719789411506,-96.5917603939982 28.357462401226169,-96.600411840200493 28.354408960067438,-96.650793747525029 28.34677533744669,-96.672676831253582 28.335579347083499,-96.688452973492915 28.347284234444516,-96.694559875534281 28.347284234444516,-96.698122233414779 28.342704062844462,-96.705246949175717 28.348810964885843,-96.700157860853906 28.369676195446971,-96.705755865897487 28.400210705653887,-96.710336037497541 28.406826524417021,-96.710425531143088 28.406841439843959,-96.711757514930511 28.407063434453107,-96.711949596522956 28.407095447664108,-96.71209813364915 28.407120203551969,-96.7125191933293 28.40719037931537,-96.712878460543081 28.407250256459115,-96.722549831718325 28.408862132132249,-96.749013067323034 28.408862132132249,-96.762244685125353 28.411915593014903,-96.76554491144303 28.411090543097366,-96.768351577304784 28.410388882297497,-96.775985199925543 28.405808690973519,-96.777118787058129 28.404067826336821,-96.778115367638478 28.402537364460464,-96.780337941159374 28.399124129135416,-96.780820705165937 28.398382742114745,-96.790234641309425 28.383925636830853,-96.794392274787313 28.366371177405831,-96.794814812909479 28.364587126849088,-96.794810066932399 28.364444747076842,-96.79477772408616 28.363474458555832,-96.794305906049686 28.349319871745632,-96.794064195689629 28.347593374049037,-96.792754716842737 28.338239980125699,-96.790743538307225 28.323874459722486,-96.791161640090152 28.319066463411133,-96.791737095961722 28.312448960638157,-96.791761391474679 28.312169572361466,-96.791798306096766 28.312130020933203,-96.806010803272656 28.29690232711997,-96.809573161153153 28.290286508356836,-96.806010803272656 28.282143978876302,-96.799480493673911 28.2729662335258,-96.799349781293685 28.272782529381054,-96.787181219874626 28.255680743271615,-96.787181219874626 28.250082757951983,-96.800412817953031 28.224128419345121,-96.810027933605966 28.21709297064087,-96.81015126416365 28.217002728792142,-96.823379937963566 28.207323213817581,-96.836184503007971 28.197954022244446,-96.84100213695676 28.194428925121734,-96.842143298799229 28.193593928862132,-96.847274602334139 28.190686192954498,-96.857267971405633 28.185023289193378,-96.872677809006134 28.176291056181483,-96.877474270970822 28.171878306563691,-96.886067200578026 28.1639728030657,-96.898123211167331 28.152881261735526,-96.906497631141988 28.149042991548708,-96.910337015250093 28.147283276415891,-96.926704620510804 28.131597659113019,-96.934764623415617 28.123873491831901,-96.962356663895278 28.123371819605953,-96.962754569737697 28.123364584972112,-96.979717515560068 28.129783000626698,-96.995398793779131 28.135716460690723,-97.000413785843605 28.137614026355994,-97.007520616950742 28.136091128354632,-97.007538501604586 28.136087295914667,-97.009222611239821 28.135094102666635,-97.00939982996681 28.134989589017771,-97.027385928308092 28.12438239869169,-97.028912648887456 28.117257682930727,-97.025203084589847 28.111384210119862,-97.023365428929196 28.108474590635566,-97.022805746846075 28.107588427939849,-97.02290356380766 28.107197159145706,-97.023379876854563 28.105291902342927,-97.02382356056566 28.10351716319958,-97.025496807419856 28.101530180660298,-97.031966099908146 28.09384788848477,-97.033883146887263 28.088918342142531,-97.035528457788629 28.084687545284659,-97.035528457788629 28.083043098067591,-97.035528457788629 28.081818766572983,-97.035528457788629 28.074000471643224,-97.033022532693735 28.061470870449408,-97.032801767679686 28.060367047518316,-97.031459273912688 28.053654591691117,-97.031457183186404 28.053644138079921,-97.025859197866765 28.041939250718904,-97.030948266464648 28.033287814378582,-97.03239348781301 28.032603236465789,-97.040617526386512 28.028707642778524,-97.041168915404441 28.028259640036232,-97.046718327422383 28.023750751173218,-97.048760075590963 28.022091833877354,-97.050263648357429 28.019142519014494,-97.059727497080047 28.000578821719444,-97.061991693393324 27.99613751499442,-97.06790259446116 27.99219690579767,-97.073772658186698 27.988283521554418,-97.075732208193486 27.986977152070377,-97.083740513918784 27.975854507337193,-97.090858162154831 27.965968886660271,-97.094600599978094 27.960771057335059,-97.101378519421061 27.951357282114685,-97.101544336287489 27.951126980954953,-97.101629253046639 27.951009041034034,-97.112670327945679 27.935674217691009,-97.118292397880069 27.927865788706086,-97.121533983365822 27.923363587495643,-97.122089895488358 27.923104160785101,-97.123659587861624 27.92237163470331,-97.129167576400675 27.91980122961516,-97.134800331352182 27.902469771509406,-97.13578341488774 27.899444915775788,-97.139044920333077 27.897526377912126,-97.141761509630356 27.895928379836029,-97.144434841366106 27.894355827453982,-97.155121915007527 27.880615312653809,-97.156735458496229 27.877916799393841,-97.171211094589736 27.85370753808861,-97.17159000749372 27.853073838716419,-97.18273536107327 27.834434189625789,-97.184638591770963 27.831251199324921,-97.187183135931861 27.824126483563962,-97.18941247112663 27.823657146727278,-97.196852395853725 27.822090836400886,-97.201135366472329 27.822090836400886,-97.208766105658313 27.822090836400886,-97.209575096934316 27.822090836400886,-97.21103842611052 27.822356897891609,-97.21191517248603 27.822516307306422,-97.214117494684729 27.822916731993345,-97.215541825234411 27.823175702780983,-97.217387510601711 27.823511284007832,-97.220771087297493 27.824126483563962,-97.222189700736266 27.82464074101355,-97.223091414240102 27.824967618564596,-97.225175600069406 27.825723150734085,-97.225442194074731 27.826156365185522,-97.225555528799433 27.826340533769983,-97.225696025109201 27.826568839847944,-97.22598639723725 27.82704069367685,-97.227317456819009 27.829203661466853,-97.227317456819009 27.832884543697009,-97.227317456819009 27.832951908184537,-97.22711696094737 27.834288541284948,-97.22651425924083 27.838306534493725,-97.227537582741903 27.841230302974814,-97.228388390382094 27.843661171179477,-97.233100025453197 27.847817700825228,-97.234045759551762 27.848652012430087,-97.234511621821596 27.849062988727319,-97.238500481248579 27.854279199579018,-97.239439164419366 27.855506710708827,-97.241127420860792 27.857714434929608,-97.24139627838295 27.858969111470945,-97.242350826195675 27.863423696705052,-97.242654131578206 27.86483913096664,-97.243132066142749 27.865496290124597,-97.244364366034702 27.867190700237273,-97.250796680782656 27.876035121329831,-97.263010484865433 27.88010639593206,-97.267085449659064 27.88068852838779,-97.272090543185925 27.881403535150675,-97.273697558506882 27.881633106649463,-97.276628649874411 27.881144591421538,-97.283916343274228 27.879929975854907,-97.291452123510041 27.878674012482271,-97.291709327200167 27.878631145200583,-97.295071705789752 27.87807074876898,-97.29826066531912 27.876989746639367,-97.302276298241679 27.875628516526195,-97.30641171632756 27.874226681314273,-97.315889353880934 27.871013926092836,-97.325097299274915 27.867892591849294,-97.326845878314657 27.866807265961079,-97.334190606350404 27.862248465187459,-97.346213303335873 27.854786094892546,-97.354613966176373 27.849571885725148,-97.359768343966266 27.850509060182219,-97.360211961357962 27.850589719168646,-97.360654441244435 27.850290746360063,-97.363614400263117 27.848290774636723,-97.376904444631478 27.839311017562139,-97.379041564479934 27.837867018088055,-97.379057154646048 27.837837708581311,-97.379081675001302 27.837791610322164,-97.37968928125764 27.836649310776913,-97.391764280353456 27.813948316782309,-97.391812130016405 27.812975373996721,-97.391812459346511 27.812968677620422,-97.39203202611381 27.808504155006624,-97.392068018906713 27.807772301822137,-97.392095751995882 27.807208395884746,-97.393123788240075 27.786304999999999,-97.393168763213623 27.785390509210199,-97.393291005863816 27.782904909577571,-97.393142269808052 27.782564941361908,-97.39298939956177 27.782215523565412,-97.390949955785928 27.777553936582201,-97.390465068726371 27.776445623015572,-97.390185233729682 27.775805999999999,-97.389524844304646 27.774296538065283,-97.38835420640342 27.771620793596586,-97.388306220610531 27.771511111755789,-97.388011229692253 27.770836846624743,-97.38704242749894 27.768622441036733,-97.386166290102864 27.766619840754537,-97.385225495384532 27.765302728148875,-97.378862356737287 27.756394334042721,-97.375764970087644 27.752057992733249,-97.373069654276961 27.748284550598278,-97.368354500700462 27.741683335591173,-97.365855345900911 27.739779218033028,-97.354970329043653 27.731485873530172,-97.352272255056832 27.729430198526604,-97.34997871774064 27.727682741876539,-97.347507961666906 27.725800261438444,-97.346980343555629 27.725398266768138,-97.343485766084669 27.723942192633796,-97.323096068004702 27.715446484002907,-97.316445853072636 27.712675560756566,-97.312489136070184 27.711663774861414,-97.307771479065892 27.710457406346261,-97.30518751069485 27.709796650788128,-97.285725857752936 27.704820043684109,-97.259850586867117 27.698203387982087,-97.253955150197811 27.696695845323848,-97.254014647303208 27.696526337654994,-97.255455364792269 27.692421723465429,-97.259957004258851 27.67959652118169,-97.261636792970123 27.679316557300702,-97.26241778482418 27.679186392412099,-97.266063906300232 27.678578707462119,-97.266172011465457 27.678349884642419,-97.272736281666539 27.664455499360063,-97.273042341106247 27.663807672923248,-97.273584380560237 27.662660354976065,-97.276535709391737 27.656413369610792,-97.277059923980644 27.655303780997631,-97.278846463786479 27.651522268106756,-97.280071982275985 27.648928251476995,-97.280889132874719 27.647198614380269,-97.282300269490932 27.644211705671331,-97.282869528026779 27.64300677394548,-97.287959956150573 27.632232024058997,-97.288756326795195 27.630546371240786,-97.290370933329072 27.627128784125372,-97.290610159422798 27.626622421740255,-97.291264204229464 27.625238025568656,-97.291996439564016 27.623688125953898,-97.292910903535031 27.621752508687905,-97.293983233844585 27.619482740684056,-97.29528946695001 27.616717877953022,-97.296598377059297 27.613947348891728,-97.297587499071795 27.609496333379006,-97.298634024222366 27.60478700569162,-97.29761621050281 27.598680093788271,-97.294053852622326 27.594099922188217,-97.294182769084571 27.593971005725969,-97.300049926927869 27.588103847882682,-97.302196382102863 27.585957392707677,-97.311120578488044 27.579146819865922,-97.321534901946578 27.571199044464009,-97.325080504595888 27.561034984604785,-97.336802147188081 27.527432946040641,-97.343417965951204 27.517763686118776,-97.347489240553443 27.503005347737066,-97.350542661988243 27.478577729709574,-97.359194108190536 27.458221396146271,-97.365809926953673 27.450587783387487,-97.371916828995055 27.425142361502377,-97.369881181831957 27.412419660421783,-97.372934622990698 27.401223670058592,-97.379550422029908 27.390027689557368,-97.399397858595393 27.344734850830708,-97.401942402756291 27.335574497768633,-97.404995863638931 27.329976512448997,-97.413138393119482 27.321325066246711,-97.42026310888042 27.317253791644482,-97.430441285524054 27.313691423902039,-97.450797599363412 27.313691423902039,-97.482858840011673 27.297915271800758,-97.508304242172855 27.275014394076553,-97.532222933616623 27.278576761818989,-97.544436737699399 27.284174747138625,-97.546981281860297 27.290790556039799,-97.536803105216677 27.289263825598471,-97.526624948296998 27.291808369759369,-97.524589320857856 27.297915271800758,-97.51746460509689 27.305039987561717,-97.504741884292372 27.305039987561717,-97.498126085253162 27.308602345442196,-97.502706237129289 27.322342870104325,-97.499143898972747 27.327940855423961,-97.483876634007316 27.33862793892736,-97.483876634007316 27.351350640007954,-97.486930094889971 27.358984272490666,-97.501688443133645 27.366617904973374,-97.514411144214236 27.361528796927644,-97.520518046255617 27.352877370449281,-97.538329835658018 27.335574478044709,-97.570899973304094 27.315727061203152,-97.584131581244463 27.309620159161771,-97.609068086407831 27.285192570720163,-97.621790807212349 27.287228188297352,-97.63146005727225 27.286210384439741,-97.63654914066305 27.282139109837512,-97.636657939024673 27.281797172172649,-97.640111498543547 27.270943129336285,-97.639093679892994 27.253131339933887,-97.635022415152719 27.247024437892502,-97.628915513111338 27.242953173152234,-97.597363199046811 27.242444266292445,-97.5826048606651 27.240408628991332,-97.573953414462821 27.238881903480983,-97.56123071338223 27.232775006370584,-97.542910007258072 27.229212648490105,-97.520009129533875 27.231248285791217,-97.509830972614182 27.235319550531486,-97.503215153851045 27.23989972213154,-97.500161712692318 27.244479898662579,-97.485148876501881 27.25084127385778,-97.467082638600573 27.253640266517596,-97.45843119239828 27.259492710198106,-97.450288657986775 27.262546171080761,-97.424079880742951 27.264072891660124,-97.422298701802717 27.257711541119829,-97.434766954384401 27.202240525749552,-97.444945121166043 27.144733882940127,-97.443672849085587 27.116235010034327,-97.452324285425917 27.115217201245734,-97.455886653168363 27.110382571284802,-97.456650008527049 27.09969549764336,-97.46173908698691 27.095624227972113,-97.475479621510999 27.098423220631929,-97.480568699970846 27.102494490303176,-97.491510231973166 27.101222218222723,-97.495835955074313 27.09409750739275,-97.4932914109134 27.078066891999608,-97.477515248950155 27.066107546277717,-97.479041969529504 27.06279964182713,-97.482256963728076 27.061942305056665,-97.48693005051112 27.057710553505324,-97.487693415731783 27.053639288765055,-97.486675602012198 27.034809685643079,-97.477515248950141 27.032519589981089,-97.473952881207694 27.029211690461484,-97.473443984209865 27.022850330059228,-97.478300083716704 27.000269498406993,-97.478533072531675 26.999186101907302,-97.480568690108868 26.997659376396957,-97.483967678435022 27.000330000000002,-97.484131057851314 27.000458369056773,-97.492988547644813 27.000330000000002,-97.49889841702128 27.000244349959733,-97.533497176854453 26.999742920066073,-97.536803065768822 26.999695008767091,-97.549271318350492 26.995878197456715,-97.555378215460905 26.990280207206101,-97.551052502221722 26.980865400714134,-97.549525776711377 26.965343697111763,-97.552324769371197 26.95211208177491,-97.555378205598956 26.947277449348487,-97.555378205598956 26.938880461507075,-97.540874325578116 26.906310323861007,-97.540110950495503 26.900966796902246,-97.547999041339082 26.895114353221743,-97.552324764440229 26.888498544320569,-97.552324764440229 26.875332999999998,-97.552324764440229 26.873831771434514,-97.552324764440229 26.871753101924,-97.552324764440229 26.867633303897481,-97.555396527456509 26.865969429990074,-97.558431656619632 26.864325399446898,-97.558453748966258 26.864224239771101,-97.559853702000524 26.857813929560987,-97.562641307980527 26.845049630589628,-97.563266286580571 26.842187886943357,-97.552579212939136 26.827938454188693,-97.547744582978211 26.824630549738107,-97.537566416196555 26.824885004400745,-97.509830908511418 26.8035108521869,-97.48438549155729 26.763561555211936,-97.478024141017002 26.757200199740662,-97.471662790476714 26.758726925251008,-97.468609339456009 26.740915130917632,-97.467337057513589 26.710126182073765,-97.444945096511148 26.633535472850511,-97.445708451869848 26.609362327976836,-97.441206258760758 26.5999011976768,-97.435205432977895 26.587290766879221,-97.432741093635642 26.582112082834445,-97.429217375703914 26.574707168454967,-97.428151110966368 26.572466467229631,-97.418145193925739 26.555638334425574,-97.416955130465126 26.553636864107652,-97.41864075483771 26.543121778291471,-97.42039414733226 26.532183948458435,-97.422284917775215 26.520389141863415,-97.422298667285844 26.520303371102887,-97.425861015304378 26.516741008291426,-97.430695645265303 26.506562841509776,-97.430695645265303 26.494603495787885,-97.42802638225659 26.488322868889494,-97.42636993202612 26.484425333937217,-97.429168909893022 26.478063961207511,-97.43553026043331 26.470175880225888,-97.441382709044788 26.466613522345408,-97.441382709044788 26.455417541844177,-97.43756589773443 26.449819546662585,-97.425861005442428 26.446002740283195,-97.421026375481503 26.446766095641895,-97.417209564171131 26.449819546662585,-97.411611568989528 26.447275002501684,-97.412883841069984 26.433025580841726,-97.421789740702152 26.417249413947498,-97.419499649971158 26.413178149207234,-97.406013578738921 26.409106884466965,-97.398125502688274 26.410888063407203,-97.394308686446919 26.414450416356704,-97.395072051667569 26.417249413947498,-97.382484933201752 26.411326066613285,-97.377769169124974 26.409106884466965,-97.369626639644437 26.394602999515151,-97.374461259743413 26.38086247238753,-97.388965149626202 26.365849678110436,-97.392018610508856 26.339386444971247,-97.391000786927322 26.332261729210284,-97.38794734576858 26.330480545339064,-97.376242448545611 26.336332993950553,-97.372171183805335 26.339895346900054,-97.36937219114553 26.348546788171358,-97.358176200782339 26.356434874083959,-97.343417852538664 26.35923386920927,-97.342332537534404 26.358759043566288,-97.335275323058127 26.355671510096041,-97.335020017473738 26.355402767481841,-97.331108052904881 26.351284911668415,-97.330440693097202 26.350582427937965,-97.333762617526986 26.340749518544904,-97.336802038706509 26.331752819885011,-97.343786761143846 26.325987658774913,-97.344677525679145 26.325252425399061,-97.352414066956698 26.31886671611711,-97.352832659030639 26.318521211944631,-97.354359379610003 26.313941040344577,-97.348998828460125 26.312092573442666,-97.347821984790102 26.311686765063648,-97.346980205488165 26.311396496183672,-97.34736083223585 26.297503848546928,-97.347437236753805 26.2947151295396,-97.347489122209922 26.292821341560611,-97.347051378510429 26.289694600417153,-97.344137846000223 26.268883651035111,-97.343926764329439 26.267375924606483,-97.342629246748771 26.266550231912309,-97.341127771669619 26.265594748131736,-97.335282658907644 26.265594748131736,-97.331967408745584 26.265594748131736,-97.330307576264516 26.266747410222209,-97.323817586106017 26.271254350355399,-97.322807065545476 26.271956101137519,-97.313207351206557 26.273518846137112,-97.312102101648151 26.273698770576502,-97.311865543405119 26.273737280077761,-97.307030913444194 26.253126493084562,-97.308048727163751 26.249055213551365,-97.321280340035131 26.236078054109896,-97.321280340035131 26.228698889850026,-97.304486359421333 26.202490107675235,-97.296598288301666 26.200708923804015,-97.294817109361432 26.192311940893585,-97.296089381441874 26.182388227541828,-97.303096384204423 26.167373221160254,-97.305986772892751 26.161179530923267,-97.306776455083323 26.159487354748606,-97.300965235160419 26.149753561518516,-97.296881711355638 26.142913659244432,-97.296598288301666 26.14243892563589,-97.285549237329036 26.12861437636975,-97.28536038956149 26.128378090441405,-97.284582435540926 26.126454238998875,-97.282094393487881 26.120301403270393,-97.282839179410786 26.118439442973433,-97.28311220967295 26.117756868971455,-97.285501587752023 26.116923364107649,-97.294053737977038 26.113940052730097,-97.295071554162092 26.108342057548505,-97.292023254217796 26.105090538920617,-97.291924538345086 26.104985242032239,-97.291541272704407 26.104576425513905,-97.287190793518263 26.099935916255493,-97.286650074642992 26.099359149688052,-97.286603231473521 26.09930918366079,-97.283195451762182 26.095674220102872,-97.282639002190891 26.095080674133143,-97.282108002623801 26.094514274823585,-97.280435495761154 26.092730268223651,-97.279905974795895 26.09216544608875,-97.27980430522237 26.092056998587434,-97.27089841052117 26.086459003405839,-97.267086875013263 26.085485845069449,-97.24859983335169 26.080765747704277,-97.246979719077387 26.080352101364454,-97.229515030031649 26.08000965739204,-97.220290685310772 26.079828788368793,-97.208048240752987 26.079588741074772,-97.205005053278043 26.078666562185607,-97.199651252911579 26.077044196913871,-97.199152512570265 26.073220535461079,-97.199134106850465 26.073079425477676,-97.198725011196004 26.069943037351702,-97.198302051934135 26.066700361972018,-97.196018989165054 26.049196947106083,-97.195939794821285 26.0485897927724,-97.195071061587612 26.04192952989985,-97.204994779870347 26.030224637607851,-97.214918488291119 26.030733549398622,-97.224842206573854 26.027425644948035,-97.226114478654296 26.024372193927345,-97.219244211392265 25.99612778184791,-97.216954125592238 25.993837693582392,-97.208557137750816 25.991802058746771,-97.195834416946283 25.993074335758202,-97.174460269663413 26.000071824804216,-97.167208324722026 26.007069313850227,-97.162755377371425 26.014575709756024,-97.16262814819099 26.023481604457221,-97.172042954682937 26.044728528107019,-97.178658763584124 26.045491893327686,-97.182730028324386 26.053125515948434,-97.164981847348457 26.063876207878327,-97.152009000000007 26.062107999999998,-97.152012551274964 26.062039393270581,-97.15321 26.038906,-97.151921999999999 26.017652999999999,-97.14747181118706 25.985075937251509,-97.145567 25.971132,-97.146880999999993 25.969781,-97.146293999999997 25.955606,-97.147784999999985 25.953132,-97.156608000000006 25.949021999999999,-97.160293999999993 25.950243,-97.168198638692317 25.959262149012673,-97.178362000000007 25.962114,-97.187583000000004 25.958174,-97.206945000000005 25.960899,-97.214339285966162 25.960186817526893,-97.227626420907342 25.958907063854085,-97.229225999999997 25.958753000000002,-97.239867000000004 25.954974,-97.244841570811701 25.950784663302475,-97.248032999999992 25.948097,-97.255343503388133 25.949129556975723,-97.276707000000002 25.952147,-97.28138899999999 25.948036999999996,-97.277163000000002 25.935438,-97.284201820237172 25.935775045516863,-97.290083634347766 25.936056689174489,-97.293963761326751 25.936242484429805,-97.303601999999998 25.936703999999999,-97.316138101068788 25.931602038234757,-97.320560999999984 25.929801999999999,-97.324914000000007 25.924040999999999,-97.332235861490744 25.923541683060932,-97.33463605770983 25.923378000829199,-97.338346 25.923124999999999,-97.339310160867683 25.923294280152341,-97.350397999999998 25.925241,-97.367642000000004 25.915679999999998,-97.369283543255307 25.913688286645449,-97.373641276386991 25.908400972256459,-97.374430000000004 25.907443999999998,-97.372365000000002 25.905015999999996,-97.365976000000003 25.902446999999999,-97.365883578347024 25.900015396466173,-97.365521 25.890476,-97.364300486696564 25.885628504434479,-97.362421560218849 25.878165998501085,-97.360082000000006 25.868874000000002,-97.364783621478566 25.852096838905283,-97.36542 25.849826,-97.372864000000007 25.840116999999996,-97.394513000000003 25.837377,-97.422635999999997 25.840377999999998,-97.42853949246836 25.842912007889609,-97.434188204901034 25.845336654308195,-97.441181027463472 25.848338244915578,-97.445113000000006 25.850026,-97.445601387363794 25.851485440010176,-97.447179184935308 25.856200346812667,-97.448271000000005 25.859463000000002,-97.449172000000004 25.871677999999996,-97.452166849899044 25.875807172885114,-97.453724626189043 25.87795496921364,-97.454727000000005 25.879337,-97.45488774919265 25.879394304385261,-97.462586893331732 25.882138919861518,-97.468261999999982 25.884162,-97.468599721544905 25.884059457735212,-97.481532785459223 25.880132596436578,-97.486059999999995 25.878758,-97.490359999998347 25.879275544671589,-97.494739403174762 25.879802646248233,-97.496860999999996 25.880057999999998,-97.519591990380178 25.88590026892226,-97.521761999999995 25.886458,-97.52344767329889 25.891064017588189,-97.524375103029939 25.893598172727145,-97.528116959024402 25.903822606212749,-97.528119935206945 25.903830738482007,-97.52812430798204 25.903842686870224,-97.528627999999998 25.905218999999999,-97.528849446448064 25.906732522417784,-97.530321999999998 25.916796999999999,-97.530415259581318 25.916820899843632,-97.539878370214808 25.919246032588486,-97.542957 25.920034999999999,-97.545169999999999 25.923974999999999,-97.545468770003851 25.926387609575503,-97.545470694802859 25.92640315259677,-97.546397824784293 25.933889856891241,-97.546420999999995 25.934076999999998,-97.546611329705271 25.934141994258589,-97.555160182125618 25.937061277530951,-97.555378999999988 25.937135999999999,-97.555477252221124 25.937015705749829,-97.559364000000002 25.932257,-97.582565000000002 25.937856999999997,-97.580418999999992 25.945115999999995,-97.583044 25.955442999999999,-97.598043000000004 25.957556,-97.5981230356591 25.957681442330628,-97.607733999999994 25.972745,-97.60783562843973 25.973457509771446,-97.607844088251909 25.973516820913719,-97.608283 25.976593999999999,-97.609461531117333 25.977846566488182,-97.613191727531174 25.981811093986448,-97.613466053312663 25.982102652924251,-97.616041456343709 25.984839842874308,-97.624938181905222 25.994295461083137,-97.627225999999993 25.996727,-97.634804000000003 25.999508999999996,-97.635072411453706 25.99971613545971,-97.639164724998494 26.00287420951236,-97.642117661027001 26.005153015998879,-97.644011365977178 26.006614404624422,-97.643848619841975 26.01214811069886,-97.643707610985203 26.016942704231127,-97.649175518723894 26.021499311673544,-97.65096419129361 26.02118629315062,-97.659123404318109 26.019758427116106,-97.661326460130226 26.019372891335045,-97.66298585459532 26.019511685247039,-97.668297999999993 26.019955999999997,-97.669519566971061 26.021667429940447,-97.671350987084779 26.024233271429612,-97.671567999996611 26.024226704244594,-97.691453959129774 26.023624920821636,-97.697068999999999 26.023454999999998,-97.703247203861338 26.030308742132775,-97.706066818770353 26.031284762516545,-97.709294717923569 26.032402112038366,-97.711145328137576 26.033042707775564,-97.719920000000002 26.030837999999999,-97.723585926686539 26.030959832537771,-97.729354247932832 26.031151535557555,-97.735180242251758 26.031345155270547,-97.758837769919694 26.032131383932391,-97.76309059882324 26.033650253079866,-97.763351431657455 26.034258862745556,-97.76491324062286 26.037903081983409,-97.769788888528993 26.041344719068825,-97.770077387482857 26.041548365582649,-97.776788595669075 26.042443189872706,-97.779190602367677 26.042763456191249,-97.784050976575529 26.040637041739476,-97.789822674626535 26.0424596835391,-97.792252861730461 26.04428232533872,-97.793102878401371 26.047342389307317,-97.793537334820812 26.048906434437896,-97.794638769549053 26.052871604582215,-97.795290594138677 26.055218176136449,-97.801344 26.060016999999998,-97.803973303988229 26.059548218630308,-97.8082126910423 26.058792373859696,-97.819424117916668 26.056793476786609,-97.820997703829306 26.056512920501468,-97.825546000000003 26.055702,-97.826721102251625 26.055271667399982,-97.830409376527257 26.053920989485444,-97.836607999999984 26.051650999999996,-97.848759348822554 26.052295281844582,-97.85186756815483 26.052460084066457,-97.859824237628374 26.052881958029587,-97.860225497621784 26.05290323340671,-97.860503999999992 26.052917999999998,-97.861874999990562 26.053580848914272,-97.869705222636284 26.057366592615971,-97.871187000000006 26.058082999999996,-97.876982999999996 26.064482999999999,-97.886529999999993 26.066338999999999,-97.901546631929207 26.060958662441269,-97.905109129229899 26.05968224852101,-97.913882 26.056539,-97.935419999999993 26.052687999999996,-97.944344999999984 26.059620999999996,-97.950095000000005 26.061827999999998,-97.96210735288345 26.054793018383155,-97.96735799999999 26.051718,-97.971403108419892 26.054550391225565,-97.978769 26.059707999999997,-97.979877702655912 26.062937323324391,-97.981335 26.067181999999995,-98.010970999999998 26.063862999999998,-98.015122209308288 26.064471399070538,-98.026123959861238 26.06608380989196,-98.028288992822496 26.066401115993269,-98.028758999999994 26.066469999999999,-98.029241090705753 26.065867136858621,-98.033102 26.061039,-98.034402999999998 26.051375,-98.034479464439173 26.051215303797409,-98.034525269179767 26.051119640464091,-98.039238999999981 26.041274999999995,-98.054365285842039 26.044575736209502,-98.070020999999997 26.047992,-98.070022345126233 26.049160242153427,-98.070025 26.051466,-98.071425788568789 26.055027814897404,-98.076094939927231 26.066900165398668,-98.076139697069991 26.067013970337847,-98.076205751241318 26.067181927684643,-98.076543999999998 26.068041999999998,-98.076994427275579 26.068371469710563,-98.080289992888041 26.070782045417982,-98.080494999999999 26.070931999999999,-98.080906883185932 26.070920010911959,-98.084755 26.070808,-98.085506402845155 26.069709056167966,-98.085848999999982 26.069208,-98.085628527723046 26.069048386721494,-98.081567000000007 26.066108,-98.081855064865067 26.063941606819231,-98.081884000000002 26.063724,-98.082307152201508 26.063513440869801,-98.091037999999998 26.059169,-98.093593108176947 26.058759459973995,-98.094431999999998 26.058624999999996,-98.095078111969258 26.058956205325877,-98.096949561841043 26.059915534659098,-98.097643000000005 26.060270999999997,-98.105504999999994 26.067537000000002,-98.122952624574893 26.063250384797335,-98.12786358062813 26.062043837809401,-98.128331000000003 26.061928999999999,-98.142925292417388 26.051941751725515,-98.14645163947533 26.049528582072455,-98.146621999999994 26.049412,-98.146852932570667 26.049588146033326,-98.149462999999997 26.051579,-98.149462999999997 26.055813,-98.151730999999998 26.058187,-98.158277994458601 26.062311711597108,-98.16142849281799 26.064296576133319,-98.161911645017582 26.064600969774318,-98.167608590156348 26.068190136655492,-98.172071527808072 26.071001859012309,-98.177897000000002 26.074672,-98.179863281323136 26.072661506851002,-98.189059999999998 26.063257999999998,-98.191534000000004 26.057117999999999,-98.197046 26.056152999999998,-98.200871000000006 26.059161,-98.203328791159265 26.063523594334541,-98.204415309491765 26.065452171017675,-98.20496 26.066419,-98.205720285634712 26.066905180236589,-98.2057544964389 26.066927057036718,-98.220672999999991 26.076467,-98.228363119990576 26.077028417928002,-98.230097 26.077155,-98.231072909449267 26.07694353295701,-98.240214327563166 26.074962705064888,-98.248806000000002 26.073101,-98.250234708208026 26.074229377516481,-98.260964088277859 26.082703320039151,-98.264514000000005 26.085506999999996,-98.272091468517374 26.0934369782697,-98.272527821536428 26.09389363077193,-98.277218000000005 26.098801999999999,-98.277020629370639 26.099144109090908,-98.272932087266241 26.106230915405163,-98.272897999999998 26.10629,-98.272099931737145 26.106512924095771,-98.270258188934392 26.107027377392626,-98.270033999999995 26.107089999999999,-98.269661374787887 26.108231250649609,-98.268046405073434 26.113177467856264,-98.266755660647689 26.117130670341034,-98.265753950746401 26.120198637935399,-98.265698 26.12037,-98.266046753689267 26.120369439652073,-98.268388964369507 26.120365676386069,-98.271048543344023 26.120361403199535,-98.2713587738927 26.120360904747326,-98.279433560913844 26.12034793086255,-98.289509742149562 26.120331741306838,-98.296194999999997 26.120321,-98.299522999999979 26.11749,-98.299575546893735 26.117376878214852,-98.299577897643644 26.117371817572689,-98.299619756950364 26.117281703787395,-98.301477861619162 26.113281617347607,-98.302978999999993 26.110049999999998,-98.307788398559808 26.112633359128559,-98.31093219000293 26.114322040617914,-98.314784784069062 26.116391454064445,-98.31781148535309 26.118017240801439,-98.323055746360907 26.120834185452331,-98.323827999999992 26.121248999999995,-98.324165904650499 26.121735183484471,-98.335204000000004 26.137616999999999,-98.337914801547555 26.149187638321976,-98.338210450252006 26.150449569219312,-98.338419999999999 26.151344000000002,-98.338123748811455 26.151776768193923,-98.337139471603692 26.153214615149455,-98.336278203634194 26.154472768358826,-98.335109254490916 26.156180386856505,-98.334230366689056 26.157464279382136,-98.333315999999996 26.158799999999999,-98.333279392301918 26.159609030127591,-98.333194378655719 26.161487831708563,-98.333156000000002 26.162336,-98.33332593363771 26.162525092143447,-98.336569396995017 26.166134227137082,-98.336837000000003 26.166432,-98.337709251548077 26.166391430160555,-98.345513373134324 26.166028447761192,-98.345781000000002 26.166015999999999,-98.345955918391979 26.165759937155421,-98.34781294946896 26.163041431373035,-98.354645000000005 26.15304,-98.380009845764519 26.156864235849298,-98.386243919298991 26.157804141722139,-98.386694000000006 26.157872,-98.386714843024777 26.157901012682096,-98.387178289965661 26.158546112849205,-98.389418830831929 26.161664858836595,-98.394322667090904 26.168490808715738,-98.402249554153599 26.179524728065878,-98.404432999999997 26.182563999999999,-98.41082579547016 26.183537375155975,-98.418120000000002 26.184647999999999,-98.44253599999999 26.199151,-98.444302622216625 26.201317032456906,-98.444376000000005 26.201407,-98.444366742625562 26.201566115583965,-98.444174812576264 26.204865005795593,-98.443681770155465 26.213339409994948,-98.45054565332704 26.219516919037407,-98.450975699346984 26.219903961344286,-98.465077324681431 26.222335272645303,-98.467962758220992 26.221802674698019,-98.47639547470331 26.220246150374404,-98.481645999999998 26.219277000000002,-98.483269000000007 26.216439,-98.496684404575589 26.212853148677059,-98.500574513964963 26.213825676024403,-98.503492081872309 26.214798198660183,-98.504399410834864 26.216045775617395,-98.509275818143593 26.222750833698164,-98.509327236533252 26.222821533963195,-98.516621175147847 26.223550930651591,-98.520846190978133 26.222726536052498,-98.524733007990875 26.221968131567948,-98.526589565145571 26.221605875956907,-98.528323413163747 26.222421776495104,-98.535240999999999 26.225677,-98.538016739096946 26.231331135295655,-98.538505426714039 26.231595841236214,-98.543851889046309 26.23449184328507,-98.556093449912439 26.231976454911809,-98.561600478976516 26.23084487397777,-98.564343479612191 26.231667774301364,-98.575891642961039 26.235132223865481,-98.57618836327309 26.235221239973473,-98.581780384919284 26.243001439905978,-98.583095590242166 26.247416774401941,-98.585184223567666 26.254428618568909,-98.588002268837087 26.255070784392117,-98.599153999999999 26.257611999999998,-98.610401443364651 26.253223367217647,-98.613465000000005 26.252027999999999,-98.617434734670965 26.252082931217494,-98.618976176235122 26.252104260920568,-98.625299999997523 26.252191766854153,-98.626653663614832 26.252210498179227,-98.633391522135483 26.243617562727948,-98.63418 26.242612,-98.636673745354344 26.241784277127035,-98.654221000000007 26.235959999999999,-98.669397000000004 26.236319999999996,-98.675206000000003 26.239989,-98.678410535728389 26.244637915883345,-98.679041999999995 26.245553999999998,-98.678977427258005 26.246060764449961,-98.677766000000005 26.255568,-98.679196310064967 26.258571609080832,-98.681167000000002 26.262709999999998,-98.687156000000002 26.26512,-98.698855915315121 26.265619481498664,-98.707451416076225 26.272152066874316,-98.710601999999994 26.279018,-98.709170532219119 26.284185773270103,-98.710647239525585 26.288123668959596,-98.711233447604599 26.289686894290245,-98.722550749196131 26.295571625529284,-98.729196000000002 26.299026999999999,-98.73263614407044 26.29899082409209,-98.734613221934339 26.298970033513189,-98.745271658069271 26.303095890935232,-98.745297595683382 26.304159357241051,-98.745599830797417 26.316551278053844,-98.745615470637418 26.317192526042046,-98.748245116157776 26.32061106368975,-98.74905366960931 26.321662182706675,-98.754840366886953 26.324877004144408,-98.755242435754027 26.32510037501579,-98.766685638772316 26.325769085950686,-98.779858354339893 26.326538865087553,-98.779911999999996 26.326541999999996,-98.779946859358333 26.326559704051515,-98.789821999999987 26.331575,-98.796251999999996 26.349104,-98.797592059971961 26.356670995104565,-98.798210999999995 26.360166,-98.807348000000005 26.369420999999999,-98.808280016253249 26.369491024329768,-98.813413043374013 26.369876679389535,-98.81818280466733 26.370235041528161,-98.81932575812273 26.370320914010964,-98.824571000000006 26.370715,-98.828353477559162 26.367368473620303,-98.832909 26.363337999999999,-98.838554497099707 26.360957856802237,-98.842229804437778 26.359408346173527,-98.844057000000006 26.358637999999999,-98.847707 26.359594999999999,-98.853132332741467 26.364754198689674,-98.853414999999998 26.365023,-98.853852117327648 26.365076242531281,-98.854321671505204 26.365133435992636,-98.861354000000006 26.365989999999996,-98.861661690067152 26.365902494757481,-98.869113443480302 26.363783259984523,-98.874117355796216 26.362360176799562,-98.876164212939671 26.361778062685843,-98.882912762903771 26.359858814831277,-98.890964919192157 26.357568829017531,-98.895015448091129 26.359360408468842,-98.900432100164338 26.361756234493352,-98.900829697862818 26.361932094951143,-98.905559653818443 26.364024190108832,-98.91296803413384 26.372226331500926,-98.915344992389564 26.37485796579432,-98.921277034399395 26.381425588572444,-98.922831447878195 26.38166472803821,-98.923508557916591 26.381768898347495,-98.924925720775448 26.381986922427696,-98.926689551972586 26.38116380140492,-98.934437533628781 26.377548077521784,-98.937555770591459 26.376092900630621,-98.942046463189357 26.375531566775365,-98.950185820407469 26.380302920861933,-98.952073083609605 26.383491745197549,-98.952938578460817 26.384954133189183,-98.953327659277917 26.385611545667039,-98.958325183064531 26.394055638388448,-98.960041959595969 26.394835991082342,-98.96758721887106 26.398265653180793,-98.981979903868819 26.396488780147621,-98.98323657723455 26.396333635432413,-98.985344372930967 26.396073413984297,-98.99032130527651 26.395458978465552,-99.008003378826189 26.395458978465552,-99.014739404125635 26.398826987036053,-99.018845438188137 26.404005475794783,-99.021934999999999 26.407902,-99.025336792347318 26.409271761295809,-99.030462148109507 26.411335530401477,-99.031104888479149 26.411594335405351,-99.032315999999994 26.412082000000002,-99.033086386506682 26.412180127570064,-99.037216923343138 26.412706252494743,-99.039107 26.412946999999999,-99.039645291109963 26.412681959983438,-99.045466000000005 26.409815999999999,-99.053184999999999 26.402006,-99.062093000000004 26.397371,-99.082001999999989 26.396509999999996,-99.085125999999988 26.398782,-99.089412999999979 26.408099999999997,-99.092044248326658 26.410330707587079,-99.0977332288968 26.415153685331873,-99.099649490160544 26.416778244479925,-99.110855 26.426278,-99.113807999999992 26.434002,-99.110485406379198 26.436329519428725,-99.103082999999998 26.441514999999999,-99.097481906444941 26.458865277747179,-99.094712087984234 26.467445230774196,-99.091634999999997 26.476977000000002,-99.105030999999997 26.500335,-99.114051328117867 26.510193091438737,-99.123438026388797 26.520451579672599,-99.126618350727256 26.523927276756307,-99.127319211298612 26.524693229780183,-99.127781999999996 26.525199,-99.128040494672888 26.525242991472329,-99.131554903978838 26.52584108518932,-99.136510932879688 26.526684518463242,-99.143658999999985 26.527901,-99.157083944984777 26.532657279516766,-99.166741999999985 26.536078999999997,-99.170704 26.540316,-99.171403999999995 26.549848,-99.167459686682065 26.559874693319248,-99.167410000000004 26.560001,-99.168618869529794 26.566870928153797,-99.16946034016965 26.571652951934592,-99.178064000000006 26.620546999999998,-99.200522000000007 26.656442999999999,-99.209947999999997 26.693937999999999,-99.208906999999982 26.724761,-99.240022999999979 26.745850999999998,-99.242444000000006 26.788262,-99.243132825912184 26.78921716914337,-99.262208 26.815667999999999,-99.268613000000002 26.843212999999999,-99.274832961326339 26.850997131057774,-99.280470999999991 26.858053000000002,-99.295146000000003 26.86544,-99.316753000000006 26.865831,-99.328801222539823 26.879647723469141,-99.328900000000004 26.879760999999998,-99.328852280051947 26.879943529980665,-99.328653604395157 26.88070346927794,-99.326247644284351 26.88990632616278,-99.321819000000005 26.906846000000002,-99.324684000000005 26.915973,-99.337297000000007 26.922758999999999,-99.361143999999996 26.928920999999999,-99.367053999999996 26.929033999999998,-99.379148999999998 26.934489999999997,-99.388253000000006 26.944216999999998,-99.393748000000002 26.960730000000002,-99.390189000000007 26.966348,-99.377312000000003 26.973818999999999,-99.376593 26.977716999999998,-99.378434999999996 26.980034,-99.385448615007036 26.981891053234623,-99.387366999999998 26.982399,-99.403694000000002 26.997355999999996,-99.407320999999996 27.005808999999999,-99.415475999999998 27.017239999999997,-99.420446999999996 27.016567999999999,-99.429379999999981 27.010833000000002,-99.432154999999995 27.010698999999995,-99.438721 27.01463,-99.445682828533535 27.022104842939122,-99.446523999999997 27.023008,-99.446589518313687 27.0234513503828,-99.446929167151652 27.025749691622671,-99.446969999999979 27.026026000000002,-99.446787747918748 27.026353589968604,-99.444062000000002 27.031253,-99.443973 27.036457999999996,-99.447729715193731 27.048260380671568,-99.452315999999996 27.062668999999996,-99.450282 27.067705,-99.439210578806851 27.075275465844946,-99.434470000000005 27.078517000000002,-99.429209 27.090981999999997,-99.430274999999995 27.094871999999999,-99.437646 27.100442,-99.442122999999995 27.106839,-99.441108999999997 27.110041999999996,-99.433369999999982 27.119218,-99.430581000000004 27.126611999999998,-99.431354999999996 27.13758,-99.438264999999987 27.144791999999995,-99.439971 27.151071999999996,-99.437950999999998 27.154121,-99.42998399999999 27.159148999999999,-99.426616441133064 27.174998569551711,-99.42634799999999 27.176261999999998,-99.426389092127664 27.176475083747437,-99.428025433058153 27.184960350328335,-99.432794999999999 27.209693,-99.441928000000004 27.217984999999995,-99.442101400955139 27.218265584747954,-99.445237999999989 27.223341,-99.443121431464945 27.230753685991843,-99.441406999999998 27.236757999999998,-99.441548999999995 27.249919999999999,-99.452207395848959 27.263806782859465,-99.452390999999992 27.264046,-99.452635348600225 27.264144272092288,-99.454218033886534 27.264780796280988,-99.462735864984637 27.268206496624611,-99.463308999999981 27.268436999999995,-99.463731957038988 27.268231398925973,-99.480688 27.259988999999997,-99.487909999999999 27.260721,-99.492407 27.264118,-99.496069429210138 27.270723950024919,-99.496615000000006 27.271707999999997,-99.496412995851571 27.272119287725655,-99.490870463706145 27.283404082904614,-99.487572835142558 27.290118173493504,-99.487513000000007 27.29024,-99.487552182270463 27.290674424182523,-99.487937000000002 27.294941,-99.493651777311726 27.30231355132117,-99.494603999999995 27.303542,-99.494999311050705 27.30367917804087,-99.501697839297435 27.306003653868146,-99.502036000000004 27.306121,-99.50260564894451 27.305998370990778,-99.511531000000005 27.304076999999999,-99.522353224815092 27.304131436852781,-99.523657999999983 27.304137999999995,-99.527521386758664 27.305370598210363,-99.529216737576675 27.305911493159478,-99.529653999999994 27.306051,-99.533911450776046 27.310119063512179,-99.536090758332008 27.312201427353024,-99.536443000000006 27.312538,-99.537771000000006 27.316072999999996,-99.53137599999998 27.323809,-99.52136037329538 27.324774325824137,-99.521259999999998 27.324784,-99.520793197388144 27.325167862222077,-99.515101491997058 27.329848278790703,-99.509737777509301 27.334258981108004,-99.504836999999995 27.338289,-99.507830999999996 27.348637,-99.507785758525344 27.353517859091919,-99.507778999999999 27.354247,-99.505884699626023 27.358359262089539,-99.503847413823948 27.362781925614613,-99.502763417847504 27.36513512979511,-99.502013099315448 27.366763966750881,-99.499076000000002 27.373139999999999,-99.492143999999996 27.380516999999998,-99.488110785984318 27.408328989964531,-99.487887470616073 27.409868914391197,-99.487633320470721 27.411621467383494,-99.487521 27.412396,-99.487591555014376 27.412624523015491,-99.489856740583164 27.419961308946796,-99.495313182879073 27.437634363915539,-99.495699000000002 27.438884000000002,-99.495681276107845 27.439260342274874,-99.495103999999998 27.451518,-99.489866073767956 27.458841813736395,-99.48498035355378 27.465673163249864,-99.484933241276849 27.465739036942171,-99.483818999999997 27.467296999999995,-99.483170086267094 27.470026063960816,-99.480813109028745 27.479938539705284,-99.480418999999998 27.481595999999996,-99.480219000000005 27.485795999999997,-99.483519 27.491095999999999,-99.494943552274876 27.498766770813134,-99.497518999999997 27.500495999999998,-99.501722168778215 27.500229993495459,-99.502529258718056 27.500178915086504,-99.513319999999993 27.499496,-99.516119999999361 27.498282666666942,-99.519319999999979 27.496896,-99.525819999999982 27.496696,-99.528319999999994 27.498895999999998,-99.525855930815595 27.516294999999385,-99.525849791073696 27.516338353233991,-99.525316190784537 27.520106149807926,-99.523876376642917 27.530272798702207,-99.522431296340699 27.540476632400054,-99.521918999999997 27.544094,-99.518818999999993 27.553194,-99.514319 27.556994,-99.511118999999994 27.564493999999996,-99.512219000000002 27.568093999999995,-99.515978000000004 27.572130999999999,-99.51621006287597 27.572263354504685,-99.516956092136581 27.572688844074506,-99.522907946893667 27.576083418863931,-99.530137999999994 27.580207,-99.536560517954015 27.595669560441458,-99.539721999999998 27.603280999999999,-99.549741780062789 27.610632655019803,-99.554405160028892 27.614054243170667,-99.554950000000005 27.614453999999999,-99.555217670042637 27.614437037021997,-99.556811999999994 27.614335999999998,-99.559466999999998 27.609075999999998,-99.562869000000006 27.607264,-99.580005999999997 27.602250999999995,-99.584175941853502 27.603675176957196,-99.584843000000006 27.603902999999999,-99.584876722760043 27.604178863233781,-99.585148000000004 27.606397999999999,-99.578360965974085 27.610254799100861,-99.578159999999983 27.610368999999999,-99.578158133228257 27.610639131051315,-99.578098999999995 27.619195999999999,-99.584782000000004 27.622006999999996,-99.591372000000007 27.627464,-99.592626330929548 27.632690692534315,-99.594037999999998 27.638573,-99.596231000000003 27.639857999999997,-99.603532999999999 27.641991999999998,-99.612907806834755 27.638651258855042,-99.615318942915422 27.637792043123689,-99.624515000000002 27.634515,-99.625321999999997 27.631136999999999,-99.638929000000005 27.626757999999999,-99.654323999999988 27.629615999999999,-99.665948 27.635967999999998,-99.665422000000007 27.640274999999999,-99.660175716081199 27.644678795569117,-99.659499999999994 27.645246,-99.659300532255756 27.646059100049566,-99.658294999999995 27.650158,-99.661845 27.655753,-99.668942 27.659973999999998,-99.672015651285406 27.660163655087903,-99.685812999999982 27.661014999999999,-99.699355999999995 27.655417,-99.704600999999997 27.654953999999996,-99.711511000000002 27.658365,-99.721518999999986 27.666154999999996,-99.723715999999996 27.673328,-99.727277746539684 27.678262316066267,-99.732288643517421 27.685204233237535,-99.732448000000005 27.685424999999999,-99.732610774853441 27.685596448480599,-99.757538999999994 27.711853,-99.758533999999997 27.717071,-99.770740000000004 27.732133999999999,-99.774900999999986 27.73354,-99.785365999999996 27.730354999999999,-99.788844999999981 27.730718,-99.796341999999981 27.735586,-99.801651000000007 27.741771,-99.805670000000006 27.758687999999999,-99.813085999999998 27.773952,-99.817390803736785 27.775433523363962,-99.819091999999998 27.776019000000002,-99.822192999999999 27.766855,-99.825793000000004 27.764373999999997,-99.835127 27.762881,-99.841707999999997 27.766463999999999,-99.843346625073153 27.773142384459568,-99.844736999999981 27.778808999999999,-99.849281022020321 27.790032142335203,-99.850876999999997 27.793973999999999,-99.857944055165163 27.794214491272228,-99.870065999999994 27.794626999999998,-99.877441689362087 27.799278597548025,-99.877677000000006 27.799427,-99.877679299916537 27.799779028327777,-99.877693551047656 27.801960325692491,-99.877840000000006 27.824375999999997,-99.876677795668783 27.832975173255242,-99.876002999999997 27.837968,-99.877201999999997 27.842179000000002,-99.882014999999996 27.850391999999996,-99.89364999999998 27.856193,-99.901486000000006 27.864162,-99.904385000000005 27.875283999999997,-99.901231999999993 27.884405999999995,-99.894091000000003 27.892949999999999,-99.893456 27.899208000000002,-99.895827999999995 27.904177999999998,-99.900080000000003 27.912141999999999,-99.905861237749605 27.914081496997749,-99.917461000000003 27.917973,-99.925935042520848 27.927688375003317,-99.93714199999998 27.940536999999999,-99.938541 27.954059,-99.932160999999979 27.96771,-99.931811999999994 27.980967,-99.962768999999994 27.983536,-99.984922999999995 27.990729000000002,-99.991446999999994 27.99456,-99.998749958954292 28.00705628754028,-100.000278657311796 28.009672084008166,-100.008630999999994 28.023963999999999,-100.012838999999985 28.037203000000002,-100.014975394500183 28.048814882934586,-100.016570970484992 28.057487270710915,-100.017914000000005 28.064786999999999,-100.028724999999994 28.073118,-100.046108000000004 28.079067999999999,-100.053122999999985 28.08473,-100.056983000000002 28.094207,-100.05559599999998 28.101140999999998,-100.056492999999989 28.104185999999995,-100.064147158981442 28.110644603904401,-100.067651999999995 28.113602,-100.075474 28.124881999999999,-100.083393 28.144034999999999,-100.090288999999984 28.148312999999998,-100.119627999999992 28.155588000000002,-100.12658652988236 28.159659080291213,-100.141098 28.168149,-100.159890345070792 28.168159605160877,-100.160589999999999 28.16816,-100.1644540887186 28.169825181963088,-100.168437999999995 28.171541999999999,-100.173949604741296 28.178834844700365,-100.174413 28.179448,-100.17569869464343 28.180169771489844,-100.185693999999998 28.185780999999999,-100.195825662217615 28.189941498404405,-100.196499000000003 28.190218000000002,-100.19841872968675 28.190245400986015,-100.202449991411854 28.190302940621361,-100.208059000000006 28.190382999999997,-100.21208061434919 28.196473071951928,-100.212104999999994 28.196509999999996,-100.212111438897693 28.196576571978802,-100.212136678181992 28.196837521783539,-100.213449999999995 28.210415999999999,-100.217564999999993 28.226934,-100.220284000000007 28.232209999999995,-100.22363 28.235223999999995,-100.227575000000002 28.235856999999999,-100.246200000000002 28.234092,-100.251633999999996 28.236177,-100.261135590980771 28.244561246718906,-100.267604000000006 28.250268999999999,-100.280518 28.267969,-100.289383999999998 28.273491,-100.293468000000004 28.278475,-100.294296000000003 28.284381,-100.287553999999986 28.301093000000002,-100.286470999999992 28.312295999999996,-100.288638999999989 28.316977999999995,-100.314198000000005 28.345859,-100.317245999999997 28.357382,-100.320392999999996 28.362116999999998,-100.341869000000003 28.384952999999996,-100.344399999999979 28.389662,-100.34934096344108 28.4019924953441,-100.349585999999988 28.402603999999997,-100.349394820211828 28.402858691740477,-100.345766407828719 28.407692501181913,-100.343945000000005 28.410119000000002,-100.337058999999996 28.427150999999995,-100.336185999999998 28.430180999999997,-100.337474638078888 28.440402915586755,-100.337648113426326 28.441778981052359,-100.337796999999995 28.442959999999999,-100.338752462381066 28.444650728533539,-100.341532999999998 28.449570999999995,-100.350785999999999 28.459246,-100.353875644654778 28.461269551534915,-100.357498000000007 28.463642,-100.35795880406117 28.464220845064407,-100.358193534884933 28.464515705266944,-100.367961112704847 28.47678537623738,-100.368288000000007 28.477195999999999,-100.368051363629903 28.477598261305609,-100.365982000000002 28.481116,-100.356642877924983 28.482149981508559,-100.352234999999979 28.482638,-100.344180999999992 28.486249,-100.337140000000005 28.491728999999999,-100.33381399999999 28.499251999999998,-100.338517999999993 28.501833,-100.362147999999991 28.508399,-100.379079000000004 28.511638999999999,-100.388859999999994 28.515747999999995,-100.405057999999983 28.535779999999999,-100.411413999999994 28.551898999999999,-100.40430324537553 28.563833042228197,-100.397270000000006 28.575637,-100.396799999999999 28.580400999999998,-100.398385000000005 28.584883999999999,-100.403243426032972 28.586668145075244,-100.425819035320046 28.594958517689108,-100.429856 28.596440999999995,-100.431892715674053 28.597943579291371,-100.447320000000005 28.609324999999998,-100.448648000000006 28.616773999999999,-100.447280739633683 28.625703494601449,-100.445528999999993 28.637143999999996,-100.44560646842767 28.637394606891831,-100.447014715516048 28.641950223113035,-100.447091 28.642196999999999,-100.447325484276334 28.642184618041064,-100.447599559425257 28.642170145483281,-100.456522261830528 28.641698981546444,-100.462866000000005 28.641363999999999,-100.474494000000007 28.647071,-100.479445543783555 28.654922981332383,-100.479495071011698 28.655001519842354,-100.479635999999999 28.655225000000002,-100.481416494659797 28.655591917738484,-100.492493911747701 28.657874710783531,-100.493322226012125 28.658045406716248,-100.495863 28.658568999999996,-100.496129521434568 28.658770241190073,-100.500353999999987 28.661960000000004,-100.502122125123847 28.667202406240314,-100.505211969634487 28.676363647108229,-100.509438609439442 28.688895431533517,-100.510054999999994 28.690722999999995,-100.510127443340068 28.69126843161186,-100.510538898440004 28.694366309458967,-100.51077198772829 28.696121257064849,-100.511998000000006 28.705352,-100.511351260759739 28.706743032691019,-100.510646631791559 28.708258576930099,-100.509872363628347 28.709923903942272,-100.509406561254394 28.710925770365975,-100.508636802312012 28.712581398765199,-100.507069450532313 28.715952521820881,-100.506701000000007 28.716745000000003,-100.506745928327234 28.717920131927187,-100.506786973330165 28.718993692782757,-100.507152057645129 28.728542729239727,-100.507513721430456 28.738002299344281,-100.507590113222051 28.740000380261673,-100.507613000000006 28.740599,-100.507694735304739 28.740708529390524,-100.51442566685138 28.749728313832868,-100.519226000000003 28.756160999999999,-100.533017 28.763279999999998,-100.537772000000004 28.780775999999996,-100.534846642084489 28.786410367511117,-100.532431000000003 28.791062999999998,-100.535830000000004 28.805887999999999,-100.546431879116881 28.824270186264151,-100.546968759195195 28.825201061771438,-100.547323999999989 28.825817,-100.548186025546428 28.826178082695296,-100.553129999999982 28.828249,-100.561442999999997 28.829174000000002,-100.570509999999999 28.826317,-100.574698999999995 28.828786999999998,-100.576846000000003 28.836168000000004,-100.572991999999999 28.848463999999996,-100.580501999999996 28.856007999999999,-100.591040000000007 28.863054000000002,-100.598061272695219 28.874286065303028,-100.598877000000002 28.875590999999996,-100.602654 28.887660000000004,-100.602394435759351 28.893839359355621,-100.602053999999995 28.901944,-100.615584686670886 28.902906942475386,-100.627205999999987 28.903734,-100.631611000000007 28.902838999999997,-100.633502414453218 28.905240591668694,-100.640568000000002 28.914211999999999,-100.639169999999979 28.916288999999999,-100.638857000000002 28.927621999999996,-100.651511999999997 28.943431999999998,-100.64789859018552 28.954344193790252,-100.646992999999995 28.957078999999997,-100.646600907687997 28.967547400926616,-100.64647463428885 28.970918751315974,-100.645893999999998 28.986421,-100.647406325643686 28.99295674936236,-100.647835962928511 28.994813493392339,-100.648681241069511 28.998466493719445,-100.65094599999999 29.008254000000004,-100.653757999999996 29.015356,-100.656109999999998 29.017223999999999,-100.660207999999997 29.031497000000002,-100.663212 29.048041999999995,-100.662508000000003 29.058106999999996,-100.664064999999994 29.073205999999999,-100.666359117032755 29.07896154562156,-100.668483863047285 29.084292168447689,-100.674655999999999 29.099777000000003,-100.684472 29.110657,-100.692326999999992 29.115227999999995,-100.70996599999998 29.119684000000003,-100.727461999999989 29.129122999999996,-100.737795000000006 29.139078999999999,-100.739115999999996 29.141658,-100.737590999999995 29.147406999999998,-100.739681000000004 29.150486000000004,-100.746139999999997 29.154149000000004,-100.752330696165359 29.155516457617566,-100.759726 29.157149999999998,-100.76337082361762 29.160348915845475,-100.772648999999987 29.168492,-100.775904999999995 29.173344,-100.772154104961558 29.17809434863841,-100.766030999999998 29.185848999999997,-100.767059000000003 29.195287,-100.768348510582513 29.197581465531123,-100.775064591152173 29.209531592641572,-100.785521000000003 29.228136999999997,-100.791371999999996 29.225944999999999,-100.795681000000002 29.227729999999998,-100.79704599999998 29.235585999999998,-100.795234211471239 29.241421249558652,-100.795010188783237 29.242142762180318,-100.794911999999997 29.242459,-100.795310930062826 29.24310735172228,-100.797670999999994 29.246943000000002,-100.805332448258866 29.251327106905226,-100.815767091023289 29.257298117587734,-100.823532999999998 29.261742000000002,-100.834039999999987 29.261399999999998,-100.839016 29.263259,-100.841581161127962 29.265429071012271,-100.848663999999999 29.271420999999997,-100.856469000000004 29.275663999999999,-100.864659000000003 29.276076,-100.874739696506666 29.279181633366278,-100.876048999999995 29.279585,-100.876625364221198 29.280115401513385,-100.878513170701353 29.281852663087207,-100.878882999999988 29.282193000000003,-100.879105716359817 29.283377353454046,-100.880504361011205 29.290815018226784,-100.882051999999987 29.299044999999996,-100.886842 29.307848,-100.895590728097048 29.309871687341737,-100.904835000000006 29.31201,-100.906461302333199 29.313095095005444,-100.914770068080642 29.318638836799305,-100.916744062319239 29.319955917421627,-100.92203960930695 29.323489191321695,-100.922232587658954 29.323617949573855,-100.924041970395777 29.324825198761538,-100.926468967605715 29.326444530233299,-100.926628772437255 29.326551154580446,-100.926677999999981 29.326584,-100.92692137104487 29.32669794102517,-100.927819078352698 29.327118228044156,-100.92782883100196 29.32712279402223,-100.930446231588661 29.328348203997709,-100.940614999999994 29.333109,-100.941560773525751 29.336361493535293,-100.943196 29.341985,-100.945807189162338 29.344363370184055,-100.948971999999998 29.347245999999998,-100.95603875001359 29.347290187325033,-100.964324999999988 29.347342,-100.971743000000004 29.351370999999997,-100.972915999999998 29.354545000000005,-100.995606999999993 29.363403000000005,-101.004206999999994 29.364771999999999,-101.010614000000004 29.368669,-101.010768998319776 29.36895846820963,-101.014103165002794 29.375185214807839,-101.024016000000003 29.393697999999997,-101.036603999999997 29.406107999999996,-101.038600000000002 29.410713999999999,-101.037642000000005 29.414681000000002,-101.043363999999997 29.42988,-101.056956999999983 29.440773,-101.06011415724447 29.458454662113137,-101.060150999999991 29.458660999999999,-101.063843258270609 29.460131584976065,-101.087148999999997 29.469414,-101.103699000000006 29.470549999999999,-101.115253999999993 29.468458999999996,-101.130037999999985 29.47842,-101.137502999999995 29.473541999999998,-101.144336999999993 29.473246,-101.151876999999999 29.477004999999998,-101.163854997623304 29.493316894569897,-101.168923969306405 29.50021992913986,-101.171662999999995 29.503950000000003,-101.173821000000004 29.514566000000002,-101.192719999999994 29.520285,-101.227418999999998 29.522349999999996,-101.235274999999987 29.524854,-101.254895000000005 29.520341999999996,-101.260836999999981 29.529933,-101.261174999999994 29.536777,-101.252755240314642 29.553001111955531,-101.244355179006547 29.569187266927752,-101.24384013276574 29.574337712700849,-101.242022713082847 29.59251185083151,-101.251352546644355 29.604174135250076,-101.252152766968493 29.604494220898598,-101.259127443101093 29.607284069726152,-101.265347312053251 29.607284069726152,-101.274677145614746 29.602619152945408,-101.277624046978673 29.599940160672645,-101.283229510623855 29.594844301688571,-101.297224215766221 29.587069435365102,-101.30733154801338 29.587846934050759,-101.312894947857018 29.594028488101586,-101.314328915651188 29.595621785307589,-101.313192213312618 29.602947206633093,-101.31110792457288 29.616379301091623,-101.30733154801338 29.640715970810437,-101.311218981175116 29.64849082206727,-101.316661381574889 29.655488204771718,-101.325213716450733 29.657820655628775,-101.350093282659174 29.654710721152696,-101.353062961800887 29.655502634567405,-101.361755552011104 29.657820655628775,-101.364595571422868 29.66106639883844,-101.367197952410862 29.664040554714198,-101.371300910394638 29.676075888592084,-101.372874548462477 29.680691889931673,-101.378860251896057 29.698249939417508,-101.396947999999995 29.713947,-101.398362000000006 29.717000000000002,-101.396293999999997 29.727055,-101.397008999999997 29.733962999999999,-101.400635999999992 29.738078999999999,-101.410024000000007 29.741498,-101.415583999999996 29.746534,-101.415509877418046 29.750619769974676,-101.415402087456428 29.756561346443686,-101.424731921017937 29.758116313681725,-101.430388403484372 29.756500180308258,-101.441059122217254 29.75345141196761,-101.446501522617027 29.755006409338922,-101.451652003139955 29.758440048234313,-101.453498905321467 29.759671311053037,-101.455223999999987 29.771874,-101.467493655663716 29.779885945414083,-101.475268506920557 29.780663444099741,-101.503223000000006 29.764581999999997,-101.522695143280473 29.759671311053037,-101.526552276219391 29.761451532447605,-101.532802460460985 29.764336242900427,-101.53746737724174 29.782995910023434,-101.53804719015173 29.783865628452077,-101.546797210803248 29.796990645299058,-101.56156944476453 29.794658179375361,-101.572592853930203 29.778735448896484,-101.575564187573463 29.774443514881042,-101.582561562744587 29.771333610538232,-101.598573641854728 29.773657690388074,-101.603680999999995 29.774398999999999,-101.607256216824311 29.773863608191139,-101.625957999999997 29.771063000000002,-101.630319 29.768729,-101.632632680380155 29.763891873249722,-101.63512799999998 29.758675,-101.646417999999997 29.754303999999998,-101.652400999999983 29.758794999999996,-101.65328091488901 29.761368862201802,-101.654578 29.765162999999998,-101.662452999999985 29.77128,-101.689992000000004 29.771212999999996,-101.706636000000003 29.762736999999998,-101.714223999999987 29.767659999999999,-101.735201999999987 29.771591999999998,-101.754322999999999 29.777661999999999,-101.760919284561496 29.782457957985276,-101.763273999999981 29.784169999999996,-101.776796131253491 29.789191504347542,-101.777161000000007 29.789327,-101.777360180704861 29.789301830227139,-101.785668 29.788251999999996,-101.791002820423358 29.783037559970925,-101.796869557069002 29.782618516634159,-101.806507764952315 29.786389987871868,-101.809441149516488 29.790161459109573,-101.813855730843954 29.79253854440006,-101.814888826583982 29.793094827432377,-101.818909248247508 29.792167038125061,-101.830044431332681 29.789597381341238,-101.831231874027822 29.789323356194672,-101.852603555202364 29.801894932400803,-101.862241763085706 29.800218726571018,-101.866487373818487 29.79821962567333,-101.875399999999985 29.794022999999999,-101.878152615094365 29.794637055896249,-101.892739000000006 29.797891,-101.912406000000004 29.797849999999997,-101.917556726002999 29.792675767854249,-101.917942403066036 29.792482929945557,-101.922585359733716 29.790161459109573,-101.929709258872364 29.789323356194672,-101.932572380438657 29.791613852338052,-101.938090312383324 29.796028195755184,-101.946471365894325 29.797704401584976,-101.952535620779244 29.796990962273608,-101.953595265032959 29.796866298670082,-101.959462001678588 29.799380623656123,-101.965427194081556 29.806464275410743,-101.966166845299441 29.8073426094683,-101.970357372054934 29.81027599403247,-101.974547898810414 29.81027599403247,-101.982165144097308 29.804870201524977,-101.987538526473998 29.801056829485908,-101.993568005272067 29.802652866652032,-102.001318622543394 29.804704498914084,-102.001786318660763 29.804828300723614,-102.021918999999997 29.802490999999996,-102.032489182844799 29.803756293694118,-102.034758999999994 29.804027999999999,-102.039012999999997 29.802655,-102.041088000000002 29.799609999999998,-102.038411999999994 29.792831999999997,-102.039226999999997 29.790977000000002,-102.041308736499772 29.78984019520162,-102.048982832584102 29.785649487466547,-102.050044 29.785069999999997,-102.053123037129694 29.785312127485501,-102.073645999999982 29.786926,-102.076299925656656 29.790865308882584,-102.077348 29.792421,-102.084438999999989 29.794962000000002,-102.091420021879856 29.792967151942147,-102.091815999999994 29.792853999999995,-102.098789196918744 29.792718427915432,-102.115682000000007 29.792389999999997,-102.142325999999997 29.802854,-102.159600999999995 29.814355999999997,-102.161673999999991 29.819486999999999,-102.181894 29.846033999999996,-102.182859740836193 29.846584944255238,-102.18326563789924 29.846816503951921,-102.184058205433814 29.847268654791659,-102.186149999999998 29.848461999999998,-102.187393471220204 29.848699156882201,-102.188384798592551 29.848888224473839,-102.188671999999997 29.848942999999998,-102.189026115519184 29.848805138880103,-102.189342793483831 29.848681852617602,-102.205381000000003 29.842438,-102.216284162639099 29.842976962035557,-102.227553 29.843533999999995,-102.261388999999994 29.853283,-102.264041000000006 29.855964,-102.261776999999995 29.864001999999999,-102.264954000000003 29.867805999999998,-102.268816999999984 29.867990999999996,-102.276754999999994 29.862977999999998,-102.281249000000003 29.863116999999999,-102.297330999999986 29.875194,-102.301381000000006 29.877673999999995,-102.315388999999996 29.879919999999998,-102.320618999999994 29.878979999999995,-102.320667125014978 29.878900015386019,-102.320698585434869 29.878847727619664,-102.324634000000003 29.872306999999996,-102.333383999999995 29.868046,-102.341032999999996 29.869305000000004,-102.349861000000004 29.862316999999997,-102.361383773688715 29.849029038788231,-102.364542 29.845386999999995,-102.363642671554629 29.839963091609825,-102.362514000000004 29.833155999999995,-102.369522000000003 29.820395,-102.377253999999994 29.800163,-102.377312999999987 29.789971,-102.385270832882995 29.770348713937391,-102.386677616883858 29.766879890389689,-102.391739211722737 29.765814289574276,-102.392906191083 29.765568609270456,-102.402175111261812 29.766775086101941,-102.412062000000006 29.768061999999997,-102.433301 29.776608,-102.460890018677347 29.77909171043791,-102.468946430597143 29.779816991558327,-102.469957868267898 29.780012383523857,-102.481595292961757 29.782260529257879,-102.490330613701886 29.783948039559665,-102.492674483475767 29.783853017496881,-102.508312776666344 29.783219030534834,-102.508509848222559 29.783087649355906,-102.512686811979108 29.780303003853621,-102.512942156326147 29.774953626291172,-102.513380999999995 29.76576,-102.526400256170959 29.758693706517125,-102.535832205630967 29.753574449155192,-102.539417050278132 29.751628749336795,-102.545492105079163 29.750899740311965,-102.551081152293932 29.752357753652575,-102.556670813570321 29.757783010503054,-102.559343229460382 29.760376824671383,-102.565661280990938 29.761591836573395,-102.572255912443325 29.757095496286663,-102.57574472309652 29.754716761401177,-102.57635337725236 29.754301769870359,-102.585948674897452 29.751239442391949,-102.587774480184081 29.750656738873374,-102.597160000000002 29.751608,-102.612879000000007 29.748181999999996,-102.622534000000002 29.736632,-102.630150999999984 29.734314999999999,-102.64566499999998 29.733910000000002,-102.661251958261417 29.736122779697027,-102.66726872436665 29.739732837494621,-102.670971460158171 29.741954477821469,-102.677191937153026 29.738261067251376,-102.678467215476147 29.736427653943998,-102.6852530581628 29.72667193704833,-102.688163999999986 29.722486999999997,-102.690237999999979 29.707481999999999,-102.695507594622001 29.699754690880447,-102.698346999999984 29.695590999999997,-102.699316999999994 29.685029,-102.693466 29.676507,-102.697798916570122 29.672550546488289,-102.711337549653422 29.6601882100483,-102.724231000000003 29.648415000000004,-102.736947999999984 29.641537999999997,-102.742030999999997 29.632142000000002,-102.74048425929719 29.62775763619268,-102.738427999999999 29.621928999999998,-102.739991000000003 29.599041,-102.746201999999997 29.592875000000003,-102.757065999999995 29.597798999999998,-102.761810999999994 29.598396999999999,-102.768340999999992 29.594733999999999,-102.766929734823805 29.591197739636346,-102.762241000000003 29.579448999999997,-102.766124000000005 29.572347999999998,-102.768792219428661 29.572598581791439,-102.773961 29.573084,-102.776343296957975 29.562015327831393,-102.777530999999996 29.556497,-102.77572499999998 29.552188999999995,-102.771428999999998 29.548545999999998,-102.79216136048494 29.533953841063816,-102.807296321997939 29.523301326891541,-102.808565712504773 29.522407885546979,-102.808691999999979 29.522319000000003,-102.808681334358837 29.522097795383676,-102.808577631171161 29.519946998869006,-102.807327 29.494009000000002,-102.813953999999995 29.482805999999997,-102.814096473430837 29.482483316434472,-102.814383778328263 29.481832608662831,-102.822314986984821 29.463869465126457,-102.82537225240516 29.456945161410285,-102.827007089548758 29.453242470491304,-102.830969999999979 29.444267,-102.832538999999997 29.433109000000002,-102.830570753051859 29.427471931628293,-102.827354999999983 29.418261999999995,-102.825211066354328 29.40389180477127,-102.824564449740322 29.399557712155943,-102.831802092379931 29.389471209449322,-102.832669213065941 29.388262775214326,-102.84047188579207 29.377388836904565,-102.840778422425643 29.376961642203423,-102.841560439245441 29.370344567434586,-102.842457529677418 29.362753791491347,-102.843015380341285 29.358033509958585,-102.843020777220957 29.357987843989019,-102.861629999999991 29.351638999999995,-102.871857000000006 29.352092999999996,-102.876866000000007 29.354058999999996,-102.879534000000007 29.353326999999997,-102.883721999999992 29.348058999999999,-102.881857488401977 29.34363024944906,-102.879805000000005 29.338754999999999,-102.890489000000002 29.309498999999995,-102.88922161316745 29.299205074185686,-102.888328 29.291947,-102.891022000000007 29.287113000000002,-102.902604999999994 29.279440999999998,-102.90311226801488 29.27677066200776,-102.906295999999998 29.260010999999995,-102.903188999999983 29.254028999999999,-102.887901999999997 29.245611999999998,-102.881135 29.246022,-102.871347 29.241624999999999,-102.870795537867835 29.239589944231255,-102.86823682221636 29.230147538772215,-102.866845999999995 29.225014999999999,-102.878020000000006 29.214697999999999,-102.890063999999995 29.208813999999997,-102.899231 29.208863,-102.908656596973657 29.219194069767902,-102.908787000000004 29.219336999999996,-102.909098471667448 29.219296482603067,-102.910575587951939 29.219104333804097,-102.912131000000002 29.218902,-102.912650757516516 29.218481184275788,-102.915803535402844 29.215928573746115,-102.915865999999994 29.215877999999996,-102.915845750043147 29.215583596781208,-102.915608148145267 29.212129230727648,-102.915554 29.211341999999998,-102.915202931298523 29.21076702044931,-102.914525807203304 29.209658028088604,-102.912447999999998 29.206254999999999,-102.91453363655873 29.20019781620671,-102.917367531146525 29.191967513425833,-102.917805 29.190697,-102.922897000000006 29.192704085059273,-102.925481999999988 29.193722999999995,-102.932612000000006 29.194113000000005,-102.944911000000005 29.188819999999996,-102.947155999999993 29.180776999999999,-102.95089 29.176834999999997,-102.953474999999997 29.176307999999995,-102.977266 29.186226,-102.981742305424802 29.185103060319207,-102.989431999999994 29.183174,-102.98978258837333 29.182935350109393,-102.991725524817895 29.181612768970929,-102.994653 29.17962,-102.994906329461855 29.17910907354543,-102.99809599999999 29.172675999999996,-102.995688 29.161218999999999,-103.00243399999998 29.150260999999997,-103.0050672680876 29.149386797638936,-103.008362000000005 29.148292999999995,-103.010324999999995 29.137821999999996,-103.015028 29.125769999999996,-103.016945338084582 29.124525732477775,-103.024896087692937 29.119366048020158,-103.032982999999987 29.114118,-103.033302941039096 29.107355634443419,-103.034095953658579 29.105913798143234,-103.035682683422891 29.103028844591982,-103.04044215980575 29.099351067768175,-103.049126083320303 29.097714968852063,-103.055369601981923 29.096538655622457,-103.061557539334615 29.093936906572154,-103.06671291432167 29.091769303506382,-103.074407490743866 29.088534080562461,-103.076354546596249 29.085721668416742,-103.076667707631657 29.079576983004682,-103.076847 29.076059,-103.091926967746744 29.064237268591206,-103.100265999999991 29.057699999999997,-103.101359249603803 29.049403674773888,-103.102531654124817 29.040506667933872,-103.100975335951205 29.030701853789079,-103.100368259199087 29.026877266486249,-103.101607999999999 29.018122999999999,-103.107810999999998 29.013812,-103.117237999999986 29.000208999999998,-103.113922000000002 28.988546999999997,-103.115062910480361 28.985887850893185,-103.115327999999991 28.98527,-103.115773294260094 28.985147329619764,-103.126748000000006 28.982123999999995,-103.134930999999995 28.983525,-103.143274000000005 28.978073999999999,-103.156645999999995 28.972830999999999,-103.163865 28.972099,-103.165923000000006 28.974001999999999,-103.166234999999986 28.978836000000005,-103.174329720990258 28.980505274886987,-103.182663652045193 28.982223879127538,-103.194928465619142 28.984753100989199,-103.195705106971403 28.984913258196226,-103.207825367468075 28.987412670652219,-103.227338454203803 28.991436614861634,-103.227579101883322 28.991486240676846,-103.227800999999999 28.991532000000003,-103.228011662384262 28.991347921912006,-103.228737472224623 28.990713704806197,-103.239108999999985 28.981650999999996,-103.245121150470112 28.980239630911282,-103.2474464632202 28.980649978816817,-103.249155161185584 28.980951512720708,-103.25190330878641 28.984768118238364,-103.253285000000005 28.986686999999996,-103.26030800838916 28.989731411362609,-103.266003072061508 28.990206003834011,-103.270357000000004 28.988113999999996,-103.270725571428585 28.987466542857135,-103.27232562100086 28.984655789108508,-103.273357000000004 28.982844,-103.273647076585334 28.982817854078331,-103.281189929980513 28.982137982403092,-103.282424051550748 28.983865752282551,-103.284749352823042 28.987121173462914,-103.285935817906974 28.994002716014545,-103.289257951411443 28.999697788883793,-103.296614077237592 29.004443676810233,-103.302399476821606 29.006455988366771,-103.312987409437454 29.010138745081029,-103.315449022736544 29.011725838031147,-103.323993942362023 29.017235063099889,-103.331021803791103 29.021766184756,-103.332920159881368 29.026986669752301,-103.332783823258595 29.028827200289001,-103.332445567409962 29.033393619832523,-103.334818511373186 29.039800579109659,-103.341462759988346 29.041224342728523,-103.347869719265475 29.037427630547988,-103.350815999999995 29.028566999999999,-103.355428000000003 29.021529,-103.355590463621823 29.021464336016578,-103.361777791205157 29.019001647792766,-103.361998 29.018913999999999,-103.382125000000002 29.024248999999998,-103.386095607142025 29.025822707722725,-103.399799910010643 29.031254261761571,-103.402689272115182 29.032399429564627,-103.427474921518822 29.04222295692054,-103.427754276336316 29.042333676218103,-103.430481680804888 29.047455485683194,-103.434668000000002 29.055316999999995,-103.439550459717495 29.058547821156772,-103.449722032594721 29.065278554178825,-103.453029264571228 29.067467015663059,-103.457386392383299 29.068596640465525,-103.460381908910477 29.067681344107211,-103.463195887793432 29.066821517562918,-103.469166763983068 29.069242141692889,-103.471264639062966 29.073115142802621,-103.471299587628792 29.074897490538035,-103.471426016715213 29.08134526859719,-103.474814887995407 29.086670637304994,-103.484429000000006 29.094524,-103.49531945696836 29.1087608679228,-103.500928937954981 29.116094025764934,-103.503236 29.119109999999996,-103.506163032831353 29.119368513261239,-103.513192088151087 29.119989313955617,-103.524613000000002 29.120998,-103.524225442342612 29.124905426308125,-103.523383999999993 29.133389,-103.525026999999994 29.137353999999998,-103.539240927934515 29.144791265038371,-103.551909954693073 29.151420179312847,-103.558678999999984 29.154961999999998,-103.579462000000007 29.149964999999998,-103.592359999999999 29.150259999999999,-103.598960126757959 29.155019048637598,-103.606437999999997 29.160411,-103.607894091053709 29.162314354517299,-103.610539999999986 29.165772999999998,-103.624537921955991 29.163185608071569,-103.629433693714475 29.1622806680118,-103.638195234739996 29.160661174732635,-103.645634999999999 29.159286000000002,-103.653180000000006 29.162863999999995,-103.656807999999984 29.169098999999999,-103.660202999999996 29.170933999999999,-103.667724667668963 29.172878689431396,-103.669696386484915 29.173388467437,-103.688670000000002 29.178293999999998,-103.688830238367032 29.178273608722382,-103.690116124218548 29.178109972160996,-103.697314000000006 29.177194,-103.699305464408098 29.178139630948273,-103.713769999999997 29.185008,-103.724743000000004 29.191469999999999,-103.73193762439729 29.198544108660482,-103.742175000000003 29.20861,-103.750912464183997 29.219357091602017,-103.755265634411842 29.22471149629115,-103.75594348727293 29.225545256136954,-103.768569999999997 29.227360999999995,-103.777623396259372 29.232265264832392,-103.780085146052983 29.242351446713872,-103.780352362214714 29.243446273985068,-103.781659908552058 29.248803500057083,-103.789034484601103 29.257501704713096,-103.792700821322356 29.259284649416337,-103.795120675584712 29.260461427946989,-103.80876361213285 29.267096007175422,-103.816641821688407 29.27092719156084,-103.818617217853202 29.271599921312173,-103.838302999999982 29.278303999999999,-103.854966933859771 29.281484400071786,-103.856892999999999 29.281852,-103.880606 29.284961999999997,-103.896615144488038 29.284634799403065,-103.910231251371073 29.284356508561018,-103.916269383748329 29.284233099060927,-103.91710599999999 29.284215999999997,-103.91776286712728 29.284516760669142,-103.918698764585329 29.284945281345607,-103.918909999999997 29.285042,-103.918905327188597 29.285488562070029,-103.918900778480648 29.285923264066316,-103.918857000000003 29.290106999999995,-103.924975999999987 29.293913000000003,-103.943697999999983 29.294945999999996,-103.965795999999983 29.298586999999998,-103.975234999999998 29.296016999999999,-103.983459597310627 29.299165977024781,-103.998789342279238 29.305035323921498,-104.012357062242771 29.310230038851625,-104.018558084893087 29.312604243583909,-104.038281999999995 29.320155999999997,-104.047006656168747 29.325575022319434,-104.055595999999994 29.330909999999996,-104.056467149578211 29.334496091467582,-104.057243999999997 29.337694000000003,-104.068917843404819 29.342306667996301,-104.075923999999986 29.345075,-104.082149999999999 29.345922999999996,-104.091021999999995 29.353691999999995,-104.093326000000005 29.359926000000002,-104.098377999999983 29.366755999999999,-104.106466999999981 29.373127,-104.122882935723638 29.379859019095424,-104.125474999999994 29.380922000000002,-104.132831527553293 29.381873417846823,-104.136236243923818 29.382313748953422,-104.143691999999987 29.383277999999997,-104.1467332019064 29.385415391432094,-104.148888696362661 29.386930297552944,-104.151718842950046 29.388919356896473,-104.157422367906094 29.392927859373117,-104.166562999999996 29.399352,-104.180069999999986 29.412763999999999,-104.181273000000004 29.426265,-104.182051945448123 29.427144615030393,-104.195989999999995 29.442884000000003,-104.208194000000006 29.448201,-104.212529153241931 29.452438774515159,-104.213947876032222 29.456222068892099,-104.21370324326665 29.462011765001886,-104.213238514637069 29.473010445135856,-104.218538498245692 29.476600759818915,-104.220568643482977 29.477976020723915,-104.227547514371139 29.480496161448666,-104.229081071868791 29.481049944541308,-104.233824999999996 29.486544999999996,-104.233486999999997 29.492733999999995,-104.235847000000007 29.496744,-104.238313284768751 29.498023301020304,-104.246870092866089 29.50246185307569,-104.254473621536903 29.506405923975272,-104.260293266516271 29.50942466611497,-104.26168489846043 29.511073814728768,-104.264155000000002 29.514001,-104.271046277211582 29.51559593462645,-104.274575430964404 29.516412730896519,-104.293481117436073 29.520788310787555,-104.306646311930564 29.523835296697214,-104.308812834933008 29.524336722260216,-104.311570786550874 29.52540915148019,-104.318073989469781 29.527937921306467,-104.320711000000003 29.526326414398167,-104.326090351466348 29.523039031981277,-104.327483437129615 29.522187701603762,-104.334811000000002 29.519462999999998,-104.338113000000007 29.519967,-104.353150868059984 29.530471948300562,-104.369085650105362 29.541603450512167,-104.37074044290263 29.542759433043344,-104.371174999999994 29.543062999999997,-104.371454921502831 29.543072731712495,-104.371996954766473 29.543091575966443,-104.375901661123379 29.543227326450971,-104.381040999999996 29.543405999999997,-104.394588999999982 29.556087000000002,-104.394583075653415 29.556197720561212,-104.394577025204526 29.556310797858156,-104.394552364240909 29.55677168847231,-104.394503136758885 29.55769170460702,-104.394351 29.560534999999998,-104.39571704642303 29.563607040276512,-104.39636925661604 29.56507376640522,-104.397848504811165 29.56840038104859,-104.399550133070164 29.572227096202102,-104.399591 29.572319,-104.399981791506633 29.572551361916329,-104.452301000000006 29.60366,-104.466520000000003 29.609296,-104.483502 29.627740999999997,-104.486693164979016 29.629712817604439,-104.493658999999994 29.634016999999997,-104.503232654335022 29.63787621670291,-104.507568060311556 29.63962385355849,-104.51068846437596 29.64315687341222,-104.513969549435132 29.646871821353749,-104.51818442992635 29.651644041921735,-104.53325150001281 29.668703453669117,-104.535568725458901 29.671327089370656,-104.539761023554547 29.676073741438437,-104.540155514025756 29.678572204873163,-104.540559188867974 29.681128836544634,-104.537934834631798 29.684482179324355,-104.535770155740693 29.687248158943191,-104.536302269386866 29.690440851131939,-104.537991394981006 29.693268523024599,-104.544269904764263 29.703779029587054,-104.545505621253113 29.70584767433138,-104.552240999999995 29.717122999999997,-104.555600999999996 29.731220999999998,-104.554914970831931 29.738152096413199,-104.554660236582549 29.740725729903364,-104.557361904757329 29.745049367744027,-104.565950999999998 29.758794999999996,-104.565687999999994 29.770461999999998,-104.571279565966023 29.778773775962186,-104.586447318468245 29.801320404476364,-104.592472 29.810276000000002,-104.594023000000007 29.809220999999997,-104.599148999999997 29.811007,-104.610166000000007 29.819117999999996,-104.610205623651026 29.819231101342197,-104.610356932717465 29.819662996386217,-104.613081011852316 29.827438579869643,-104.615248982559379 29.833626813172685,-104.619039 29.844444999999997,-104.624350000000007 29.845221999999996,-104.629290740007292 29.852171499068138,-104.629713747950376 29.852766489555783,-104.630103000000005 29.853313999999997,-104.630111961493199 29.853664893019587,-104.630290851730521 29.860669455113747,-104.630338938536084 29.862552324858758,-104.630359999999996 29.863376999999996,-104.630588419131911 29.86393398222631,-104.633274999999998 29.870484999999999,-104.63616345635748 29.872800876528242,-104.645854762904364 29.880571071602066,-104.65678299999999 29.889332999999997,-104.658422170930251 29.891285606400047,-104.65864999999998 29.891556999999999,-104.658665881124946 29.891956296855856,-104.659041999999999 29.901413000000002,-104.661965712024596 29.903547518850328,-104.666224133352003 29.906656470935726,-104.672326999999996 29.911111999999996,-104.679772 29.924658999999998,-104.680850906343153 29.932111041680564,-104.684321999999995 29.956085999999999,-104.679660999999982 29.975271999999997,-104.680379178583593 29.977083,-104.685479 29.989943,-104.689640999999995 30.014949999999999,-104.693591999999995 30.019077000000003,-104.701242868742796 30.021046973658397,-104.702310999999995 30.021321999999998,-104.702447580064685 30.021555813412469,-104.7030116881661 30.022521518330599,-104.703997999999999 30.02421,-104.703882705803636 30.024660825787098,-104.703121214098445 30.027638426639932,-104.701101999999992 30.035533999999998,-104.706873999999999 30.050685,-104.706630611705322 30.051708605996314,-104.703831250551389 30.063481739403372,-104.703581999999997 30.06453,-104.699792220462342 30.065066336345112,-104.698848962238912 30.065199827927678,-104.698233000000002 30.065286999999998,-104.697787990647399 30.065651654776563,-104.69277799999999 30.069756999999996,-104.687313590037505 30.080921966773531,-104.685080632167896 30.08548438075637,-104.685002999999995 30.085643,-104.685554782105299 30.093963293324606,-104.685687 30.095957000000002,-104.686861171517634 30.098036494960315,-104.692093999999983 30.107303999999996,-104.693655813605488 30.119154117533654,-104.695366000000007 30.13213,-104.692122999999995 30.138662999999998,-104.690080458880587 30.149079251722458,-104.687506999999997 30.162202999999998,-104.687296000000003 30.179464000000003,-104.702787999999998 30.211735999999995,-104.707897632633845 30.218501061672534,-104.711235999999985 30.222920999999999,-104.713166 30.237956999999998,-104.722357186598074 30.248308653999679,-104.724410584274111 30.250621311025988,-104.72532436157617 30.251650460675243,-104.73347160041142 30.260826359409911,-104.733822000000004 30.261220999999999,-104.734059376092361 30.261231667834558,-104.737359999999995 30.261379999999996,-104.740448 30.259454000000002,-104.749663999999996 30.26126,-104.751566999999994 30.263643999999999,-104.754655151309422 30.272796681105522,-104.757893999999993 30.282395999999999,-104.761634 30.301147999999998,-104.779356000000007 30.313188,-104.790279572675416 30.323632238875831,-104.797291 30.330335999999999,-104.809794338457337 30.334925849121163,-104.810755485390246 30.338091979227556,-104.81211787963197 30.342579864771171,-104.813478341684558 30.347061385458392,-104.814379749150064 30.356375955470707,-104.814778573671205 30.360497153782266,-104.817595751374526 30.365914799658352,-104.824313633436745 30.370465624210016,-104.837492999999995 30.373909,-104.849824017938076 30.383147747051474,-104.859521 30.390413000000002,-104.857439999999997 30.408957,-104.852419999999995 30.418792,-104.861074000000002 30.428896999999996,-104.86474141169117 30.441297336779865,-104.865463293164552 30.443738179024677,-104.868454614768496 30.453852504447951,-104.869872 30.458644999999997,-104.86871099999999 30.463229999999996,-104.866118999999983 30.46479,-104.866094000000004 30.467379999999999,-104.870137228360662 30.483875070981508,-104.873288503237063 30.496731258693877,-104.873335488188886 30.496922942181985,-104.876786999999979 30.511004000000003,-104.878566789651714 30.514416830422793,-104.880108146577356 30.517372454871531,-104.88208573587417 30.521164575423189,-104.889375999999999 30.535143999999995,-104.890392881954469 30.540947215529823,-104.892228000000003 30.551419999999997,-104.895440150997459 30.560421421221292,-104.899000999999998 30.570399999999996,-104.909330873116318 30.584188648619556,-104.909747767935556 30.584745133303247,-104.918689620637082 30.596681007395873,-104.924796 30.604831999999998,-104.927016167130404 30.604700501077968,-104.934922481779466 30.604232215677584,-104.939873000000006 30.603939,-104.953391370086464 30.606003357240429,-104.967167000000003 30.608106999999997,-104.971627504383378 30.61006529240159,-104.972071 30.61026,-104.972794851616513 30.611297344530712,-104.980135850742045 30.621817657146149,-104.980290999999994 30.622039999999995,-104.982191641583043 30.62882153037463,-104.983981 30.635206,-104.985513855292751 30.652294791670293,-104.9863 30.661059000000002,-105.001239999999996 30.672583000000003,-105.002056999999994 30.680971999999997,-105.006614566555172 30.685839873047019,-105.006800999999996 30.686039,-105.007528432885024 30.6859080282745,-105.007959930235828 30.685830338698263,-105.020141999999993 30.683637,-105.035888798004834 30.686138071331488,-105.042930223005172 30.687256464175281,-105.044973600167665 30.685364445024991,-105.049769587265445 30.680923708581364,-105.049884734287517 30.6808170907847,-105.050688284649809 30.681171184306308,-105.054688384336032 30.682933873306403,-105.062333999999993 30.686302999999995,-105.062477471553692 30.692159292631892,-105.062625999999995 30.698222,-105.084504902225902 30.710918832086001,-105.098281999999998 30.718914000000002,-105.108075999999997 30.730049999999995,-105.110705999999993 30.737749999999995,-105.110681999999983 30.743366000000002,-105.113815999999986 30.746001,-105.119547104826722 30.748125675649064,-105.123265000000004 30.749504000000005,-105.140207000000004 30.752502,-105.152361999999982 30.751451999999997,-105.157640215066564 30.754007791997694,-105.16015278062757 30.757058756266805,-105.160271207191187 30.758203550015399,-105.161229588477383 30.767467931854636,-105.164076390339474 30.771453450048199,-105.164818961888187 30.77249304906519,-105.164868027003308 30.772491740665838,-105.170370203038615 30.772345016388588,-105.178279098267282 30.772134113115257,-105.183436 30.776644999999995,-105.185930999999997 30.784391999999997,-105.195143999999999 30.792138,-105.195988495740664 30.791702299374609,-105.203522176185984 30.787815448176353,-105.206160999999994 30.786453999999996,-105.212916518294108 30.785414778041517,-105.215967484302155 30.786491589369188,-105.216685356202021 30.789542555377231,-105.215888956387687 30.792967070566242,-105.214890669496626 30.797259699168034,-105.218659510882389 30.801566944478708,-105.222008841883465 30.801829013843189,-105.231580057313238 30.802577916338681,-105.238364256021057 30.803108747911697,-105.249792715464977 30.799033957074698,-105.255416052233826 30.797028969328842,-105.261224946310648 30.798054073736733,-105.261360733612406 30.798078036329223,-105.27276013440985 30.808707209360072,-105.27887297001547 30.814407016614517,-105.283004544196217 30.818259431108679,-105.287237620233441 30.822206489243744,-105.289317685342255 30.822206489243744,-105.295630129130572 30.822206489243744,-105.300778681061615 30.818848737795758,-105.303672944509898 30.816961174571279,-105.314862960890409 30.816961174571279,-105.316949659843416 30.82296045428,-105.31766045482081 30.825003996727105,-105.320108268786385 30.827451797139727,-105.322675464925993 30.828439452154051,-105.330102631610075 30.831296841312803,-105.347695000000002 30.838065,-105.353219571709047 30.842032277683753,-105.358103536812379 30.84553952616983,-105.359771122039604 30.846737044096301,-105.360672052753856 30.84738401593513,-105.36720323988537 30.847875849249167,-105.377416999999994 30.848644999999998,-105.387780492422849 30.851314552204784,-105.394242074789418 30.852979003795937,-105.396689881978517 30.855426817761515,-105.396237319899697 30.858492407966825,-105.394628539050657 30.86939005724841,-105.394248999999988 30.871960999999999,-105.395681745186749 30.87649980844607,-105.399608999999998 30.888940999999996,-105.399828021807267 30.889112280223049,-105.402824820246408 30.891455847338634,-105.413505 30.899808,-105.430088999999995 30.905791999999998,-105.44547819369545 30.915748838601054,-105.448693870984556 30.917829388134351,-105.452149246331331 30.920065022782566,-105.4597280766598 30.924968540917344,-105.469954295993247 30.931584924947412,-105.472488639470896 30.933224650164071,-105.476269681741059 30.935670991952524,-105.488027000000002 30.943277999999999,-105.495516502166126 30.9493992090351,-105.4968561000139 30.950494069316512,-105.497422439936116 30.953962910943051,-105.497963910074574 30.957279424722472,-105.502256687477072 30.962680017552614,-105.507558525965123 30.966493977230062,-105.533087999999992 30.984859,-105.541468808393844 30.984769556162778,-105.543675999999991 30.984745999999998,-105.557430349577899 30.990228688381027,-105.570063935625512 31.008532833135739,-105.575218046011173 31.016000355201566,-105.578084306850855 31.020153131231776,-105.578407858220658 31.020621907958049,-105.57911399999999 31.021644999999999,-105.580554486932016 31.024917232759986,-105.581339666024604 31.026700857930102,-105.581404000000006 31.026847000000004,-105.581361569643192 31.027041810483581,-105.581235244876609 31.027621805343596,-105.579823718925667 31.034102543987302,-105.579541999999989 31.035395999999995,-105.579765234089464 31.036249085539566,-105.579847333127134 31.036562825712579,-105.585323000000002 31.057487999999996,-105.592709163135751 31.0626132919136,-105.595921000000004 31.064841999999999,-105.598772999999994 31.074925999999998,-105.60333 31.082624999999997,-105.627348999999995 31.098545,-105.641890000000004 31.098321999999996,-105.646730999999988 31.113907999999999,-105.647031366805422 31.114192798578223,-105.648833999999994 31.115902000000002,-105.662869191777489 31.12063916934996,-105.673930643060629 31.124372639388369,-105.709491 31.136374999999997,-105.717005999999998 31.141438,-105.717653520299876 31.143411480377267,-105.719539999999995 31.149160999999996,-105.742677999999998 31.164897,-105.763531 31.164121000000005,-105.773256999999987 31.166896999999999,-105.774148788612138 31.168976038235485,-105.780021000000005 31.182666,-105.779878030009812 31.18682806893737,-105.779724999999999 31.191282999999995,-105.782894999999996 31.197562999999999,-105.790659746923424 31.200723362140888,-105.794386000000003 31.20224,-105.818835000000007 31.230680999999997,-105.825806058218902 31.23733997673531,-105.835722000000004 31.246811999999995,-105.851073632158958 31.265902599748792,-105.86604427072389 31.284519412988434,-105.869353000000004 31.288633999999998,-105.869862116496506 31.288859823963843,-105.876014999999981 31.291588999999995,-105.890871999999987 31.290013999999996,-105.895034999999993 31.290977999999999,-105.903460999999993 31.306768999999999,-105.908770999999987 31.312773999999997,-105.914613899052299 31.312859252963214,-105.93196564998388 31.313112430054005,-105.932552999999999 31.313120999999995,-105.933375187723101 31.313903465142818,-105.938451999999984 31.318735,-105.948091000000005 31.340069,-105.945903 31.352809999999998,-105.953942999999995 31.364749,-105.970101 31.365936999999995,-105.997579969562565 31.386863626037869,-106.00418474278807 31.391893495117941,-106.004925999999998 31.392457999999998,-106.006143777923754 31.392558937255828,-106.022866323827969 31.393945009265412,-106.080091217088636 31.398688175961098,-106.080258 31.398702,-106.080335505244278 31.398768097394733,-106.096409750603954 31.412476405141465,-106.100621535494 31.416068265421309,-106.102641400977276 31.417790830744398,-106.10264993125142 31.41779810546371,-106.106876999999997 31.421403000000005,-106.112168999999994 31.423577999999996,-106.132782000000006 31.425367000000005,-106.143572676566535 31.431101721097118,-106.158218000000005 31.438885000000003,-106.175305198785026 31.455910533348611,-106.175674999999998 31.456278999999995,-106.17677981450808 31.456634312625521,-106.182946895641223 31.45861766980741,-106.20560859826729 31.465905761156737,-106.205826999999999 31.465975999999998,-106.205998876707866 31.466165148890862,-106.212686244283063 31.473524541419071,-106.218538531147885 31.479964934554566,-106.218843000000007 31.480299999999996,-106.218893022078106 31.480498686193428,-106.223908999999992 31.500422,-106.236804000000006 31.513376,-106.242649095206133 31.530650094003715,-106.245874455325477 31.540182047193959,-106.246202999999994 31.541153,-106.246406806009631 31.541315626597875,-106.254779999999997 31.547997000000002,-106.280345588488331 31.561810530102129,-106.280548572587122 31.561920205925162,-106.280811 31.562061999999997,-106.287785 31.584444999999999,-106.292254713772053 31.594651759250389,-106.295141086978958 31.601242900860864,-106.303535999999994 31.620412999999996,-106.308594276522342 31.627497440426588,-106.330970256390501 31.658836434185069,-106.33473699999999 31.664111999999999,-106.338265602146336 31.671883697950737,-106.346992532059133 31.691104641686092,-106.349537999999995 31.696711,-106.357472918704602 31.702103016258707,-106.368303742040567 31.709462886938788,-106.370138999999995 31.710709999999999,-106.373839000000004 31.714809999999996,-106.378039 31.72831,-106.381039 31.732109999999999,-106.38595139194058 31.734759025425479,-106.394642915450532 31.739445961452269,-106.404086535473255 31.744538468290354,-106.417940000000002 31.752009,-106.421739999999616 31.752623660686648,-106.431540999999996 31.754208999999996,-106.434644983693715 31.755853956158482,-106.444263765046571 31.76095142933643,-106.451540999999992 31.764807999999999,-106.467641999999998 31.759607999999997,-106.470742 31.753508,-106.472156160715315 31.752506597443457,-106.47367184987327 31.751433300058491,-106.475016438009845 31.750481163584279,-106.475542000000004 31.750108999999998,-106.48261401078824 31.748321568701869,-106.484641999999994 31.747809000000004,-106.486162292248409 31.747994847970777,-106.488078402545341 31.748229082678503,-106.489542 31.748407999999998,-106.507341999999994 31.761208,-106.509102011460428 31.762827435120251,-106.511609062807707 31.765134242258316,-106.523643000000007 31.776206999999996,-106.528643000000002 31.781807,-106.528542999999999 31.783906999999996,-106.528542999999999 31.784407000000002,-106.527996999999999 31.786944999999999,-106.527623000000006 31.789119000000003,-106.527737999999985 31.789760999999995,-106.527942999999993 31.790507000000002,-106.530514999999994 31.792103,-106.532480000000007 31.791913999999998,-106.533 31.791829,-106.533043000000006 31.791906999999995,-106.534743000000006 31.796106999999999,-106.535154000000006 31.797088999999996,-106.535342999999997 31.797507,-106.535842999999986 31.798607,-106.542096999999998 31.802145999999997,-106.542143999999993 31.802106999999996,-106.544713999999999 31.804286999999999,-106.545344 31.805007,-106.546561898485905 31.806561850400339,-106.546615562760394 31.806630361790774,-106.547143999999989 31.807304999999996,-106.551861034152338 31.808599471053657,-106.558443999999994 31.810406,-106.560680020141419 31.810752754512048,-106.560847305685968 31.810778696593822,-106.562944999999999 31.811104,-106.56344399999999 31.812605999999995,-106.566844000000003 31.813305999999997,-106.569123704016391 31.811582321353455,-106.570943999999997 31.810205999999997,-106.577243999999993 31.810406,-106.581344 31.813905999999996,-106.582144 31.815505999999999,-106.588044999999994 31.822105999999998,-106.589044999999984 31.822705999999997,-106.593826000000007 31.824901,-106.602727000000002 31.825023999999996,-106.605266999999998 31.827911999999998,-106.603310537982878 31.834798487166189,-106.601945 31.839604999999999,-106.60204499999999 31.844404999999998,-106.605244999999982 31.845904999999998,-106.605845000000002 31.846304999999997,-106.614637000000002 31.846489999999996,-106.621857000000006 31.852854,-106.625763000000006 31.856276,-106.627808000000002 31.860592999999998,-106.629708357956787 31.861913746439043,-106.635925999999998 31.866235,-106.635879999999986 31.871514,-106.634872999999999 31.874477999999996,-106.630798999999996 31.879696999999997,-106.629271361585637 31.8835303997664,-106.629197000000005 31.883717000000004,-106.629948941610351 31.885072003811555,-106.630443527558498 31.88596325099838,-106.630530381920593 31.886119763139838,-106.630691999999982 31.886410999999999,-106.633926999999986 31.889183999999997,-106.635073463799642 31.889856364267651,-106.636317332120683 31.890585853164694,-106.638154 31.891662999999998,-106.638364165758659 31.89171923904625,-106.642899999999983 31.892932999999999,-106.645296000000002 31.894859,-106.645645999999999 31.895648999999995,-106.645478999999995 31.898669999999999,-106.640839999999997 31.904598,-106.63512839833713 31.908732779117901,-106.633668 31.90979,-106.633408736085542 31.909871832166754,-106.625946999999996 31.912227,-106.62344499999999 31.914034,-106.618336531290581 31.916262323146238,-106.614677480394235 31.917858407661853,-106.614345999999998 31.918002999999995,-106.611846 31.920003,-106.616063629645311 31.921863544491501,-106.623932999999994 31.925334999999997,-106.624022586877501 31.92530240401349,-106.628663000000003 31.923614,-106.629746999999995 31.926570000000002,-106.625321999999983 31.930053000000004,-106.622529 31.934863000000004,-106.622117000000003 31.936620999999999,-106.622377 31.940863,-106.623659000000004 31.945509999999995,-106.616135999999983 31.948439,-106.614701999999994 31.956,-106.617707999999993 31.956008,-106.622819000000007 31.952891,-106.625123000000002 31.954530999999999,-106.625534999999985 31.957475999999996,-106.624298999999993 31.961054,-106.620453999999981 31.963402999999996,-106.619370999999987 31.964777000000005,-106.618745000000004 31.966954999999995,-106.619568999999998 31.971578,-106.621872999999994 31.972933,-106.623215999999999 31.972909999999999,-106.626465999999994 31.97069,-106.630114000000006 31.971257999999999,-106.638186000000005 31.976819999999996,-106.639528999999996 31.980347999999996,-106.63649199999999 31.985719,-106.631181999999995 31.989809,-106.629494617643616 31.990072722748106,-106.628337072326531 31.990253636712819,-106.62822051159516 31.990271854111079,-106.626910882874782 31.990476537349483,-106.623567999999992 31.990998999999999,-106.619448000000006 31.994733,-106.618486000000004 32.000494999999994,-106.599096000000003 32.000731000000002,-106.598639000000006 32.000753999999993,-106.595332999999997 32.000777999999997,-106.587971999999979 32.000748999999999,-106.582805114232855 32.000751357586125,-106.566056000000003 32.000759000000002,-106.565141999999994 32.000736000000003,-106.564298514026802 32.00073927393025,-106.562131862706067 32.000747683631808,-106.55942760630407 32.000758180008894,-106.517043115844388 32.000922692365819,-106.411074999999983 32.001334,-106.409326934223301 32.001349629127162,-106.409108574114072 32.001351581443814,-106.394297999999992 32.001483999999998,-106.376861000000005 32.001171999999997,-106.32356972407176 32.001457096670784,-106.313306999999995 32.001511999999998,-106.205915000000005 32.001761999999999,-106.200699 32.001784999999998,-106.18183999999998 32.002049999999997,-106.125534000000002 32.002532999999993,-106.05045734599986 32.002412317859424,-105.998002999999997 32.002327999999999,-105.900599999999997 32.002099999999992,-105.886159000000006 32.001969999999993,-105.854061000000002 32.00235,-105.750527000000005 32.002206,-105.731362000000004 32.001564000000002,-105.563520259526442 32.001015604709174,-105.429281000000003 32.000577,-105.428582000000006 32.000599999999999,-105.427048999999997 32.000638000000002,-105.390395999999981 32.000607000000002,-105.340142768272344 32.000583616714373,-105.200871148394683 32.000518812363367,-105.153993999999997 32.000497000000003,-105.150310000000005 32.000497000000003,-105.14824 32.000484999999998,-105.132915999999994 32.000518,-105.131377 32.000523999999999,-105.118039999999993 32.000484999999998,-105.078604999999996 32.000532999999997,-105.077045999999996 32.000578999999995,-104.918272000000002 32.000495999999991,-104.643525999999994 32.000442999999997,-104.640917999999999 32.000396000000002,-104.531936999999999 32.000311000000004,-104.531756 32.000117000000003,-104.024520999999993 32.000010000000003,-103.980179000000007 32.000124999999997,-103.875476000000006 32.000554,-103.748317 32.000197999999997,-103.72373965094468 32.000208021677786,-103.713395184678689 32.000212239744897,-103.713395184670219 32.000212239744904,-103.713395184654971 32.000212239744911,-103.713395184639609 32.000212239744918,-103.60161412595366 32.000257819670985,-103.326500999999993 32.00036999999999,-103.278520999999998 32.000419,-103.270382999999995 32.000326,-103.267707999999999 32.000323999999992,-103.267633000000004 32.000475000000002,-103.215641000000005 32.000512999999998,-103.133028835827503 32.000473953106116,-103.088697999999994 32.000452999999993,-103.085875999999985 32.000464999999998,-103.064422999999991 32.000518,-103.064344000000006 32.087051000000002,-103.064347999999995 32.123041,-103.064421999999993 32.145006000000002,-103.064695999999998 32.522193,-103.064761000000004 32.587983,-103.064787999999993 32.600397,-103.064761000000004 32.601863000000002,-103.064814999999996 32.624536999999997,-103.064633 32.646419999999992,-103.064864 32.682647000000003,-103.064797999999996 32.690761000000002,-103.064798999999994 32.708694,-103.064826999999994 32.726627999999998,-103.064807000000002 32.777302999999996,-103.064698000000007 32.783602000000002,-103.064711000000003 32.784593,-103.064699000000005 32.827531,-103.064672000000002 32.828470000000003,-103.064888999999994 32.849359,-103.064915999999982 32.857259999999997,-103.064807000000002 32.857695999999997,-103.064862000000005 32.868346000000003,-103.064700999999985 32.879354999999997,-103.064569000000006 32.900013999999999,-103.064656999999997 32.959097,-103.064678999999998 32.964373000000002,-103.064625000000007 32.999898999999999,-103.064452000000003 33.010289999999998,-103.06398 33.038693000000002,-103.063904999999991 33.042054999999998,-103.063382198608849 33.066417104805645,-103.0628188509327 33.092668632365545,-103.062136190569035 33.12448003074244,-103.060102999999984 33.219225000000002,-103.059719999999999 33.256262,-103.059241999999998 33.260370999999992,-103.057856 33.315233999999997,-103.057486999999995 33.32947699999999,-103.056655000000006 33.388437999999994,-103.052609999999987 33.570599,-103.051664000000002 33.629489,-103.051362999999995 33.64195,-103.051535 33.650486999999998,-103.051086999999981 33.658186,-103.050532000000004 33.672407999999997,-103.050147999999993 33.701971,-103.049608000000006 33.737766,-103.049096000000006 33.746270000000003,-103.047346000000005 33.824674999999999,-103.046907000000004 33.850299999999997,-103.045643999999996 33.901536999999998,-103.045698000000002 33.90629899999999,-103.044893000000002 33.945616999999999,-103.043949999999981 33.974629,-103.043616999999998 34.003633,-103.043531000000002 34.018014,-103.043554999999984 34.032713999999991,-103.043745999999999 34.037294000000003,-103.043771000000007 34.041538000000003,-103.043720999999991 34.042319999999997,-103.043767000000003 34.043544999999995,-103.043744000000004 34.049985999999997,-103.04368599999998 34.063077999999997,-103.043515999999983 34.079382000000003,-103.043569000000005 34.087947,-103.043571175003294 34.092846731402311,-103.043572866326429 34.096656853966635,-103.04358003846437 34.112813863799865,-103.043644 34.256903,-103.043718999999982 34.289440999999997,-103.043935999999988 34.302584999999993,-103.043978999999979 34.312763999999994,-103.043947553639484 34.376410480771497,-103.043947499824213 34.37651940122479,-103.043946000000005 34.379555000000003,-103.043943999999982 34.37966,-103.043919000000002 34.380915999999992,-103.043693000000005 34.383578,-103.043629999999993 34.384689999999999,-103.043614000000005 34.384968999999998,-103.043612999999993 34.388679000000003,-103.043612999999993 34.390442,-103.043606047260084 34.391254973944719,-103.043584999999993 34.393715999999998,-103.043610999999999 34.397105000000003,-103.043582999999998 34.400677999999999,-103.043537999999998 34.405462999999997,-103.043582 34.455657000000002,-103.043587999999986 34.459662000000002,-103.043588999999997 34.459774000000003,-103.043593999999985 34.46266,-103.043434927764125 34.510540742996007,-103.043071999999981 34.619782,-103.043277851519235 34.65183038816317,-103.0432796163159 34.65210514391012,-103.043285999999995 34.653098999999997,-103.042827000000003 34.671187999999994,-103.042768999999993 34.747360999999998,-103.042770000000004 34.792223999999997,-103.042781000000005 34.850242999999999,-103.042520999999979 34.899546,-103.0425974544018 35.032467348285799,-103.042641999999987 35.109912999999999,-103.043261 35.125058000000003,-103.042519999999996 35.135596,-103.042599999999993 35.142766000000002,-103.042710999999997 35.144734999999997,-103.042568000000003 35.159317999999999,-103.042394999999999 35.178573,-103.042338999999984 35.181922,-103.042366 35.182786,-103.042377000000002 35.183149,-103.042496999999997 35.211862000000004,-103.042775000000006 35.241236999999998,-103.042366 35.250056,-103.041554000000005 35.622487,-103.041484634909168 35.651235429903174,-103.041145999999998 35.791583000000003,-103.041916999999998 35.796441000000002,-103.041715999999994 35.814072000000003,-103.042186 35.825216999999995,-103.04130499999998 35.837693999999999,-103.040823999999986 36.055230999999992,-103.041387523024824 36.229129564686382,-103.041674 36.317534000000002,-103.041745000000006 36.318266999999999,-103.041923999999995 36.500439,-103.00243399999998 36.500397)),((-96.818513748151517 28.172441936006489,-96.816443421354066 28.174808025412563,-96.791958210781445 28.188687337716829,-96.733036581469989 28.190913261798631,-96.70383764358462 28.198245729538105,-96.697421731775194 28.2029594609741,-96.702659211994316 28.211208487181011,-96.703313894801497 28.216445964862743,-96.686815839850283 28.218410020896432,-96.662461568376486 28.227313732447904,-96.66062845144161 28.228884976259902,-96.663116248646261 28.233205895474203,-96.651855673914184 28.251275190431315,-96.607991796426646 28.277069769155677,-96.608122730450688 28.280081317680857,-96.611527096272326 28.281390688369981,-96.610479598706064 28.283092866206033,-96.592934048725994 28.296972182316367,-96.581018783574592 28.302209665072866,-96.553260151988255 28.302340591484768,-96.546975176740276 28.305614018207578,-96.542130508742858 28.315958034472228,-96.528905880514458 28.322504882843088,-96.476269225261575 28.330753906512612,-96.45099839278295 28.337038879223222,-96.434107525610045 28.344764159184386,-96.418918843885365 28.35484630740093,-96.415252604940861 28.362833452872817,-96.417216660974546 28.367154372087118,-96.412895739222876 28.36951123780511,-96.403206408302779 28.371475291301415,-96.401242352269094 28.366892498964241,-96.400558825492723 28.362187299887704,-96.398667286465624 28.349166496619617,-96.397846 28.343512999999998,-96.413700000000006 28.327342999999999,-96.439098999999999 28.319051999999999,-96.495600517783487 28.293964130304811,-96.547774000000004 28.270797999999999,-96.587113635820756 28.248878526668094,-96.611036668198281 28.235548960715661,-96.621533999999983 28.229699999999998,-96.694665999999998 28.18212,-96.758140999999995 28.136872999999998,-96.830820125734775 28.079724674840076,-96.849624000000006 28.064938999999999,-96.854049189790473 28.060788472935577,-96.855594496383262 28.059339080448503,-96.859762278796424 28.055429983997605,-96.896530613737951 28.020943786452513,-96.898080497387397 28.019490100997579,-96.929052999999996 27.990439999999996,-96.96699599999998 27.950531000000002,-97.001440999999986 27.911442,-97.031660000000002 27.869974999999997,-97.041798999999997 27.852925999999997,-97.045408776308051 27.837452569961062,-97.045409609838757 27.837448997003069,-97.04598 27.835004,-97.050599498412936 27.830109781194331,-97.058265753683145 27.821987615677948,-97.076304165860961 27.802876463727326,-97.079565315161531 27.799421374709375,-97.083535350812468 27.795215242050556,-97.085211615730273 27.793439290085495,-97.085394999999991 27.793244999999999,-97.11422230692618 27.755303327915222,-97.116276999999997 27.752599,-97.117304906633777 27.751048809529347,-97.118830196202964 27.748748513687826,-97.139140047561696 27.718119138409879,-97.139351757288111 27.717799858049549,-97.143807202733072 27.711080581371732,-97.165547551982726 27.678293865995041,-97.166583141799606 27.676732088482499,-97.166681999999994 27.676583,-97.184850261879149 27.644709535797791,-97.192144670654784 27.631912600211269,-97.198729900630283 27.620359811436909,-97.201865999999995 27.614857999999998,-97.211651066704889 27.596044174137351,-97.213608899397855 27.592279833590187,-97.221943360361436 27.576255098965802,-97.265194083077162 27.493096589152017,-97.265746568141566 27.492034321708481,-97.276090999999994 27.472145,-97.304469999999995 27.407734,-97.326522999999995 27.347611999999998,-97.347445832595042 27.277936119324231,-97.350397999999998 27.268104999999998,-97.363400999999996 27.210366,-97.370941000000002 27.161165999999998,-97.377001000000007 27.101020999999999,-97.379130000000004 27.047996,-97.378361999999996 26.992877,-97.370730999999992 26.909706,-97.365301177044699 26.875333999999995,-97.365282052674758 26.875212938438843,-97.364726000000005 26.871692999999997,-97.363633430415348 26.866515420001111,-97.352028350385282 26.811520085064032,-97.35141299999998 26.808603999999999,-97.350529648372714 26.805138580575584,-97.333027999999999 26.736478999999996,-97.304204860681779 26.646364129642233,-97.300690000000003 26.635375,-97.297812715808362 26.627503004299889,-97.297022484076606 26.625340999999999,-97.287871455917369 26.600304594305239,-97.275119000000004 26.565415000000002,-97.269391999999982 26.554046,-97.269132970349304 26.553256905349773,-97.257954534248029 26.519203490608863,-97.229844 26.433568999999999,-97.223724090442104 26.411478908273114,-97.206682644704898 26.34996703527348,-97.194643999999997 26.306512999999999,-97.185844000000003 26.267102999999995,-97.177979856301576 26.220346386353309,-97.177168840972797 26.215524458900923,-97.173264999999986 26.192314,-97.170387765328073 26.167037808112223,-97.169872392484734 26.162510314053797,-97.167099005951158 26.138146416702778,-97.161470999999992 26.088705,-97.158662630175101 26.080176913346069,-97.154270970414501 26.066840900880429,-97.161462285840642 26.067639941946975,-97.169842256221145 26.077853024187579,-97.171781452365479 26.102521767945923,-97.179531587141199 26.146202099560895,-97.178745972847352 26.177103221942961,-97.183983445454302 26.214289306886101,-97.194458400817808 26.271639686993655,-97.214884565299002 26.353606215503973,-97.226930759399721 26.385554824668418,-97.240286324189555 26.405980989149626,-97.240845398636537 26.411470089808617,-97.243166933615896 26.434263367616055,-97.247618791929028 26.456260775909261,-97.254165635225121 26.471187589585856,-97.262545605605609 26.482971915638458,-97.27642492679071 26.521729238684483,-97.292399243108349 26.528014213932472,-97.310730412457033 26.556558470596535,-97.308111681228326 26.5712234060755,-97.308635417324538 26.576722756880109,-97.317015387705027 26.597672667607057,-97.318434072834165 26.60022630157264,-97.324871601690262 26.611813856840271,-97.338489044677715 26.647428701777493,-97.33639404954522 26.666021744249065,-97.345821512417203 26.700589103038251,-97.363105189274393 26.710540307081217,-97.370437657013895 26.723895871871047,-97.370961403259614 26.736203954318924,-97.367557047587525 26.740393934434408,-97.364152671616353 26.758986971196869,-97.364646278833362 26.767121661774897,-97.368866408127118 26.774699404876429,-97.370437646864346 26.781508126370166,-97.368342661881371 26.795649318140761,-97.373056398392137 26.808481136684847,-97.387459455673451 26.820789208983193,-97.383531343606066 26.875520854055946,-97.385626348888096 26.88887641440536,-97.391649435788921 26.901970109878395,-97.389554460955466 26.945964918852653,-97.390340075249313 27.05228571820243,-97.389816329003565 27.067212531879022,-97.386411973331462 27.083186832972341,-97.387459455673422 27.090519300711819,-97.390601943297412 27.094185534581555,-97.390078197051665 27.156511519247964,-97.377508246555678 27.199458835730731,-97.379865109736301 27.202863196477598,-97.386673841379576 27.204696313412462,-97.382221972916923 27.229050589961044,-97.37488951532697 27.25026236588155,-97.373318276589728 27.276449754290233,-97.372896734486858 27.277942715507475,-97.367033301341749 27.298709035706306,-97.36467643816114 27.302637142698917,-97.359962701650375 27.304732132756659,-97.357605838469766 27.307874620380655,-97.362319574980518 27.32672953597509,-97.366771423144115 27.333276389420721,-97.36179581858525 27.359987519000377,-97.346607126710992 27.390364889744752,-97.336132171347501 27.402411088920228,-97.331156576938184 27.412362295500575,-97.329585328051422 27.418123524502818,-97.330894688591016 27.425455992242295,-97.329847196099536 27.434359703793774,-97.317277255753083 27.463689574751687,-97.293708603647858 27.497209429631152,-97.282971770086746 27.521563701104967,-97.267627232015485 27.541048841138782,-97.26651977444007 27.542455137362143,-97.266473727822444 27.542513609294531,-97.257831889393842 27.556392930479635,-97.261144559602045 27.562355746269706,-97.261759991311692 27.563463525096239,-97.260450620622564 27.56739163716362,-97.260303240478223 27.567589679048492,-97.252732825146552 27.577762415194865,-97.252070650242061 27.578652211895708,-97.247885553160842 27.581360217573209,-97.247618802078478 27.581532821322067,-97.236881968517352 27.598292751933528,-97.24107194863285 27.602482732049012,-97.241084821027414 27.602523494839662,-97.242643187370078 27.607458346757408,-97.231683715414945 27.631671123728168,-97.231553918442799 27.631957884363242,-97.231382612637987 27.632336350521356,-97.221955159915538 27.632860099304484,-97.221711030183002 27.632638163711842,-97.219074540339648 27.630241360463614,-97.217418907944051 27.630677052710489,-97.214098935780783 27.631550728615359,-97.200743370990949 27.650143776161688,-97.197339005169326 27.664546838517776,-97.19760088336696 27.678426154628117,-97.203474366386629 27.684532651921231,-97.20308902068453 27.688000774441392,-97.200450811776179 27.688974477466285,-97.190006537429824 27.692829222058965,-97.188284576858237 27.695272543577584,-97.170627865440125 27.720325976082009,-97.166176017276527 27.732372180332245,-97.161200407642937 27.734074342943998,-97.153606061705801 27.733288721037997,-97.147321086457822 27.735383711095739,-97.130823034043985 27.751619892924076,-97.127942424617643 27.75580987303956,-97.127680546420009 27.759999858229808,-97.125046985317312 27.763143140340585,-97.103326269871417 27.789067861139614,-97.102999946318647 27.791923200131116,-97.10255066693685 27.795854405604921,-97.102495980878558 27.796332909939515,-97.102278777379922 27.798233445813956,-97.100865886772965 27.802472121847156,-97.098874421707819 27.808446522979796,-97.095168997779496 27.812151946908138,-97.092851314507953 27.81446963017968,-97.092589446459854 27.819183356540908,-97.098874421707819 27.822849590410645,-97.104263831428213 27.822227735056668,-97.126109297533233 27.819707102786651,-97.130299287798252 27.820492727230029,-97.134489267913736 27.825206463740791,-97.132394272781227 27.827301438574235,-97.10670775348396 27.832389859144307,-97.087681973298601 27.836158807756469,-97.056712719518927 27.842293721800239,-97.055822986229373 27.843403727743151,-97.04322620548075 27.859119113080268,-97.013634476624247 27.906780143237341,-97.017955395838555 27.911493874673329,-97.016384146951765 27.917255079570445,-96.985744902767337 27.954048356415132,-96.977888688782102 27.976438572489602,-96.978805242174786 27.978271691961854,-96.980900237307296 27.978271691961854,-96.986006780964971 27.976176699366729,-96.986661461234775 27.980759491703903,-96.978281501003806 28.001709402430844,-96.967806540565562 28.020040576854303,-96.966759042999328 28.020367911280101,-96.965187799187319 28.013297317932185,-96.962569062883844 28.012380759464751,-96.952617853766114 28.01643980428749,-96.946987563862692 28.02652194996665,-96.932453562407773 28.035425661518129,-96.926430465357427 28.043412814602167,-96.929572952981431 28.051399967686208,-96.927085150701998 28.057292130712504,-96.906004298338829 28.076147047258459,-96.890946545563423 28.076801730065643,-96.886232814127425 28.084396073465374,-96.88832780925992 28.086622002621937,-96.889113433703315 28.099453823703399,-96.886887499471996 28.117130312782294,-96.879424092633712 28.131402425890027,-96.874972236857971 28.133235547899659,-96.87078225420511 28.13127149186597,-96.86462821551855 28.126295887307109,-96.857164811217643 28.115559058820768,-96.845380482627661 28.108881273888468,-96.830128556765757 28.111822717849165,-96.827049318353744 28.112416571196771,-96.816574357915513 28.119618104912195,-96.810420321766344 28.126034014184238,-96.810944073086844 28.136378030448888,-96.816836228500989 28.158048094801106,-96.820248352517055 28.163388807027481,-96.822859330626116 28.167475552598326,-96.818513748151517 28.172441936006489))) \ No newline at end of file
diff --git a/django/contrib/gis/tests/geoapp/tests.py b/django/contrib/gis/tests/geoapp/tests.py
new file mode 100644
index 0000000000..7e37733667
--- /dev/null
+++ b/django/contrib/gis/tests/geoapp/tests.py
@@ -0,0 +1,564 @@
+import os, unittest
+from models import Country, City, State, Feature, MinusOneSRID
+from django.contrib.gis import gdal
+from django.contrib.gis.db.backend import SpatialBackend
+from django.contrib.gis.geos import *
+from django.contrib.gis.measure import Distance
+from django.contrib.gis.tests.utils import no_oracle, no_postgis, oracle, postgis
+
+# TODO: Some tests depend on the success/failure of previous tests, these should
+# be decoupled. This flag is an artifact of this problem, and makes debugging easier;
+# specifically, the DISABLE flag will disables all tests, allowing problem tests to
+# be examined individually.
+DISABLE = False
+
+class GeoModelTest(unittest.TestCase):
+
+ def test01_initial_sql(self):
+ "Testing geographic initial SQL."
+ if DISABLE: return
+ if oracle:
+ # Oracle doesn't allow strings longer than 4000 characters
+ # in SQL files, and I'm stumped on how to use Oracle BFILE's
+ # in PLSQL, so we set up the larger geometries manually, rather
+ # than relying on the initial SQL.
+
+ # Routine for returning the path to the data files.
+ data_dir = os.path.join(os.path.dirname(__file__), 'sql')
+ def get_file(wkt_file):
+ return os.path.join(data_dir, wkt_file)
+
+ State(name='Colorado', poly=fromfile(get_file('co.wkt'))).save()
+ State(name='Kansas', poly=fromfile(get_file('ks.wkt'))).save()
+ Country(name='Texas', mpoly=fromfile(get_file('tx.wkt'))).save()
+ Country(name='New Zealand', mpoly=fromfile(get_file('nz.wkt'))).save()
+
+ # Ensuring that data was loaded from initial SQL.
+ self.assertEqual(2, Country.objects.count())
+ self.assertEqual(8, City.objects.count())
+
+ # Oracle cannot handle NULL geometry values w/certain queries.
+ if oracle: n_state = 2
+ else: n_state = 3
+ self.assertEqual(n_state, State.objects.count())
+
+ def test02_proxy(self):
+ "Testing Lazy-Geometry support (using the GeometryProxy)."
+ if DISABLE: return
+ ## Testing on a Point
+ pnt = Point(0, 0)
+ nullcity = City(name='NullCity', point=pnt)
+ nullcity.save()
+
+ # Making sure TypeError is thrown when trying to set with an
+ # incompatible type.
+ for bad in [5, 2.0, LineString((0, 0), (1, 1))]:
+ try:
+ nullcity.point = bad
+ except TypeError:
+ pass
+ else:
+ self.fail('Should throw a TypeError')
+
+ # Now setting with a compatible GEOS Geometry, saving, and ensuring
+ # the save took, notice no SRID is explicitly set.
+ new = Point(5, 23)
+ nullcity.point = new
+
+ # Ensuring that the SRID is automatically set to that of the
+ # field after assignment, but before saving.
+ self.assertEqual(4326, nullcity.point.srid)
+ nullcity.save()
+
+ # Ensuring the point was saved correctly after saving
+ self.assertEqual(new, City.objects.get(name='NullCity').point)
+
+ # Setting the X and Y of the Point
+ nullcity.point.x = 23
+ nullcity.point.y = 5
+ # Checking assignments pre & post-save.
+ self.assertNotEqual(Point(23, 5), City.objects.get(name='NullCity').point)
+ nullcity.save()
+ self.assertEqual(Point(23, 5), City.objects.get(name='NullCity').point)
+ nullcity.delete()
+
+ ## Testing on a Polygon
+ shell = LinearRing((0, 0), (0, 100), (100, 100), (100, 0), (0, 0))
+ inner = LinearRing((40, 40), (40, 60), (60, 60), (60, 40), (40, 40))
+
+ # Creating a State object using a built Polygon
+ ply = Polygon(shell, inner)
+ nullstate = State(name='NullState', poly=ply)
+ self.assertEqual(4326, nullstate.poly.srid) # SRID auto-set from None
+ nullstate.save()
+
+ ns = State.objects.get(name='NullState')
+ self.assertEqual(ply, ns.poly)
+
+ # Testing the `ogr` and `srs` lazy-geometry properties.
+ if gdal.HAS_GDAL:
+ self.assertEqual(True, isinstance(ns.poly.ogr, gdal.OGRGeometry))
+ self.assertEqual(ns.poly.wkb, ns.poly.ogr.wkb)
+ self.assertEqual(True, isinstance(ns.poly.srs, gdal.SpatialReference))
+ self.assertEqual('WGS 84', ns.poly.srs.name)
+
+ # Changing the interior ring on the poly attribute.
+ new_inner = LinearRing((30, 30), (30, 70), (70, 70), (70, 30), (30, 30))
+ ns.poly[1] = new_inner
+ ply[1] = new_inner
+ self.assertEqual(4326, ns.poly.srid)
+ ns.save()
+ self.assertEqual(ply, State.objects.get(name='NullState').poly)
+ ns.delete()
+
+ @no_oracle # Oracle does not support KML.
+ def test03a_kml(self):
+ "Testing KML output from the database using GeoManager.kml()."
+ if DISABLE: return
+ # Should throw a TypeError when trying to obtain KML from a
+ # non-geometry field.
+ qs = City.objects.all()
+ self.assertRaises(TypeError, qs.kml, 'name')
+
+ # The reference KML depends on the version of PostGIS used
+ # (the output stopped including altitude in 1.3.3).
+ major, minor1, minor2 = SpatialBackend.version
+ ref_kml1 = '<Point><coordinates>-104.609252,38.255001,0</coordinates></Point>'
+ ref_kml2 = '<Point><coordinates>-104.609252,38.255001</coordinates></Point>'
+ if major == 1:
+ if minor1 > 3 or (minor1 == 3 and minor2 >= 3): ref_kml = ref_kml2
+ else: ref_kml = ref_kml1
+ else:
+ ref_kml = ref_kml2
+
+ # Ensuring the KML is as expected.
+ ptown1 = City.objects.kml(field_name='point', precision=9).get(name='Pueblo')
+ ptown2 = City.objects.kml(precision=9).get(name='Pueblo')
+ for ptown in [ptown1, ptown2]:
+ self.assertEqual(ref_kml, ptown.kml)
+
+ def test03b_gml(self):
+ "Testing GML output from the database using GeoManager.gml()."
+ if DISABLE: return
+ # Should throw a TypeError when tyring to obtain GML from a
+ # non-geometry field.
+ qs = City.objects.all()
+ self.assertRaises(TypeError, qs.gml, field_name='name')
+ ptown1 = City.objects.gml(field_name='point', precision=9).get(name='Pueblo')
+ ptown2 = City.objects.gml(precision=9).get(name='Pueblo')
+
+ if oracle:
+ # No precision parameter for Oracle :-/
+ import re
+ gml_regex = re.compile(r'<gml:Point srsName="SDO:4326" xmlns:gml="http://www.opengis.net/gml"><gml:coordinates decimal="\." cs="," ts=" ">-104.60925199\d+,38.25500\d+ </gml:coordinates></gml:Point>')
+ for ptown in [ptown1, ptown2]:
+ self.assertEqual(True, bool(gml_regex.match(ptown.gml)))
+ else:
+ for ptown in [ptown1, ptown2]:
+ self.assertEqual('<gml:Point srsName="EPSG:4326"><gml:coordinates>-104.609252,38.255001</gml:coordinates></gml:Point>', ptown.gml)
+
+ def test04_transform(self):
+ "Testing the transform() GeoManager method."
+ if DISABLE: return
+ # Pre-transformed points for Houston and Pueblo.
+ htown = fromstr('POINT(1947516.83115183 6322297.06040572)', srid=3084)
+ ptown = fromstr('POINT(992363.390841912 481455.395105533)', srid=2774)
+ prec = 3 # Precision is low due to version variations in PROJ and GDAL.
+
+ # Asserting the result of the transform operation with the values in
+ # the pre-transformed points. Oracle does not have the 3084 SRID.
+ if not oracle:
+ h = City.objects.transform(htown.srid).get(name='Houston')
+ self.assertEqual(3084, h.point.srid)
+ self.assertAlmostEqual(htown.x, h.point.x, prec)
+ self.assertAlmostEqual(htown.y, h.point.y, prec)
+
+ p1 = City.objects.transform(ptown.srid, field_name='point').get(name='Pueblo')
+ p2 = City.objects.transform(srid=ptown.srid).get(name='Pueblo')
+ for p in [p1, p2]:
+ self.assertEqual(2774, p.point.srid)
+ self.assertAlmostEqual(ptown.x, p.point.x, prec)
+ self.assertAlmostEqual(ptown.y, p.point.y, prec)
+
+ @no_oracle # Most likely can do this in Oracle, however, it is not yet implemented (patches welcome!)
+ def test05_extent(self):
+ "Testing the `extent` GeoQuerySet method."
+ if DISABLE: return
+ # Reference query:
+ # `SELECT ST_extent(point) FROM geoapp_city WHERE (name='Houston' or name='Dallas');`
+ # => BOX(-96.8016128540039 29.7633724212646,-95.3631439208984 32.7820587158203)
+ expected = (-96.8016128540039, 29.7633724212646, -95.3631439208984, 32.782058715820)
+
+ qs = City.objects.filter(name__in=('Houston', 'Dallas'))
+ extent = qs.extent()
+
+ for val, exp in zip(extent, expected):
+ self.assertAlmostEqual(exp, val, 8)
+
+ @no_oracle
+ def test06_make_line(self):
+ "Testing the `make_line` GeoQuerySet method."
+ if DISABLE: return
+ # Ensuring that a `TypeError` is raised on models without PointFields.
+ self.assertRaises(TypeError, State.objects.make_line)
+ self.assertRaises(TypeError, Country.objects.make_line)
+ # Reference query:
+ # SELECT AsText(ST_MakeLine(geoapp_city.point)) FROM geoapp_city;
+ self.assertEqual(GEOSGeometry('LINESTRING(-95.363151 29.763374,-96.801611 32.782057,-97.521157 34.464642,174.783117 -41.315268,-104.609252 38.255001,-95.23506 38.971823,-87.650175 41.850385,-123.305196 48.462611)', srid=4326),
+ City.objects.make_line())
+
+ def test09_disjoint(self):
+ "Testing the `disjoint` lookup type."
+ if DISABLE: return
+ ptown = City.objects.get(name='Pueblo')
+ qs1 = City.objects.filter(point__disjoint=ptown.point)
+ self.assertEqual(7, qs1.count())
+
+ if not postgis:
+ # TODO: Do NULL columns bork queries on PostGIS? The following
+ # error is encountered:
+ # psycopg2.ProgrammingError: invalid memory alloc request size 4294957297
+ qs2 = State.objects.filter(poly__disjoint=ptown.point)
+ self.assertEqual(1, qs2.count())
+ self.assertEqual('Kansas', qs2[0].name)
+
+ def test10_contains_contained(self):
+ "Testing the 'contained', 'contains', and 'bbcontains' lookup types."
+ if DISABLE: return
+ # Getting Texas, yes we were a country -- once ;)
+ texas = Country.objects.get(name='Texas')
+
+ # Seeing what cities are in Texas, should get Houston and Dallas,
+ # and Oklahoma City because 'contained' only checks on the
+ # _bounding box_ of the Geometries.
+ if not oracle:
+ qs = City.objects.filter(point__contained=texas.mpoly)
+ self.assertEqual(3, qs.count())
+ cities = ['Houston', 'Dallas', 'Oklahoma City']
+ for c in qs: self.assertEqual(True, c.name in cities)
+
+ # Pulling out some cities.
+ houston = City.objects.get(name='Houston')
+ wellington = City.objects.get(name='Wellington')
+ pueblo = City.objects.get(name='Pueblo')
+ okcity = City.objects.get(name='Oklahoma City')
+ lawrence = City.objects.get(name='Lawrence')
+
+ # Now testing contains on the countries using the points for
+ # Houston and Wellington.
+ tx = Country.objects.get(mpoly__contains=houston.point) # Query w/GEOSGeometry
+ nz = Country.objects.get(mpoly__contains=wellington.point.hex) # Query w/EWKBHEX
+ ks = State.objects.get(poly__contains=lawrence.point)
+ self.assertEqual('Texas', tx.name)
+ self.assertEqual('New Zealand', nz.name)
+ self.assertEqual('Kansas', ks.name)
+
+ # Pueblo and Oklahoma City (even though OK City is within the bounding box of Texas)
+ # are not contained in Texas or New Zealand.
+ self.assertEqual(0, len(Country.objects.filter(mpoly__contains=pueblo.point))) # Query w/GEOSGeometry object
+ self.assertEqual(0, len(Country.objects.filter(mpoly__contains=okcity.point.wkt))) # Qeury w/WKT
+
+ # OK City is contained w/in bounding box of Texas.
+ if not oracle:
+ qs = Country.objects.filter(mpoly__bbcontains=okcity.point)
+ self.assertEqual(1, len(qs))
+ self.assertEqual('Texas', qs[0].name)
+
+ def test11_lookup_insert_transform(self):
+ "Testing automatic transform for lookups and inserts."
+ if DISABLE: return
+ # San Antonio in 'WGS84' (SRID 4326)
+ sa_4326 = 'POINT (-98.493183 29.424170)'
+ wgs_pnt = fromstr(sa_4326, srid=4326) # Our reference point in WGS84
+
+ # Oracle doesn't have SRID 3084, using 41157.
+ if oracle:
+ # San Antonio in 'Texas 4205, Southern Zone (1983, meters)' (SRID 41157)
+ # Used the following Oracle SQL to get this value:
+ # SELECT SDO_UTIL.TO_WKTGEOMETRY(SDO_CS.TRANSFORM(SDO_GEOMETRY('POINT (-98.493183 29.424170)', 4326), 41157)) FROM DUAL;
+ nad_wkt = 'POINT (300662.034646583 5416427.45974934)'
+ nad_srid = 41157
+ else:
+ # San Antonio in 'NAD83(HARN) / Texas Centric Lambert Conformal' (SRID 3084)
+ nad_wkt = 'POINT (1645978.362408288754523 6276356.025927528738976)' # Used ogr.py in gdal 1.4.1 for this transform
+ nad_srid = 3084
+
+ # Constructing & querying with a point from a different SRID. Oracle
+ # `SDO_OVERLAPBDYINTERSECT` operates differently from
+ # `ST_Intersects`, so contains is used instead.
+ nad_pnt = fromstr(nad_wkt, srid=nad_srid)
+ if oracle:
+ tx = Country.objects.get(mpoly__contains=nad_pnt)
+ else:
+ tx = Country.objects.get(mpoly__intersects=nad_pnt)
+ self.assertEqual('Texas', tx.name)
+
+ # Creating San Antonio. Remember the Alamo.
+ sa = City(name='San Antonio', point=nad_pnt)
+ sa.save()
+
+ # Now verifying that San Antonio was transformed correctly
+ sa = City.objects.get(name='San Antonio')
+ self.assertAlmostEqual(wgs_pnt.x, sa.point.x, 6)
+ self.assertAlmostEqual(wgs_pnt.y, sa.point.y, 6)
+
+ # If the GeometryField SRID is -1, then we shouldn't perform any
+ # transformation if the SRID of the input geometry is different.
+ m1 = MinusOneSRID(geom=Point(17, 23, srid=4326))
+ m1.save()
+ self.assertEqual(-1, m1.geom.srid)
+
+ # Oracle does not support NULL geometries in its spatial index for
+ # some routines (e.g., SDO_GEOM.RELATE).
+ @no_oracle
+ def test12_null_geometries(self):
+ "Testing NULL geometry support, and the `isnull` lookup type."
+ if DISABLE: return
+ # Querying for both NULL and Non-NULL values.
+ nullqs = State.objects.filter(poly__isnull=True)
+ validqs = State.objects.filter(poly__isnull=False)
+
+ # Puerto Rico should be NULL (it's a commonwealth unincorporated territory)
+ self.assertEqual(1, len(nullqs))
+ self.assertEqual('Puerto Rico', nullqs[0].name)
+
+ # The valid states should be Colorado & Kansas
+ self.assertEqual(2, len(validqs))
+ state_names = [s.name for s in validqs]
+ self.assertEqual(True, 'Colorado' in state_names)
+ self.assertEqual(True, 'Kansas' in state_names)
+
+ # Saving another commonwealth w/a NULL geometry.
+ if not oracle:
+ # TODO: Fix saving w/NULL geometry on Oracle.
+ State(name='Northern Mariana Islands', poly=None).save()
+
+ @no_oracle # No specific `left` or `right` operators in Oracle.
+ def test13_left_right(self):
+ "Testing the 'left' and 'right' lookup types."
+ if DISABLE: return
+ # Left: A << B => true if xmax(A) < xmin(B)
+ # Right: A >> B => true if xmin(A) > xmax(B)
+ # See: BOX2D_left() and BOX2D_right() in lwgeom_box2dfloat4.c in PostGIS source.
+
+ # Getting the borders for Colorado & Kansas
+ co_border = State.objects.get(name='Colorado').poly
+ ks_border = State.objects.get(name='Kansas').poly
+
+ # Note: Wellington has an 'X' value of 174, so it will not be considered
+ # to the left of CO.
+
+ # These cities should be strictly to the right of the CO border.
+ cities = ['Houston', 'Dallas', 'San Antonio', 'Oklahoma City',
+ 'Lawrence', 'Chicago', 'Wellington']
+ qs = City.objects.filter(point__right=co_border)
+ self.assertEqual(7, len(qs))
+ for c in qs: self.assertEqual(True, c.name in cities)
+
+ # These cities should be strictly to the right of the KS border.
+ cities = ['Chicago', 'Wellington']
+ qs = City.objects.filter(point__right=ks_border)
+ self.assertEqual(2, len(qs))
+ for c in qs: self.assertEqual(True, c.name in cities)
+
+ # Note: Wellington has an 'X' value of 174, so it will not be considered
+ # to the left of CO.
+ vic = City.objects.get(point__left=co_border)
+ self.assertEqual('Victoria', vic.name)
+
+ cities = ['Pueblo', 'Victoria']
+ qs = City.objects.filter(point__left=ks_border)
+ self.assertEqual(2, len(qs))
+ for c in qs: self.assertEqual(True, c.name in cities)
+
+ def test14_equals(self):
+ if DISABLE: return
+ "Testing the 'same_as' and 'equals' lookup types."
+ pnt = fromstr('POINT (-95.363151 29.763374)', srid=4326)
+ c1 = City.objects.get(point=pnt)
+ c2 = City.objects.get(point__same_as=pnt)
+ c3 = City.objects.get(point__equals=pnt)
+ for c in [c1, c2, c3]: self.assertEqual('Houston', c.name)
+
+ def test15_relate(self):
+ "Testing the 'relate' lookup type."
+ if DISABLE: return
+ # To make things more interesting, we will have our Texas reference point in
+ # different SRIDs.
+ pnt1 = fromstr('POINT (649287.0363174 4177429.4494686)', srid=2847)
+ pnt2 = fromstr('POINT(-98.4919715741052 29.4333344025053)', srid=4326)
+
+ # Not passing in a geometry as first param shoud
+ # raise a type error when initializing the GeoQuerySet
+ self.assertRaises(TypeError, Country.objects.filter, mpoly__relate=(23, 'foo'))
+ # Making sure the right exception is raised for the given
+ # bad arguments.
+ for bad_args, e in [((pnt1, 0), TypeError), ((pnt2, 'T*T***FF*', 0), ValueError)]:
+ qs = Country.objects.filter(mpoly__relate=bad_args)
+ self.assertRaises(e, qs.count)
+
+ # Relate works differently for the different backends.
+ if postgis:
+ contains_mask = 'T*T***FF*'
+ within_mask = 'T*F**F***'
+ intersects_mask = 'T********'
+ elif oracle:
+ contains_mask = 'contains'
+ within_mask = 'inside'
+ # TODO: This is not quite the same as the PostGIS mask above
+ intersects_mask = 'overlapbdyintersect'
+
+ # Testing contains relation mask.
+ self.assertEqual('Texas', Country.objects.get(mpoly__relate=(pnt1, contains_mask)).name)
+ self.assertEqual('Texas', Country.objects.get(mpoly__relate=(pnt2, contains_mask)).name)
+
+ # Testing within relation mask.
+ ks = State.objects.get(name='Kansas')
+ self.assertEqual('Lawrence', City.objects.get(point__relate=(ks.poly, within_mask)).name)
+
+ # Testing intersection relation mask.
+ if not oracle:
+ self.assertEqual('Texas', Country.objects.get(mpoly__relate=(pnt1, intersects_mask)).name)
+ self.assertEqual('Texas', Country.objects.get(mpoly__relate=(pnt2, intersects_mask)).name)
+ self.assertEqual('Lawrence', City.objects.get(point__relate=(ks.poly, intersects_mask)).name)
+
+ def test16_createnull(self):
+ "Testing creating a model instance and the geometry being None"
+ if DISABLE: return
+ c = City()
+ self.assertEqual(c.point, None)
+
+ def test17_unionagg(self):
+ "Testing the `unionagg` (aggregate union) GeoManager method."
+ if DISABLE: return
+ tx = Country.objects.get(name='Texas').mpoly
+ # Houston, Dallas, San Antonio -- Oracle has different order.
+ union1 = fromstr('MULTIPOINT(-98.493183 29.424170,-96.801611 32.782057,-95.363151 29.763374)')
+ union2 = fromstr('MULTIPOINT(-96.801611 32.782057,-95.363151 29.763374,-98.493183 29.424170)')
+ qs = City.objects.filter(point__within=tx)
+ self.assertRaises(TypeError, qs.unionagg, 'name')
+ # Using `field_name` keyword argument in one query and specifying an
+ # order in the other (which should not be used because this is
+ # an aggregate method on a spatial column)
+ u1 = qs.unionagg(field_name='point')
+ u2 = qs.order_by('name').unionagg()
+ tol = 0.00001
+ if SpatialBackend.oracle:
+ union = union2
+ else:
+ union = union1
+ self.assertEqual(True, union.equals_exact(u1, tol))
+ self.assertEqual(True, union.equals_exact(u2, tol))
+ qs = City.objects.filter(name='NotACity')
+ self.assertEqual(None, qs.unionagg(field_name='point'))
+
+ def test18_geometryfield(self):
+ "Testing GeometryField."
+ if DISABLE: return
+ Feature(name='Point', geom=Point(1, 1)).save()
+ Feature(name='LineString', geom=LineString((0, 0), (1, 1), (5, 5))).save()
+ Feature(name='Polygon', geom=Polygon(LinearRing((0, 0), (0, 5), (5, 5), (5, 0), (0, 0)))).save()
+ Feature(name='GeometryCollection',
+ geom=GeometryCollection(Point(2, 2), LineString((0, 0), (2, 2)),
+ Polygon(LinearRing((0, 0), (0, 5), (5, 5), (5, 0), (0, 0))))).save()
+
+ f_1 = Feature.objects.get(name='Point')
+ self.assertEqual(True, isinstance(f_1.geom, Point))
+ self.assertEqual((1.0, 1.0), f_1.geom.tuple)
+ f_2 = Feature.objects.get(name='LineString')
+ self.assertEqual(True, isinstance(f_2.geom, LineString))
+ self.assertEqual(((0.0, 0.0), (1.0, 1.0), (5.0, 5.0)), f_2.geom.tuple)
+
+ f_3 = Feature.objects.get(name='Polygon')
+ self.assertEqual(True, isinstance(f_3.geom, Polygon))
+ f_4 = Feature.objects.get(name='GeometryCollection')
+ self.assertEqual(True, isinstance(f_4.geom, GeometryCollection))
+ self.assertEqual(f_3.geom, f_4.geom[2])
+
+ def test19_centroid(self):
+ "Testing the `centroid` GeoQuerySet method."
+ if DISABLE: return
+ qs = State.objects.exclude(poly__isnull=True).centroid()
+ if oracle: tol = 0.1
+ else: tol = 0.000000001
+ for s in qs:
+ self.assertEqual(True, s.poly.centroid.equals_exact(s.centroid, tol))
+
+ def test20_pointonsurface(self):
+ "Testing the `point_on_surface` GeoQuerySet method."
+ if DISABLE: return
+ # Reference values.
+ if SpatialBackend.oracle:
+ # SELECT SDO_UTIL.TO_WKTGEOMETRY(SDO_GEOM.SDO_POINTONSURFACE(GEOAPP_COUNTRY.MPOLY, 0.05)) FROM GEOAPP_COUNTRY;
+ ref = {'New Zealand' : fromstr('POINT (174.616364 -36.100861)', srid=4326),
+ 'Texas' : fromstr('POINT (-103.002434 36.500397)', srid=4326),
+ }
+ elif SpatialBackend.postgis:
+ # Using GEOSGeometry to compute the reference point on surface values
+ # -- since PostGIS also uses GEOS these should be the same.
+ ref = {'New Zealand' : Country.objects.get(name='New Zealand').mpoly.point_on_surface,
+ 'Texas' : Country.objects.get(name='Texas').mpoly.point_on_surface
+ }
+ for cntry in Country.objects.point_on_surface():
+ self.assertEqual(ref[cntry.name], cntry.point_on_surface)
+
+ @no_oracle
+ def test21_scale(self):
+ "Testing the `scale` GeoQuerySet method."
+ if DISABLE: return
+ xfac, yfac = 2, 3
+ qs = Country.objects.scale(xfac, yfac, model_att='scaled')
+ for c in qs:
+ for p1, p2 in zip(c.mpoly, c.scaled):
+ for r1, r2 in zip(p1, p2):
+ for c1, c2 in zip(r1.coords, r2.coords):
+ self.assertEqual(c1[0] * xfac, c2[0])
+ self.assertEqual(c1[1] * yfac, c2[1])
+
+ @no_oracle
+ def test22_translate(self):
+ "Testing the `translate` GeoQuerySet method."
+ if DISABLE: return
+ xfac, yfac = 5, -23
+ qs = Country.objects.translate(xfac, yfac, model_att='translated')
+ for c in qs:
+ for p1, p2 in zip(c.mpoly, c.translated):
+ for r1, r2 in zip(p1, p2):
+ for c1, c2 in zip(r1.coords, r2.coords):
+ self.assertEqual(c1[0] + xfac, c2[0])
+ self.assertEqual(c1[1] + yfac, c2[1])
+
+ def test23_numgeom(self):
+ "Testing the `num_geom` GeoQuerySet method."
+ if DISABLE: return
+ # Both 'countries' only have two geometries.
+ for c in Country.objects.num_geom(): self.assertEqual(2, c.num_geom)
+ for c in City.objects.filter(point__isnull=False).num_geom():
+ # Oracle will return 1 for the number of geometries on non-collections,
+ # whereas PostGIS will return None.
+ if postgis: self.assertEqual(None, c.num_geom)
+ else: self.assertEqual(1, c.num_geom)
+
+ def test24_numpoints(self):
+ "Testing the `num_points` GeoQuerySet method."
+ if DISABLE: return
+ for c in Country.objects.num_points(): self.assertEqual(c.mpoly.num_points, c.num_points)
+ if postgis:
+ # Oracle cannot count vertices in Point geometries.
+ for c in City.objects.num_points(): self.assertEqual(1, c.num_points)
+
+ @no_oracle
+ def test25_geoset(self):
+ "Testing the `difference`, `intersection`, `sym_difference`, and `union` GeoQuerySet methods."
+ if DISABLE: return
+ geom = Point(5, 23)
+ for c in Country.objects.all().intersection(geom).difference(geom).sym_difference(geom).union(geom):
+ self.assertEqual(c.mpoly.difference(geom), c.difference)
+ self.assertEqual(c.mpoly.intersection(geom), c.intersection)
+ self.assertEqual(c.mpoly.sym_difference(geom), c.sym_difference)
+ self.assertEqual(c.mpoly.union(geom), c.union)
+
+def suite():
+ s = unittest.TestSuite()
+ s.addTest(unittest.makeSuite(GeoModelTest))
+ return s
diff --git a/django/contrib/gis/tests/geoapp/tests_mysql.py b/django/contrib/gis/tests/geoapp/tests_mysql.py
new file mode 100644
index 0000000000..4e7c411f52
--- /dev/null
+++ b/django/contrib/gis/tests/geoapp/tests_mysql.py
@@ -0,0 +1,179 @@
+"""
+ A limited test module is used for a limited spatial database.
+"""
+import os, unittest
+from models import Country, City, State, Feature
+from django.contrib.gis import gdal
+from django.contrib.gis.geos import *
+from django.core.exceptions import ImproperlyConfigured
+
+class GeoModelTest(unittest.TestCase):
+
+ def test01_initial_sql(self):
+ "Testing geographic initial SQL."
+ # Ensuring that data was loaded from initial SQL.
+ self.assertEqual(2, Country.objects.count())
+ self.assertEqual(8, City.objects.count())
+ self.assertEqual(2, State.objects.count())
+
+ def test02_proxy(self):
+ "Testing Lazy-Geometry support (using the GeometryProxy)."
+ #### Testing on a Point
+ pnt = Point(0, 0)
+ nullcity = City(name='NullCity', point=pnt)
+ nullcity.save()
+
+ # Making sure TypeError is thrown when trying to set with an
+ # incompatible type.
+ for bad in [5, 2.0, LineString((0, 0), (1, 1))]:
+ try:
+ nullcity.point = bad
+ except TypeError:
+ pass
+ else:
+ self.fail('Should throw a TypeError')
+
+ # Now setting with a compatible GEOS Geometry, saving, and ensuring
+ # the save took, notice no SRID is explicitly set.
+ new = Point(5, 23)
+ nullcity.point = new
+
+ # Ensuring that the SRID is automatically set to that of the
+ # field after assignment, but before saving.
+ self.assertEqual(4326, nullcity.point.srid)
+ nullcity.save()
+
+ # Ensuring the point was saved correctly after saving
+ self.assertEqual(new, City.objects.get(name='NullCity').point)
+
+ # Setting the X and Y of the Point
+ nullcity.point.x = 23
+ nullcity.point.y = 5
+ # Checking assignments pre & post-save.
+ self.assertNotEqual(Point(23, 5), City.objects.get(name='NullCity').point)
+ nullcity.save()
+ self.assertEqual(Point(23, 5), City.objects.get(name='NullCity').point)
+ nullcity.delete()
+
+ #### Testing on a Polygon
+ shell = LinearRing((0, 0), (0, 100), (100, 100), (100, 0), (0, 0))
+ inner = LinearRing((40, 40), (40, 60), (60, 60), (60, 40), (40, 40))
+
+ # Creating a State object using a built Polygon
+ ply = Polygon(shell, inner)
+ nullstate = State(name='NullState', poly=ply)
+ self.assertEqual(4326, nullstate.poly.srid) # SRID auto-set from None
+ nullstate.save()
+
+ ns = State.objects.get(name='NullState')
+ self.assertEqual(ply, ns.poly)
+
+ # Testing the `ogr` and `srs` lazy-geometry properties.
+ if gdal.HAS_GDAL:
+ self.assertEqual(True, isinstance(ns.poly.ogr, gdal.OGRGeometry))
+ self.assertEqual(ns.poly.wkb, ns.poly.ogr.wkb)
+ self.assertEqual(True, isinstance(ns.poly.srs, gdal.SpatialReference))
+ self.assertEqual('WGS 84', ns.poly.srs.name)
+
+ # Changing the interior ring on the poly attribute.
+ new_inner = LinearRing((30, 30), (30, 70), (70, 70), (70, 30), (30, 30))
+ ns.poly[1] = new_inner
+ ply[1] = new_inner
+ self.assertEqual(4326, ns.poly.srid)
+ ns.save()
+ self.assertEqual(ply, State.objects.get(name='NullState').poly)
+ ns.delete()
+
+ def test03_contains_contained(self):
+ "Testing the 'contained', 'contains', and 'bbcontains' lookup types."
+ # Getting Texas, yes we were a country -- once ;)
+ texas = Country.objects.get(name='Texas')
+
+ # Seeing what cities are in Texas, should get Houston and Dallas,
+ # and Oklahoma City because MySQL 'within' only checks on the
+ # _bounding box_ of the Geometries.
+ qs = City.objects.filter(point__within=texas.mpoly)
+ self.assertEqual(3, qs.count())
+ cities = ['Houston', 'Dallas', 'Oklahoma City']
+ for c in qs: self.assertEqual(True, c.name in cities)
+
+ # Pulling out some cities.
+ houston = City.objects.get(name='Houston')
+ wellington = City.objects.get(name='Wellington')
+ pueblo = City.objects.get(name='Pueblo')
+ okcity = City.objects.get(name='Oklahoma City')
+ lawrence = City.objects.get(name='Lawrence')
+
+ # Now testing contains on the countries using the points for
+ # Houston and Wellington.
+ tx = Country.objects.get(mpoly__contains=houston.point) # Query w/GEOSGeometry
+ nz = Country.objects.get(mpoly__contains=wellington.point.hex) # Query w/EWKBHEX
+ ks = State.objects.get(poly__contains=lawrence.point)
+ self.assertEqual('Texas', tx.name)
+ self.assertEqual('New Zealand', nz.name)
+ self.assertEqual('Kansas', ks.name)
+
+ # Pueblo is not contained in Texas or New Zealand.
+ self.assertEqual(0, len(Country.objects.filter(mpoly__contains=pueblo.point))) # Query w/GEOSGeometry object
+
+ # OK City is contained w/in bounding box of Texas.
+ qs = Country.objects.filter(mpoly__bbcontains=okcity.point)
+ self.assertEqual(1, len(qs))
+ self.assertEqual('Texas', qs[0].name)
+
+ def test04_disjoint(self):
+ "Testing the `disjoint` lookup type."
+ ptown = City.objects.get(name='Pueblo')
+ qs1 = City.objects.filter(point__disjoint=ptown.point)
+ self.assertEqual(7, qs1.count())
+ # TODO: This query should work in MySQL, but it appears the
+ # `MBRDisjoint` function doesn't work properly (I went down
+ # to the SQL level for debugging and still got bogus answers).
+ #qs2 = State.objects.filter(poly__disjoint=ptown.point)
+ #self.assertEqual(1, qs2.count())
+ #self.assertEqual('Kansas', qs2[0].name)
+
+ def test05_equals(self):
+ "Testing the 'same_as' and 'equals' lookup types."
+ pnt = fromstr('POINT (-95.363151 29.763374)', srid=4326)
+ c1 = City.objects.get(point=pnt)
+ c2 = City.objects.get(point__same_as=pnt)
+ c3 = City.objects.get(point__equals=pnt)
+ for c in [c1, c2, c3]: self.assertEqual('Houston', c.name)
+
+ def test06_geometryfield(self):
+ "Testing GeometryField."
+ f1 = Feature(name='Point', geom=Point(1, 1))
+ f2 = Feature(name='LineString', geom=LineString((0, 0), (1, 1), (5, 5)))
+ f3 = Feature(name='Polygon', geom=Polygon(LinearRing((0, 0), (0, 5), (5, 5), (5, 0), (0, 0))))
+ f4 = Feature(name='GeometryCollection',
+ geom=GeometryCollection(Point(2, 2), LineString((0, 0), (2, 2)),
+ Polygon(LinearRing((0, 0), (0, 5), (5, 5), (5, 0), (0, 0)))))
+ f1.save()
+ f2.save()
+ f3.save()
+ f4.save()
+
+ f_1 = Feature.objects.get(name='Point')
+ self.assertEqual(True, isinstance(f_1.geom, Point))
+ self.assertEqual((1.0, 1.0), f_1.geom.tuple)
+ f_2 = Feature.objects.get(name='LineString')
+ self.assertEqual(True, isinstance(f_2.geom, LineString))
+ self.assertEqual(((0.0, 0.0), (1.0, 1.0), (5.0, 5.0)), f_2.geom.tuple)
+
+ f_3 = Feature.objects.get(name='Polygon')
+ self.assertEqual(True, isinstance(f_3.geom, Polygon))
+ f_4 = Feature.objects.get(name='GeometryCollection')
+ self.assertEqual(True, isinstance(f_4.geom, GeometryCollection))
+ self.assertEqual(f_3.geom, f_4.geom[2])
+
+ def test07_mysql_limitations(self):
+ "Testing that union(), kml(), gml() raise exceptions."
+ self.assertRaises(ImproperlyConfigured, City.objects.union, Point(5, 23), field_name='point')
+ self.assertRaises(ImproperlyConfigured, State.objects.all().kml, field_name='poly')
+ self.assertRaises(ImproperlyConfigured, Country.objects.all().gml, field_name='mpoly')
+
+def suite():
+ s = unittest.TestSuite()
+ s.addTest(unittest.makeSuite(GeoModelTest))
+ return s
diff --git a/django/contrib/gis/tests/geometries.py b/django/contrib/gis/tests/geometries.py
new file mode 100644
index 0000000000..e9bc6f618b
--- /dev/null
+++ b/django/contrib/gis/tests/geometries.py
@@ -0,0 +1,157 @@
+import re
+
+wkt_regex = re.compile(r'^(?P<type>[A-Z]+) ?\(')
+
+class TestGeom:
+ "The Test Geometry class container."
+ def __init__(self, wkt, **kwargs):
+ self.wkt = wkt
+
+ self.bad = kwargs.pop('bad', False)
+
+ if not self.bad:
+ m = wkt_regex.match(wkt)
+ if not m:
+ raise Exception, 'Improper WKT: "%s"' % wkt
+ self.geo_type = m.group('type')
+
+ for key, value in kwargs.items():
+ setattr(self, key, value)
+
+# For the old tests
+swig_geoms = (TestGeom('POLYGON ((0 0, 0 100, 100 100, 100 0, 0 0))', ncoords=5),
+ TestGeom('POLYGON ((0 0, 0 100, 100 100, 100 0, 0 0), (10 10, 10 90, 90 90, 90 10, 10 10) ))', ncoords=10),
+ )
+
+# Testing WKT & HEX
+hex_wkt = (TestGeom('POINT(0 1)', hex='01010000000000000000000000000000000000F03F'),
+ TestGeom('LINESTRING(0 1, 2 3, 4 5)', hex='0102000000030000000000000000000000000000000000F03F0000000000000040000000000000084000000000000010400000000000001440'),
+ TestGeom('POLYGON((0 0, 10 0, 10 10, 0 10, 0 0))', hex='010300000001000000050000000000000000000000000000000000000000000000000024400000000000000000000000000000244000000000000024400000000000000000000000000000244000000000000000000000000000000000'),
+ TestGeom('MULTIPOINT(0 0, 10 0, 10 10, 0 10, 0 0)', hex='010400000005000000010100000000000000000000000000000000000000010100000000000000000024400000000000000000010100000000000000000024400000000000002440010100000000000000000000000000000000002440010100000000000000000000000000000000000000'),
+ TestGeom('MULTILINESTRING((0 0, 10 0, 10 10, 0 10),(20 20, 30 20))', hex='01050000000200000001020000000400000000000000000000000000000000000000000000000000244000000000000000000000000000002440000000000000244000000000000000000000000000002440010200000002000000000000000000344000000000000034400000000000003E400000000000003440'),
+ TestGeom('MULTIPOLYGON(((0 0, 10 0, 10 10, 0 10, 0 0)),((20 20, 20 30, 30 30, 30 20, 20 20),(25 25, 25 26, 26 26, 26 25, 25 25)))', hex='010600000002000000010300000001000000050000000000000000000000000000000000000000000000000024400000000000000000000000000000244000000000000024400000000000000000000000000000244000000000000000000000000000000000010300000002000000050000000000000000003440000000000000344000000000000034400000000000003E400000000000003E400000000000003E400000000000003E40000000000000344000000000000034400000000000003440050000000000000000003940000000000000394000000000000039400000000000003A400000000000003A400000000000003A400000000000003A40000000000000394000000000000039400000000000003940'),
+ TestGeom('GEOMETRYCOLLECTION(MULTIPOLYGON(((0 0, 10 0, 10 10, 0 10, 0 0)),((20 20, 20 30, 30 30, 30 20, 20 20),(25 25, 25 26, 26 26, 26 25, 25 25))),MULTILINESTRING((0 0, 10 0, 10 10, 0 10),(20 20, 30 20)),MULTIPOINT(0 0, 10 0, 10 10, 0 10, 0 0))', hex='010700000003000000010600000002000000010300000001000000050000000000000000000000000000000000000000000000000024400000000000000000000000000000244000000000000024400000000000000000000000000000244000000000000000000000000000000000010300000002000000050000000000000000003440000000000000344000000000000034400000000000003E400000000000003E400000000000003E400000000000003E40000000000000344000000000000034400000000000003440050000000000000000003940000000000000394000000000000039400000000000003A400000000000003A400000000000003A400000000000003A4000000000000039400000000000003940000000000000394001050000000200000001020000000400000000000000000000000000000000000000000000000000244000000000000000000000000000002440000000000000244000000000000000000000000000002440010200000002000000000000000000344000000000000034400000000000003E400000000000003440010400000005000000010100000000000000000000000000000000000000010100000000000000000024400000000000000000010100000000000000000024400000000000002440010100000000000000000000000000000000002440010100000000000000000000000000000000000000'),
+ )
+
+# WKT, GML, KML output
+wkt_out = (TestGeom('POINT (110 130)', ewkt='POINT (110.0000000000000000 130.0000000000000000)', kml='<Point><coordinates>110.0,130.0,0</coordinates></Point>', gml='<gml:Point><gml:coordinates>110,130</gml:coordinates></gml:Point>'),
+ TestGeom('LINESTRING (40 40,50 130,130 130)', ewkt='LINESTRING (40.0000000000000000 40.0000000000000000, 50.0000000000000000 130.0000000000000000, 130.0000000000000000 130.0000000000000000)', kml='<LineString><coordinates>40.0,40.0,0 50.0,130.0,0 130.0,130.0,0</coordinates></LineString>', gml='<gml:LineString><gml:coordinates>40,40 50,130 130,130</gml:coordinates></gml:LineString>'),
+ TestGeom('POLYGON ((150 150,410 150,280 20,20 20,150 150),(170 120,330 120,260 50,100 50,170 120))', ewkt='POLYGON ((150.0000000000000000 150.0000000000000000, 410.0000000000000000 150.0000000000000000, 280.0000000000000000 20.0000000000000000, 20.0000000000000000 20.0000000000000000, 150.0000000000000000 150.0000000000000000), (170.0000000000000000 120.0000000000000000, 330.0000000000000000 120.0000000000000000, 260.0000000000000000 50.0000000000000000, 100.0000000000000000 50.0000000000000000, 170.0000000000000000 120.0000000000000000))', kml='<Polygon><outerBoundaryIs><LinearRing><coordinates>150.0,150.0,0 410.0,150.0,0 280.0,20.0,0 20.0,20.0,0 150.0,150.0,0</coordinates></LinearRing></outerBoundaryIs><innerBoundaryIs><LinearRing><coordinates>170.0,120.0,0 330.0,120.0,0 260.0,50.0,0 100.0,50.0,0 170.0,120.0,0</coordinates></LinearRing></innerBoundaryIs></Polygon>', gml='<gml:Polygon><gml:outerBoundaryIs><gml:LinearRing><gml:coordinates>150,150 410,150 280,20 20,20 150,150</gml:coordinates></gml:LinearRing></gml:outerBoundaryIs><gml:innerBoundaryIs><gml:LinearRing><gml:coordinates>170,120 330,120 260,50 100,50 170,120</gml:coordinates></gml:LinearRing></gml:innerBoundaryIs></gml:Polygon>'),
+ TestGeom('MULTIPOINT (10 80,110 170,110 120)', ewkt='MULTIPOINT (10.0000000000000000 80.0000000000000000, 110.0000000000000000 170.0000000000000000, 110.0000000000000000 120.0000000000000000)', kml='<MultiGeometry><Point><coordinates>10.0,80.0,0</coordinates></Point><Point><coordinates>110.0,170.0,0</coordinates></Point><Point><coordinates>110.0,120.0,0</coordinates></Point></MultiGeometry>', gml='<gml:MultiPoint><gml:pointMember><gml:Point><gml:coordinates>10,80</gml:coordinates></gml:Point></gml:pointMember><gml:pointMember><gml:Point><gml:coordinates>110,170</gml:coordinates></gml:Point></gml:pointMember><gml:pointMember><gml:Point><gml:coordinates>110,120</gml:coordinates></gml:Point></gml:pointMember></gml:MultiPoint>'),
+ TestGeom('MULTILINESTRING ((110 100,40 30,180 30),(170 30,110 90,50 30))', ewkt='MULTILINESTRING ((110.0000000000000000 100.0000000000000000, 40.0000000000000000 30.0000000000000000, 180.0000000000000000 30.0000000000000000), (170.0000000000000000 30.0000000000000000, 110.0000000000000000 90.0000000000000000, 50.0000000000000000 30.0000000000000000))', kml='<MultiGeometry><LineString><coordinates>110.0,100.0,0 40.0,30.0,0 180.0,30.0,0</coordinates></LineString><LineString><coordinates>170.0,30.0,0 110.0,90.0,0 50.0,30.0,0</coordinates></LineString></MultiGeometry>', gml='<gml:MultiLineString><gml:lineStringMember><gml:LineString><gml:coordinates>110,100 40,30 180,30</gml:coordinates></gml:LineString></gml:lineStringMember><gml:lineStringMember><gml:LineString><gml:coordinates>170,30 110,90 50,30</gml:coordinates></gml:LineString></gml:lineStringMember></gml:MultiLineString>'),
+ TestGeom('MULTIPOLYGON (((110 110,70 200,150 200,110 110),(110 110,100 180,120 180,110 110)),((110 110,150 20,70 20,110 110),(110 110,120 40,100 40,110 110)))', ewkt='MULTIPOLYGON (((110.0000000000000000 110.0000000000000000, 70.0000000000000000 200.0000000000000000, 150.0000000000000000 200.0000000000000000, 110.0000000000000000 110.0000000000000000), (110.0000000000000000 110.0000000000000000, 100.0000000000000000 180.0000000000000000, 120.0000000000000000 180.0000000000000000, 110.0000000000000000 110.0000000000000000)), ((110.0000000000000000 110.0000000000000000, 150.0000000000000000 20.0000000000000000, 70.0000000000000000 20.0000000000000000, 110.0000000000000000 110.0000000000000000), (110.0000000000000000 110.0000000000000000, 120.0000000000000000 40.0000000000000000, 100.0000000000000000 40.0000000000000000, 110.0000000000000000 110.0000000000000000)))', kml='<MultiGeometry><Polygon><outerBoundaryIs><LinearRing><coordinates>110.0,110.0,0 70.0,200.0,0 150.0,200.0,0 110.0,110.0,0</coordinates></LinearRing></outerBoundaryIs><innerBoundaryIs><LinearRing><coordinates>110.0,110.0,0 100.0,180.0,0 120.0,180.0,0 110.0,110.0,0</coordinates></LinearRing></innerBoundaryIs></Polygon><Polygon><outerBoundaryIs><LinearRing><coordinates>110.0,110.0,0 150.0,20.0,0 70.0,20.0,0 110.0,110.0,0</coordinates></LinearRing></outerBoundaryIs><innerBoundaryIs><LinearRing><coordinates>110.0,110.0,0 120.0,40.0,0 100.0,40.0,0 110.0,110.0,0</coordinates></LinearRing></innerBoundaryIs></Polygon></MultiGeometry>', gml='<gml:MultiPolygon><gml:polygonMember><gml:Polygon><gml:outerBoundaryIs><gml:LinearRing><gml:coordinates>110,110 70,200 150,200 110,110</gml:coordinates></gml:LinearRing></gml:outerBoundaryIs><gml:innerBoundaryIs><gml:LinearRing><gml:coordinates>110,110 100,180 120,180 110,110</gml:coordinates></gml:LinearRing></gml:innerBoundaryIs></gml:Polygon></gml:polygonMember><gml:polygonMember><gml:Polygon><gml:outerBoundaryIs><gml:LinearRing><gml:coordinates>110,110 150,20 70,20 110,110</gml:coordinates></gml:LinearRing></gml:outerBoundaryIs><gml:innerBoundaryIs><gml:LinearRing><gml:coordinates>110,110 120,40 100,40 110,110</gml:coordinates></gml:LinearRing></gml:innerBoundaryIs></gml:Polygon></gml:polygonMember></gml:MultiPolygon>'),
+ TestGeom('GEOMETRYCOLLECTION (POINT (110 260),LINESTRING (110 0,110 60))', ewkt='GEOMETRYCOLLECTION (POINT (110.0000000000000000 260.0000000000000000), LINESTRING (110.0000000000000000 0.0000000000000000, 110.0000000000000000 60.0000000000000000))', kml='<MultiGeometry><Point><coordinates>110.0,260.0,0</coordinates></Point><LineString><coordinates>110.0,0.0,0 110.0,60.0,0</coordinates></LineString></MultiGeometry>', gml='<gml:GeometryCollection><gml:geometryMember><gml:Point><gml:coordinates>110,260</gml:coordinates></gml:Point></gml:geometryMember><gml:geometryMember><gml:LineString><gml:coordinates>110,0 110,60</gml:coordinates></gml:LineString></gml:geometryMember></gml:GeometryCollection>'),
+ )
+
+# Errors
+errors = (TestGeom('GEOMETR##!@#%#............a32515', bad=True, hex=False),
+ TestGeom('Foo.Bar', bad=True, hex=False),
+ TestGeom('POINT (5, 23)', bad=True, hex=False),
+ TestGeom('AAABBBDDDAAD##@#1113511111-098111111111111111533333333333333', bad=True, hex=True),
+ TestGeom('FFFFFFFFFFFFFFFFF1355555555555555555565111', bad=True, hex=True),
+ TestGeom('', bad=True, hex=False),
+ )
+
+# Polygons
+polygons = (TestGeom('POLYGON ((0 0, 0 100, 100 100, 100 0, 0 0), (10 10, 10 90, 90 90, 90 10, 10 10))',
+ n_i=1, ext_ring_cs=((0, 0), (0, 100), (100, 100), (100, 0), (0, 0)), n_p=10, area=3600.0, centroid=(50., 50.),
+ ),
+ TestGeom('POLYGON ((0 0, 0 100, 100 100, 100 0, 0 0), (10 10, 10 20, 20 20, 20 10, 10 10), (80 80, 80 90, 90 90, 90 80, 80 80))',
+ n_i=2, ext_ring_cs=((0, 0), (0, 100), (100, 100), (100, 0), (0, 0)), n_p=15, area=9800.0, centroid=(50., 50.),
+ ),
+ TestGeom('POLYGON ((0 0, 0 100, 100 100, 100 0, 0 0))',
+ n_i=0, ext_ring_cs=((0, 0), (0, 100), (100, 100), (100, 0), (0, 0)), n_p=5, area=10000.0, centroid=(50., 50.),
+ ),
+ TestGeom('POLYGON ((-95.3848703124799471 29.7056021479768511, -95.3851905195191847 29.7046588196500281, -95.3859356966379011 29.7025053545605502, -95.3860723000647539 29.7020963367038391, -95.3871517697222089 29.6989779021280995, -95.3865578518265522 29.6990856888057202, -95.3862634205175226 29.6999471753441782, -95.3861991779541967 29.6999591988978615, -95.3856773799358137 29.6998323107113578, -95.3856209915427229 29.6998005235473741, -95.3855833545501639 29.6996619391729801, -95.3855776331865002 29.6996232659570047, -95.3850162731712885 29.6997236706530536, -95.3831047357410284 29.7000847603095082, -95.3829800724914776 29.7000676365023502, -95.3828084594470909 29.6999969684031200, -95.3828131504821499 29.6999090511531065, -95.3828022942979601 29.6998152117366025, -95.3827893930918833 29.6997790953076759, -95.3825174668099862 29.6998267772748825, -95.3823521544804862 29.7000451723151606, -95.3820491918785223 29.6999682034582335, -95.3817932841505893 29.6999640407204772, -95.3815438924600443 29.7005983712500630, -95.3807812390843424 29.7007538492921590, -95.3778578936435935 29.7012966201172048, -95.3770817300034679 29.7010555145969093, -95.3772763716395957 29.7004995005932031, -95.3769891024414420 29.7005797730360186, -95.3759855007185990 29.7007754783987821, -95.3759516423090474 29.7007305400669388, -95.3765252155960042 29.6989549173240874, -95.3766842746727832 29.6985134987163164, -95.3768510987262914 29.6980530300744938, -95.3769198676258014 29.6977137204527573, -95.3769616670751930 29.6973351617272172, -95.3770309229297766 29.6969821084304186, -95.3772352596880637 29.6959751305871613, -95.3776232419333354 29.6945439060847463, -95.3776849628727064 29.6943364710766069, -95.3779699491714723 29.6926548349458947, -95.3781945479573494 29.6920088336742545, -95.3785807118394189 29.6908279316076005, -95.3787441368896651 29.6908846275832197, -95.3787903214163890 29.6907152912461640, -95.3791765069353659 29.6893335376821526, -95.3794935959513026 29.6884781789101595, -95.3796592071232112 29.6880066681407619, -95.3799788182090111 29.6873687353035081, -95.3801545516183893 29.6868782380716993, -95.3801258908302145 29.6867756621337762, -95.3801104284899566 29.6867229678809572, -95.3803803523746154 29.6863753372986459, -95.3821028558287622 29.6837392961470421, -95.3827289584682205 29.6828097375216160, -95.3827494698109035 29.6790739156259278, -95.3826022014838486 29.6776502228345507, -95.3825047356438063 29.6765773006280753, -95.3823473035336917 29.6750405250369127, -95.3824540163482055 29.6750076408228587, -95.3838984230304305 29.6745679207378679, -95.3916547074937426 29.6722459226508377, -95.3926154662749468 29.6719609085105489, -95.3967246645118081 29.6707316485589736, -95.3974588054406780 29.6705065336410989, -95.3978523748756828 29.6703795547846845, -95.3988598162279970 29.6700874981900853, -95.3995628600665952 29.6698505300412414, -95.4134721665944170 29.6656841279906232, -95.4143262068232616 29.6654291174019278, -95.4159685142480214 29.6649750989232288, -95.4180067396277565 29.6643253024318021, -95.4185886692196590 29.6641482768691063, -95.4234155309609662 29.6626925393704788, -95.4287785503196346 29.6611023620959706, -95.4310287312749352 29.6604222580752648, -95.4320295629628959 29.6603361318136720, -95.4332899683975739 29.6600560661713608, -95.4342675748811047 29.6598454934599900, -95.4343110414310871 29.6598411486215490, -95.4345576779282538 29.6598147020668499, -95.4348823041721630 29.6597875803673112, -95.4352827715209457 29.6597762346946681, -95.4355290431309982 29.6597827926562374, -95.4359197997999331 29.6598014511782715, -95.4361907884752156 29.6598444333523368, -95.4364608955807228 29.6598901433108217, -95.4367250147512323 29.6599494499910712, -95.4364898759758091 29.6601880616540186, -95.4354501111810691 29.6616378572201107, -95.4381459623171224 29.6631265631655126, -95.4367852490863129 29.6642266600024023, -95.4370040894557263 29.6643425389568769, -95.4367078350812648 29.6645492592343238, -95.4366081749871285 29.6646291473027297, -95.4358539359938192 29.6652308742342932, -95.4350327668927889 29.6658995989314462, -95.4350580905272921 29.6678812477895271, -95.4349710541447536 29.6680054925936965, -95.4349500440473548 29.6671410080890006, -95.4341492724148850 29.6678790545191688, -95.4340248868274728 29.6680353198492135, -95.4333227845797438 29.6689245624945990, -95.4331325652123326 29.6691616138940901, -95.4321314741096955 29.6704473333237253, -95.4320435792664341 29.6702578985411982, -95.4320147929883547 29.6701800936425109, -95.4319764538662980 29.6683246590817085, -95.4317490976340679 29.6684974372577166, -95.4305958185342718 29.6694049049170374, -95.4296600735653016 29.6701723430938493, -95.4284928989940937 29.6710931793380972, -95.4274630532378580 29.6719378813640091, -95.4273056811974811 29.6720684984625791, -95.4260554084574864 29.6730668861566969, -95.4253558063699643 29.6736342467365724, -95.4249278826026028 29.6739557343648919, -95.4248648873821423 29.6745400910786152, -95.4260016131471929 29.6750987014005858, -95.4258567183010911 29.6753452063069929, -95.4260238081486847 29.6754322077221353, -95.4258707374502393 29.6756647377294307, -95.4257951755816691 29.6756407098663360, -95.4257701599566985 29.6761077719536068, -95.4257726684792260 29.6761711204603955, -95.4257980187195614 29.6770219651929423, -95.4252712669032519 29.6770161558853758, -95.4249234392992065 29.6770068683962300, -95.4249574272905789 29.6779707498635759, -95.4244725881033702 29.6779825646764159, -95.4222269476429545 29.6780711474441716, -95.4223032371999267 29.6796029391538809, -95.4239133706588945 29.6795331493690355, -95.4224579084327331 29.6813706893847780, -95.4224290108823965 29.6821953228763924, -95.4230916478977349 29.6822130268724109, -95.4222928279595521 29.6832041816675343, -95.4228763710016352 29.6832087677714505, -95.4223401691637179 29.6838987872753748, -95.4211655906087088 29.6838784024852984, -95.4201984153205558 29.6851319258758082, -95.4206156387716362 29.6851623398125319, -95.4213438084897660 29.6851763011334739, -95.4212071118618752 29.6853679931624974, -95.4202651399651245 29.6865313962980508, -95.4172061157659783 29.6865816431043932, -95.4182217951255183 29.6872251197301544, -95.4178664826439160 29.6876750901471631, -95.4180678442928780 29.6877960336377207, -95.4188763472917572 29.6882826379510938, -95.4185374500596311 29.6887137897831934, -95.4182121713132290 29.6885097429738813, -95.4179857231741551 29.6888118367840086, -95.4183106010563620 29.6890048676118212, -95.4179489865331334 29.6894546700979056, -95.4175581746284820 29.6892323606815438, -95.4173439957341571 29.6894990139807007, -95.4177411199311081 29.6897435034738422, -95.4175789200209721 29.6899207529979208, -95.4170598559864800 29.6896042165807508, -95.4166733682539814 29.6900891174451367, -95.4165941362704331 29.6900347214235047, -95.4163537218065301 29.6903529467753238, -95.4126843270708775 29.6881086357212780, -95.4126604121378392 29.6880942378803496, -95.4126672298953338 29.6885951670109982, -95.4126680884821923 29.6887052446594275, -95.4158080137241882 29.6906382377959339, -95.4152061403821961 29.6910871045531586, -95.4155842583188161 29.6917382915894308, -95.4157426793520358 29.6920726941677096, -95.4154520563662203 29.6922052332446427, -95.4151389936167078 29.6923261661269571, -95.4148649784384872 29.6924343866430256, -95.4144051352401590 29.6925623927348106, -95.4146792019416665 29.6926770338507744, -95.4148824479948985 29.6928117893696388, -95.4149851734360226 29.6929823719519774, -95.4140436551925291 29.6929626643100946, -95.4140465993023241 29.6926545917254892, -95.4137269186733334 29.6927395764256090, -95.4137372859685513 29.6935432485666624, -95.4135702836218655 29.6933186678088283, -95.4133925235973237 29.6930415229852152, -95.4133017035615580 29.6928685062036166, -95.4129588921634593 29.6929391128977862, -95.4125107395559695 29.6930481664661485, -95.4102647423187307 29.6935850183258019, -95.4081931340840157 29.6940907430947760, -95.4078783596459772 29.6941703429951609, -95.4049213975000043 29.6948723732981961, -95.4045944244127071 29.6949626434239207, -95.4045865139788134 29.6954109019001358, -95.4045953345484037 29.6956972800496963, -95.4038879332535146 29.6958296089365490, -95.4040366394459340 29.6964389004769842, -95.4032774779020798 29.6965643341263892, -95.4026066501239853 29.6966646227683881, -95.4024991226393837 29.6961389766619703, -95.4011781398631911 29.6963566063186377, -95.4011524097636112 29.6962596176762190, -95.4018184046368276 29.6961399466727336, -95.4016995838361908 29.6956442609415099, -95.4007100753964608 29.6958900524002978, -95.4008032469935188 29.6962639900781404, -95.3995660267125487 29.6965636449370329, -95.3996140564775601 29.6967877962763644, -95.3996364430014410 29.6968901984825280, -95.3984003269631842 29.6968679634805746, -95.3981442026887265 29.6983660679730335, -95.3980178461957706 29.6990890276252415, -95.3977097967130163 29.7008526152273049, -95.3962347157626027 29.7009697553607630, -95.3951949050136250 29.7004740386619019, -95.3957564950617183 29.6990281830553187, -95.3965927101519924 29.6968771129030706, -95.3957496517238184 29.6970800358387095, -95.3957720559467361 29.6972264611230727, -95.3957391586571788 29.6973548894558732, -95.3956286413405365 29.6974949857280883, -95.3955111053256957 29.6975661086270186, -95.3953215342724121 29.6976022763384790, -95.3951795558443365 29.6975846977491038, -95.3950369632041060 29.6975175779330200, -95.3949401089966500 29.6974269267953304, -95.3948740281415581 29.6972903308506346, -95.3946650813866910 29.6973397326847923, -95.3947654059391112 29.6974882560192022, -95.3949627316619768 29.6980355864961858, -95.3933200807862249 29.6984590863712796, -95.3932606497523494 29.6984464798710839, -95.3932983699113350 29.6983154306484352, -95.3933058014696655 29.6982165816983610, -95.3932946347785133 29.6981089778195759, -95.3931780601756287 29.6977068906794841, -95.3929928222970602 29.6977541771878180, -95.3930873169846478 29.6980676264932946, -95.3932743746374570 29.6981249406449663, -95.3929512584706316 29.6989526513922222, -95.3919850280655197 29.7014358632108646, -95.3918950918929056 29.7014169320765724, -95.3916928317890296 29.7019232352846423, -95.3915424614970959 29.7022988712928289, -95.3901530441668939 29.7058519502930061, -95.3899656322116698 29.7059156823562418, -95.3897628748670883 29.7059900058266777, -95.3896062677805787 29.7060738276384946, -95.3893941800512266 29.7061891695242046, -95.3892150365492455 29.7062641292949436, -95.3890502563035199 29.7063339729630940, -95.3888717930715586 29.7063896908080736, -95.3886925428988945 29.7064453871994978, -95.3885376849411983 29.7064797304524149, -95.3883284158984139 29.7065153575050189, -95.3881046767627794 29.7065368368267357, -95.3878809284696132 29.7065363048447537, -95.3876046356120924 29.7065288525102424, -95.3873060894974714 29.7064822806001452, -95.3869851943158409 29.7063993367575350, -95.3865967896568065 29.7062870572919202, -95.3861785624983156 29.7061492099008184, -95.3857375009733488 29.7059887337478798, -95.3854573290902152 29.7058683664514618, -95.3848703124799471 29.7056021479768511))',
+ n_i=0, ext_ring_cs=False, n_p=264, area=0.00129917360654, centroid=(-95.403569179437341, 29.681772571690402),
+ ),
+ )
+
+# MultiPolygons
+multipolygons = (TestGeom('MULTIPOLYGON (((100 20, 180 20, 180 100, 100 100, 100 20)), ((20 100, 100 100, 100 180, 20 180, 20 100)), ((100 180, 180 180, 180 260, 100 260, 100 180)), ((180 100, 260 100, 260 180, 180 180, 180 100)))', valid=True, num_geom=4, n_p=20),
+ TestGeom('MULTIPOLYGON (((60 300, 320 220, 260 60, 60 100, 60 300)), ((60 300, 320 220, 260 60, 60 100, 60 300)))', valid=False),
+ TestGeom('MULTIPOLYGON (((180 60, 240 160, 300 60, 180 60)), ((80 80, 180 60, 160 140, 240 160, 360 140, 300 60, 420 100, 320 280, 120 260, 80 80)))', valid=True, num_geom=2, n_p=14),
+ )
+
+# Points
+points = (TestGeom('POINT (5 23)', x=5.0, y=23.0, centroid=(5.0, 23.0)),
+ TestGeom('POINT (-95.338492 29.723893)', x=-95.338492, y=29.723893, centroid=(-95.338492, 29.723893)),
+ TestGeom('POINT(1.234 5.678)', x=1.234, y=5.678, centroid=(1.234, 5.678)),
+ TestGeom('POINT(4.321 8.765)', x=4.321, y=8.765, centroid=(4.321, 8.765)),
+ TestGeom('POINT(10 10)', x=10, y=10, centroid=(10., 10.)),
+ TestGeom('POINT (5 23 8)', x=5.0, y=23.0, z=8.0, centroid=(5.0, 23.0)),
+ )
+
+# MultiPoints
+multipoints = (TestGeom('MULTIPOINT(10 10, 20 20 )', n_p=2, points=((10., 10.), (20., 20.)), centroid=(15., 15.)),
+ TestGeom('MULTIPOINT(10 10, 20 20, 10 20, 20 10)',
+ n_p=4, points=((10., 10.), (20., 20.), (10., 20.), (20., 10.)),
+ centroid=(15., 15.)),
+ )
+
+# LineStrings
+linestrings = (TestGeom('LINESTRING (60 180, 120 100, 180 180)', n_p=3, centroid=(120, 140), tup=((60, 180), (120, 100), (180, 180))),
+ TestGeom('LINESTRING (0 0, 5 5, 10 5, 10 10)', n_p=4, centroid=(6.1611652351681556, 4.6966991411008934), tup=((0, 0), (5, 5), (10, 5), (10, 10)),),
+ )
+
+# Linear Rings
+linearrings = (TestGeom('LINEARRING (649899.3065171393100172 4176512.3807915160432458, 649902.7294133581453934 4176512.7834989596158266, 649906.5550170192727819 4176514.3942507002502680, 649910.5820134161040187 4176516.0050024418160319, 649914.4076170771149918 4176518.0184616246260703, 649917.2264131171396002 4176519.4278986593708396, 649920.0452871860470623 4176521.6427505780011415, 649922.0587463703704998 4176522.8507948759943247, 649924.2735982896992937 4176524.4616246484220028, 649926.2870574744883925 4176525.4683542405255139, 649927.8978092158213258 4176526.8777912775985897, 649929.3072462501004338 4176528.0858355751261115, 649930.1126611357321963 4176529.4952726080082357, 649927.4951798024121672 4176506.9444361114874482, 649899.3065171393100172 4176512.3807915160432458)', n_p=15),
+ )
+
+# MultiLineStrings
+multilinestrings = (TestGeom('MULTILINESTRING ((0 0, 0 100), (100 0, 100 100))', n_p=4, centroid=(50, 50), tup=(((0, 0), (0, 100)), ((100, 0), (100, 100)))),
+ TestGeom('MULTILINESTRING ((20 20, 60 60), (20 -20, 60 -60), (-20 -20, -60 -60), (-20 20, -60 60), (-80 0, 0 80, 80 0, 0 -80, -80 0), (-40 20, -40 -20), (-20 40, 20 40), (40 20, 40 -20), (20 -40, -20 -40))',
+ n_p=21, centroid=(0, 0), tup=(((20., 20.), (60., 60.)), ((20., -20.), (60., -60.)), ((-20., -20.), (-60., -60.)), ((-20., 20.), (-60., 60.)), ((-80., 0.), (0., 80.), (80., 0.), (0., -80.), (-80., 0.)), ((-40., 20.), (-40., -20.)), ((-20., 40.), (20., 40.)), ((40., 20.), (40., -20.)), ((20., -40.), (-20., -40.))))
+ )
+
+# ====================================================
+# Topology Operations
+
+topology_geoms = ( (TestGeom('POLYGON ((-5.0 0.0, -5.0 10.0, 5.0 10.0, 5.0 0.0, -5.0 0.0))'),
+ TestGeom('POLYGON ((0.0 -5.0, 0.0 5.0, 10.0 5.0, 10.0 -5.0, 0.0 -5.0))')
+ ),
+ (TestGeom('POLYGON ((2 0, 18 0, 18 15, 2 15, 2 0))'),
+ TestGeom('POLYGON ((10 1, 11 3, 13 4, 15 6, 16 8, 16 10, 15 12, 13 13, 11 12, 10 10, 9 12, 7 13, 5 12, 4 10, 4 8, 5 6, 7 4, 9 3, 10 1))'),
+ ),
+ )
+
+intersect_geoms = ( TestGeom('POLYGON ((5 5,5 0,0 0,0 5,5 5))'),
+ TestGeom('POLYGON ((10 1, 9 3, 7 4, 5 6, 4 8, 4 10, 5 12, 7 13, 9 12, 10 10, 11 12, 13 13, 15 12, 16 10, 16 8, 15 6, 13 4, 11 3, 10 1))'),
+ )
+
+union_geoms = ( TestGeom('POLYGON ((-5 0,-5 10,5 10,5 5,10 5,10 -5,0 -5,0 0,-5 0))'),
+ TestGeom('POLYGON ((2 0, 2 15, 18 15, 18 0, 2 0))'),
+ )
+
+diff_geoms = ( TestGeom('POLYGON ((-5 0,-5 10,5 10,5 5,0 5,0 0,-5 0))'),
+ TestGeom('POLYGON ((2 0, 2 15, 18 15, 18 0, 2 0), (10 1, 11 3, 13 4, 15 6, 16 8, 16 10, 15 12, 13 13, 11 12, 10 10, 9 12, 7 13, 5 12, 4 10, 4 8, 5 6, 7 4, 9 3, 10 1))'),
+ )
+
+sdiff_geoms = ( TestGeom('MULTIPOLYGON (((-5 0,-5 10,5 10,5 5,0 5,0 0,-5 0)),((0 0,5 0,5 5,10 5,10 -5,0 -5,0 0)))'),
+ TestGeom('POLYGON ((2 0, 2 15, 18 15, 18 0, 2 0), (10 1, 11 3, 13 4, 15 6, 16 8, 16 10, 15 12, 13 13, 11 12, 10 10, 9 12, 7 13, 5 12, 4 10, 4 8, 5 6, 7 4, 9 3, 10 1))'),
+ )
+
+relate_geoms = ( (TestGeom('MULTIPOINT(80 70, 20 20, 200 170, 140 120)'),
+ TestGeom('MULTIPOINT(80 170, 140 120, 200 80, 80 70)'),
+ '0F0FFF0F2', True,),
+ (TestGeom('POINT(20 20)'), TestGeom('POINT(40 60)'),
+ 'FF0FFF0F2', True,),
+ (TestGeom('POINT(110 110)'), TestGeom('LINESTRING(200 200, 110 110, 200 20, 20 20, 110 110, 20 200, 200 200)'),
+ '0FFFFF1F2', True,),
+ (TestGeom('MULTILINESTRING((20 20, 90 20, 170 20), (90 20, 90 80, 90 140))'),
+ TestGeom('MULTILINESTRING((90 20, 170 100, 170 140), (130 140, 130 60, 90 20, 20 90, 90 20))'),
+ 'FF10F0102', True,),
+ )
+
+buffer_geoms = ( (TestGeom('POINT(0 0)'),
+ TestGeom('POLYGON ((5 0,4.903926402016153 -0.97545161008064,4.619397662556435 -1.913417161825447,4.157348061512728 -2.777851165098009,3.53553390593274 -3.535533905932735,2.777851165098015 -4.157348061512724,1.913417161825454 -4.619397662556431,0.975451610080648 -4.903926402016151,0.000000000000008 -5.0,-0.975451610080632 -4.903926402016154,-1.913417161825439 -4.619397662556437,-2.777851165098002 -4.157348061512732,-3.53553390593273 -3.535533905932746,-4.157348061512719 -2.777851165098022,-4.619397662556429 -1.913417161825462,-4.903926402016149 -0.975451610080656,-5.0 -0.000000000000016,-4.903926402016156 0.975451610080624,-4.619397662556441 1.913417161825432,-4.157348061512737 2.777851165097995,-3.535533905932752 3.535533905932723,-2.777851165098029 4.157348061512714,-1.913417161825468 4.619397662556426,-0.975451610080661 4.903926402016149,-0.000000000000019 5.0,0.975451610080624 4.903926402016156,1.913417161825434 4.61939766255644,2.777851165097998 4.157348061512735,3.535533905932727 3.535533905932748,4.157348061512719 2.777851165098022,4.619397662556429 1.91341716182546,4.90392640201615 0.975451610080652,5 0))'),
+ 5.0, 8),
+ (TestGeom('POLYGON((0 0, 10 0, 10 10, 0 10, 0 0))'),
+ TestGeom('POLYGON ((-2 0,-2 10,-1.961570560806461 10.390180644032258,-1.847759065022573 10.765366864730179,-1.662939224605091 11.111140466039204,-1.414213562373095 11.414213562373096,-1.111140466039204 11.662939224605092,-0.765366864730179 11.847759065022574,-0.390180644032256 11.961570560806461,0 12,10 12,10.390180644032256 11.961570560806461,10.765366864730179 11.847759065022574,11.111140466039204 11.66293922460509,11.414213562373096 11.414213562373096,11.66293922460509 11.111140466039204,11.847759065022574 10.765366864730179,11.961570560806461 10.390180644032256,12 10,12 0,11.961570560806461 -0.390180644032256,11.847759065022574 -0.76536686473018,11.66293922460509 -1.111140466039204,11.414213562373096 -1.414213562373095,11.111140466039204 -1.66293922460509,10.765366864730179 -1.847759065022573,10.390180644032256 -1.961570560806461,10 -2,0.0 -2.0,-0.390180644032255 -1.961570560806461,-0.765366864730177 -1.847759065022575,-1.1111404660392 -1.662939224605093,-1.41421356237309 -1.4142135623731,-1.662939224605086 -1.111140466039211,-1.84775906502257 -0.765366864730189,-1.961570560806459 -0.390180644032268,-2 0))'),
+ 2.0, 8),
+ )
+
+json_geoms = (TestGeom('POINT(100 0)', json='{ "type": "Point", "coordinates": [ 100.000000, 0.000000 ] }'),
+ TestGeom('POLYGON((0 0, -10 0, -10 -10, 0 -10, 0 0))', json='{ "type": "Polygon", "coordinates": [ [ [ 0.000000, 0.000000 ], [ -10.000000, 0.000000 ], [ -10.000000, -10.000000 ], [ 0.000000, -10.000000 ], [ 0.000000, 0.000000 ] ] ] }'),
+ TestGeom('MULTIPOLYGON(((102 2, 103 2, 103 3, 102 3, 102 2)), ((100.0 0.0, 101.0 0.0, 101.0 1.0, 100.0 1.0, 100.0 0.0), (100.2 0.2, 100.8 0.2, 100.8 0.8, 100.2 0.8, 100.2 0.2)))', json='{ "type": "MultiPolygon", "coordinates": [ [ [ [ 102.000000, 2.000000 ], [ 103.000000, 2.000000 ], [ 103.000000, 3.000000 ], [ 102.000000, 3.000000 ], [ 102.000000, 2.000000 ] ] ], [ [ [ 100.000000, 0.000000 ], [ 101.000000, 0.000000 ], [ 101.000000, 1.000000 ], [ 100.000000, 1.000000 ], [ 100.000000, 0.000000 ] ], [ [ 100.200000, 0.200000 ], [ 100.800000, 0.200000 ], [ 100.800000, 0.800000 ], [ 100.200000, 0.800000 ], [ 100.200000, 0.200000 ] ] ] ] }'),
+ )
diff --git a/django/contrib/gis/tests/layermap/__init__.py b/django/contrib/gis/tests/layermap/__init__.py
new file mode 100644
index 0000000000..e69de29bb2
--- /dev/null
+++ b/django/contrib/gis/tests/layermap/__init__.py
diff --git a/django/contrib/gis/tests/layermap/cities/cities.dbf b/django/contrib/gis/tests/layermap/cities/cities.dbf
new file mode 100644
index 0000000000..8b276331b9
--- /dev/null
+++ b/django/contrib/gis/tests/layermap/cities/cities.dbf
Binary files differ
diff --git a/django/contrib/gis/tests/layermap/cities/cities.prj b/django/contrib/gis/tests/layermap/cities/cities.prj
new file mode 100644
index 0000000000..a30c00a55d
--- /dev/null
+++ b/django/contrib/gis/tests/layermap/cities/cities.prj
@@ -0,0 +1 @@
+GEOGCS["GCS_WGS_1984",DATUM["D_WGS_1984",SPHEROID["WGS_1984",6378137,298.257223563]],PRIMEM["Greenwich",0],UNIT["Degree",0.017453292519943295]] \ No newline at end of file
diff --git a/django/contrib/gis/tests/layermap/cities/cities.shp b/django/contrib/gis/tests/layermap/cities/cities.shp
new file mode 100644
index 0000000000..1c46ccc5fc
--- /dev/null
+++ b/django/contrib/gis/tests/layermap/cities/cities.shp
Binary files differ
diff --git a/django/contrib/gis/tests/layermap/cities/cities.shx b/django/contrib/gis/tests/layermap/cities/cities.shx
new file mode 100644
index 0000000000..6be3fd68e9
--- /dev/null
+++ b/django/contrib/gis/tests/layermap/cities/cities.shx
Binary files differ
diff --git a/django/contrib/gis/tests/layermap/counties/counties.dbf b/django/contrib/gis/tests/layermap/counties/counties.dbf
new file mode 100644
index 0000000000..ccdbb264b9
--- /dev/null
+++ b/django/contrib/gis/tests/layermap/counties/counties.dbf
Binary files differ
diff --git a/django/contrib/gis/tests/layermap/counties/counties.shp b/django/contrib/gis/tests/layermap/counties/counties.shp
new file mode 100644
index 0000000000..2e7dca5e43
--- /dev/null
+++ b/django/contrib/gis/tests/layermap/counties/counties.shp
Binary files differ
diff --git a/django/contrib/gis/tests/layermap/counties/counties.shx b/django/contrib/gis/tests/layermap/counties/counties.shx
new file mode 100644
index 0000000000..46ed3bb203
--- /dev/null
+++ b/django/contrib/gis/tests/layermap/counties/counties.shx
Binary files differ
diff --git a/django/contrib/gis/tests/layermap/interstates/interstates.dbf b/django/contrib/gis/tests/layermap/interstates/interstates.dbf
new file mode 100644
index 0000000000..a88d171588
--- /dev/null
+++ b/django/contrib/gis/tests/layermap/interstates/interstates.dbf
Binary files differ
diff --git a/django/contrib/gis/tests/layermap/interstates/interstates.prj b/django/contrib/gis/tests/layermap/interstates/interstates.prj
new file mode 100644
index 0000000000..a30c00a55d
--- /dev/null
+++ b/django/contrib/gis/tests/layermap/interstates/interstates.prj
@@ -0,0 +1 @@
+GEOGCS["GCS_WGS_1984",DATUM["D_WGS_1984",SPHEROID["WGS_1984",6378137,298.257223563]],PRIMEM["Greenwich",0],UNIT["Degree",0.017453292519943295]] \ No newline at end of file
diff --git a/django/contrib/gis/tests/layermap/interstates/interstates.shp b/django/contrib/gis/tests/layermap/interstates/interstates.shp
new file mode 100644
index 0000000000..6d93de75ec
--- /dev/null
+++ b/django/contrib/gis/tests/layermap/interstates/interstates.shp
Binary files differ
diff --git a/django/contrib/gis/tests/layermap/interstates/interstates.shx b/django/contrib/gis/tests/layermap/interstates/interstates.shx
new file mode 100644
index 0000000000..7b9088ac5b
--- /dev/null
+++ b/django/contrib/gis/tests/layermap/interstates/interstates.shx
Binary files differ
diff --git a/django/contrib/gis/tests/layermap/models.py b/django/contrib/gis/tests/layermap/models.py
new file mode 100644
index 0000000000..5dbd528030
--- /dev/null
+++ b/django/contrib/gis/tests/layermap/models.py
@@ -0,0 +1,52 @@
+from django.contrib.gis.db import models
+
+class State(models.Model):
+ name = models.CharField(max_length=20)
+ objects = models.GeoManager()
+
+class County(models.Model):
+ name = models.CharField(max_length=25)
+ state = models.ForeignKey(State)
+ mpoly = models.MultiPolygonField(srid=4269) # Multipolygon in NAD83
+ objects = models.GeoManager()
+
+class CountyFeat(models.Model):
+ name = models.CharField(max_length=25)
+ poly = models.PolygonField(srid=4269)
+ objects = models.GeoManager()
+
+class City(models.Model):
+ name = models.CharField(max_length=25)
+ population = models.IntegerField()
+ density = models.DecimalField(max_digits=7, decimal_places=1)
+ dt = models.DateField()
+ point = models.PointField()
+ objects = models.GeoManager()
+
+class Interstate(models.Model):
+ name = models.CharField(max_length=20)
+ length = models.DecimalField(max_digits=6, decimal_places=2)
+ path = models.LineStringField()
+ objects = models.GeoManager()
+
+# Mapping dictionaries for the models above.
+co_mapping = {'name' : 'Name',
+ 'state' : {'name' : 'State'}, # ForeignKey's use another mapping dictionary for the _related_ Model (State in this case).
+ 'mpoly' : 'MULTIPOLYGON', # Will convert POLYGON features into MULTIPOLYGONS.
+ }
+
+cofeat_mapping = {'name' : 'Name',
+ 'poly' : 'POLYGON',
+ }
+
+city_mapping = {'name' : 'Name',
+ 'population' : 'Population',
+ 'density' : 'Density',
+ 'dt' : 'Created',
+ 'point' : 'POINT',
+ }
+
+inter_mapping = {'name' : 'Name',
+ 'length' : 'Length',
+ 'path' : 'LINESTRING',
+ }
diff --git a/django/contrib/gis/tests/layermap/tests.py b/django/contrib/gis/tests/layermap/tests.py
new file mode 100644
index 0000000000..740ab8647e
--- /dev/null
+++ b/django/contrib/gis/tests/layermap/tests.py
@@ -0,0 +1,249 @@
+import os, unittest
+from copy import copy
+from datetime import date
+from decimal import Decimal
+from models import City, County, CountyFeat, Interstate, State, city_mapping, co_mapping, cofeat_mapping, inter_mapping
+from django.contrib.gis.utils.layermapping import LayerMapping, LayerMapError, InvalidDecimal, MissingForeignKey
+from django.contrib.gis.gdal import DataSource
+
+shp_path = os.path.dirname(__file__)
+city_shp = os.path.join(shp_path, 'cities/cities.shp')
+co_shp = os.path.join(shp_path, 'counties/counties.shp')
+inter_shp = os.path.join(shp_path, 'interstates/interstates.shp')
+
+# Dictionaries to hold what's expected in the county shapefile.
+NAMES = ['Bexar', 'Galveston', 'Harris', 'Honolulu', 'Pueblo']
+NUMS = [1, 2, 1, 19, 1] # Number of polygons for each.
+STATES = ['Texas', 'Texas', 'Texas', 'Hawaii', 'Colorado']
+
+class LayerMapTest(unittest.TestCase):
+
+ def test01_init(self):
+ "Testing LayerMapping initialization."
+
+ # Model field that does not exist.
+ bad1 = copy(city_mapping)
+ bad1['foobar'] = 'FooField'
+
+ # Shapefile field that does not exist.
+ bad2 = copy(city_mapping)
+ bad2['name'] = 'Nombre'
+
+ # Nonexistent geographic field type.
+ bad3 = copy(city_mapping)
+ bad3['point'] = 'CURVE'
+
+ # Incrementing through the bad mapping dictionaries and
+ # ensuring that a LayerMapError is raised.
+ for bad_map in (bad1, bad2, bad3):
+ try:
+ lm = LayerMapping(City, city_shp, bad_map)
+ except LayerMapError:
+ pass
+ else:
+ self.fail('Expected a LayerMapError.')
+
+ # A LookupError should be thrown for bogus encodings.
+ try:
+ lm = LayerMapping(City, city_shp, city_mapping, encoding='foobar')
+ except LookupError:
+ pass
+ else:
+ self.fail('Expected a LookupError')
+
+ def test02_simple_layermap(self):
+ "Test LayerMapping import of a simple point shapefile."
+
+ # Setting up for the LayerMapping.
+ lm = LayerMapping(City, city_shp, city_mapping)
+ lm.save()
+
+ # There should be three cities in the shape file.
+ self.assertEqual(3, City.objects.count())
+
+ # Opening up the shapefile, and verifying the values in each
+ # of the features made it to the model.
+ ds = DataSource(city_shp)
+ layer = ds[0]
+ for feat in layer:
+ city = City.objects.get(name=feat['Name'].value)
+ self.assertEqual(feat['Population'].value, city.population)
+ self.assertEqual(Decimal(str(feat['Density'])), city.density)
+ self.assertEqual(feat['Created'].value, city.dt)
+
+ # Comparing the geometries.
+ pnt1, pnt2 = feat.geom, city.point
+ self.assertAlmostEqual(pnt1.x, pnt2.x, 6)
+ self.assertAlmostEqual(pnt1.y, pnt2.y, 6)
+
+ def test03_layermap_strict(self):
+ "Testing the `strict` keyword, and import of a LineString shapefile."
+
+ # When the `strict` keyword is set an error encountered will force
+ # the importation to stop.
+ try:
+ lm = LayerMapping(Interstate, inter_shp, inter_mapping)
+ lm.save(silent=True, strict=True)
+ except InvalidDecimal:
+ pass
+ else:
+ self.fail('Should have failed on strict import with invalid decimal values.')
+
+ # This LayerMapping should work b/c `strict` is not set.
+ lm = LayerMapping(Interstate, inter_shp, inter_mapping)
+ lm.save(silent=True)
+
+ # Two interstate should have imported correctly.
+ self.assertEqual(2, Interstate.objects.count())
+
+ # Verifying the values in the layer w/the model.
+ ds = DataSource(inter_shp)
+
+ # Only the first two features of this shapefile are valid.
+ valid_feats = ds[0][:2]
+ for feat in valid_feats:
+ istate = Interstate.objects.get(name=feat['Name'].value)
+
+ if feat.fid == 0:
+ self.assertEqual(Decimal(str(feat['Length'])), istate.length)
+ elif feat.fid == 1:
+ # Everything but the first two decimal digits were truncated,
+ # because the Interstate model's `length` field has decimal_places=2.
+ self.assertAlmostEqual(feat.get('Length'), float(istate.length), 2)
+
+ for p1, p2 in zip(feat.geom, istate.path):
+ self.assertAlmostEqual(p1[0], p2[0], 6)
+ self.assertAlmostEqual(p1[1], p2[1], 6)
+
+ def county_helper(self, county_feat=True):
+ "Helper function for ensuring the integrity of the mapped County models."
+
+ for name, n, st in zip(NAMES, NUMS, STATES):
+ # Should only be one record b/c of `unique` keyword.
+ c = County.objects.get(name=name)
+ self.assertEqual(n, len(c.mpoly))
+ self.assertEqual(st, c.state.name) # Checking ForeignKey mapping.
+
+ # Multiple records because `unique` was not set.
+ if county_feat:
+ qs = CountyFeat.objects.filter(name=name)
+ self.assertEqual(n, qs.count())
+
+ def test04_layermap_unique_multigeometry_fk(self):
+ "Testing the `unique`, and `transform`, geometry collection conversion, and ForeignKey mappings."
+ # All the following should work.
+ try:
+ # Telling LayerMapping that we want no transformations performed on the data.
+ lm = LayerMapping(County, co_shp, co_mapping, transform=False)
+
+ # Specifying the source spatial reference system via the `source_srs` keyword.
+ lm = LayerMapping(County, co_shp, co_mapping, source_srs=4269)
+ lm = LayerMapping(County, co_shp, co_mapping, source_srs='NAD83')
+
+ # Unique may take tuple or string parameters.
+ for arg in ('name', ('name', 'mpoly')):
+ lm = LayerMapping(County, co_shp, co_mapping, transform=False, unique=arg)
+ except:
+ self.fail('No exception should be raised for proper use of keywords.')
+
+ # Testing invalid params for the `unique` keyword.
+ for e, arg in ((TypeError, 5.0), (ValueError, 'foobar'), (ValueError, ('name', 'mpolygon'))):
+ self.assertRaises(e, LayerMapping, County, co_shp, co_mapping, transform=False, unique=arg)
+
+ # No source reference system defined in the shapefile, should raise an error.
+ self.assertRaises(LayerMapError, LayerMapping, County, co_shp, co_mapping)
+
+ # Passing in invalid ForeignKey mapping parameters -- must be a dictionary
+ # mapping for the model the ForeignKey points to.
+ bad_fk_map1 = copy(co_mapping); bad_fk_map1['state'] = 'name'
+ bad_fk_map2 = copy(co_mapping); bad_fk_map2['state'] = {'nombre' : 'State'}
+ self.assertRaises(TypeError, LayerMapping, County, co_shp, bad_fk_map1, transform=False)
+ self.assertRaises(LayerMapError, LayerMapping, County, co_shp, bad_fk_map2, transform=False)
+
+ # There exist no State models for the ForeignKey mapping to work -- should raise
+ # a MissingForeignKey exception (this error would be ignored if the `strict`
+ # keyword is not set).
+ lm = LayerMapping(County, co_shp, co_mapping, transform=False, unique='name')
+ self.assertRaises(MissingForeignKey, lm.save, silent=True, strict=True)
+
+ # Now creating the state models so the ForeignKey mapping may work.
+ co, hi, tx = State(name='Colorado'), State(name='Hawaii'), State(name='Texas')
+ co.save(), hi.save(), tx.save()
+
+ # If a mapping is specified as a collection, all OGR fields that
+ # are not collections will be converted into them. For example,
+ # a Point column would be converted to MultiPoint. Other things being done
+ # w/the keyword args:
+ # `transform=False`: Specifies that no transform is to be done; this
+ # has the effect of ignoring the spatial reference check (because the
+ # county shapefile does not have implicit spatial reference info).
+ #
+ # `unique='name'`: Creates models on the condition that they have
+ # unique county names; geometries from each feature however will be
+ # appended to the geometry collection of the unique model. Thus,
+ # all of the various islands in Honolulu county will be in in one
+ # database record with a MULTIPOLYGON type.
+ lm = LayerMapping(County, co_shp, co_mapping, transform=False, unique='name')
+ lm.save(silent=True, strict=True)
+
+ # A reference that doesn't use the unique keyword; a new database record will
+ # created for each polygon.
+ lm = LayerMapping(CountyFeat, co_shp, cofeat_mapping, transform=False)
+ lm.save(silent=True, strict=True)
+
+ # The county helper is called to ensure integrity of County models.
+ self.county_helper()
+
+ def test05_test_fid_range_step(self):
+ "Tests the `fid_range` keyword and the `step` keyword of .save()."
+
+ # Function for clearing out all the counties before testing.
+ def clear_counties(): County.objects.all().delete()
+
+ # Initializing the LayerMapping object to use in these tests.
+ lm = LayerMapping(County, co_shp, co_mapping, transform=False, unique='name')
+
+ # Bad feature id ranges should raise a type error.
+ clear_counties()
+ bad_ranges = (5.0, 'foo', co_shp)
+ for bad in bad_ranges:
+ self.assertRaises(TypeError, lm.save, fid_range=bad)
+
+ # Step keyword should not be allowed w/`fid_range`.
+ fr = (3, 5) # layer[3:5]
+ self.assertRaises(LayerMapError, lm.save, fid_range=fr, step=10)
+ lm.save(fid_range=fr)
+
+ # Features IDs 3 & 4 are for Galveston County, Texas -- only
+ # one model is returned because the `unique` keyword was set.
+ qs = County.objects.all()
+ self.assertEqual(1, qs.count())
+ self.assertEqual('Galveston', qs[0].name)
+
+ # Features IDs 5 and beyond for Honolulu County, Hawaii, and
+ # FID 0 is for Pueblo County, Colorado.
+ clear_counties()
+ lm.save(fid_range=slice(5, None), silent=True, strict=True) # layer[5:]
+ lm.save(fid_range=slice(None, 1), silent=True, strict=True) # layer[:1]
+
+ # Only Pueblo & Honolulu counties should be present because of
+ # the `unique` keyword.
+ qs = County.objects.all()
+ self.assertEqual(2, qs.count())
+ hi, co = tuple(qs)
+ hi_idx, co_idx = tuple(map(NAMES.index, ('Honolulu', 'Pueblo')))
+ self.assertEqual('Pueblo', co.name); self.assertEqual(NUMS[co_idx], len(co.mpoly))
+ self.assertEqual('Honolulu', hi.name); self.assertEqual(NUMS[hi_idx], len(hi.mpoly))
+
+ # Testing the `step` keyword -- should get the same counties
+ # regardless of we use a step that divides equally, that is odd,
+ # or that is larger than the dataset.
+ for st in (4,7,1000):
+ clear_counties()
+ lm.save(step=st, strict=True)
+ self.county_helper(county_feat=False)
+
+def suite():
+ s = unittest.TestSuite()
+ s.addTest(unittest.makeSuite(LayerMapTest))
+ return s
diff --git a/django/contrib/gis/tests/relatedapp/__init__.py b/django/contrib/gis/tests/relatedapp/__init__.py
new file mode 100644
index 0000000000..e69de29bb2
--- /dev/null
+++ b/django/contrib/gis/tests/relatedapp/__init__.py
diff --git a/django/contrib/gis/tests/relatedapp/models.py b/django/contrib/gis/tests/relatedapp/models.py
new file mode 100644
index 0000000000..8484054e0d
--- /dev/null
+++ b/django/contrib/gis/tests/relatedapp/models.py
@@ -0,0 +1,12 @@
+from django.contrib.gis.db import models
+
+class Location(models.Model):
+ name = models.CharField(max_length=50)
+ point = models.PointField()
+ objects = models.GeoManager()
+
+class City(models.Model):
+ name = models.CharField(max_length=50)
+ state = models.USStateField()
+ location = models.ForeignKey(Location)
+ objects = models.GeoManager()
diff --git a/django/contrib/gis/tests/relatedapp/tests.py b/django/contrib/gis/tests/relatedapp/tests.py
new file mode 100644
index 0000000000..5fe63cbc8e
--- /dev/null
+++ b/django/contrib/gis/tests/relatedapp/tests.py
@@ -0,0 +1,98 @@
+import os, unittest
+from django.contrib.gis.geos import *
+from django.contrib.gis.tests.utils import no_mysql, postgis
+from django.conf import settings
+from models import City, Location
+
+cities = (('Aurora', 'TX', -97.516111, 33.058333),
+ ('Roswell', 'NM', -104.528056, 33.387222),
+ ('Kecksburg', 'PA', -79.460734, 40.18476),
+ )
+
+class RelatedGeoModelTest(unittest.TestCase):
+
+ def test01_setup(self):
+ "Setting up for related model tests."
+ for name, state, lon, lat in cities:
+ loc = Location(point=Point(lon, lat))
+ loc.save()
+ c = City(name=name, state=state, location=loc)
+ c.save()
+
+ def test02_select_related(self):
+ "Testing `select_related` on geographic models (see #7126)."
+ qs1 = City.objects.all()
+ qs2 = City.objects.select_related()
+ qs3 = City.objects.select_related('location')
+
+ for qs in (qs1, qs2, qs3):
+ for ref, c in zip(cities, qs):
+ nm, st, lon, lat = ref
+ self.assertEqual(nm, c.name)
+ self.assertEqual(st, c.state)
+ self.assertEqual(Point(lon, lat), c.location.point)
+
+ @no_mysql
+ def test03_transform_related(self):
+ "Testing the `transform` GeoQuerySet method on related geographic models."
+ # All the transformations are to state plane coordinate systems using
+ # US Survey Feet (thus a tolerance of 0 implies error w/in 1 survey foot).
+ if postgis:
+ tol = 3
+ nqueries = 4 # +1 for `postgis_lib_version`
+ else:
+ tol = 0
+ nqueries = 3
+
+ def check_pnt(ref, pnt):
+ self.assertAlmostEqual(ref.x, pnt.x, tol)
+ self.assertAlmostEqual(ref.y, pnt.y, tol)
+ self.assertEqual(ref.srid, pnt.srid)
+
+ # Turning on debug so we can manually verify the number of SQL queries issued.
+ # DISABLED: the number of queries count testing mechanism is way too brittle.
+ #dbg = settings.DEBUG
+ #settings.DEBUG = True
+ from django.db import connection
+
+ # Each city transformed to the SRID of their state plane coordinate system.
+ transformed = (('Kecksburg', 2272, 'POINT(1490553.98959621 314792.131023984)'),
+ ('Roswell', 2257, 'POINT(481902.189077221 868477.766629735)'),
+ ('Aurora', 2276, 'POINT(2269923.2484839 7069381.28722222)'),
+ )
+
+ for name, srid, wkt in transformed:
+ # Doing this implicitly sets `select_related` select the location.
+ qs = list(City.objects.filter(name=name).transform(srid, field_name='location__point'))
+ check_pnt(GEOSGeometry(wkt, srid), qs[0].location.point)
+ #settings.DEBUG= dbg
+
+ # Verifying the number of issued SQL queries.
+ #self.assertEqual(nqueries, len(connection.queries))
+
+ @no_mysql
+ def test04_related_aggregate(self):
+ "Testing the `extent` and `unionagg` GeoQuerySet aggregates on related geographic models."
+ if postgis:
+ # One for all locations, one that excludes Roswell.
+ all_extent = (-104.528060913086, 33.0583305358887,-79.4607315063477, 40.1847610473633)
+ txpa_extent = (-97.51611328125, 33.0583305358887,-79.4607315063477, 40.1847610473633)
+ e1 = City.objects.extent(field_name='location__point')
+ e2 = City.objects.exclude(name='Roswell').extent(field_name='location__point')
+ for ref, e in [(all_extent, e1), (txpa_extent, e2)]:
+ for ref_val, e_val in zip(ref, e): self.assertAlmostEqual(ref_val, e_val)
+
+ # The second union is for a query that has something in the WHERE clause.
+ ref_u1 = GEOSGeometry('MULTIPOINT(-104.528056 33.387222,-97.516111 33.058333,-79.460734 40.18476)', 4326)
+ ref_u2 = GEOSGeometry('MULTIPOINT(-97.516111 33.058333,-79.460734 40.18476)', 4326)
+ u1 = City.objects.unionagg(field_name='location__point')
+ u2 = City.objects.exclude(name='Roswell').unionagg(field_name='location__point')
+ self.assertEqual(ref_u1, u1)
+ self.assertEqual(ref_u2, u2)
+
+ # TODO: Related tests for KML, GML, and distance lookups.
+
+def suite():
+ s = unittest.TestSuite()
+ s.addTest(unittest.makeSuite(RelatedGeoModelTest))
+ return s
diff --git a/django/contrib/gis/tests/relatedapp/tests_mysql.py b/django/contrib/gis/tests/relatedapp/tests_mysql.py
new file mode 100644
index 0000000000..ecadf745f3
--- /dev/null
+++ b/django/contrib/gis/tests/relatedapp/tests_mysql.py
@@ -0,0 +1 @@
+from tests import *
diff --git a/django/contrib/gis/tests/test_gdal.py b/django/contrib/gis/tests/test_gdal.py
new file mode 100644
index 0000000000..030ac505fe
--- /dev/null
+++ b/django/contrib/gis/tests/test_gdal.py
@@ -0,0 +1,28 @@
+"""
+Module for executing all of the GDAL tests. None
+of these tests require the use of the database.
+"""
+from unittest import TestSuite, TextTestRunner
+
+# Importing the GDAL test modules.
+from django.contrib.gis.tests import \
+ test_gdal_driver, test_gdal_ds, test_gdal_envelope, \
+ test_gdal_geom, test_gdal_srs
+
+
+test_suites = [test_gdal_driver.suite(),
+ test_gdal_ds.suite(),
+ test_gdal_envelope.suite(),
+ test_gdal_geom.suite(),
+ test_gdal_srs.suite(),
+ ]
+
+def suite():
+ "Builds a test suite for the GDAL tests."
+ s = TestSuite()
+ map(s.addTest, test_suites)
+ return s
+
+def run(verbosity=1):
+ "Runs the GDAL tests."
+ TextTestRunner(verbosity=verbosity).run(suite())
diff --git a/django/contrib/gis/tests/test_gdal_driver.py b/django/contrib/gis/tests/test_gdal_driver.py
new file mode 100644
index 0000000000..1ff65ac31b
--- /dev/null
+++ b/django/contrib/gis/tests/test_gdal_driver.py
@@ -0,0 +1,40 @@
+import os, os.path, unittest
+from django.contrib.gis.gdal import Driver, OGRException
+
+valid_drivers = ('ESRI Shapefile', 'MapInfo File', 'TIGER', 'S57', 'DGN',
+ 'Memory', 'CSV', 'GML', 'KML')
+
+invalid_drivers = ('Foo baz', 'clucka', 'ESRI Shp')
+
+aliases = {'eSrI' : 'ESRI Shapefile',
+ 'TigER/linE' : 'TIGER',
+ 'SHAPE' : 'ESRI Shapefile',
+ 'sHp' : 'ESRI Shapefile',
+ }
+
+class DriverTest(unittest.TestCase):
+
+ def test01_valid_driver(self):
+ "Testing valid OGR Data Source Drivers."
+ for d in valid_drivers:
+ dr = Driver(d)
+ self.assertEqual(d, str(dr))
+
+ def test02_invalid_driver(self):
+ "Testing invalid OGR Data Source Drivers."
+ for i in invalid_drivers:
+ self.assertRaises(OGRException, Driver, i)
+
+ def test03_aliases(self):
+ "Testing driver aliases."
+ for alias, full_name in aliases.items():
+ dr = Driver(alias)
+ self.assertEqual(full_name, str(dr))
+
+def suite():
+ s = unittest.TestSuite()
+ s.addTest(unittest.makeSuite(DriverTest))
+ return s
+
+def run(verbosity=2):
+ unittest.TextTestRunner(verbosity=verbosity).run(suite())
diff --git a/django/contrib/gis/tests/test_gdal_ds.py b/django/contrib/gis/tests/test_gdal_ds.py
new file mode 100644
index 0000000000..9b826859f9
--- /dev/null
+++ b/django/contrib/gis/tests/test_gdal_ds.py
@@ -0,0 +1,181 @@
+import os, os.path, unittest
+from django.contrib.gis.gdal import DataSource, Envelope, OGRException, OGRIndexError
+from django.contrib.gis.gdal.field import OFTReal, OFTInteger, OFTString
+
+# Path for SHP files
+data_path = os.path.join(os.path.dirname(__file__), 'data')
+def get_ds_file(name, ext):
+ return os.sep.join([data_path, name, name + '.%s' % ext])
+
+# Test SHP data source object
+class TestDS:
+ def __init__(self, name, **kwargs):
+ ext = kwargs.pop('ext', 'shp')
+ self.ds = get_ds_file(name, ext)
+ for key, value in kwargs.items():
+ setattr(self, key, value)
+
+# List of acceptable data sources.
+ds_list = (TestDS('test_point', nfeat=5, nfld=3, geom='POINT', gtype=1, driver='ESRI Shapefile',
+ fields={'dbl' : OFTReal, 'int' : OFTInteger, 'str' : OFTString,},
+ extent=(-1.35011,0.166623,-0.524093,0.824508), # Got extent from QGIS
+ srs_wkt='GEOGCS["GCS_WGS_1984",DATUM["WGS_1984",SPHEROID["WGS_1984",6378137,298.257223563]],PRIMEM["Greenwich",0],UNIT["Degree",0.017453292519943295]]',
+ field_values={'dbl' : [float(i) for i in range(1, 6)], 'int' : range(1, 6), 'str' : [str(i) for i in range(1, 6)]},
+ fids=range(5)),
+ TestDS('test_vrt', ext='vrt', nfeat=3, nfld=3, geom='POINT', gtype=1, driver='VRT',
+ fields={'POINT_X' : OFTString, 'POINT_Y' : OFTString, 'NUM' : OFTString}, # VRT uses CSV, which all types are OFTString.
+ extent=(1.0, 2.0, 100.0, 523.5), # Min/Max from CSV
+ field_values={'POINT_X' : ['1.0', '5.0', '100.0'], 'POINT_Y' : ['2.0', '23.0', '523.5'], 'NUM' : ['5', '17', '23']},
+ fids=range(1,4)),
+ TestDS('test_poly', nfeat=3, nfld=3, geom='POLYGON', gtype=3,
+ driver='ESRI Shapefile',
+ fields={'float' : OFTReal, 'int' : OFTInteger, 'str' : OFTString,},
+ extent=(-1.01513,-0.558245,0.161876,0.839637), # Got extent from QGIS
+ srs_wkt='GEOGCS["GCS_WGS_1984",DATUM["WGS_1984",SPHEROID["WGS_1984",6378137,298.257223563]],PRIMEM["Greenwich",0],UNIT["Degree",0.017453292519943295]]'),
+ )
+
+bad_ds = (TestDS('foo'),
+ )
+
+class DataSourceTest(unittest.TestCase):
+
+ def test01_valid_shp(self):
+ "Testing valid SHP Data Source files."
+
+ for source in ds_list:
+ # Loading up the data source
+ ds = DataSource(source.ds)
+
+ # Making sure the layer count is what's expected (only 1 layer in a SHP file)
+ self.assertEqual(1, len(ds))
+
+ # Making sure GetName works
+ self.assertEqual(source.ds, ds.name)
+
+ # Making sure the driver name matches up
+ self.assertEqual(source.driver, str(ds.driver))
+
+ # Making sure indexing works
+ try:
+ ds[len(ds)]
+ except OGRIndexError:
+ pass
+ else:
+ self.fail('Expected an IndexError!')
+
+ def test02_invalid_shp(self):
+ "Testing invalid SHP files for the Data Source."
+ for source in bad_ds:
+ self.assertRaises(OGRException, DataSource, source.ds)
+
+ def test03a_layers(self):
+ "Testing Data Source Layers."
+ print "\nBEGIN - expecting out of range feature id error; safe to ignore.\n"
+ for source in ds_list:
+ ds = DataSource(source.ds)
+
+ # Incrementing through each layer, this tests DataSource.__iter__
+ for layer in ds:
+ # Making sure we get the number of features we expect
+ self.assertEqual(len(layer), source.nfeat)
+
+ # Making sure we get the number of fields we expect
+ self.assertEqual(source.nfld, layer.num_fields)
+ self.assertEqual(source.nfld, len(layer.fields))
+
+ # Testing the layer's extent (an Envelope), and it's properties
+ self.assertEqual(True, isinstance(layer.extent, Envelope))
+ self.assertAlmostEqual(source.extent[0], layer.extent.min_x, 5)
+ self.assertAlmostEqual(source.extent[1], layer.extent.min_y, 5)
+ self.assertAlmostEqual(source.extent[2], layer.extent.max_x, 5)
+ self.assertAlmostEqual(source.extent[3], layer.extent.max_y, 5)
+
+ # Now checking the field names.
+ flds = layer.fields
+ for f in flds: self.assertEqual(True, f in source.fields)
+
+ # Negative FIDs are not allowed.
+ self.assertRaises(OGRIndexError, layer.__getitem__, -1)
+ self.assertRaises(OGRIndexError, layer.__getitem__, 50000)
+
+ if hasattr(source, 'field_values'):
+ fld_names = source.field_values.keys()
+
+ # Testing `Layer.get_fields` (which uses Layer.__iter__)
+ for fld_name in fld_names:
+ self.assertEqual(source.field_values[fld_name], layer.get_fields(fld_name))
+
+ # Testing `Layer.__getitem__`.
+ for i, fid in enumerate(source.fids):
+ feat = layer[fid]
+ self.assertEqual(fid, feat.fid)
+ # Maybe this should be in the test below, but we might as well test
+ # the feature values here while in this loop.
+ for fld_name in fld_names:
+ self.assertEqual(source.field_values[fld_name][i], feat.get(fld_name))
+ print "\nEND - expecting out of range feature id error; safe to ignore."
+
+ def test03b_layer_slice(self):
+ "Test indexing and slicing on Layers."
+ # Using the first data-source because the same slice
+ # can be used for both the layer and the control values.
+ source = ds_list[0]
+ ds = DataSource(source.ds)
+
+ sl = slice(1, 3)
+ feats = ds[0][sl]
+
+ for fld_name in ds[0].fields:
+ test_vals = [feat.get(fld_name) for feat in feats]
+ control_vals = source.field_values[fld_name][sl]
+ self.assertEqual(control_vals, test_vals)
+
+ def test04_features(self):
+ "Testing Data Source Features."
+ for source in ds_list:
+ ds = DataSource(source.ds)
+
+ # Incrementing through each layer
+ for layer in ds:
+ # Incrementing through each feature in the layer
+ for feat in layer:
+ # Making sure the number of fields, and the geometry type
+ # are what's expected.
+ self.assertEqual(source.nfld, len(list(feat)))
+ self.assertEqual(source.gtype, feat.geom_type)
+
+ # Making sure the fields match to an appropriate OFT type.
+ for k, v in source.fields.items():
+ # Making sure we get the proper OGR Field instance, using
+ # a string value index for the feature.
+ self.assertEqual(True, isinstance(feat[k], v))
+
+ # Testing Feature.__iter__
+ for fld in feat: self.assertEqual(True, fld.name in source.fields.keys())
+
+ def test05_geometries(self):
+ "Testing Geometries from Data Source Features."
+ for source in ds_list:
+ ds = DataSource(source.ds)
+
+ # Incrementing through each layer and feature.
+ for layer in ds:
+ for feat in layer:
+ g = feat.geom
+
+ # Making sure we get the right Geometry name & type
+ self.assertEqual(source.geom, g.geom_name)
+ self.assertEqual(source.gtype, g.geom_type)
+
+ # Making sure the SpatialReference is as expected.
+ if hasattr(source, 'srs_wkt'):
+ self.assertEqual(source.srs_wkt, g.srs.wkt)
+
+
+def suite():
+ s = unittest.TestSuite()
+ s.addTest(unittest.makeSuite(DataSourceTest))
+ return s
+
+def run(verbosity=2):
+ unittest.TextTestRunner(verbosity=verbosity).run(suite())
diff --git a/django/contrib/gis/tests/test_gdal_envelope.py b/django/contrib/gis/tests/test_gdal_envelope.py
new file mode 100644
index 0000000000..fda27191ac
--- /dev/null
+++ b/django/contrib/gis/tests/test_gdal_envelope.py
@@ -0,0 +1,45 @@
+import unittest
+from django.contrib.gis.gdal import Envelope, OGRException
+
+class EnvelopeTest(unittest.TestCase):
+
+ def test01_init(self):
+ "Testing Envelope initilization."
+ e1 = Envelope((0, 0, 5, 5))
+ e2 = Envelope(0, 0, 5, 5)
+ e3 = Envelope(0, '0', '5', 5) # Thanks to ww for this
+ e4 = Envelope(e1._envelope)
+ self.assertRaises(OGRException, Envelope, (5, 5, 0, 0))
+ self.assertRaises(OGRException, Envelope, 5, 5, 0, 0)
+ self.assertRaises(OGRException, Envelope, (0, 0, 5, 5, 3))
+ self.assertRaises(OGRException, Envelope, ())
+ self.assertRaises(ValueError, Envelope, 0, 'a', 5, 5)
+ self.assertRaises(TypeError, Envelope, u'foo')
+
+ def test02_properties(self):
+ "Testing Envelope properties."
+ e = Envelope(0, 0, 2, 3)
+ self.assertEqual(0, e.min_x)
+ self.assertEqual(0, e.min_y)
+ self.assertEqual(2, e.max_x)
+ self.assertEqual(3, e.max_y)
+ self.assertEqual((0, 0), e.ll)
+ self.assertEqual((2, 3), e.ur)
+ self.assertEqual((0, 0, 2, 3), e.tuple)
+ self.assertEqual('POLYGON((0.0 0.0,0.0 3.0,2.0 3.0,2.0 0.0,0.0 0.0))', e.wkt)
+ self.assertEqual('(0.0, 0.0, 2.0, 3.0)', str(e))
+
+ def test03_equivalence(self):
+ "Testing Envelope equivalence."
+ e1 = Envelope(0.523, 0.217, 253.23, 523.69)
+ e2 = Envelope((0.523, 0.217, 253.23, 523.69))
+ self.assertEqual(e1, e2)
+ self.assertEqual((0.523, 0.217, 253.23, 523.69), e1)
+
+def suite():
+ s = unittest.TestSuite()
+ s.addTest(unittest.makeSuite(EnvelopeTest))
+ return s
+
+def run(verbosity=2):
+ unittest.TextTestRunner(verbosity=verbosity).run(suite())
diff --git a/django/contrib/gis/tests/test_gdal_geom.py b/django/contrib/gis/tests/test_gdal_geom.py
new file mode 100644
index 0000000000..b0dab0e9e8
--- /dev/null
+++ b/django/contrib/gis/tests/test_gdal_geom.py
@@ -0,0 +1,403 @@
+import unittest
+from django.contrib.gis.gdal import OGRGeometry, OGRGeomType, \
+ OGRException, OGRIndexError, SpatialReference, CoordTransform, \
+ gdal_version
+from django.contrib.gis.tests.geometries import *
+
+class OGRGeomTest(unittest.TestCase):
+ "This tests the OGR Geometry."
+
+ def test00_geomtype(self):
+ "Testing OGRGeomType object."
+
+ # OGRGeomType should initialize on all these inputs.
+ try:
+ g = OGRGeomType(1)
+ g = OGRGeomType(7)
+ g = OGRGeomType('point')
+ g = OGRGeomType('GeometrycollectioN')
+ g = OGRGeomType('LINearrING')
+ g = OGRGeomType('Unknown')
+ except:
+ self.fail('Could not create an OGRGeomType object!')
+
+ # Should throw TypeError on this input
+ self.assertRaises(TypeError, OGRGeomType.__init__, 23)
+ self.assertRaises(TypeError, OGRGeomType.__init__, 'fooD')
+ self.assertRaises(TypeError, OGRGeomType.__init__, 9)
+
+ # Equivalence can take strings, ints, and other OGRGeomTypes
+ self.assertEqual(True, OGRGeomType(1) == OGRGeomType(1))
+ self.assertEqual(True, OGRGeomType(7) == 'GeometryCollection')
+ self.assertEqual(True, OGRGeomType('point') == 'POINT')
+ self.assertEqual(False, OGRGeomType('point') == 2)
+ self.assertEqual(True, OGRGeomType('unknown') == 0)
+ self.assertEqual(True, OGRGeomType(6) == 'MULtiPolyGON')
+ self.assertEqual(False, OGRGeomType(1) != OGRGeomType('point'))
+ self.assertEqual(True, OGRGeomType('POINT') != OGRGeomType(6))
+
+ # Testing the Django field name equivalent property.
+ self.assertEqual('PointField', OGRGeomType('Point').django)
+ self.assertEqual(None, OGRGeomType('Unknown').django)
+ self.assertEqual(None, OGRGeomType('none').django)
+
+ def test01a_wkt(self):
+ "Testing WKT output."
+ for g in wkt_out:
+ geom = OGRGeometry(g.wkt)
+ self.assertEqual(g.wkt, geom.wkt)
+
+ def test01b_gml(self):
+ "Testing GML output."
+ for g in wkt_out:
+ geom = OGRGeometry(g.wkt)
+ self.assertEqual(g.gml, geom.gml)
+
+ def test01c_hex(self):
+ "Testing HEX input/output."
+ for g in hex_wkt:
+ geom1 = OGRGeometry(g.wkt)
+ self.assertEqual(g.hex, geom1.hex)
+ # Constructing w/HEX
+ geom2 = OGRGeometry(g.hex)
+ self.assertEqual(geom1, geom2)
+
+ def test01d_wkb(self):
+ "Testing WKB input/output."
+ from binascii import b2a_hex
+ for g in hex_wkt:
+ geom1 = OGRGeometry(g.wkt)
+ wkb = geom1.wkb
+ self.assertEqual(b2a_hex(wkb).upper(), g.hex)
+ # Constructing w/WKB.
+ geom2 = OGRGeometry(wkb)
+ self.assertEqual(geom1, geom2)
+
+ def test01e_json(self):
+ "Testing GeoJSON input/output."
+ from django.contrib.gis.gdal.prototypes.geom import GEOJSON
+ if not GEOJSON: return
+ for g in json_geoms:
+ geom = OGRGeometry(g.wkt)
+ self.assertEqual(g.json, geom.json)
+ self.assertEqual(g.json, geom.geojson)
+ self.assertEqual(OGRGeometry(g.wkt), OGRGeometry(geom.json))
+
+ def test02_points(self):
+ "Testing Point objects."
+
+ prev = OGRGeometry('POINT(0 0)')
+ for p in points:
+ if not hasattr(p, 'z'): # No 3D
+ pnt = OGRGeometry(p.wkt)
+ self.assertEqual(1, pnt.geom_type)
+ self.assertEqual('POINT', pnt.geom_name)
+ self.assertEqual(p.x, pnt.x)
+ self.assertEqual(p.y, pnt.y)
+ self.assertEqual((p.x, p.y), pnt.tuple)
+
+ def test03_multipoints(self):
+ "Testing MultiPoint objects."
+
+ for mp in multipoints:
+ mgeom1 = OGRGeometry(mp.wkt) # First one from WKT
+ self.assertEqual(4, mgeom1.geom_type)
+ self.assertEqual('MULTIPOINT', mgeom1.geom_name)
+ mgeom2 = OGRGeometry('MULTIPOINT') # Creating empty multipoint
+ mgeom3 = OGRGeometry('MULTIPOINT')
+ for g in mgeom1:
+ mgeom2.add(g) # adding each point from the multipoints
+ mgeom3.add(g.wkt) # should take WKT as well
+ self.assertEqual(mgeom1, mgeom2) # they should equal
+ self.assertEqual(mgeom1, mgeom3)
+ self.assertEqual(mp.points, mgeom2.tuple)
+ self.assertEqual(mp.n_p, mgeom2.point_count)
+
+ def test04_linestring(self):
+ "Testing LineString objects."
+ prev = OGRGeometry('POINT(0 0)')
+ for ls in linestrings:
+ linestr = OGRGeometry(ls.wkt)
+ self.assertEqual(2, linestr.geom_type)
+ self.assertEqual('LINESTRING', linestr.geom_name)
+ self.assertEqual(ls.n_p, linestr.point_count)
+ self.assertEqual(ls.tup, linestr.tuple)
+ self.assertEqual(True, linestr == OGRGeometry(ls.wkt))
+ self.assertEqual(True, linestr != prev)
+ self.assertRaises(OGRIndexError, linestr.__getitem__, len(linestr))
+ prev = linestr
+
+ # Testing the x, y properties.
+ x = [tmpx for tmpx, tmpy in ls.tup]
+ y = [tmpy for tmpx, tmpy in ls.tup]
+ self.assertEqual(x, linestr.x)
+ self.assertEqual(y, linestr.y)
+
+ def test05_multilinestring(self):
+ "Testing MultiLineString objects."
+ prev = OGRGeometry('POINT(0 0)')
+ for mls in multilinestrings:
+ mlinestr = OGRGeometry(mls.wkt)
+ self.assertEqual(5, mlinestr.geom_type)
+ self.assertEqual('MULTILINESTRING', mlinestr.geom_name)
+ self.assertEqual(mls.n_p, mlinestr.point_count)
+ self.assertEqual(mls.tup, mlinestr.tuple)
+ self.assertEqual(True, mlinestr == OGRGeometry(mls.wkt))
+ self.assertEqual(True, mlinestr != prev)
+ prev = mlinestr
+ for ls in mlinestr:
+ self.assertEqual(2, ls.geom_type)
+ self.assertEqual('LINESTRING', ls.geom_name)
+ self.assertRaises(OGRIndexError, mlinestr.__getitem__, len(mlinestr))
+
+ def test06_linearring(self):
+ "Testing LinearRing objects."
+ prev = OGRGeometry('POINT(0 0)')
+ for rr in linearrings:
+ lr = OGRGeometry(rr.wkt)
+ #self.assertEqual(101, lr.geom_type.num)
+ self.assertEqual('LINEARRING', lr.geom_name)
+ self.assertEqual(rr.n_p, len(lr))
+ self.assertEqual(True, lr == OGRGeometry(rr.wkt))
+ self.assertEqual(True, lr != prev)
+ prev = lr
+
+ def test07a_polygons(self):
+ "Testing Polygon objects."
+ prev = OGRGeometry('POINT(0 0)')
+ for p in polygons:
+ poly = OGRGeometry(p.wkt)
+ self.assertEqual(3, poly.geom_type)
+ self.assertEqual('POLYGON', poly.geom_name)
+ self.assertEqual(p.n_p, poly.point_count)
+ self.assertEqual(p.n_i + 1, len(poly))
+
+ # Testing area & centroid.
+ self.assertAlmostEqual(p.area, poly.area, 9)
+ x, y = poly.centroid.tuple
+ self.assertAlmostEqual(p.centroid[0], x, 9)
+ self.assertAlmostEqual(p.centroid[1], y, 9)
+
+ # Testing equivalence
+ self.assertEqual(True, poly == OGRGeometry(p.wkt))
+ self.assertEqual(True, poly != prev)
+
+ if p.ext_ring_cs:
+ ring = poly[0]
+ self.assertEqual(p.ext_ring_cs, ring.tuple)
+ self.assertEqual(p.ext_ring_cs, poly[0].tuple)
+ self.assertEqual(len(p.ext_ring_cs), ring.point_count)
+
+ for r in poly:
+ self.assertEqual('LINEARRING', r.geom_name)
+
+ def test07b_closepolygons(self):
+ "Testing closing Polygon objects."
+ # Both rings in this geometry are not closed.
+ poly = OGRGeometry('POLYGON((0 0, 5 0, 5 5, 0 5), (1 1, 2 1, 2 2, 2 1))')
+ self.assertEqual(8, poly.point_count)
+ print "\nBEGIN - expecting IllegalArgumentException; safe to ignore.\n"
+ try:
+ c = poly.centroid
+ except OGRException:
+ # Should raise an OGR exception, rings are not closed
+ pass
+ else:
+ self.fail('Should have raised an OGRException!')
+ print "\nEND - expecting IllegalArgumentException; safe to ignore.\n"
+
+ # Closing the rings -- doesn't work on GDAL versions 1.4.1 and below:
+ # http://trac.osgeo.org/gdal/ticket/1673
+ major, minor1, minor2 = gdal_version().split('.')
+ if major == '1':
+ iminor1 = int(minor1)
+ if iminor1 < 4 or (iminor1 == 4 and minor2.startswith('1')): return
+ poly.close_rings()
+ self.assertEqual(10, poly.point_count) # Two closing points should've been added
+ self.assertEqual(OGRGeometry('POINT(2.5 2.5)'), poly.centroid)
+
+ def test08_multipolygons(self):
+ "Testing MultiPolygon objects."
+ prev = OGRGeometry('POINT(0 0)')
+ for mp in multipolygons:
+ mpoly = OGRGeometry(mp.wkt)
+ self.assertEqual(6, mpoly.geom_type)
+ self.assertEqual('MULTIPOLYGON', mpoly.geom_name)
+ if mp.valid:
+ self.assertEqual(mp.n_p, mpoly.point_count)
+ self.assertEqual(mp.num_geom, len(mpoly))
+ self.assertRaises(OGRIndexError, mpoly.__getitem__, len(mpoly))
+ for p in mpoly:
+ self.assertEqual('POLYGON', p.geom_name)
+ self.assertEqual(3, p.geom_type)
+ self.assertEqual(mpoly.wkt, OGRGeometry(mp.wkt).wkt)
+
+ def test09a_srs(self):
+ "Testing OGR Geometries with Spatial Reference objects."
+ for mp in multipolygons:
+ # Creating a geometry w/spatial reference
+ sr = SpatialReference('WGS84')
+ mpoly = OGRGeometry(mp.wkt, sr)
+ self.assertEqual(sr.wkt, mpoly.srs.wkt)
+
+ # Ensuring that SRS is propagated to clones.
+ klone = mpoly.clone()
+ self.assertEqual(sr.wkt, klone.srs.wkt)
+
+ # Ensuring all children geometries (polygons and their rings) all
+ # return the assigned spatial reference as well.
+ for poly in mpoly:
+ self.assertEqual(sr.wkt, poly.srs.wkt)
+ for ring in poly:
+ self.assertEqual(sr.wkt, ring.srs.wkt)
+
+ # Ensuring SRS propagate in topological ops.
+ a, b = topology_geoms[0]
+ a, b = OGRGeometry(a.wkt, sr), OGRGeometry(b.wkt, sr)
+ diff = a.difference(b)
+ union = a.union(b)
+ self.assertEqual(sr.wkt, diff.srs.wkt)
+ self.assertEqual(sr.srid, union.srs.srid)
+
+ # Instantiating w/an integer SRID
+ mpoly = OGRGeometry(mp.wkt, 4326)
+ self.assertEqual(4326, mpoly.srid)
+ mpoly.srs = SpatialReference(4269)
+ self.assertEqual(4269, mpoly.srid)
+ self.assertEqual('NAD83', mpoly.srs.name)
+
+ # Incrementing through the multipolyogn after the spatial reference
+ # has been re-assigned.
+ for poly in mpoly:
+ self.assertEqual(mpoly.srs.wkt, poly.srs.wkt)
+ poly.srs = 32140
+ for ring in poly:
+ # Changing each ring in the polygon
+ self.assertEqual(32140, ring.srs.srid)
+ self.assertEqual('NAD83 / Texas South Central', ring.srs.name)
+ ring.srs = str(SpatialReference(4326)) # back to WGS84
+ self.assertEqual(4326, ring.srs.srid)
+
+ # Using the `srid` property.
+ ring.srid = 4322
+ self.assertEqual('WGS 72', ring.srs.name)
+ self.assertEqual(4322, ring.srid)
+
+ def test09b_srs_transform(self):
+ "Testing transform()."
+ orig = OGRGeometry('POINT (-104.609 38.255)', 4326)
+ trans = OGRGeometry('POINT (992385.4472045 481455.4944650)', 2774)
+
+ # Using an srid, a SpatialReference object, and a CoordTransform object
+ # or transformations.
+ t1, t2, t3 = orig.clone(), orig.clone(), orig.clone()
+ t1.transform(trans.srid)
+ t2.transform(SpatialReference('EPSG:2774'))
+ ct = CoordTransform(SpatialReference('WGS84'), SpatialReference(2774))
+ t3.transform(ct)
+
+ # Testing use of the `clone` keyword.
+ k1 = orig.clone()
+ k2 = k1.transform(trans.srid, clone=True)
+ self.assertEqual(k1, orig)
+ self.assertNotEqual(k1, k2)
+
+ prec = 3
+ for p in (t1, t2, t3, k2):
+ self.assertAlmostEqual(trans.x, p.x, prec)
+ self.assertAlmostEqual(trans.y, p.y, prec)
+
+ def test10_difference(self):
+ "Testing difference()."
+ for i in xrange(len(topology_geoms)):
+ g_tup = topology_geoms[i]
+ a = OGRGeometry(g_tup[0].wkt)
+ b = OGRGeometry(g_tup[1].wkt)
+ d1 = OGRGeometry(diff_geoms[i].wkt)
+ d2 = a.difference(b)
+ self.assertEqual(d1, d2)
+ self.assertEqual(d1, a - b) # __sub__ is difference operator
+ a -= b # testing __isub__
+ self.assertEqual(d1, a)
+
+ def test11_intersection(self):
+ "Testing intersects() and intersection()."
+ for i in xrange(len(topology_geoms)):
+ g_tup = topology_geoms[i]
+ a = OGRGeometry(g_tup[0].wkt)
+ b = OGRGeometry(g_tup[1].wkt)
+ i1 = OGRGeometry(intersect_geoms[i].wkt)
+ self.assertEqual(True, a.intersects(b))
+ i2 = a.intersection(b)
+ self.assertEqual(i1, i2)
+ self.assertEqual(i1, a & b) # __and__ is intersection operator
+ a &= b # testing __iand__
+ self.assertEqual(i1, a)
+
+ def test12_symdifference(self):
+ "Testing sym_difference()."
+ for i in xrange(len(topology_geoms)):
+ g_tup = topology_geoms[i]
+ a = OGRGeometry(g_tup[0].wkt)
+ b = OGRGeometry(g_tup[1].wkt)
+ d1 = OGRGeometry(sdiff_geoms[i].wkt)
+ d2 = a.sym_difference(b)
+ self.assertEqual(d1, d2)
+ self.assertEqual(d1, a ^ b) # __xor__ is symmetric difference operator
+ a ^= b # testing __ixor__
+ self.assertEqual(d1, a)
+
+ def test13_union(self):
+ "Testing union()."
+ for i in xrange(len(topology_geoms)):
+ g_tup = topology_geoms[i]
+ a = OGRGeometry(g_tup[0].wkt)
+ b = OGRGeometry(g_tup[1].wkt)
+ u1 = OGRGeometry(union_geoms[i].wkt)
+ u2 = a.union(b)
+ self.assertEqual(u1, u2)
+ self.assertEqual(u1, a | b) # __or__ is union operator
+ a |= b # testing __ior__
+ self.assertEqual(u1, a)
+
+ def test14_add(self):
+ "Testing GeometryCollection.add()."
+ # Can't insert a Point into a MultiPolygon.
+ mp = OGRGeometry('MultiPolygon')
+ pnt = OGRGeometry('POINT(5 23)')
+ self.assertRaises(OGRException, mp.add, pnt)
+
+ # GeometryCollection.add may take an OGRGeometry (if another collection
+ # of the same type all child geoms will be added individually) or WKT.
+ for mp in multipolygons:
+ mpoly = OGRGeometry(mp.wkt)
+ mp1 = OGRGeometry('MultiPolygon')
+ mp2 = OGRGeometry('MultiPolygon')
+ mp3 = OGRGeometry('MultiPolygon')
+
+ for poly in mpoly:
+ mp1.add(poly) # Adding a geometry at a time
+ mp2.add(poly.wkt) # Adding WKT
+ mp3.add(mpoly) # Adding a MultiPolygon's entire contents at once.
+ for tmp in (mp1, mp2, mp3): self.assertEqual(mpoly, tmp)
+
+ def test15_extent(self):
+ "Testing `extent` property."
+ # The xmin, ymin, xmax, ymax of the MultiPoint should be returned.
+ mp = OGRGeometry('MULTIPOINT(5 23, 0 0, 10 50)')
+ self.assertEqual((0.0, 0.0, 10.0, 50.0), mp.extent)
+ # Testing on the 'real world' Polygon.
+ poly = OGRGeometry(polygons[3].wkt)
+ ring = poly.shell
+ x, y = ring.x, ring.y
+ xmin, ymin = min(x), min(y)
+ xmax, ymax = max(x), max(y)
+ self.assertEqual((xmin, ymin, xmax, ymax), poly.extent)
+
+def suite():
+ s = unittest.TestSuite()
+ s.addTest(unittest.makeSuite(OGRGeomTest))
+ return s
+
+def run(verbosity=2):
+ unittest.TextTestRunner(verbosity=verbosity).run(suite())
diff --git a/django/contrib/gis/tests/test_gdal_srs.py b/django/contrib/gis/tests/test_gdal_srs.py
new file mode 100644
index 0000000000..2742c7aad9
--- /dev/null
+++ b/django/contrib/gis/tests/test_gdal_srs.py
@@ -0,0 +1,169 @@
+import unittest
+from django.contrib.gis.gdal import SpatialReference, CoordTransform, OGRException, SRSException
+
+class TestSRS:
+ def __init__(self, wkt, **kwargs):
+ self.wkt = wkt
+ for key, value in kwargs.items():
+ setattr(self, key, value)
+
+# Some Spatial Reference examples
+srlist = (TestSRS('GEOGCS["WGS 84",DATUM["WGS_1984",SPHEROID["WGS 84",6378137,298.257223563,AUTHORITY["EPSG","7030"]],TOWGS84[0,0,0,0,0,0,0],AUTHORITY["EPSG","6326"]],PRIMEM["Greenwich",0,AUTHORITY["EPSG","8901"]],UNIT["degree",0.01745329251994328,AUTHORITY["EPSG","9122"]],AUTHORITY["EPSG","4326"]]',
+ proj='+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs ',
+ epsg=4326, projected=False, geographic=True, local=False,
+ lin_name='unknown', ang_name='degree', lin_units=1.0, ang_units=0.0174532925199,
+ auth={'GEOGCS' : ('EPSG', '4326'), 'spheroid' : ('EPSG', '7030')},
+ attr=(('DATUM', 'WGS_1984'), (('SPHEROID', 1), '6378137'),('primem|authority', 'EPSG'),),
+ ),
+ TestSRS('PROJCS["NAD83 / Texas South Central",GEOGCS["NAD83",DATUM["North_American_Datum_1983",SPHEROID["GRS 1980",6378137,298.257222101,AUTHORITY["EPSG","7019"]],AUTHORITY["EPSG","6269"]],PRIMEM["Greenwich",0,AUTHORITY["EPSG","8901"]],UNIT["degree",0.01745329251994328,AUTHORITY["EPSG","9122"]],AUTHORITY["EPSG","4269"]],PROJECTION["Lambert_Conformal_Conic_2SP"],PARAMETER["standard_parallel_1",30.28333333333333],PARAMETER["standard_parallel_2",28.38333333333333],PARAMETER["latitude_of_origin",27.83333333333333],PARAMETER["central_meridian",-99],PARAMETER["false_easting",600000],PARAMETER["false_northing",4000000],UNIT["metre",1,AUTHORITY["EPSG","9001"]],AUTHORITY["EPSG","32140"]]',
+ proj='+proj=lcc +lat_1=30.28333333333333 +lat_2=28.38333333333333 +lat_0=27.83333333333333 +lon_0=-99 +x_0=600000 +y_0=4000000 +ellps=GRS80 +datum=NAD83 +units=m +no_defs ',
+ epsg=32140, projected=True, geographic=False, local=False,
+ lin_name='metre', ang_name='degree', lin_units=1.0, ang_units=0.0174532925199,
+ auth={'PROJCS' : ('EPSG', '32140'), 'spheroid' : ('EPSG', '7019'), 'unit' : ('EPSG', '9001'),},
+ attr=(('DATUM', 'North_American_Datum_1983'),(('SPHEROID', 2), '298.257222101'),('PROJECTION','Lambert_Conformal_Conic_2SP'),),
+ ),
+ TestSRS('PROJCS["NAD_1983_StatePlane_Texas_South_Central_FIPS_4204_Feet",GEOGCS["GCS_North_American_1983",DATUM["North_American_Datum_1983",SPHEROID["GRS_1980",6378137.0,298.257222101]],PRIMEM["Greenwich",0.0],UNIT["Degree",0.0174532925199433]],PROJECTION["Lambert_Conformal_Conic_2SP"],PARAMETER["False_Easting",1968500.0],PARAMETER["False_Northing",13123333.33333333],PARAMETER["Central_Meridian",-99.0],PARAMETER["Standard_Parallel_1",28.38333333333333],PARAMETER["Standard_Parallel_2",30.28333333333334],PARAMETER["Latitude_Of_Origin",27.83333333333333],UNIT["Foot_US",0.3048006096012192]]',
+ proj='+proj=lcc +lat_1=28.38333333333333 +lat_2=30.28333333333334 +lat_0=27.83333333333333 +lon_0=-99 +x_0=600000 +y_0=3999999.999999999 +ellps=GRS80 +datum=NAD83 +to_meter=0.3048006096012192 +no_defs ',
+ epsg=None, projected=True, geographic=False, local=False,
+ lin_name='Foot_US', ang_name='Degree', lin_units=0.3048006096012192, ang_units=0.0174532925199,
+ auth={'PROJCS' : (None, None),},
+ attr=(('PROJCS|GeOgCs|spheroid', 'GRS_1980'),(('projcs', 9), 'UNIT'), (('projcs', 11), None),),
+ ),
+ # This is really ESRI format, not WKT -- but the import should work the same
+ TestSRS('LOCAL_CS["Non-Earth (Meter)",LOCAL_DATUM["Local Datum",0],UNIT["Meter",1.0],AXIS["X",EAST],AXIS["Y",NORTH]]',
+ esri=True, proj=None, epsg=None, projected=False, geographic=False, local=True,
+ lin_name='Meter', ang_name='degree', lin_units=1.0, ang_units=0.0174532925199,
+ attr=(('LOCAL_DATUM', 'Local Datum'), ('unit', 'Meter')),
+ ),
+ )
+
+# Well-Known Names
+well_known = (TestSRS('GEOGCS["WGS 84",DATUM["WGS_1984",SPHEROID["WGS 84",6378137,298.257223563,AUTHORITY["EPSG","7030"]],TOWGS84[0,0,0,0,0,0,0],AUTHORITY["EPSG","6326"]],PRIMEM["Greenwich",0,AUTHORITY["EPSG","8901"]],UNIT["degree",0.01745329251994328,AUTHORITY["EPSG","9122"]],AUTHORITY["EPSG","4326"]]', wk='WGS84', name='WGS 84', attrs=(('GEOGCS|AUTHORITY', 1, '4326'), ('SPHEROID', 'WGS 84'))),
+ TestSRS('GEOGCS["WGS 72",DATUM["WGS_1972",SPHEROID["WGS 72",6378135,298.26,AUTHORITY["EPSG","7043"]],AUTHORITY["EPSG","6322"]],PRIMEM["Greenwich",0,AUTHORITY["EPSG","8901"]],UNIT["degree",0.01745329251994328,AUTHORITY["EPSG","9122"]],AUTHORITY["EPSG","4322"]]', wk='WGS72', name='WGS 72', attrs=(('GEOGCS|AUTHORITY', 1, '4322'), ('SPHEROID', 'WGS 72'))),
+ TestSRS('GEOGCS["NAD27",DATUM["North_American_Datum_1927",SPHEROID["Clarke 1866",6378206.4,294.9786982138982,AUTHORITY["EPSG","7008"]],AUTHORITY["EPSG","6267"]],PRIMEM["Greenwich",0,AUTHORITY["EPSG","8901"]],UNIT["degree",0.01745329251994328,AUTHORITY["EPSG","9122"]],AUTHORITY["EPSG","4267"]]', wk='NAD27', name='NAD27', attrs=(('GEOGCS|AUTHORITY', 1, '4267'), ('SPHEROID', 'Clarke 1866'))),
+ TestSRS('GEOGCS["NAD83",DATUM["North_American_Datum_1983",SPHEROID["GRS 1980",6378137,298.257222101,AUTHORITY["EPSG","7019"]],AUTHORITY["EPSG","6269"]],PRIMEM["Greenwich",0,AUTHORITY["EPSG","8901"]],UNIT["degree",0.01745329251994328,AUTHORITY["EPSG","9122"]],AUTHORITY["EPSG","4269"]]', wk='NAD83', name='NAD83', attrs=(('GEOGCS|AUTHORITY', 1, '4269'), ('SPHEROID', 'GRS 1980'))),
+ TestSRS('PROJCS["NZGD49 / Karamea Circuit",GEOGCS["NZGD49",DATUM["New_Zealand_Geodetic_Datum_1949",SPHEROID["International 1924",6378388,297,AUTHORITY["EPSG","7022"]],TOWGS84[59.47,-5.04,187.44,0.47,-0.1,1.024,-4.5993],AUTHORITY["EPSG","6272"]],PRIMEM["Greenwich",0,AUTHORITY["EPSG","8901"]],UNIT["degree",0.01745329251994328,AUTHORITY["EPSG","9122"]],AUTHORITY["EPSG","4272"]],PROJECTION["Transverse_Mercator"],PARAMETER["latitude_of_origin",-41.28991152777778],PARAMETER["central_meridian",172.1090281944444],PARAMETER["scale_factor",1],PARAMETER["false_easting",300000],PARAMETER["false_northing",700000],UNIT["metre",1,AUTHORITY["EPSG","9001"]],AUTHORITY["EPSG","27216"]]', wk='EPSG:27216', name='NZGD49 / Karamea Circuit', attrs=(('PROJECTION','Transverse_Mercator'), ('SPHEROID', 'International 1924'))),
+ )
+
+bad_srlist = ('Foobar', 'OOJCS["NAD83 / Texas South Central",GEOGCS["NAD83",DATUM["North_American_Datum_1983",SPHEROID["GRS 1980",6378137,298.257222101,AUTHORITY["EPSG","7019"]],AUTHORITY["EPSG","6269"]],PRIMEM["Greenwich",0,AUTHORITY["EPSG","8901"]],UNIT["degree",0.01745329251994328,AUTHORITY["EPSG","9122"]],AUTHORITY["EPSG","4269"]],PROJECTION["Lambert_Conformal_Conic_2SP"],PARAMETER["standard_parallel_1",30.28333333333333],PARAMETER["standard_parallel_2",28.38333333333333],PARAMETER["latitude_of_origin",27.83333333333333],PARAMETER["central_meridian",-99],PARAMETER["false_easting",600000],PARAMETER["false_northing",4000000],UNIT["metre",1,AUTHORITY["EPSG","9001"]],AUTHORITY["EPSG","32140"]]',)
+
+class SpatialRefTest(unittest.TestCase):
+
+ def test01_wkt(self):
+ "Testing initialization on valid OGC WKT."
+ for s in srlist:
+ srs = SpatialReference(s.wkt)
+
+ def test02_bad_wkt(self):
+ "Testing initialization on invalid WKT."
+ for bad in bad_srlist:
+ try:
+ srs = SpatialReference(bad)
+ srs.validate()
+ except (SRSException, OGRException):
+ pass
+ else:
+ self.fail('Should not have initialized on bad WKT "%s"!')
+
+ def test03_get_wkt(self):
+ "Testing getting the WKT."
+ for s in srlist:
+ srs = SpatialReference(s.wkt)
+ self.assertEqual(s.wkt, srs.wkt)
+
+ def test04_proj(self):
+ "Test PROJ.4 import and export."
+
+ for s in srlist:
+ if s.proj:
+ srs1 = SpatialReference(s.wkt)
+ srs2 = SpatialReference(s.proj)
+ self.assertEqual(srs1.proj, srs2.proj)
+
+ def test05_epsg(self):
+ "Test EPSG import."
+ for s in srlist:
+ if s.epsg:
+ srs1 = SpatialReference(s.wkt)
+ srs2 = SpatialReference(s.epsg)
+ srs3 = SpatialReference(str(s.epsg))
+ srs4 = SpatialReference('EPSG:%d' % s.epsg)
+ #self.assertEqual(srs1.wkt, srs2.wkt)
+ for srs in (srs1, srs2, srs3, srs4):
+ for attr, expected in s.attr:
+ self.assertEqual(expected, srs[attr])
+
+ def test07_boolean_props(self):
+ "Testing the boolean properties."
+ for s in srlist:
+ srs = SpatialReference(s.wkt)
+ self.assertEqual(s.projected, srs.projected)
+ self.assertEqual(s.geographic, srs.geographic)
+
+ def test08_angular_linear(self):
+ "Testing the linear and angular units routines."
+ for s in srlist:
+ srs = SpatialReference(s.wkt)
+ self.assertEqual(s.ang_name, srs.angular_name)
+ self.assertEqual(s.lin_name, srs.linear_name)
+ self.assertAlmostEqual(s.ang_units, srs.angular_units, 9)
+ self.assertAlmostEqual(s.lin_units, srs.linear_units, 9)
+
+ def test09_authority(self):
+ "Testing the authority name & code routines."
+ for s in srlist:
+ if hasattr(s, 'auth'):
+ srs = SpatialReference(s.wkt)
+ for target, tup in s.auth.items():
+ self.assertEqual(tup[0], srs.auth_name(target))
+ self.assertEqual(tup[1], srs.auth_code(target))
+
+ def test10_attributes(self):
+ "Testing the attribute retrieval routines."
+ for s in srlist:
+ srs = SpatialReference(s.wkt)
+ for tup in s.attr:
+ att = tup[0] # Attribute to test
+ exp = tup[1] # Expected result
+ self.assertEqual(exp, srs[att])
+
+ def test11_wellknown(self):
+ "Testing Well Known Names of Spatial References."
+ for s in well_known:
+ srs = SpatialReference(s.wk)
+ self.assertEqual(s.name, srs.name)
+ for tup in s.attrs:
+ if len(tup) == 2:
+ key = tup[0]
+ exp = tup[1]
+ elif len(tup) == 3:
+ key = tup[:2]
+ exp = tup[2]
+ self.assertEqual(srs[key], exp)
+
+ def test12_coordtransform(self):
+ "Testing initialization of a CoordTransform."
+ target = SpatialReference('WGS84')
+ for s in srlist:
+ if s.proj:
+ ct = CoordTransform(SpatialReference(s.wkt), target)
+
+ def test13_attr_value(self):
+ "Testing the attr_value() method."
+ s1 = SpatialReference('WGS84')
+ self.assertRaises(TypeError, s1.__getitem__, 0)
+ self.assertRaises(TypeError, s1.__getitem__, ('GEOGCS', 'foo'))
+ self.assertEqual('WGS 84', s1['GEOGCS'])
+ self.assertEqual('WGS_1984', s1['DATUM'])
+ self.assertEqual('EPSG', s1['AUTHORITY'])
+ self.assertEqual(4326, int(s1['AUTHORITY', 1]))
+ #for i in range(7): self.assertEqual(0, int(s1['TOWGS84', i]))
+ self.assertEqual(None, s1['FOOBAR'])
+
+def suite():
+ s = unittest.TestSuite()
+ s.addTest(unittest.makeSuite(SpatialRefTest))
+ return s
+
+def run(verbosity=2):
+ unittest.TextTestRunner(verbosity=verbosity).run(suite())
diff --git a/django/contrib/gis/tests/test_geoip.py b/django/contrib/gis/tests/test_geoip.py
new file mode 100644
index 0000000000..44b080223c
--- /dev/null
+++ b/django/contrib/gis/tests/test_geoip.py
@@ -0,0 +1,104 @@
+import os, unittest
+from django.db import settings
+from django.contrib.gis.geos import GEOSGeometry
+from django.contrib.gis.utils import GeoIP, GeoIPException
+
+# Note: Requires use of both the GeoIP country and city datasets.
+# The GEOIP_DATA path should be the only setting set (the directory
+# should contain links or the actual database files 'GeoIP.dat' and
+# 'GeoLiteCity.dat'.
+class GeoIPTest(unittest.TestCase):
+
+ def test01_init(self):
+ "Testing GeoIP initialization."
+ g1 = GeoIP() # Everything inferred from GeoIP path
+ path = settings.GEOIP_PATH
+ g2 = GeoIP(path, 0) # Passing in data path explicitly.
+ g3 = GeoIP.open(path, 0) # MaxMind Python API syntax.
+
+ for g in (g1, g2, g3):
+ self.assertEqual(True, bool(g._country))
+ self.assertEqual(True, bool(g._city))
+
+ # Only passing in the location of one database.
+ city = os.path.join(path, 'GeoLiteCity.dat')
+ cntry = os.path.join(path, 'GeoIP.dat')
+ g4 = GeoIP(city, country='')
+ self.assertEqual(None, g4._country)
+ g5 = GeoIP(cntry, city='')
+ self.assertEqual(None, g5._city)
+
+ # Improper parameters.
+ bad_params = (23, 'foo', 15.23)
+ for bad in bad_params:
+ self.assertRaises(GeoIPException, GeoIP, cache=bad)
+ if isinstance(bad, basestring):
+ e = GeoIPException
+ else:
+ e = TypeError
+ self.assertRaises(e, GeoIP, bad, 0)
+
+ def test02_bad_query(self):
+ "Testing GeoIP query parameter checking."
+ cntry_g = GeoIP(city='<foo>')
+ # No city database available, these calls should fail.
+ self.assertRaises(GeoIPException, cntry_g.city, 'google.com')
+ self.assertRaises(GeoIPException, cntry_g.coords, 'yahoo.com')
+
+ # Non-string query should raise TypeError
+ self.assertRaises(TypeError, cntry_g.country_code, 17)
+ self.assertRaises(TypeError, cntry_g.country_name, GeoIP)
+
+ def test03_country(self):
+ "Testing GeoIP country querying methods."
+ g = GeoIP(city='<foo>')
+
+ fqdn = 'www.google.com'
+ addr = '12.215.42.19'
+
+ for query in (fqdn, addr):
+ for func in (g.country_code, g.country_code_by_addr, g.country_code_by_name):
+ self.assertEqual('US', func(query))
+ for func in (g.country_name, g.country_name_by_addr, g.country_name_by_name):
+ self.assertEqual('United States', func(query))
+ self.assertEqual({'country_code' : 'US', 'country_name' : 'United States'},
+ g.country(query))
+
+ def test04_city(self):
+ "Testing GeoIP city querying methods."
+ g = GeoIP(country='<foo>')
+
+ addr = '130.80.29.3'
+ fqdn = 'chron.com'
+ for query in (fqdn, addr):
+ # Country queries should still work.
+ for func in (g.country_code, g.country_code_by_addr, g.country_code_by_name):
+ self.assertEqual('US', func(query))
+ for func in (g.country_name, g.country_name_by_addr, g.country_name_by_name):
+ self.assertEqual('United States', func(query))
+ self.assertEqual({'country_code' : 'US', 'country_name' : 'United States'},
+ g.country(query))
+
+ # City information dictionary.
+ d = g.city(query)
+ self.assertEqual('USA', d['country_code3'])
+ self.assertEqual('Houston', d['city'])
+ self.assertEqual('TX', d['region'])
+ self.assertEqual('77002', d['postal_code'])
+ self.assertEqual(713, d['area_code'])
+ geom = g.geos(query)
+ self.failIf(not isinstance(geom, GEOSGeometry))
+ lon, lat = (-95.366996765, 29.752300262)
+ lat_lon = g.lat_lon(query)
+ lat_lon = (lat_lon[1], lat_lon[0])
+ for tup in (geom.tuple, g.coords(query), g.lon_lat(query), lat_lon):
+ self.assertAlmostEqual(lon, tup[0], 9)
+ self.assertAlmostEqual(lat, tup[1], 9)
+
+def suite():
+ s = unittest.TestSuite()
+ s.addTest(unittest.makeSuite(GeoIPTest))
+ return s
+
+def run(verbosity=2):
+ unittest.TextTestRunner(verbosity=verbosity).run(suite())
diff --git a/django/contrib/gis/tests/test_geos.py b/django/contrib/gis/tests/test_geos.py
new file mode 100644
index 0000000000..8ea450700c
--- /dev/null
+++ b/django/contrib/gis/tests/test_geos.py
@@ -0,0 +1,775 @@
+import random, unittest, sys
+from ctypes import ArgumentError
+from django.contrib.gis.geos import *
+from django.contrib.gis.geos.base import HAS_GDAL
+from django.contrib.gis.tests.geometries import *
+
+if HAS_NUMPY: from numpy import array
+if HAS_GDAL: from django.contrib.gis.gdal import OGRGeometry, SpatialReference, CoordTransform, GEOJSON
+
+class GEOSTest(unittest.TestCase):
+
+ @property
+ def null_srid(self):
+ """
+ Returns the proper null SRID depending on the GEOS version.
+ See the comments in `test15_srid` for more details.
+ """
+ info = geos_version_info()
+ if info['version'] == '3.0.0' and info['release_candidate']:
+ return -1
+ else:
+ return None
+
+ def test01a_wkt(self):
+ "Testing WKT output."
+ for g in wkt_out:
+ geom = fromstr(g.wkt)
+ self.assertEqual(g.ewkt, geom.wkt)
+
+ def test01b_hex(self):
+ "Testing HEX output."
+ for g in hex_wkt:
+ geom = fromstr(g.wkt)
+ self.assertEqual(g.hex, geom.hex)
+
+ def test01c_kml(self):
+ "Testing KML output."
+ for tg in wkt_out:
+ geom = fromstr(tg.wkt)
+ kml = getattr(tg, 'kml', False)
+ if kml: self.assertEqual(kml, geom.kml)
+
+ def test01d_errors(self):
+ "Testing the Error handlers."
+ # string-based
+ print "\nBEGIN - expecting GEOS_ERROR; safe to ignore.\n"
+ for err in errors:
+ try:
+ g = fromstr(err.wkt)
+ except (GEOSException, ValueError):
+ pass
+ print "\nEND - expecting GEOS_ERROR; safe to ignore.\n"
+
+ class NotAGeometry(object):
+ pass
+
+ # Some other object
+ self.assertRaises(TypeError, GEOSGeometry, NotAGeometry())
+ # None
+ self.assertRaises(TypeError, GEOSGeometry, None)
+ # Bad WKB
+ self.assertRaises(GEOSException, GEOSGeometry, buffer('0'))
+
+ def test01e_wkb(self):
+ "Testing WKB output."
+ from binascii import b2a_hex
+ for g in hex_wkt:
+ geom = fromstr(g.wkt)
+ wkb = geom.wkb
+ self.assertEqual(b2a_hex(wkb).upper(), g.hex)
+
+ def test01f_create_hex(self):
+ "Testing creation from HEX."
+ for g in hex_wkt:
+ geom_h = GEOSGeometry(g.hex)
+ # we need to do this so decimal places get normalised
+ geom_t = fromstr(g.wkt)
+ self.assertEqual(geom_t.wkt, geom_h.wkt)
+
+ def test01g_create_wkb(self):
+ "Testing creation from WKB."
+ from binascii import a2b_hex
+ for g in hex_wkt:
+ wkb = buffer(a2b_hex(g.hex))
+ geom_h = GEOSGeometry(wkb)
+ # we need to do this so decimal places get normalised
+ geom_t = fromstr(g.wkt)
+ self.assertEqual(geom_t.wkt, geom_h.wkt)
+
+ def test01h_ewkt(self):
+ "Testing EWKT."
+ srid = 32140
+ for p in polygons:
+ ewkt = 'SRID=%d;%s' % (srid, p.wkt)
+ poly = fromstr(ewkt)
+ self.assertEqual(srid, poly.srid)
+ self.assertEqual(srid, poly.shell.srid)
+ self.assertEqual(srid, fromstr(poly.ewkt).srid) # Checking export
+
+ def test01i_json(self):
+ "Testing GeoJSON input/output (via GDAL)."
+ if not HAS_GDAL or not GEOJSON: return
+ for g in json_geoms:
+ geom = GEOSGeometry(g.wkt)
+ self.assertEqual(g.json, geom.json)
+ self.assertEqual(g.json, geom.geojson)
+ self.assertEqual(GEOSGeometry(g.wkt), GEOSGeometry(geom.json))
+
+ def test01j_eq(self):
+ "Testing equivalence."
+ p = fromstr('POINT(5 23)')
+ self.assertEqual(p, p.wkt)
+ self.assertNotEqual(p, 'foo')
+ ls = fromstr('LINESTRING(0 0, 1 1, 5 5)')
+ self.assertEqual(ls, ls.wkt)
+ self.assertNotEqual(p, 'bar')
+ # Error shouldn't be raise on equivalence testing with
+ # an invalid type.
+ for g in (p, ls):
+ self.assertNotEqual(g, None)
+ self.assertNotEqual(g, {'foo' : 'bar'})
+ self.assertNotEqual(g, False)
+
+ def test02a_points(self):
+ "Testing Point objects."
+ prev = fromstr('POINT(0 0)')
+ for p in points:
+ # Creating the point from the WKT
+ pnt = fromstr(p.wkt)
+ self.assertEqual(pnt.geom_type, 'Point')
+ self.assertEqual(pnt.geom_typeid, 0)
+ self.assertEqual(p.x, pnt.x)
+ self.assertEqual(p.y, pnt.y)
+ self.assertEqual(True, pnt == fromstr(p.wkt))
+ self.assertEqual(False, pnt == prev)
+
+ # Making sure that the point's X, Y components are what we expect
+ self.assertAlmostEqual(p.x, pnt.tuple[0], 9)
+ self.assertAlmostEqual(p.y, pnt.tuple[1], 9)
+
+ # Testing the third dimension, and getting the tuple arguments
+ if hasattr(p, 'z'):
+ self.assertEqual(True, pnt.hasz)
+ self.assertEqual(p.z, pnt.z)
+ self.assertEqual(p.z, pnt.tuple[2], 9)
+ tup_args = (p.x, p.y, p.z)
+ set_tup1 = (2.71, 3.14, 5.23)
+ set_tup2 = (5.23, 2.71, 3.14)
+ else:
+ self.assertEqual(False, pnt.hasz)
+ self.assertEqual(None, pnt.z)
+ tup_args = (p.x, p.y)
+ set_tup1 = (2.71, 3.14)
+ set_tup2 = (3.14, 2.71)
+
+ # Centroid operation on point should be point itself
+ self.assertEqual(p.centroid, pnt.centroid.tuple)
+
+ # Now testing the different constructors
+ pnt2 = Point(tup_args) # e.g., Point((1, 2))
+ pnt3 = Point(*tup_args) # e.g., Point(1, 2)
+ self.assertEqual(True, pnt == pnt2)
+ self.assertEqual(True, pnt == pnt3)
+
+ # Now testing setting the x and y
+ pnt.y = 3.14
+ pnt.x = 2.71
+ self.assertEqual(3.14, pnt.y)
+ self.assertEqual(2.71, pnt.x)
+
+ # Setting via the tuple/coords property
+ pnt.tuple = set_tup1
+ self.assertEqual(set_tup1, pnt.tuple)
+ pnt.coords = set_tup2
+ self.assertEqual(set_tup2, pnt.coords)
+
+ prev = pnt # setting the previous geometry
+
+ def test02b_multipoints(self):
+ "Testing MultiPoint objects."
+ for mp in multipoints:
+ mpnt = fromstr(mp.wkt)
+ self.assertEqual(mpnt.geom_type, 'MultiPoint')
+ self.assertEqual(mpnt.geom_typeid, 4)
+
+ self.assertAlmostEqual(mp.centroid[0], mpnt.centroid.tuple[0], 9)
+ self.assertAlmostEqual(mp.centroid[1], mpnt.centroid.tuple[1], 9)
+
+ self.assertRaises(GEOSIndexError, mpnt.__getitem__, len(mpnt))
+ self.assertEqual(mp.centroid, mpnt.centroid.tuple)
+ self.assertEqual(mp.points, tuple(m.tuple for m in mpnt))
+ for p in mpnt:
+ self.assertEqual(p.geom_type, 'Point')
+ self.assertEqual(p.geom_typeid, 0)
+ self.assertEqual(p.empty, False)
+ self.assertEqual(p.valid, True)
+
+ def test03a_linestring(self):
+ "Testing LineString objects."
+ prev = fromstr('POINT(0 0)')
+ for l in linestrings:
+ ls = fromstr(l.wkt)
+ self.assertEqual(ls.geom_type, 'LineString')
+ self.assertEqual(ls.geom_typeid, 1)
+ self.assertEqual(ls.empty, False)
+ self.assertEqual(ls.ring, False)
+ if hasattr(l, 'centroid'):
+ self.assertEqual(l.centroid, ls.centroid.tuple)
+ if hasattr(l, 'tup'):
+ self.assertEqual(l.tup, ls.tuple)
+
+ self.assertEqual(True, ls == fromstr(l.wkt))
+ self.assertEqual(False, ls == prev)
+ self.assertRaises(GEOSIndexError, ls.__getitem__, len(ls))
+ prev = ls
+
+ # Creating a LineString from a tuple, list, and numpy array
+ self.assertEqual(ls, LineString(ls.tuple)) # tuple
+ self.assertEqual(ls, LineString(*ls.tuple)) # as individual arguments
+ self.assertEqual(ls, LineString([list(tup) for tup in ls.tuple])) # as list
+ self.assertEqual(ls.wkt, LineString(*tuple(Point(tup) for tup in ls.tuple)).wkt) # Point individual arguments
+ if HAS_NUMPY: self.assertEqual(ls, LineString(array(ls.tuple))) # as numpy array
+
+ def test03b_multilinestring(self):
+ "Testing MultiLineString objects."
+ prev = fromstr('POINT(0 0)')
+ for l in multilinestrings:
+ ml = fromstr(l.wkt)
+ self.assertEqual(ml.geom_type, 'MultiLineString')
+ self.assertEqual(ml.geom_typeid, 5)
+
+ self.assertAlmostEqual(l.centroid[0], ml.centroid.x, 9)
+ self.assertAlmostEqual(l.centroid[1], ml.centroid.y, 9)
+
+ self.assertEqual(True, ml == fromstr(l.wkt))
+ self.assertEqual(False, ml == prev)
+ prev = ml
+
+ for ls in ml:
+ self.assertEqual(ls.geom_type, 'LineString')
+ self.assertEqual(ls.geom_typeid, 1)
+ self.assertEqual(ls.empty, False)
+
+ self.assertRaises(GEOSIndexError, ml.__getitem__, len(ml))
+ self.assertEqual(ml.wkt, MultiLineString(*tuple(s.clone() for s in ml)).wkt)
+ self.assertEqual(ml, MultiLineString(*tuple(LineString(s.tuple) for s in ml)))
+
+ def test04_linearring(self):
+ "Testing LinearRing objects."
+ for rr in linearrings:
+ lr = fromstr(rr.wkt)
+ self.assertEqual(lr.geom_type, 'LinearRing')
+ self.assertEqual(lr.geom_typeid, 2)
+ self.assertEqual(rr.n_p, len(lr))
+ self.assertEqual(True, lr.valid)
+ self.assertEqual(False, lr.empty)
+
+ # Creating a LinearRing from a tuple, list, and numpy array
+ self.assertEqual(lr, LinearRing(lr.tuple))
+ self.assertEqual(lr, LinearRing(*lr.tuple))
+ self.assertEqual(lr, LinearRing([list(tup) for tup in lr.tuple]))
+ if HAS_NUMPY: self.assertEqual(lr, LinearRing(array(lr.tuple)))
+
+ def test05a_polygons(self):
+ "Testing Polygon objects."
+ prev = fromstr('POINT(0 0)')
+ for p in polygons:
+ # Creating the Polygon, testing its properties.
+ poly = fromstr(p.wkt)
+ self.assertEqual(poly.geom_type, 'Polygon')
+ self.assertEqual(poly.geom_typeid, 3)
+ self.assertEqual(poly.empty, False)
+ self.assertEqual(poly.ring, False)
+ self.assertEqual(p.n_i, poly.num_interior_rings)
+ self.assertEqual(p.n_i + 1, len(poly)) # Testing __len__
+ self.assertEqual(p.n_p, poly.num_points)
+
+ # Area & Centroid
+ self.assertAlmostEqual(p.area, poly.area, 9)
+ self.assertAlmostEqual(p.centroid[0], poly.centroid.tuple[0], 9)
+ self.assertAlmostEqual(p.centroid[1], poly.centroid.tuple[1], 9)
+
+ # Testing the geometry equivalence
+ self.assertEqual(True, poly == fromstr(p.wkt))
+ self.assertEqual(False, poly == prev) # Should not be equal to previous geometry
+ self.assertEqual(True, poly != prev)
+
+ # Testing the exterior ring
+ ring = poly.exterior_ring
+ self.assertEqual(ring.geom_type, 'LinearRing')
+ self.assertEqual(ring.geom_typeid, 2)
+ if p.ext_ring_cs:
+ self.assertEqual(p.ext_ring_cs, ring.tuple)
+ self.assertEqual(p.ext_ring_cs, poly[0].tuple) # Testing __getitem__
+
+ # Testing __getitem__ and __setitem__ on invalid indices
+ self.assertRaises(GEOSIndexError, poly.__getitem__, len(poly))
+ self.assertRaises(GEOSIndexError, poly.__setitem__, len(poly), False)
+ self.assertRaises(GEOSIndexError, poly.__getitem__, -1)
+
+ # Testing __iter__
+ for r in poly:
+ self.assertEqual(r.geom_type, 'LinearRing')
+ self.assertEqual(r.geom_typeid, 2)
+
+ # Testing polygon construction.
+ self.assertRaises(TypeError, Polygon.__init__, 0, [1, 2, 3])
+ self.assertRaises(TypeError, Polygon.__init__, 'foo')
+
+ # Polygon(shell, (hole1, ... holeN))
+ rings = tuple(r for r in poly)
+ self.assertEqual(poly, Polygon(rings[0], rings[1:]))
+
+ # Polygon(shell_tuple, hole_tuple1, ... , hole_tupleN)
+ ring_tuples = tuple(r.tuple for r in poly)
+ self.assertEqual(poly, Polygon(*ring_tuples))
+
+ # Constructing with tuples of LinearRings.
+ self.assertEqual(poly.wkt, Polygon(*tuple(r for r in poly)).wkt)
+ self.assertEqual(poly.wkt, Polygon(*tuple(LinearRing(r.tuple) for r in poly)).wkt)
+
+ def test05b_multipolygons(self):
+ "Testing MultiPolygon objects."
+ print "\nBEGIN - expecting GEOS_NOTICE; safe to ignore.\n"
+ prev = fromstr('POINT (0 0)')
+ for mp in multipolygons:
+ mpoly = fromstr(mp.wkt)
+ self.assertEqual(mpoly.geom_type, 'MultiPolygon')
+ self.assertEqual(mpoly.geom_typeid, 6)
+ self.assertEqual(mp.valid, mpoly.valid)
+
+ if mp.valid:
+ self.assertEqual(mp.num_geom, mpoly.num_geom)
+ self.assertEqual(mp.n_p, mpoly.num_coords)
+ self.assertEqual(mp.num_geom, len(mpoly))
+ self.assertRaises(GEOSIndexError, mpoly.__getitem__, len(mpoly))
+ for p in mpoly:
+ self.assertEqual(p.geom_type, 'Polygon')
+ self.assertEqual(p.geom_typeid, 3)
+ self.assertEqual(p.valid, True)
+ self.assertEqual(mpoly.wkt, MultiPolygon(*tuple(poly.clone() for poly in mpoly)).wkt)
+
+ print "\nEND - expecting GEOS_NOTICE; safe to ignore.\n"
+
+ def test06a_memory_hijinks(self):
+ "Testing Geometry __del__() on rings and polygons."
+ #### Memory issues with rings and polygons
+
+ # These tests are needed to ensure sanity with writable geometries.
+
+ # Getting a polygon with interior rings, and pulling out the interior rings
+ poly = fromstr(polygons[1].wkt)
+ ring1 = poly[0]
+ ring2 = poly[1]
+
+ # These deletes should be 'harmless' since they are done on child geometries
+ del ring1
+ del ring2
+ ring1 = poly[0]
+ ring2 = poly[1]
+
+ # Deleting the polygon
+ del poly
+
+ # Access to these rings is OK since they are clones.
+ s1, s2 = str(ring1), str(ring2)
+
+ # The previous hijinks tests are now moot because only clones are
+ # now used =)
+
+ def test08_coord_seq(self):
+ "Testing Coordinate Sequence objects."
+ for p in polygons:
+ if p.ext_ring_cs:
+ # Constructing the polygon and getting the coordinate sequence
+ poly = fromstr(p.wkt)
+ cs = poly.exterior_ring.coord_seq
+
+ self.assertEqual(p.ext_ring_cs, cs.tuple) # done in the Polygon test too.
+ self.assertEqual(len(p.ext_ring_cs), len(cs)) # Making sure __len__ works
+
+ # Checks __getitem__ and __setitem__
+ for i in xrange(len(p.ext_ring_cs)):
+ c1 = p.ext_ring_cs[i] # Expected value
+ c2 = cs[i] # Value from coordseq
+ self.assertEqual(c1, c2)
+
+ # Constructing the test value to set the coordinate sequence with
+ if len(c1) == 2: tset = (5, 23)
+ else: tset = (5, 23, 8)
+ cs[i] = tset
+
+ # Making sure every set point matches what we expect
+ for j in range(len(tset)):
+ cs[i] = tset
+ self.assertEqual(tset[j], cs[i][j])
+
+ def test09_relate_pattern(self):
+ "Testing relate() and relate_pattern()."
+ g = fromstr('POINT (0 0)')
+ self.assertRaises(GEOSException, g.relate_pattern, 0, 'invalid pattern, yo')
+ for i in xrange(len(relate_geoms)):
+ g_tup = relate_geoms[i]
+ a = fromstr(g_tup[0].wkt)
+ b = fromstr(g_tup[1].wkt)
+ pat = g_tup[2]
+ result = g_tup[3]
+ self.assertEqual(result, a.relate_pattern(b, pat))
+ self.assertEqual(pat, a.relate(b))
+
+ def test10_intersection(self):
+ "Testing intersects() and intersection()."
+ for i in xrange(len(topology_geoms)):
+ g_tup = topology_geoms[i]
+ a = fromstr(g_tup[0].wkt)
+ b = fromstr(g_tup[1].wkt)
+ i1 = fromstr(intersect_geoms[i].wkt)
+ self.assertEqual(True, a.intersects(b))
+ i2 = a.intersection(b)
+ self.assertEqual(i1, i2)
+ self.assertEqual(i1, a & b) # __and__ is intersection operator
+ a &= b # testing __iand__
+ self.assertEqual(i1, a)
+
+ def test11_union(self):
+ "Testing union()."
+ for i in xrange(len(topology_geoms)):
+ g_tup = topology_geoms[i]
+ a = fromstr(g_tup[0].wkt)
+ b = fromstr(g_tup[1].wkt)
+ u1 = fromstr(union_geoms[i].wkt)
+ u2 = a.union(b)
+ self.assertEqual(u1, u2)
+ self.assertEqual(u1, a | b) # __or__ is union operator
+ a |= b # testing __ior__
+ self.assertEqual(u1, a)
+
+ def test12_difference(self):
+ "Testing difference()."
+ for i in xrange(len(topology_geoms)):
+ g_tup = topology_geoms[i]
+ a = fromstr(g_tup[0].wkt)
+ b = fromstr(g_tup[1].wkt)
+ d1 = fromstr(diff_geoms[i].wkt)
+ d2 = a.difference(b)
+ self.assertEqual(d1, d2)
+ self.assertEqual(d1, a - b) # __sub__ is difference operator
+ a -= b # testing __isub__
+ self.assertEqual(d1, a)
+
+ def test13_symdifference(self):
+ "Testing sym_difference()."
+ for i in xrange(len(topology_geoms)):
+ g_tup = topology_geoms[i]
+ a = fromstr(g_tup[0].wkt)
+ b = fromstr(g_tup[1].wkt)
+ d1 = fromstr(sdiff_geoms[i].wkt)
+ d2 = a.sym_difference(b)
+ self.assertEqual(d1, d2)
+ self.assertEqual(d1, a ^ b) # __xor__ is symmetric difference operator
+ a ^= b # testing __ixor__
+ self.assertEqual(d1, a)
+
+ def test14_buffer(self):
+ "Testing buffer()."
+ for i in xrange(len(buffer_geoms)):
+ g_tup = buffer_geoms[i]
+ g = fromstr(g_tup[0].wkt)
+
+ # The buffer we expect
+ exp_buf = fromstr(g_tup[1].wkt)
+
+ # Can't use a floating-point for the number of quadsegs.
+ self.assertRaises(ArgumentError, g.buffer, g_tup[2], float(g_tup[3]))
+
+ # Constructing our buffer
+ buf = g.buffer(g_tup[2], g_tup[3])
+ self.assertEqual(exp_buf.num_coords, buf.num_coords)
+ self.assertEqual(len(exp_buf), len(buf))
+
+ # Now assuring that each point in the buffer is almost equal
+ for j in xrange(len(exp_buf)):
+ exp_ring = exp_buf[j]
+ buf_ring = buf[j]
+ self.assertEqual(len(exp_ring), len(buf_ring))
+ for k in xrange(len(exp_ring)):
+ # Asserting the X, Y of each point are almost equal (due to floating point imprecision)
+ self.assertAlmostEqual(exp_ring[k][0], buf_ring[k][0], 9)
+ self.assertAlmostEqual(exp_ring[k][1], buf_ring[k][1], 9)
+
+ def test15_srid(self):
+ "Testing the SRID property and keyword."
+ # Testing SRID keyword on Point
+ pnt = Point(5, 23, srid=4326)
+ self.assertEqual(4326, pnt.srid)
+ pnt.srid = 3084
+ self.assertEqual(3084, pnt.srid)
+ self.assertRaises(ArgumentError, pnt.set_srid, '4326')
+
+ # Testing SRID keyword on fromstr(), and on Polygon rings.
+ poly = fromstr(polygons[1].wkt, srid=4269)
+ self.assertEqual(4269, poly.srid)
+ for ring in poly: self.assertEqual(4269, ring.srid)
+ poly.srid = 4326
+ self.assertEqual(4326, poly.shell.srid)
+
+ # Testing SRID keyword on GeometryCollection
+ gc = GeometryCollection(Point(5, 23), LineString((0, 0), (1.5, 1.5), (3, 3)), srid=32021)
+ self.assertEqual(32021, gc.srid)
+ for i in range(len(gc)): self.assertEqual(32021, gc[i].srid)
+
+ # GEOS may get the SRID from HEXEWKB
+ # 'POINT(5 23)' at SRID=4326 in hex form -- obtained from PostGIS
+ # using `SELECT GeomFromText('POINT (5 23)', 4326);`.
+ hex = '0101000020E610000000000000000014400000000000003740'
+ p1 = fromstr(hex)
+ self.assertEqual(4326, p1.srid)
+
+ # In GEOS 3.0.0rc1-4 when the EWKB and/or HEXEWKB is exported,
+ # the SRID information is lost and set to -1 -- this is not a
+ # problem on the 3.0.0 version (another reason to upgrade).
+ exp_srid = self.null_srid
+
+ p2 = fromstr(p1.hex)
+ self.assertEqual(exp_srid, p2.srid)
+ p3 = fromstr(p1.hex, srid=-1) # -1 is intended.
+ self.assertEqual(-1, p3.srid)
+
+ def test16_mutable_geometries(self):
+ "Testing the mutability of Polygons and Geometry Collections."
+ ### Testing the mutability of Polygons ###
+ for p in polygons:
+ poly = fromstr(p.wkt)
+
+ # Should only be able to use __setitem__ with LinearRing geometries.
+ self.assertRaises(TypeError, poly.__setitem__, 0, LineString((1, 1), (2, 2)))
+
+ # Constructing the new shell by adding 500 to every point in the old shell.
+ shell_tup = poly.shell.tuple
+ new_coords = []
+ for point in shell_tup: new_coords.append((point[0] + 500., point[1] + 500.))
+ new_shell = LinearRing(*tuple(new_coords))
+
+ # Assigning polygon's exterior ring w/the new shell
+ poly.exterior_ring = new_shell
+ s = str(new_shell) # new shell is still accessible
+ self.assertEqual(poly.exterior_ring, new_shell)
+ self.assertEqual(poly[0], new_shell)
+
+ ### Testing the mutability of Geometry Collections
+ for tg in multipoints:
+ mp = fromstr(tg.wkt)
+ for i in range(len(mp)):
+ # Creating a random point.
+ pnt = mp[i]
+ new = Point(random.randint(1, 100), random.randint(1, 100))
+ # Testing the assignment
+ mp[i] = new
+ s = str(new) # what was used for the assignment is still accessible
+ self.assertEqual(mp[i], new)
+ self.assertEqual(mp[i].wkt, new.wkt)
+ self.assertNotEqual(pnt, mp[i])
+
+ # MultiPolygons involve much more memory management because each
+ # Polygon w/in the collection has its own rings.
+ for tg in multipolygons:
+ mpoly = fromstr(tg.wkt)
+ for i in xrange(len(mpoly)):
+ poly = mpoly[i]
+ old_poly = mpoly[i]
+ # Offsetting the each ring in the polygon by 500.
+ for j in xrange(len(poly)):
+ r = poly[j]
+ for k in xrange(len(r)): r[k] = (r[k][0] + 500., r[k][1] + 500.)
+ poly[j] = r
+
+ self.assertNotEqual(mpoly[i], poly)
+ # Testing the assignment
+ mpoly[i] = poly
+ s = str(poly) # Still accessible
+ self.assertEqual(mpoly[i], poly)
+ self.assertNotEqual(mpoly[i], old_poly)
+
+ # Extreme (!!) __setitem__ -- no longer works, have to detect
+ # in the first object that __setitem__ is called in the subsequent
+ # objects -- maybe mpoly[0, 0, 0] = (3.14, 2.71)?
+ #mpoly[0][0][0] = (3.14, 2.71)
+ #self.assertEqual((3.14, 2.71), mpoly[0][0][0])
+ # Doing it more slowly..
+ #self.assertEqual((3.14, 2.71), mpoly[0].shell[0])
+ #del mpoly
+
+ def test17_threed(self):
+ "Testing three-dimensional geometries."
+ # Testing a 3D Point
+ pnt = Point(2, 3, 8)
+ self.assertEqual((2.,3.,8.), pnt.coords)
+ self.assertRaises(TypeError, pnt.set_coords, (1.,2.))
+ pnt.coords = (1.,2.,3.)
+ self.assertEqual((1.,2.,3.), pnt.coords)
+
+ # Testing a 3D LineString
+ ls = LineString((2., 3., 8.), (50., 250., -117.))
+ self.assertEqual(((2.,3.,8.), (50.,250.,-117.)), ls.tuple)
+ self.assertRaises(TypeError, ls.__setitem__, 0, (1.,2.))
+ ls[0] = (1.,2.,3.)
+ self.assertEqual((1.,2.,3.), ls[0])
+
+ def test18_distance(self):
+ "Testing the distance() function."
+ # Distance to self should be 0.
+ pnt = Point(0, 0)
+ self.assertEqual(0.0, pnt.distance(Point(0, 0)))
+
+ # Distance should be 1
+ self.assertEqual(1.0, pnt.distance(Point(0, 1)))
+
+ # Distance should be ~ sqrt(2)
+ self.assertAlmostEqual(1.41421356237, pnt.distance(Point(1, 1)), 11)
+
+ # Distances are from the closest vertex in each geometry --
+ # should be 3 (distance from (2, 2) to (5, 2)).
+ ls1 = LineString((0, 0), (1, 1), (2, 2))
+ ls2 = LineString((5, 2), (6, 1), (7, 0))
+ self.assertEqual(3, ls1.distance(ls2))
+
+ def test19_length(self):
+ "Testing the length property."
+ # Points have 0 length.
+ pnt = Point(0, 0)
+ self.assertEqual(0.0, pnt.length)
+
+ # Should be ~ sqrt(2)
+ ls = LineString((0, 0), (1, 1))
+ self.assertAlmostEqual(1.41421356237, ls.length, 11)
+
+ # Should be circumfrence of Polygon
+ poly = Polygon(LinearRing((0, 0), (0, 1), (1, 1), (1, 0), (0, 0)))
+ self.assertEqual(4.0, poly.length)
+
+ # Should be sum of each element's length in collection.
+ mpoly = MultiPolygon(poly.clone(), poly)
+ self.assertEqual(8.0, mpoly.length)
+
+ def test20_emptyCollections(self):
+ "Testing empty geometries and collections."
+ gc1 = GeometryCollection([])
+ gc2 = fromstr('GEOMETRYCOLLECTION EMPTY')
+ pnt = fromstr('POINT EMPTY')
+ ls = fromstr('LINESTRING EMPTY')
+ poly = fromstr('POLYGON EMPTY')
+ mls = fromstr('MULTILINESTRING EMPTY')
+ mpoly1 = fromstr('MULTIPOLYGON EMPTY')
+ mpoly2 = MultiPolygon(())
+
+ for g in [gc1, gc2, pnt, ls, poly, mls, mpoly1, mpoly2]:
+ self.assertEqual(True, g.empty)
+
+ # Testing len() and num_geom.
+ if isinstance(g, Polygon):
+ self.assertEqual(1, len(g)) # Has one empty linear ring
+ self.assertEqual(1, g.num_geom)
+ self.assertEqual(0, len(g[0]))
+ elif isinstance(g, (Point, LineString)):
+ self.assertEqual(1, g.num_geom)
+ self.assertEqual(0, len(g))
+ else:
+ self.assertEqual(0, g.num_geom)
+ self.assertEqual(0, len(g))
+
+ # Testing __getitem__ (doesn't work on Point or Polygon)
+ if isinstance(g, Point):
+ self.assertRaises(GEOSIndexError, g.get_x)
+ elif isinstance(g, Polygon):
+ lr = g.shell
+ self.assertEqual('LINEARRING EMPTY', lr.wkt)
+ self.assertEqual(0, len(lr))
+ self.assertEqual(True, lr.empty)
+ self.assertRaises(GEOSIndexError, lr.__getitem__, 0)
+ else:
+ self.assertRaises(GEOSIndexError, g.__getitem__, 0)
+
+ def test21_test_gdal(self):
+ "Testing `ogr` and `srs` properties."
+ if not HAS_GDAL: return
+ g1 = fromstr('POINT(5 23)')
+ self.assertEqual(True, isinstance(g1.ogr, OGRGeometry))
+ self.assertEqual(g1.srs, None)
+
+ g2 = fromstr('LINESTRING(0 0, 5 5, 23 23)', srid=4326)
+ self.assertEqual(True, isinstance(g2.ogr, OGRGeometry))
+ self.assertEqual(True, isinstance(g2.srs, SpatialReference))
+ self.assertEqual(g2.hex, g2.ogr.hex)
+ self.assertEqual('WGS 84', g2.srs.name)
+
+ def test22_copy(self):
+ "Testing use with the Python `copy` module."
+ import copy
+ poly = GEOSGeometry('POLYGON((0 0, 0 23, 23 23, 23 0, 0 0), (5 5, 5 10, 10 10, 10 5, 5 5))')
+ cpy1 = copy.copy(poly)
+ cpy2 = copy.deepcopy(poly)
+ self.assertNotEqual(poly._ptr, cpy1._ptr)
+ self.assertNotEqual(poly._ptr, cpy2._ptr)
+
+ def test23_transform(self):
+ "Testing `transform` method."
+ if not HAS_GDAL: return
+ orig = GEOSGeometry('POINT (-104.609 38.255)', 4326)
+ trans = GEOSGeometry('POINT (992385.4472045 481455.4944650)', 2774)
+
+ # Using a srid, a SpatialReference object, and a CoordTransform object
+ # for transformations.
+ t1, t2, t3 = orig.clone(), orig.clone(), orig.clone()
+ t1.transform(trans.srid)
+ t2.transform(SpatialReference('EPSG:2774'))
+ ct = CoordTransform(SpatialReference('WGS84'), SpatialReference(2774))
+ t3.transform(ct)
+
+ # Testing use of the `clone` keyword.
+ k1 = orig.clone()
+ k2 = k1.transform(trans.srid, clone=True)
+ self.assertEqual(k1, orig)
+ self.assertNotEqual(k1, k2)
+
+ prec = 3
+ for p in (t1, t2, t3, k2):
+ self.assertAlmostEqual(trans.x, p.x, prec)
+ self.assertAlmostEqual(trans.y, p.y, prec)
+
+ def test24_extent(self):
+ "Testing `extent` method."
+ # The xmin, ymin, xmax, ymax of the MultiPoint should be returned.
+ mp = MultiPoint(Point(5, 23), Point(0, 0), Point(10, 50))
+ self.assertEqual((0.0, 0.0, 10.0, 50.0), mp.extent)
+ pnt = Point(5.23, 17.8)
+ # Extent of points is just the point itself repeated.
+ self.assertEqual((5.23, 17.8, 5.23, 17.8), pnt.extent)
+ # Testing on the 'real world' Polygon.
+ poly = fromstr(polygons[3].wkt)
+ ring = poly.shell
+ x, y = ring.x, ring.y
+ xmin, ymin = min(x), min(y)
+ xmax, ymax = max(x), max(y)
+ self.assertEqual((xmin, ymin, xmax, ymax), poly.extent)
+
+ def test25_pickle(self):
+ "Testing pickling and unpickling support."
+ # Using both pickle and cPickle -- just 'cause.
+ import pickle, cPickle
+
+ # Creating a list of test geometries for pickling,
+ # and setting the SRID on some of them.
+ def get_geoms(lst, srid=None):
+ return [GEOSGeometry(tg.wkt, srid) for tg in lst]
+ tgeoms = get_geoms(points)
+ tgeoms.extend(get_geoms(multilinestrings, 4326))
+ tgeoms.extend(get_geoms(polygons, 3084))
+ tgeoms.extend(get_geoms(multipolygons, 900913))
+
+ # The SRID won't be exported in GEOS 3.0 release candidates.
+ no_srid = self.null_srid == -1
+ for geom in tgeoms:
+ s1, s2 = cPickle.dumps(geom), pickle.dumps(geom)
+ g1, g2 = cPickle.loads(s1), pickle.loads(s2)
+ for tmpg in (g1, g2):
+ self.assertEqual(geom, tmpg)
+ if not no_srid: self.assertEqual(geom.srid, tmpg.srid)
+
+def suite():
+ s = unittest.TestSuite()
+ s.addTest(unittest.makeSuite(GEOSTest))
+ return s
+
+def run(verbosity=2):
+ unittest.TextTestRunner(verbosity=verbosity).run(suite())
diff --git a/django/contrib/gis/tests/test_measure.py b/django/contrib/gis/tests/test_measure.py
new file mode 100644
index 0000000000..43bc8ae691
--- /dev/null
+++ b/django/contrib/gis/tests/test_measure.py
@@ -0,0 +1,333 @@
+"""
+Distance and Area objects to allow for sensible and convienient calculation
+and conversions. Here are some tests.
+"""
+
+import unittest
+from django.contrib.gis.measure import Distance, Area, D, A
+
+class DistanceTest(unittest.TestCase):
+ "Testing the Distance object"
+
+ def testInit(self):
+ "Testing initialisation from valid units"
+ d = Distance(m=100)
+ self.assertEqual(d.m, 100)
+
+ d1, d2, d3 = D(m=100), D(meter=100), D(metre=100)
+ for d in (d1, d2, d3):
+ self.assertEqual(d.m, 100)
+
+ d = D(nm=100)
+ self.assertEqual(d.m, 185200)
+
+ y1, y2, y3 = D(yd=100), D(yard=100), D(Yard=100)
+ for d in (y1, y2, y3):
+ self.assertEqual(d.yd, 100)
+
+ mm1, mm2 = D(millimeter=1000), D(MiLLiMeTeR=1000)
+ for d in (mm1, mm2):
+ self.assertEqual(d.m, 1.0)
+ self.assertEqual(d.mm, 1000.0)
+
+
+ def testInitInvalid(self):
+ "Testing initialisation from invalid units"
+ self.assertRaises(AttributeError, D, banana=100)
+
+ def testAccess(self):
+ "Testing access in different units"
+ d = D(m=100)
+ self.assertEqual(d.km, 0.1)
+ self.assertAlmostEqual(d.ft, 328.084, 3)
+
+ def testAccessInvalid(self):
+ "Testing access in invalid units"
+ d = D(m=100)
+ self.failIf(hasattr(d, 'banana'))
+
+ def testAddition(self):
+ "Test addition & subtraction"
+ d1 = D(m=100)
+ d2 = D(m=200)
+
+ d3 = d1 + d2
+ self.assertEqual(d3.m, 300)
+ d3 += d1
+ self.assertEqual(d3.m, 400)
+
+ d4 = d1 - d2
+ self.assertEqual(d4.m, -100)
+ d4 -= d1
+ self.assertEqual(d4.m, -200)
+
+ try:
+ d5 = d1 + 1
+ except TypeError, e:
+ pass
+ else:
+ self.fail('Distance + number should raise TypeError')
+
+ try:
+ d5 = d1 - 1
+ except TypeError, e:
+ pass
+ else:
+ self.fail('Distance - number should raise TypeError')
+
+ try:
+ d1 += 1
+ except TypeError, e:
+ pass
+ else:
+ self.fail('Distance += number should raise TypeError')
+
+ try:
+ d1 -= 1
+ except TypeError, e:
+ pass
+ else:
+ self.fail('Distance -= number should raise TypeError')
+
+ def testMultiplication(self):
+ "Test multiplication & division"
+ d1 = D(m=100)
+
+ d3 = d1 * 2
+ self.assertEqual(d3.m, 200)
+ d3 *= 5
+ self.assertEqual(d3.m, 1000)
+
+ d4 = d1 / 2
+ self.assertEqual(d4.m, 50)
+ d4 /= 5
+ self.assertEqual(d4.m, 10)
+
+ a5 = d1 * D(m=10)
+ self.assert_(isinstance(a5, Area))
+ self.assertEqual(a5.sq_m, 100*10)
+
+ try:
+ d1 *= D(m=1)
+ except TypeError, e:
+ pass
+ else:
+ self.fail('Distance *= Distance should raise TypeError')
+
+ try:
+ d5 = d1 / D(m=1)
+ except TypeError, e:
+ pass
+ else:
+ self.fail('Distance / Distance should raise TypeError')
+
+ try:
+ d1 /= D(m=1)
+ except TypeError, e:
+ pass
+ else:
+ self.fail('Distance /= Distance should raise TypeError')
+
+ def testUnitConversions(self):
+ "Testing default units during maths"
+ d1 = D(m=100)
+ d2 = D(km=1)
+
+ d3 = d1 + d2
+ self.assertEqual(d3._default_unit, 'm')
+ d4 = d2 + d1
+ self.assertEqual(d4._default_unit, 'km')
+ d5 = d1 * 2
+ self.assertEqual(d5._default_unit, 'm')
+ d6 = d1 / 2
+ self.assertEqual(d6._default_unit, 'm')
+
+ def testComparisons(self):
+ "Testing comparisons"
+ d1 = D(m=100)
+ d2 = D(km=1)
+ d3 = D(km=0)
+
+ self.assert_(d2 > d1)
+ self.assert_(d1 == d1)
+ self.assert_(d1 < d2)
+ self.failIf(d3)
+
+ def testUnitsStr(self):
+ "Testing conversion to strings"
+ d1 = D(m=100)
+ d2 = D(km=3.5)
+
+ self.assertEqual(str(d1), '100.0 m')
+ self.assertEqual(str(d2), '3.5 km')
+ self.assertEqual(repr(d1), 'Distance(m=100.0)')
+ self.assertEqual(repr(d2), 'Distance(km=3.5)')
+
+ def testUnitAttName(self):
+ "Testing the `unit_attname` class method"
+ unit_tuple = [('Yard', 'yd'), ('Nautical Mile', 'nm'), ('German legal metre', 'german_m'),
+ ('Indian yard', 'indian_yd'), ('Chain (Sears)', 'chain_sears'), ('Chain', 'chain')]
+ for nm, att in unit_tuple:
+ self.assertEqual(att, D.unit_attname(nm))
+
+class AreaTest(unittest.TestCase):
+ "Testing the Area object"
+
+ def testInit(self):
+ "Testing initialisation from valid units"
+ a = Area(sq_m=100)
+ self.assertEqual(a.sq_m, 100)
+
+ a = A(sq_m=100)
+ self.assertEqual(a.sq_m, 100)
+
+ a = A(sq_mi=100)
+ self.assertEqual(a.sq_m, 258998811.0336)
+
+ def testInitInvaliA(self):
+ "Testing initialisation from invalid units"
+ self.assertRaises(AttributeError, A, banana=100)
+
+ def testAccess(self):
+ "Testing access in different units"
+ a = A(sq_m=100)
+ self.assertEqual(a.sq_km, 0.0001)
+ self.assertAlmostEqual(a.sq_ft, 1076.391, 3)
+
+ def testAccessInvaliA(self):
+ "Testing access in invalid units"
+ a = A(sq_m=100)
+ self.failIf(hasattr(a, 'banana'))
+
+ def testAddition(self):
+ "Test addition & subtraction"
+ a1 = A(sq_m=100)
+ a2 = A(sq_m=200)
+
+ a3 = a1 + a2
+ self.assertEqual(a3.sq_m, 300)
+ a3 += a1
+ self.assertEqual(a3.sq_m, 400)
+
+ a4 = a1 - a2
+ self.assertEqual(a4.sq_m, -100)
+ a4 -= a1
+ self.assertEqual(a4.sq_m, -200)
+
+ try:
+ a5 = a1 + 1
+ except TypeError, e:
+ pass
+ else:
+ self.fail('Area + number should raise TypeError')
+
+ try:
+ a5 = a1 - 1
+ except TypeError, e:
+ pass
+ else:
+ self.fail('Area - number should raise TypeError')
+
+ try:
+ a1 += 1
+ except TypeError, e:
+ pass
+ else:
+ self.fail('Area += number should raise TypeError')
+
+ try:
+ a1 -= 1
+ except TypeError, e:
+ pass
+ else:
+ self.fail('Area -= number should raise TypeError')
+
+ def testMultiplication(self):
+ "Test multiplication & division"
+ a1 = A(sq_m=100)
+
+ a3 = a1 * 2
+ self.assertEqual(a3.sq_m, 200)
+ a3 *= 5
+ self.assertEqual(a3.sq_m, 1000)
+
+ a4 = a1 / 2
+ self.assertEqual(a4.sq_m, 50)
+ a4 /= 5
+ self.assertEqual(a4.sq_m, 10)
+
+ try:
+ a5 = a1 * A(sq_m=1)
+ except TypeError, e:
+ pass
+ else:
+ self.fail('Area * Area should raise TypeError')
+
+ try:
+ a1 *= A(sq_m=1)
+ except TypeError, e:
+ pass
+ else:
+ self.fail('Area *= Area should raise TypeError')
+
+ try:
+ a5 = a1 / A(sq_m=1)
+ except TypeError, e:
+ pass
+ else:
+ self.fail('Area / Area should raise TypeError')
+
+ try:
+ a1 /= A(sq_m=1)
+ except TypeError, e:
+ pass
+ else:
+ self.fail('Area /= Area should raise TypeError')
+
+ def testUnitConversions(self):
+ "Testing default units during maths"
+ a1 = A(sq_m=100)
+ a2 = A(sq_km=1)
+
+ a3 = a1 + a2
+ self.assertEqual(a3._default_unit, 'sq_m')
+ a4 = a2 + a1
+ self.assertEqual(a4._default_unit, 'sq_km')
+ a5 = a1 * 2
+ self.assertEqual(a5._default_unit, 'sq_m')
+ a6 = a1 / 2
+ self.assertEqual(a6._default_unit, 'sq_m')
+
+ def testComparisons(self):
+ "Testing comparisons"
+ a1 = A(sq_m=100)
+ a2 = A(sq_km=1)
+ a3 = A(sq_km=0)
+
+ self.assert_(a2 > a1)
+ self.assert_(a1 == a1)
+ self.assert_(a1 < a2)
+ self.failIf(a3)
+
+ def testUnitsStr(self):
+ "Testing conversion to strings"
+ a1 = A(sq_m=100)
+ a2 = A(sq_km=3.5)
+
+ self.assertEqual(str(a1), '100.0 sq_m')
+ self.assertEqual(str(a2), '3.5 sq_km')
+ self.assertEqual(repr(a1), 'Area(sq_m=100.0)')
+ self.assertEqual(repr(a2), 'Area(sq_km=3.5)')
+
+
+def suite():
+ s = unittest.TestSuite()
+ s.addTest(unittest.makeSuite(DistanceTest))
+ s.addTest(unittest.makeSuite(AreaTest))
+ return s
+
+def run(verbosity=2):
+ unittest.TextTestRunner(verbosity=verbosity).run(suite())
+
+if __name__=="__main__":
+ run()
diff --git a/django/contrib/gis/tests/test_spatialrefsys.py b/django/contrib/gis/tests/test_spatialrefsys.py
new file mode 100644
index 0000000000..0b133a11f2
--- /dev/null
+++ b/django/contrib/gis/tests/test_spatialrefsys.py
@@ -0,0 +1,90 @@
+import unittest
+from django.contrib.gis.tests.utils import mysql, no_mysql, oracle, postgis
+if not mysql:
+ from django.contrib.gis.models import SpatialRefSys
+
+test_srs = ({'srid' : 4326,
+ 'auth_name' : ('EPSG', True),
+ 'auth_srid' : 4326,
+ 'srtext' : 'GEOGCS["WGS 84",DATUM["WGS_1984",SPHEROID["WGS 84",6378137,298.257223563,AUTHORITY["EPSG","7030"]],TOWGS84[0,0,0,0,0,0,0],AUTHORITY["EPSG","6326"]],PRIMEM["Greenwich",0,AUTHORITY["EPSG","8901"]],UNIT["degree",0.01745329251994328,AUTHORITY["EPSG","9122"]],AUTHORITY["EPSG","4326"]]',
+ 'proj4' : '+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs ',
+ 'spheroid' : 'WGS 84', 'name' : 'WGS 84',
+ 'geographic' : True, 'projected' : False,
+ 'ellipsoid' : (6378137.0, 6356752.3, 298.257223563), # From proj's "cs2cs -le" and Wikipedia (semi-minor only)
+ 'eprec' : (1, 1, 9),
+ },
+ {'srid' : 32140,
+ 'auth_name' : ('EPSG', False),
+ 'auth_srid' : 32140,
+ 'srtext' : 'PROJCS["NAD83 / Texas South Central",GEOGCS["NAD83",DATUM["North_American_Datum_1983",SPHEROID["GRS 1980",6378137,298.257222101,AUTHORITY["EPSG","7019"]],AUTHORITY["EPSG","6269"]],PRIMEM["Greenwich",0,AUTHORITY["EPSG","8901"]],UNIT["degree",0.01745329251994328,AUTHORITY["EPSG","9122"]],AUTHORITY["EPSG","4269"]],PROJECTION["Lambert_Conformal_Conic_2SP"],PARAMETER["standard_parallel_1",30.28333333333333],PARAMETER["standard_parallel_2",28.38333333333333],PARAMETER["latitude_of_origin",27.83333333333333],PARAMETER["central_meridian",-99],PARAMETER["false_easting",600000],PARAMETER["false_northing",4000000],UNIT["metre",1,AUTHORITY["EPSG","9001"]],AUTHORITY["EPSG","32140"]]',
+ 'proj4' : '+proj=lcc +lat_1=30.28333333333333 +lat_2=28.38333333333333 +lat_0=27.83333333333333 +lon_0=-99 +x_0=600000 +y_0=4000000 +ellps=GRS80 +datum=NAD83 +units=m +no_defs ',
+ 'spheroid' : 'GRS 1980', 'name' : 'NAD83 / Texas South Central',
+ 'geographic' : False, 'projected' : True,
+ 'ellipsoid' : (6378137.0, 6356752.31414, 298.257222101), # From proj's "cs2cs -le" and Wikipedia (semi-minor only)
+ 'eprec' : (1, 5, 10),
+ },
+ )
+
+class SpatialRefSysTest(unittest.TestCase):
+
+ @no_mysql
+ def test01_retrieve(self):
+ "Testing retrieval of SpatialRefSys model objects."
+ for sd in test_srs:
+ srs = SpatialRefSys.objects.get(srid=sd['srid'])
+ self.assertEqual(sd['srid'], srs.srid)
+
+ # Some of the authority names are borked on Oracle, e.g., SRID=32140.
+ # also, Oracle Spatial seems to add extraneous info to fields, hence the
+ # the testing with the 'startswith' flag.
+ auth_name, oracle_flag = sd['auth_name']
+ if postgis or (oracle and oracle_flag):
+ self.assertEqual(True, srs.auth_name.startswith(auth_name))
+
+ self.assertEqual(sd['auth_srid'], srs.auth_srid)
+
+ # No proj.4 and different srtext on oracle backends :(
+ if postgis:
+ self.assertEqual(sd['srtext'], srs.wkt)
+ self.assertEqual(sd['proj4'], srs.proj4text)
+
+ @no_mysql
+ def test02_osr(self):
+ "Testing getting OSR objects from SpatialRefSys model objects."
+ for sd in test_srs:
+ sr = SpatialRefSys.objects.get(srid=sd['srid'])
+ self.assertEqual(True, sr.spheroid.startswith(sd['spheroid']))
+ self.assertEqual(sd['geographic'], sr.geographic)
+ self.assertEqual(sd['projected'], sr.projected)
+ self.assertEqual(True, sr.name.startswith(sd['name']))
+
+ # Testing the SpatialReference object directly.
+ if postgis:
+ srs = sr.srs
+ self.assertEqual(sd['proj4'], srs.proj4)
+ self.assertEqual(sd['srtext'], srs.wkt)
+
+ @no_mysql
+ def test03_ellipsoid(self):
+ "Testing the ellipsoid property."
+ for sd in test_srs:
+ # Getting the ellipsoid and precision parameters.
+ ellps1 = sd['ellipsoid']
+ prec = sd['eprec']
+
+ # Getting our spatial reference and its ellipsoid
+ srs = SpatialRefSys.objects.get(srid=sd['srid'])
+ ellps2 = srs.ellipsoid
+
+ for i in range(3):
+ param1 = ellps1[i]
+ param2 = ellps2[i]
+ self.assertAlmostEqual(ellps1[i], ellps2[i], prec[i])
+
+def suite():
+ s = unittest.TestSuite()
+ s.addTest(unittest.makeSuite(SpatialRefSysTest))
+ return s
+
+def run(verbosity=2):
+ unittest.TextTestRunner(verbosity=verbosity).run(suite())
diff --git a/django/contrib/gis/tests/utils.py b/django/contrib/gis/tests/utils.py
new file mode 100644
index 0000000000..0b368f1385
--- /dev/null
+++ b/django/contrib/gis/tests/utils.py
@@ -0,0 +1,22 @@
+from django.conf import settings
+
+# function that will pass a test.
+def pass_test(*args): return
+
+def no_backend(test_func, backend):
+ "Use this decorator to disable test on specified backend."
+ if settings.DATABASE_ENGINE == backend:
+ return pass_test
+ else:
+ return test_func
+
+# Decorators to disable entire test functions for specific
+# spatial backends.
+def no_oracle(func): return no_backend(func, 'oracle')
+def no_postgis(func): return no_backend(func, 'postgresql_psycopg2')
+def no_mysql(func): return no_backend(func, 'mysql')
+
+# Shortcut booleans to omit only portions of tests.
+oracle = settings.DATABASE_ENGINE == 'oracle'
+postgis = settings.DATABASE_ENGINE == 'postgresql_psycopg2'
+mysql = settings.DATABASE_ENGINE == 'mysql'
diff --git a/django/contrib/gis/utils/__init__.py b/django/contrib/gis/utils/__init__.py
new file mode 100644
index 0000000000..2c9f2f3ce6
--- /dev/null
+++ b/django/contrib/gis/utils/__init__.py
@@ -0,0 +1,25 @@
+"""
+ This module contains useful utilities for GeoDjango.
+"""
+# Importing the utilities that depend on GDAL, if available.
+from django.contrib.gis.gdal import HAS_GDAL
+if HAS_GDAL:
+ from django.contrib.gis.utils.ogrinfo import ogrinfo, sample
+ from django.contrib.gis.utils.ogrinspect import mapping, ogrinspect
+ from django.contrib.gis.utils.srs import add_postgis_srs
+ try:
+ # LayerMapping requires DJANGO_SETTINGS_MODULE to be set,
+ # so this needs to be in try/except.
+ from django.contrib.gis.utils.layermapping import LayerMapping
+ except:
+ pass
+
+# Attempting to import the GeoIP class.
+try:
+ from django.contrib.gis.utils.geoip import GeoIP, GeoIPException
+ HAS_GEOIP = True
+except:
+ HAS_GEOIP = False
+
+from django.contrib.gis.utils.wkt import precision_wkt
+
diff --git a/django/contrib/gis/utils/geoip.py b/django/contrib/gis/utils/geoip.py
new file mode 100644
index 0000000000..4d163aab9a
--- /dev/null
+++ b/django/contrib/gis/utils/geoip.py
@@ -0,0 +1,344 @@
+"""
+ This module houses the GeoIP object, a ctypes wrapper for the MaxMind GeoIP(R)
+ C API (http://www.maxmind.com/app/c). This is an alternative to the GPL
+ licensed Python GeoIP interface provided by MaxMind.
+
+ GeoIP(R) is a registered trademark of MaxMind, LLC of Boston, Massachusetts.
+
+ For IP-based geolocation, this module requires the GeoLite Country and City
+ datasets, in binary format (CSV will not work!). The datasets may be
+ downloaded from MaxMind at http://www.maxmind.com/download/geoip/database/.
+ Grab GeoIP.dat.gz and GeoLiteCity.dat.gz, and unzip them in the directory
+ corresponding to settings.GEOIP_PATH. See the GeoIP docstring and examples
+ below for more details.
+
+ TODO: Verify compatibility with Windows.
+
+ Example:
+
+ >>> from django.contrib.gis.utils import GeoIP
+ >>> g = GeoIP()
+ >>> g.country('google.com')
+ {'country_code': 'US', 'country_name': 'United States'}
+ >>> g.city('72.14.207.99')
+ {'area_code': 650,
+ 'city': 'Mountain View',
+ 'country_code': 'US',
+ 'country_code3': 'USA',
+ 'country_name': 'United States',
+ 'dma_code': 807,
+ 'latitude': 37.419200897216797,
+ 'longitude': -122.05740356445312,
+ 'postal_code': '94043',
+ 'region': 'CA'}
+ >>> g.lat_lon('salon.com')
+ (37.789798736572266, -122.39420318603516)
+ >>> g.lon_lat('uh.edu')
+ (-95.415199279785156, 29.77549934387207)
+ >>> g.geos('24.124.1.80').wkt
+ 'POINT (-95.2087020874023438 39.0392990112304688)'
+"""
+import os, re
+from ctypes import c_char_p, c_float, c_int, Structure, CDLL, POINTER
+from ctypes.util import find_library
+from django.conf import settings
+if not settings._target: settings.configure()
+
+# Creating the settings dictionary with any settings, if needed.
+GEOIP_SETTINGS = dict((key, getattr(settings, key))
+ for key in ('GEOIP_PATH', 'GEOIP_LIBRARY_PATH', 'GEOIP_COUNTRY', 'GEOIP_CITY')
+ if hasattr(settings, key))
+lib_path = GEOIP_SETTINGS.get('GEOIP_LIBRARY_PATH', None)
+
+# GeoIP Exception class.
+class GeoIPException(Exception): pass
+
+# The shared library for the GeoIP C API. May be downloaded
+# from http://www.maxmind.com/download/geoip/api/c/
+if lib_path:
+ lib_name = None
+else:
+ # TODO: Is this really the library name for Windows?
+ lib_name = 'GeoIP'
+
+# Getting the path to the GeoIP library.
+if lib_name: lib_path = find_library(lib_name)
+if lib_path is None: raise GeoIPException('Could not find the GeoIP library (tried "%s"). '
+ 'Try setting GEOIP_LIBRARY_PATH in your settings.' % lib_name)
+lgeoip = CDLL(lib_path)
+
+# Regular expressions for recognizing IP addresses and the GeoIP
+# free database editions.
+ipregex = re.compile(r'^(?P<w>\d\d?\d?)\.(?P<x>\d\d?\d?)\.(?P<y>\d\d?\d?)\.(?P<z>\d\d?\d?)$')
+free_regex = re.compile(r'^GEO-\d{3}FREE')
+lite_regex = re.compile(r'^GEO-\d{3}LITE')
+
+#### GeoIP C Structure definitions ####
+class GeoIPRecord(Structure):
+ _fields_ = [('country_code', c_char_p),
+ ('country_code3', c_char_p),
+ ('country_name', c_char_p),
+ ('region', c_char_p),
+ ('city', c_char_p),
+ ('postal_code', c_char_p),
+ ('latitude', c_float),
+ ('longitude', c_float),
+ ('dma_code', c_int),
+ ('area_code', c_int),
+ ]
+class GeoIPTag(Structure): pass
+
+#### ctypes function prototypes ####
+RECTYPE = POINTER(GeoIPRecord)
+DBTYPE = POINTER(GeoIPTag)
+
+# For retrieving records by name or address.
+def record_output(func):
+ func.restype = RECTYPE
+ return func
+rec_by_addr = record_output(lgeoip.GeoIP_record_by_addr)
+rec_by_name = record_output(lgeoip.GeoIP_record_by_name)
+
+# For opening up GeoIP databases.
+geoip_open = lgeoip.GeoIP_open
+geoip_open.restype = DBTYPE
+
+# String output routines.
+def string_output(func):
+ func.restype = c_char_p
+ return func
+geoip_dbinfo = string_output(lgeoip.GeoIP_database_info)
+cntry_code_by_addr = string_output(lgeoip.GeoIP_country_code_by_addr)
+cntry_code_by_name = string_output(lgeoip.GeoIP_country_code_by_name)
+cntry_name_by_addr = string_output(lgeoip.GeoIP_country_name_by_addr)
+cntry_name_by_name = string_output(lgeoip.GeoIP_country_name_by_name)
+
+#### GeoIP class ####
+class GeoIP(object):
+ # The flags for GeoIP memory caching.
+ # GEOIP_STANDARD - read database from filesystem, uses least memory.
+ #
+ # GEOIP_MEMORY_CACHE - load database into memory, faster performance
+ # but uses more memory
+ #
+ # GEOIP_CHECK_CACHE - check for updated database. If database has been updated,
+ # reload filehandle and/or memory cache.
+ #
+ # GEOIP_INDEX_CACHE - just cache
+ # the most frequently accessed index portion of the database, resulting
+ # in faster lookups than GEOIP_STANDARD, but less memory usage than
+ # GEOIP_MEMORY_CACHE - useful for larger databases such as
+ # GeoIP Organization and GeoIP City. Note, for GeoIP Country, Region
+ # and Netspeed databases, GEOIP_INDEX_CACHE is equivalent to GEOIP_MEMORY_CACHE
+ #
+ GEOIP_STANDARD = 0
+ GEOIP_MEMORY_CACHE = 1
+ GEOIP_CHECK_CACHE = 2
+ GEOIP_INDEX_CACHE = 4
+ cache_options = dict((opt, None) for opt in (0, 1, 2, 4))
+
+ def __init__(self, path=None, cache=0, country=None, city=None):
+ """
+ Initializes the GeoIP object, no parameters are required to use default
+ settings. Keyword arguments may be passed in to customize the locations
+ of the GeoIP data sets.
+
+ * path: Base directory to where GeoIP data is located or the full path
+ to where the city or country data files (*.dat) are located.
+ Assumes that both the city and country data sets are located in
+ this directory; overrides the GEOIP_PATH settings attribute.
+
+ * cache: The cache settings when opening up the GeoIP datasets,
+ and may be an integer in (0, 1, 2, 4) corresponding to
+ the GEOIP_STANDARD, GEOIP_MEMORY_CACHE, GEOIP_CHECK_CACHE,
+ and GEOIP_INDEX_CACHE `GeoIPOptions` C API settings,
+ respectively. Defaults to 0, meaning that the data is read
+ from the disk.
+
+ * country: The name of the GeoIP country data file. Defaults to
+ 'GeoIP.dat'; overrides the GEOIP_COUNTRY settings attribute.
+
+ * city: The name of the GeoIP city data file. Defaults to
+ 'GeoLiteCity.dat'; overrides the GEOIP_CITY settings attribute.
+ """
+ # Checking the given cache option.
+ if cache in self.cache_options:
+ self._cache = self.cache_options[cache]
+ else:
+ raise GeoIPException('Invalid caching option: %s' % cache)
+
+ # Getting the GeoIP data path.
+ if not path:
+ path = GEOIP_SETTINGS.get('GEOIP_PATH', None)
+ if not path: raise GeoIPException('GeoIP path must be provided via parameter or the GEOIP_PATH setting.')
+ if not isinstance(path, basestring):
+ raise TypeError('Invalid path type: %s' % type(path).__name__)
+
+ cntry_ptr, city_ptr = (None, None)
+ if os.path.isdir(path):
+ # Getting the country and city files using the settings
+ # dictionary. If no settings are provided, default names
+ # are assigned.
+ country = os.path.join(path, country or GEOIP_SETTINGS.get('GEOIP_COUNTRY', 'GeoIP.dat'))
+ city = os.path.join(path, city or GEOIP_SETTINGS.get('GEOIP_CITY', 'GeoLiteCity.dat'))
+ elif os.path.isfile(path):
+ # Otherwise, some detective work will be needed to figure
+ # out whether the given database path is for the GeoIP country
+ # or city databases.
+ ptr = geoip_open(path, cache)
+ info = geoip_dbinfo(ptr)
+ if lite_regex.match(info):
+ # GeoLite City database.
+ city, city_ptr = path, ptr
+ elif free_regex.match(info):
+ # GeoIP Country database.
+ country, cntry_ptr = path, ptr
+ else:
+ raise GeoIPException('Unable to recognize database edition: %s' % info)
+ else:
+ raise GeoIPException('GeoIP path must be a valid file or directory.')
+
+ # `_init_db` does the dirty work.
+ self._init_db(country, cache, '_country', cntry_ptr)
+ self._init_db(city, cache, '_city', city_ptr)
+
+ def _init_db(self, db_file, cache, attname, ptr=None):
+ "Helper routine for setting GeoIP ctypes database properties."
+ if ptr:
+ # Pointer already retrieved.
+ pass
+ elif os.path.isfile(db_file or ''):
+ ptr = geoip_open(db_file, cache)
+ setattr(self, attname, ptr)
+ setattr(self, '%s_file' % attname, db_file)
+
+ def _check_query(self, query, country=False, city=False, city_or_country=False):
+ "Helper routine for checking the query and database availability."
+ # Making sure a string was passed in for the query.
+ if not isinstance(query, basestring):
+ raise TypeError('GeoIP query must be a string, not type %s' % type(query).__name__)
+
+ # Extra checks for the existence of country and city databases.
+ if city_or_country and self._country is None and self._city is None:
+ raise GeoIPException('Invalid GeoIP country and city data files.')
+ elif country and self._country is None:
+ raise GeoIPException('Invalid GeoIP country data file: %s' % self._country_file)
+ elif city and self._city is None:
+ raise GeoIPException('Invalid GeoIP city data file: %s' % self._city_file)
+
+ def city(self, query):
+ """
+ Returns a dictionary of city information for the given IP address or
+ Fully Qualified Domain Name (FQDN). Some information in the dictionary
+ may be undefined (None).
+ """
+ self._check_query(query, city=True)
+ if ipregex.match(query):
+ # If an IP address was passed in
+ ptr = rec_by_addr(self._city, c_char_p(query))
+ else:
+ # If a FQDN was passed in.
+ ptr = rec_by_name(self._city, c_char_p(query))
+
+ # Checking the pointer to the C structure, if valid pull out elements
+ # into a dicionary and return.
+ if bool(ptr):
+ record = ptr.contents
+ return dict((tup[0], getattr(record, tup[0])) for tup in record._fields_)
+ else:
+ return None
+
+ def country_code(self, query):
+ "Returns the country code for the given IP Address or FQDN."
+ self._check_query(query, city_or_country=True)
+ if self._country:
+ if ipregex.match(query): return cntry_code_by_addr(self._country, query)
+ else: return cntry_code_by_name(self._country, query)
+ else:
+ return self.city(query)['country_code']
+
+ def country_name(self, query):
+ "Returns the country name for the given IP Address or FQDN."
+ self._check_query(query, city_or_country=True)
+ if self._country:
+ if ipregex.match(query): return cntry_name_by_addr(self._country, query)
+ else: return cntry_name_by_name(self._country, query)
+ else:
+ return self.city(query)['country_name']
+
+ def country(self, query):
+ """
+ Returns a dictonary with with the country code and name when given an
+ IP address or a Fully Qualified Domain Name (FQDN). For example, both
+ '24.124.1.80' and 'djangoproject.com' are valid parameters.
+ """
+ # Returning the country code and name
+ return {'country_code' : self.country_code(query),
+ 'country_name' : self.country_name(query),
+ }
+
+ #### Coordinate retrieval routines ####
+ def coords(self, query, ordering=('longitude', 'latitude')):
+ cdict = self.city(query)
+ if cdict is None: return None
+ else: return tuple(cdict[o] for o in ordering)
+
+ def lon_lat(self, query):
+ "Returns a tuple of the (longitude, latitude) for the given query."
+ return self.coords(query)
+
+ def lat_lon(self, query):
+ "Returns a tuple of the (latitude, longitude) for the given query."
+ return self.coords(query, ('latitude', 'longitude'))
+
+ def geos(self, query):
+ "Returns a GEOS Point object for the given query."
+ ll = self.lon_lat(query)
+ if ll:
+ from django.contrib.gis.geos import Point
+ return Point(ll, srid=4326)
+ else:
+ return None
+
+ #### GeoIP Database Information Routines ####
+ def country_info(self):
+ "Returns information about the GeoIP country database."
+ if self._country is None:
+ ci = 'No GeoIP Country data in "%s"' % self._country_file
+ else:
+ ci = geoip_dbinfo(self._country)
+ return ci
+ country_info = property(country_info)
+
+ def city_info(self):
+ "Retuns information about the GeoIP city database."
+ if self._city is None:
+ ci = 'No GeoIP City data in "%s"' % self._city_file
+ else:
+ ci = geoip_dbinfo(self._city)
+ return ci
+ city_info = property(city_info)
+
+ def info(self):
+ "Returns information about all GeoIP databases in use."
+ return 'Country:\n\t%s\nCity:\n\t%s' % (self.country_info, self.city_info)
+ info = property(info)
+
+ #### Methods for compatibility w/the GeoIP-Python API. ####
+ @classmethod
+ def open(cls, full_path, cache):
+ return GeoIP(full_path, cache)
+
+ def _rec_by_arg(self, arg):
+ if self._city:
+ return self.city(arg)
+ else:
+ return self.country(arg)
+ region_by_addr = city
+ region_by_name = city
+ record_by_addr = _rec_by_arg
+ record_by_name = _rec_by_arg
+ country_code_by_addr = country_code
+ country_code_by_name = country_code
+ country_name_by_addr = country_name
+ country_name_by_name = country_name
diff --git a/django/contrib/gis/utils/layermapping.py b/django/contrib/gis/utils/layermapping.py
new file mode 100644
index 0000000000..40d2e97278
--- /dev/null
+++ b/django/contrib/gis/utils/layermapping.py
@@ -0,0 +1,677 @@
+# LayerMapping -- A Django Model/OGR Layer Mapping Utility
+"""
+ The LayerMapping class provides a way to map the contents of OGR
+ vector files (e.g. SHP files) to Geographic-enabled Django models.
+
+ This grew out of my personal needs, specifically the code repetition
+ that went into pulling geometries and fields out of an OGR layer,
+ converting to another coordinate system (e.g. WGS84), and then inserting
+ into a GeoDjango model.
+
+ Please report any bugs encountered using this utility.
+
+ Requirements: OGR C Library (from GDAL) required.
+
+ Usage:
+ lm = LayerMapping(model, source_file, mapping) where,
+
+ model:
+ GeoDjango model (not an instance)
+
+ data:
+ OGR-supported data source file (e.g. a shapefile) or
+ gdal.DataSource instance
+
+ mapping:
+ A python dictionary, keys are strings corresponding
+ to the GeoDjango model field, and values correspond to
+ string field names for the OGR feature, or if the model field
+ is a geographic then it should correspond to the OGR
+ geometry type, e.g. 'POINT', 'LINESTRING', 'POLYGON'.
+
+ Keyword Args:
+ layer:
+ The index of the layer to use from the Data Source (defaults to 0)
+
+ source_srs:
+ Use this to specify the source SRS manually (for example,
+ some shapefiles don't come with a '.prj' file). An integer SRID,
+ a string WKT, and SpatialReference objects are valid parameters.
+
+ encoding:
+ Specifies the encoding of the string in the OGR data source.
+ For example, 'latin-1', 'utf-8', and 'cp437' are all valid
+ encoding parameters.
+
+ transaction_mode:
+ May be 'commit_on_success' (default) or 'autocommit'.
+
+ transform:
+ Setting this to False will disable all coordinate transformations.
+
+ unique:
+ Setting this to the name, or a tuple of names, from the given
+ model will create models unique only to the given name(s).
+ Geometries will from each feature will be added into the collection
+ associated with the unique model. Forces transaction mode to
+ be 'autocommit'.
+
+Example:
+
+ 1. You need a GDAL-supported data source, like a shapefile.
+
+ Assume we're using the test_poly SHP file:
+ >>> from django.contrib.gis.gdal import DataSource
+ >>> ds = DataSource('test_poly.shp')
+ >>> layer = ds[0]
+ >>> print layer.fields # Exploring the fields in the layer, we only want the 'str' field.
+ ['float', 'int', 'str']
+ >>> print len(layer) # getting the number of features in the layer (should be 3)
+ 3
+ >>> print layer.geom_type # Should be 3 (a Polygon)
+ 3
+ >>> print layer.srs # WGS84
+ GEOGCS["GCS_WGS_1984",
+ DATUM["WGS_1984",
+ SPHEROID["WGS_1984",6378137,298.257223563]],
+ PRIMEM["Greenwich",0],
+ UNIT["Degree",0.017453292519943295]]
+
+ 2. Now we define our corresponding Django model (make sure to use syncdb):
+
+ from django.contrib.gis.db import models
+ class TestGeo(models.Model, models.GeoMixin):
+ name = models.CharField(maxlength=25) # corresponds to the 'str' field
+ poly = models.PolygonField(srid=4269) # we want our model in a different SRID
+ objects = models.GeoManager()
+ def __str__(self):
+ return 'Name: %s' % self.name
+
+ 3. Use LayerMapping to extract all the features and place them in the database:
+
+ >>> from django.contrib.gis.utils import LayerMapping
+ >>> from geoapp.models import TestGeo
+ >>> mapping = {'name' : 'str', # The 'name' model field maps to the 'str' layer field.
+ 'poly' : 'POLYGON', # For geometry fields use OGC name.
+ } # The mapping is a dictionary
+ >>> lm = LayerMapping(TestGeo, 'test_poly.shp', mapping)
+ >>> lm.save(verbose=True) # Save the layermap, imports the data.
+ Saved: Name: 1
+ Saved: Name: 2
+ Saved: Name: 3
+
+ LayerMapping just transformed the three geometries from the SHP file from their
+ source spatial reference system (WGS84) to the spatial reference system of
+ the GeoDjango model (NAD83). If no spatial reference system is defined for
+ the layer, use the `source_srs` keyword with a SpatialReference object to
+ specify one.
+"""
+import sys
+from datetime import date, datetime
+from decimal import Decimal
+from django.core.exceptions import ObjectDoesNotExist
+from django.contrib.gis.db.models import GeometryField
+from django.contrib.gis.db.backend import SpatialBackend
+from django.contrib.gis.gdal import CoordTransform, DataSource, \
+ OGRException, OGRGeometry, OGRGeomType, SpatialReference
+from django.contrib.gis.gdal.field import \
+ OFTDate, OFTDateTime, OFTInteger, OFTReal, OFTString, OFTTime
+from django.contrib.gis.models import GeometryColumns, SpatialRefSys
+from django.db import models, transaction
+
+# LayerMapping exceptions.
+class LayerMapError(Exception): pass
+class InvalidString(LayerMapError): pass
+class InvalidDecimal(LayerMapError): pass
+class InvalidInteger(LayerMapError): pass
+class MissingForeignKey(LayerMapError): pass
+
+class LayerMapping(object):
+ "A class that maps OGR Layers to GeoDjango Models."
+
+ # Acceptable 'base' types for a multi-geometry type.
+ MULTI_TYPES = {1 : OGRGeomType('MultiPoint'),
+ 2 : OGRGeomType('MultiLineString'),
+ 3 : OGRGeomType('MultiPolygon'),
+ }
+
+ # Acceptable Django field types and corresponding acceptable OGR
+ # counterparts.
+ FIELD_TYPES = {
+ models.AutoField : OFTInteger,
+ models.IntegerField : (OFTInteger, OFTReal, OFTString),
+ models.FloatField : (OFTInteger, OFTReal),
+ models.DateField : OFTDate,
+ models.DateTimeField : OFTDateTime,
+ models.EmailField : OFTString,
+ models.TimeField : OFTTime,
+ models.DecimalField : (OFTInteger, OFTReal),
+ models.CharField : OFTString,
+ models.SlugField : OFTString,
+ models.TextField : OFTString,
+ models.URLField : OFTString,
+ models.USStateField : OFTString,
+ models.XMLField : OFTString,
+ models.SmallIntegerField : (OFTInteger, OFTReal, OFTString),
+ models.PositiveSmallIntegerField : (OFTInteger, OFTReal, OFTString),
+ }
+
+ # The acceptable transaction modes.
+ TRANSACTION_MODES = {'autocommit' : transaction.autocommit,
+ 'commit_on_success' : transaction.commit_on_success,
+ }
+
+ def __init__(self, model, data, mapping, layer=0,
+ source_srs=None, encoding=None,
+ transaction_mode='commit_on_success',
+ transform=True, unique=None):
+ """
+ A LayerMapping object is initialized using the given Model (not an instance),
+ a DataSource (or string path to an OGR-supported data file), and a mapping
+ dictionary. See the module level docstring for more details and keyword
+ argument usage.
+ """
+ # Getting the DataSource and the associated Layer.
+ if isinstance(data, basestring):
+ self.ds = DataSource(data)
+ else:
+ self.ds = data
+ self.layer = self.ds[layer]
+
+ # Setting the mapping
+ self.mapping = mapping
+
+ # Setting the model, and getting the geometry column associated
+ # with the model (an exception will be raised if there is no
+ # geometry column).
+ self.model = model
+ self.geo_col = self.geometry_column()
+
+ # Checking the source spatial reference system, and getting
+ # the coordinate transformation object (unless the `transform`
+ # keyword is set to False)
+ if transform:
+ self.source_srs = self.check_srs(source_srs)
+ self.transform = self.coord_transform()
+ else:
+ self.transform = transform
+
+ # Checking the layer -- intitialization of the object will fail if
+ # things don't check out before hand.
+ self.check_layer()
+
+ # Setting the encoding for OFTString fields, if specified.
+ if encoding:
+ # Making sure the encoding exists, if not a LookupError
+ # exception will be thrown.
+ from codecs import lookup
+ lookup(encoding)
+ self.encoding = encoding
+ else:
+ self.encoding = None
+
+ if unique:
+ self.check_unique(unique)
+ transaction_mode = 'autocommit' # Has to be set to autocommit.
+ self.unique = unique
+ else:
+ self.unique = None
+
+ # Setting the transaction decorator with the function in the
+ # transaction modes dictionary.
+ if transaction_mode in self.TRANSACTION_MODES:
+ self.transaction_decorator = self.TRANSACTION_MODES[transaction_mode]
+ self.transaction_mode = transaction_mode
+ else:
+ raise LayerMapError('Unrecognized transaction mode: %s' % transaction_mode)
+
+ #### Checking routines used during initialization ####
+ def check_fid_range(self, fid_range):
+ "This checks the `fid_range` keyword."
+ if fid_range:
+ if isinstance(fid_range, (tuple, list)):
+ return slice(*fid_range)
+ elif isinstance(fid_range, slice):
+ return fid_range
+ else:
+ raise TypeError
+ else:
+ return None
+
+ def check_layer(self):
+ """
+ This checks the Layer metadata, and ensures that it is compatible
+ with the mapping information and model. Unlike previous revisions,
+ there is no need to increment through each feature in the Layer.
+ """
+ # The geometry field of the model is set here.
+ # TODO: Support more than one geometry field / model.
+ self.geom_field = False
+ self.fields = {}
+
+ # Getting lists of the field names and the field types available in
+ # the OGR Layer.
+ ogr_fields = self.layer.fields
+ ogr_field_types = self.layer.field_types
+
+ # Function for determining if the OGR mapping field is in the Layer.
+ def check_ogr_fld(ogr_map_fld):
+ try:
+ idx = ogr_fields.index(ogr_map_fld)
+ except ValueError:
+ raise LayerMapError('Given mapping OGR field "%s" not found in OGR Layer.' % ogr_map_fld)
+ return idx
+
+ # No need to increment through each feature in the model, simply check
+ # the Layer metadata against what was given in the mapping dictionary.
+ for field_name, ogr_name in self.mapping.items():
+ # Ensuring that a corresponding field exists in the model
+ # for the given field name in the mapping.
+ try:
+ model_field = self.model._meta.get_field(field_name)
+ except models.fields.FieldDoesNotExist:
+ raise LayerMapError('Given mapping field "%s" not in given Model fields.' % field_name)
+
+ # Getting the string name for the Django field class (e.g., 'PointField').
+ fld_name = model_field.__class__.__name__
+
+ if isinstance(model_field, GeometryField):
+ if self.geom_field:
+ raise LayerMapError('LayerMapping does not support more than one GeometryField per model.')
+
+ try:
+ gtype = OGRGeomType(ogr_name)
+ except OGRException:
+ raise LayerMapError('Invalid mapping for GeometryField "%s".' % field_name)
+
+ # Making sure that the OGR Layer's Geometry is compatible.
+ ltype = self.layer.geom_type
+ if not (gtype == ltype or self.make_multi(ltype, model_field)):
+ raise LayerMapError('Invalid mapping geometry; model has %s, feature has %s.' % (fld_name, gtype))
+
+ # Setting the `geom_field` attribute w/the name of the model field
+ # that is a Geometry.
+ self.geom_field = field_name
+ fields_val = model_field
+ elif isinstance(model_field, models.ForeignKey):
+ if isinstance(ogr_name, dict):
+ # Is every given related model mapping field in the Layer?
+ rel_model = model_field.rel.to
+ for rel_name, ogr_field in ogr_name.items():
+ idx = check_ogr_fld(ogr_field)
+ try:
+ rel_field = rel_model._meta.get_field(rel_name)
+ except models.fields.FieldDoesNotExist:
+ raise LayerMapError('ForeignKey mapping field "%s" not in %s fields.' %
+ (rel_name, rel_model.__class__.__name__))
+ fields_val = rel_model
+ else:
+ raise TypeError('ForeignKey mapping must be of dictionary type.')
+ else:
+ # Is the model field type supported by LayerMapping?
+ if not model_field.__class__ in self.FIELD_TYPES:
+ raise LayerMapError('Django field type "%s" has no OGR mapping (yet).' % fld_name)
+
+ # Is the OGR field in the Layer?
+ idx = check_ogr_fld(ogr_name)
+ ogr_field = ogr_field_types[idx]
+
+ # Can the OGR field type be mapped to the Django field type?
+ if not issubclass(ogr_field, self.FIELD_TYPES[model_field.__class__]):
+ raise LayerMapError('OGR field "%s" (of type %s) cannot be mapped to Django %s.' %
+ (ogr_field, ogr_field.__name__, fld_name))
+ fields_val = model_field
+
+ self.fields[field_name] = fields_val
+
+ def check_srs(self, source_srs):
+ "Checks the compatibility of the given spatial reference object."
+ if isinstance(source_srs, SpatialReference):
+ sr = source_srs
+ elif isinstance(source_srs, SpatialRefSys):
+ sr = source_srs.srs
+ elif isinstance(source_srs, (int, basestring)):
+ sr = SpatialReference(source_srs)
+ else:
+ # Otherwise just pulling the SpatialReference from the layer
+ sr = self.layer.srs
+
+ if not sr:
+ raise LayerMapError('No source reference system defined.')
+ else:
+ return sr
+
+ def check_unique(self, unique):
+ "Checks the `unique` keyword parameter -- may be a sequence or string."
+ if isinstance(unique, (list, tuple)):
+ # List of fields to determine uniqueness with
+ for attr in unique:
+ if not attr in self.mapping: raise ValueError
+ elif isinstance(unique, basestring):
+ # Only a single field passed in.
+ if unique not in self.mapping: raise ValueError
+ else:
+ raise TypeError('Unique keyword argument must be set with a tuple, list, or string.')
+
+ #### Keyword argument retrieval routines ####
+ def feature_kwargs(self, feat):
+ """
+ Given an OGR Feature, this will return a dictionary of keyword arguments
+ for constructing the mapped model.
+ """
+ # The keyword arguments for model construction.
+ kwargs = {}
+
+ # Incrementing through each model field and OGR field in the
+ # dictionary mapping.
+ for field_name, ogr_name in self.mapping.items():
+ model_field = self.fields[field_name]
+
+ if isinstance(model_field, GeometryField):
+ # Verify OGR geometry.
+ val = self.verify_geom(feat.geom, model_field)
+ elif isinstance(model_field, models.base.ModelBase):
+ # The related _model_, not a field was passed in -- indicating
+ # another mapping for the related Model.
+ val = self.verify_fk(feat, model_field, ogr_name)
+ else:
+ # Otherwise, verify OGR Field type.
+ val = self.verify_ogr_field(feat[ogr_name], model_field)
+
+ # Setting the keyword arguments for the field name with the
+ # value obtained above.
+ kwargs[field_name] = val
+
+ return kwargs
+
+ def unique_kwargs(self, kwargs):
+ """
+ Given the feature keyword arguments (from `feature_kwargs`) this routine
+ will construct and return the uniqueness keyword arguments -- a subset
+ of the feature kwargs.
+ """
+ if isinstance(self.unique, basestring):
+ return {self.unique : kwargs[self.unique]}
+ else:
+ return dict((fld, kwargs[fld]) for fld in self.unique)
+
+ #### Verification routines used in constructing model keyword arguments. ####
+ def verify_ogr_field(self, ogr_field, model_field):
+ """
+ Verifies if the OGR Field contents are acceptable to the Django
+ model field. If they are, the verified value is returned,
+ otherwise the proper exception is raised.
+ """
+ if (isinstance(ogr_field, OFTString) and
+ isinstance(model_field, (models.CharField, models.TextField))):
+ if self.encoding:
+ # The encoding for OGR data sources may be specified here
+ # (e.g., 'cp437' for Census Bureau boundary files).
+ val = unicode(ogr_field.value, self.encoding)
+ else:
+ val = ogr_field.value
+ if len(val) > model_field.max_length:
+ raise InvalidString('%s model field maximum string length is %s, given %s characters.' %
+ (model_field.name, model_field.max_length, len(val)))
+ elif isinstance(ogr_field, OFTReal) and isinstance(model_field, models.DecimalField):
+ try:
+ # Creating an instance of the Decimal value to use.
+ d = Decimal(str(ogr_field.value))
+ except:
+ raise InvalidDecimal('Could not construct decimal from: %s' % ogr_field.value)
+
+ # Getting the decimal value as a tuple.
+ dtup = d.as_tuple()
+ digits = dtup[1]
+ d_idx = dtup[2] # index where the decimal is
+
+ # Maximum amount of precision, or digits to the left of the decimal.
+ max_prec = model_field.max_digits - model_field.decimal_places
+
+ # Getting the digits to the left of the decimal place for the
+ # given decimal.
+ if d_idx < 0:
+ n_prec = len(digits[:d_idx])
+ else:
+ n_prec = len(digits) + d_idx
+
+ # If we have more than the maximum digits allowed, then throw an
+ # InvalidDecimal exception.
+ if n_prec > max_prec:
+ raise InvalidDecimal('A DecimalField with max_digits %d, decimal_places %d must round to an absolute value less than 10^%d.' %
+ (model_field.max_digits, model_field.decimal_places, max_prec))
+ val = d
+ elif isinstance(ogr_field, (OFTReal, OFTString)) and isinstance(model_field, models.IntegerField):
+ # Attempt to convert any OFTReal and OFTString value to an OFTInteger.
+ try:
+ val = int(ogr_field.value)
+ except:
+ raise InvalidInteger('Could not construct integer from: %s' % ogr_field.value)
+ else:
+ val = ogr_field.value
+ return val
+
+ def verify_fk(self, feat, rel_model, rel_mapping):
+ """
+ Given an OGR Feature, the related model and its dictionary mapping,
+ this routine will retrieve the related model for the ForeignKey
+ mapping.
+ """
+ # TODO: It is expensive to retrieve a model for every record --
+ # explore if an efficient mechanism exists for caching related
+ # ForeignKey models.
+
+ # Constructing and verifying the related model keyword arguments.
+ fk_kwargs = {}
+ for field_name, ogr_name in rel_mapping.items():
+ fk_kwargs[field_name] = self.verify_ogr_field(feat[ogr_name], rel_model._meta.get_field(field_name))
+
+ # Attempting to retrieve and return the related model.
+ try:
+ return rel_model.objects.get(**fk_kwargs)
+ except ObjectDoesNotExist:
+ raise MissingForeignKey('No ForeignKey %s model found with keyword arguments: %s' % (rel_model.__name__, fk_kwargs))
+
+ def verify_geom(self, geom, model_field):
+ """
+ Verifies the geometry -- will construct and return a GeometryCollection
+ if necessary (for example if the model field is MultiPolygonField while
+ the mapped shapefile only contains Polygons).
+ """
+ if self.make_multi(geom.geom_type, model_field):
+ # Constructing a multi-geometry type to contain the single geometry
+ multi_type = self.MULTI_TYPES[geom.geom_type.num]
+ g = OGRGeometry(multi_type)
+ g.add(geom)
+ else:
+ g = geom
+
+ # Transforming the geometry with our Coordinate Transformation object,
+ # but only if the class variable `transform` is set w/a CoordTransform
+ # object.
+ if self.transform: g.transform(self.transform)
+
+ # Returning the WKT of the geometry.
+ return g.wkt
+
+ #### Other model methods ####
+ def coord_transform(self):
+ "Returns the coordinate transformation object."
+ try:
+ # Getting the target spatial reference system
+ target_srs = SpatialRefSys.objects.get(srid=self.geo_col.srid).srs
+
+ # Creating the CoordTransform object
+ return CoordTransform(self.source_srs, target_srs)
+ except Exception, msg:
+ raise LayerMapError('Could not translate between the data source and model geometry: %s' % msg)
+
+ def geometry_column(self):
+ "Returns the GeometryColumn model associated with the geographic column."
+ # Getting the GeometryColumn object.
+ try:
+ db_table = self.model._meta.db_table
+ if SpatialBackend.name == 'oracle': db_table = db_table.upper()
+ gc_kwargs = {GeometryColumns.table_name_col() : db_table}
+ return GeometryColumns.objects.get(**gc_kwargs)
+ except Exception, msg:
+ raise LayerMapError('Geometry column does not exist for model. (did you run syncdb?):\n %s' % msg)
+
+ def make_multi(self, geom_type, model_field):
+ """
+ Given the OGRGeomType for a geometry and its associated GeometryField,
+ determine whether the geometry should be turned into a GeometryCollection.
+ """
+ return (geom_type.num in self.MULTI_TYPES and
+ model_field.__class__.__name__ == 'Multi%s' % geom_type.django)
+
+ def save(self, verbose=False, fid_range=False, step=False,
+ progress=False, silent=False, stream=sys.stdout, strict=False):
+ """
+ Saves the contents from the OGR DataSource Layer into the database
+ according to the mapping dictionary given at initialization.
+
+ Keyword Parameters:
+ verbose:
+ If set, information will be printed subsequent to each model save
+ executed on the database.
+
+ fid_range:
+ May be set with a slice or tuple of (begin, end) feature ID's to map
+ from the data source. In other words, this keyword enables the user
+ to selectively import a subset range of features in the geographic
+ data source.
+
+ step:
+ If set with an integer, transactions will occur at every step
+ interval. For example, if step=1000, a commit would occur after
+ the 1,000th feature, the 2,000th feature etc.
+
+ progress:
+ When this keyword is set, status information will be printed giving
+ the number of features processed and sucessfully saved. By default,
+ progress information will pe printed every 1000 features processed,
+ however, this default may be overridden by setting this keyword with an
+ integer for the desired interval.
+
+ stream:
+ Status information will be written to this file handle. Defaults to
+ using `sys.stdout`, but any object with a `write` method is supported.
+
+ silent:
+ By default, non-fatal error notifications are printed to stdout, but
+ this keyword may be set to disable these notifications.
+
+ strict:
+ Execution of the model mapping will cease upon the first error
+ encountered. The default behavior is to attempt to continue.
+ """
+ # Getting the default Feature ID range.
+ default_range = self.check_fid_range(fid_range)
+
+ # Setting the progress interval, if requested.
+ if progress:
+ if progress is True or not isinstance(progress, int):
+ progress_interval = 1000
+ else:
+ progress_interval = progress
+
+ # Defining the 'real' save method, utilizing the transaction
+ # decorator created during initialization.
+ @self.transaction_decorator
+ def _save(feat_range=default_range, num_feat=0, num_saved=0):
+ if feat_range:
+ layer_iter = self.layer[feat_range]
+ else:
+ layer_iter = self.layer
+
+ for feat in layer_iter:
+ num_feat += 1
+ # Getting the keyword arguments
+ try:
+ kwargs = self.feature_kwargs(feat)
+ except LayerMapError, msg:
+ # Something borked the validation
+ if strict: raise
+ elif not silent:
+ stream.write('Ignoring Feature ID %s because: %s\n' % (feat.fid, msg))
+ else:
+ # Constructing the model using the keyword args
+ is_update = False
+ if self.unique:
+ # If we want unique models on a particular field, handle the
+ # geometry appropriately.
+ try:
+ # Getting the keyword arguments and retrieving
+ # the unique model.
+ u_kwargs = self.unique_kwargs(kwargs)
+ m = self.model.objects.get(**u_kwargs)
+ is_update = True
+
+ # Getting the geometry (in OGR form), creating
+ # one from the kwargs WKT, adding in additional
+ # geometries, and update the attribute with the
+ # just-updated geometry WKT.
+ geom = getattr(m, self.geom_field).ogr
+ new = OGRGeometry(kwargs[self.geom_field])
+ for g in new: geom.add(g)
+ setattr(m, self.geom_field, geom.wkt)
+ except ObjectDoesNotExist:
+ # No unique model exists yet, create.
+ m = self.model(**kwargs)
+ else:
+ m = self.model(**kwargs)
+
+ try:
+ # Attempting to save.
+ m.save()
+ num_saved += 1
+ if verbose: stream.write('%s: %s\n' % (is_update and 'Updated' or 'Saved', m))
+ except SystemExit:
+ raise
+ except Exception, msg:
+ if self.transaction_mode == 'autocommit':
+ # Rolling back the transaction so that other model saves
+ # will work.
+ transaction.rollback_unless_managed()
+ if strict:
+ # Bailing out if the `strict` keyword is set.
+ if not silent:
+ stream.write('Failed to save the feature (id: %s) into the model with the keyword arguments:\n' % feat.fid)
+ stream.write('%s\n' % kwargs)
+ raise
+ elif not silent:
+ stream.write('Failed to save %s:\n %s\nContinuing\n' % (kwargs, msg))
+
+ # Printing progress information, if requested.
+ if progress and num_feat % progress_interval == 0:
+ stream.write('Processed %d features, saved %d ...\n' % (num_feat, num_saved))
+
+ # Only used for status output purposes -- incremental saving uses the
+ # values returned here.
+ return num_saved, num_feat
+
+ nfeat = self.layer.num_feat
+ if step and isinstance(step, int) and step < nfeat:
+ # Incremental saving is requested at the given interval (step)
+ if default_range:
+ raise LayerMapError('The `step` keyword may not be used in conjunction with the `fid_range` keyword.')
+ beg, num_feat, num_saved = (0, 0, 0)
+ indices = range(step, nfeat, step)
+ n_i = len(indices)
+
+ for i, end in enumerate(indices):
+ # Constructing the slice to use for this step; the last slice is
+ # special (e.g, [100:] instead of [90:100]).
+ if i+1 == n_i: step_slice = slice(beg, None)
+ else: step_slice = slice(beg, end)
+
+ try:
+ num_feat, num_saved = _save(step_slice, num_feat, num_saved)
+ beg = end
+ except:
+ stream.write('%s\nFailed to save slice: %s\n' % ('=-' * 20, step_slice))
+ raise
+ else:
+ # Otherwise, just calling the previously defined _save() function.
+ _save()
diff --git a/django/contrib/gis/utils/ogrinfo.py b/django/contrib/gis/utils/ogrinfo.py
new file mode 100644
index 0000000000..f9b389c684
--- /dev/null
+++ b/django/contrib/gis/utils/ogrinfo.py
@@ -0,0 +1,53 @@
+"""
+This module includes some utility functions for inspecting the layout
+of a GDAL data source -- the functionality is analogous to the output
+produced by the `ogrinfo` utility.
+"""
+
+from django.contrib.gis.gdal import DataSource
+from django.contrib.gis.gdal.geometries import GEO_CLASSES
+
+def ogrinfo(data_source, num_features=10):
+ """
+ Walks the available layers in the supplied `data_source`, displaying
+ the fields for the first `num_features` features.
+ """
+
+ # Checking the parameters.
+ if isinstance(data_source, str):
+ data_source = DataSource(data_source)
+ elif isinstance(data_source, DataSource):
+ pass
+ else:
+ raise Exception, 'Data source parameter must be a string or a DataSource object.'
+
+ for i, layer in enumerate(data_source):
+ print "data source : %s" % data_source.name
+ print "==== layer %s" % i
+ print " shape type: %s" % GEO_CLASSES[layer.geom_type.num].__name__
+ print " # features: %s" % len(layer)
+ print " srs: %s" % layer.srs
+ extent_tup = layer.extent.tuple
+ print " extent: %s - %s" % (extent_tup[0:2], extent_tup[2:4])
+ print "Displaying the first %s features ====" % num_features
+
+ width = max(*map(len,layer.fields))
+ fmt = " %%%ss: %%s" % width
+ for j, feature in enumerate(layer[:num_features]):
+ print "=== Feature %s" % j
+ for fld_name in layer.fields:
+ type_name = feature[fld_name].type_name
+ output = fmt % (fld_name, type_name)
+ val = feature.get(fld_name)
+ if val:
+ if isinstance(val, str):
+ val_fmt = ' ("%s")'
+ else:
+ val_fmt = ' (%s)'
+ output += val_fmt % val
+ else:
+ output += ' (None)'
+ print output
+
+# For backwards compatibility.
+sample = ogrinfo
diff --git a/django/contrib/gis/utils/ogrinspect.py b/django/contrib/gis/utils/ogrinspect.py
new file mode 100644
index 0000000000..c0c3c40a69
--- /dev/null
+++ b/django/contrib/gis/utils/ogrinspect.py
@@ -0,0 +1,225 @@
+"""
+This module is for inspecting OGR data sources and generating either
+models for GeoDjango and/or mapping dictionaries for use with the
+`LayerMapping` utility.
+
+Author: Travis Pinney, Dane Springmeyer, & Justin Bronn
+"""
+from itertools import izip
+# Requires GDAL to use.
+from django.contrib.gis.gdal import DataSource
+from django.contrib.gis.gdal.field import OFTDate, OFTDateTime, OFTInteger, OFTReal, OFTString, OFTTime
+
+def mapping(data_source, geom_name='geom', layer_key=0, multi_geom=False):
+ """
+ Given a DataSource, generates a dictionary that may be used
+ for invoking the LayerMapping utility.
+
+ Keyword Arguments:
+ `geom_name` => The name of the geometry field to use for the model.
+
+ `layer_key` => The key for specifying which layer in the DataSource to use;
+ defaults to 0 (the first layer). May be an integer index or a string
+ identifier for the layer.
+
+ `multi_geom` => Boolean (default: False) - specify as multigeometry.
+ """
+ if isinstance(data_source, basestring):
+ # Instantiating the DataSource from the string.
+ data_source = DataSource(data_source)
+ elif isinstance(data_source, DataSource):
+ pass
+ else:
+ raise TypeError('Data source parameter must be a string or a DataSource object.')
+
+ # Creating the dictionary.
+ _mapping = {}
+
+ # Generating the field name for each field in the layer.
+ for field in data_source[layer_key].fields:
+ mfield = field.lower()
+ if mfield[-1:] == '_': mfield += 'field'
+ _mapping[mfield] = field
+ gtype = data_source[layer_key].geom_type
+ if multi_geom and gtype.num in (1, 2, 3): prefix = 'MULTI'
+ else: prefix = ''
+ _mapping[geom_name] = prefix + str(gtype).upper()
+ return _mapping
+
+def ogrinspect(*args, **kwargs):
+ """
+ Given a data source (either a string or a DataSource object) and a string
+ model name this function will generate a GeoDjango model.
+
+ Usage:
+
+ >>> from django.contrib.gis.utils import ogrinspect
+ >>> ogrinspect('/path/to/shapefile.shp','NewModel')
+
+ ...will print model definition to stout
+
+ or put this in a python script and use to redirect the output to a new
+ model like:
+
+ $ python generate_model.py > myapp/models.py
+
+ # generate_model.py
+ from django.contrib.gis.utils import ogrinspect
+ shp_file = 'data/mapping_hacks/world_borders.shp'
+ model_name = 'WorldBorders'
+
+ print ogrinspect(shp_file, model_name, multi_geom=True, srid=4326,
+ geom_name='shapes', blank=True)
+
+ Required Arguments
+ `datasource` => string or DataSource object to file pointer
+
+ `model name` => string of name of new model class to create
+
+ Optional Keyword Arguments
+ `geom_name` => For specifying the model name for the Geometry Field.
+ Otherwise will default to `geom`
+
+ `layer_key` => The key for specifying which layer in the DataSource to use;
+ defaults to 0 (the first layer). May be an integer index or a string
+ identifier for the layer.
+
+ `srid` => The SRID to use for the Geometry Field. If it can be determined,
+ the SRID of the datasource is used.
+
+ `multi_geom` => Boolean (default: False) - specify as multigeometry.
+
+ `name_field` => String - specifies a field name to return for the
+ `__unicode__` function (which will be generated if specified).
+
+ `imports` => Boolean (default: True) - set to False to omit the
+ `from django.contrib.gis.db import models` code from the
+ autogenerated models thus avoiding duplicated imports when building
+ more than one model by batching ogrinspect()
+
+ `decimal` => Boolean or sequence (default: False). When set to True
+ all generated model fields corresponding to the `OFTReal` type will
+ be `DecimalField` instead of `FloatField`. A sequence of specific
+ field names to generate as `DecimalField` may also be used.
+
+ `blank` => Boolean or sequence (default: False). When set to True all
+ generated model fields will have `blank=True`. If the user wants to
+ give specific fields to have blank, then a list/tuple of OGR field
+ names may be used.
+
+ `null` => Boolean (default: False) - When set to True all generated
+ model fields will have `null=True`. If the user wants to specify
+ give specific fields to have null, then a list/tuple of OGR field
+ names may be used.
+
+ Note: This routine calls the _ogrinspect() helper to do the heavy lifting.
+ """
+ return '\n'.join(s for s in _ogrinspect(*args, **kwargs))
+
+def _ogrinspect(data_source, model_name, geom_name='geom', layer_key=0, srid=None,
+ multi_geom=False, name_field=None, imports=True,
+ decimal=False, blank=False, null=False):
+ """
+ Helper routine for `ogrinspect` that generates GeoDjango models corresponding
+ to the given data source. See the `ogrinspect` docstring for more details.
+ """
+ # Getting the DataSource
+ if isinstance(data_source, str):
+ data_source = DataSource(data_source)
+ elif isinstance(data_source, DataSource):
+ pass
+ else:
+ raise TypeError('Data source parameter must be a string or a DataSource object.')
+
+ # Getting the layer corresponding to the layer key and getting
+ # a string listing of all OGR fields in the Layer.
+ layer = data_source[layer_key]
+ ogr_fields = layer.fields
+
+ # Creating lists from the `null`, `blank`, and `decimal`
+ # keyword arguments.
+ def process_kwarg(kwarg):
+ if isinstance(kwarg, (list, tuple)):
+ return [s.lower() for s in kwarg]
+ elif kwarg:
+ return [s.lower() for s in ogr_fields]
+ else:
+ return []
+ null_fields = process_kwarg(null)
+ blank_fields = process_kwarg(blank)
+ decimal_fields = process_kwarg(decimal)
+
+ # Gets the `null` and `blank` keywords for the given field name.
+ def get_kwargs_str(field_name):
+ kwlist = []
+ if field_name.lower() in null_fields: kwlist.append('null=True')
+ if field_name.lower() in blank_fields: kwlist.append('blank=True')
+ if kwlist: return ', ' + ', '.join(kwlist)
+ else: return ''
+
+ # For those wishing to disable the imports.
+ if imports:
+ yield '# This is an auto-generated Django model module created by ogrinspect.'
+ yield 'from django.contrib.gis.db import models'
+ yield ''
+
+ yield 'class %s(models.Model):' % model_name
+
+ for field_name, width, precision, field_type in izip(ogr_fields, layer.field_widths, layer.field_precisions, layer.field_types):
+ # The model field name.
+ mfield = field_name.lower()
+ if mfield[-1:] == '_': mfield += 'field'
+
+ # Getting the keyword args string.
+ kwargs_str = get_kwargs_str(field_name)
+
+ if field_type is OFTReal:
+ # By default OFTReals are mapped to `FloatField`, however, they
+ # may also be mapped to `DecimalField` if specified in the
+ # `decimal` keyword.
+ if field_name.lower() in decimal_fields:
+ yield ' %s = models.DecimalField(max_digits=%d, decimal_places=%d%s)' % (mfield, width, precision, kwargs_str)
+ else:
+ yield ' %s = models.FloatField(%s)' % (mfield, kwargs_str[2:])
+ elif field_type is OFTInteger:
+ yield ' %s = models.IntegerField(%s)' % (mfield, kwargs_str[2:])
+ elif field_type is OFTString:
+ yield ' %s = models.CharField(max_length=%s%s)' % (mfield, width, kwargs_str)
+ elif field_type is OFTDate:
+ yield ' %s = models.DateField(%s)' % (mfield, kwargs_str[2:])
+ elif field_type is OFTDateTime:
+ yield ' %s = models.DateTimeField(%s)' % (mfield, kwargs_str[2:])
+ elif field_type is OFTDate:
+ yield ' %s = models.TimeField(%s)' % (mfield, kwargs_str[2:])
+ else:
+ raise TypeError('Unknown field type %s in %s' % (fld_type, mfield))
+
+ # TODO: Autodetection of multigeometry types (see #7218).
+ gtype = layer.geom_type
+ if multi_geom and gtype.num in (1, 2, 3):
+ geom_field = 'Multi%s' % gtype.django
+ else:
+ geom_field = gtype.django
+
+ # Setting up the SRID keyword string.
+ if srid is None:
+ if layer.srs is None:
+ srid_str = 'srid=-1'
+ else:
+ srid = layer.srs.srid
+ if srid is None:
+ srid_str = 'srid=-1'
+ elif srid == 4326:
+ # WGS84 is already the default.
+ srid_str = ''
+ else:
+ srid_str = 'srid=%s' % srid
+ else:
+ srid_str = 'srid=%s' % srid
+
+ yield ' %s = models.%s(%s)' % (geom_name, geom_field, srid_str)
+ yield ' objects = models.GeoManager()'
+
+ if name_field:
+ yield ''
+ yield ' def __unicode__(self): return self.%s' % name_field
diff --git a/django/contrib/gis/utils/srs.py b/django/contrib/gis/utils/srs.py
new file mode 100644
index 0000000000..4df27961af
--- /dev/null
+++ b/django/contrib/gis/utils/srs.py
@@ -0,0 +1,27 @@
+def add_postgis_srs(srs):
+ """
+ This function takes a GDAL SpatialReference system and adds its
+ information to the PostGIS `spatial_ref_sys` table -- enabling
+ spatial transformations with PostGIS. This is handy for adding
+ spatial reference systems not included by default with PostGIS.
+ For example, the following adds the so-called "Google Maps Mercator
+ Projection" (available in GDAL 1.5):
+
+ >>> add_postgis_srs(SpatialReference(900913))
+
+ Note: By default, the `auth_name` is set to 'EPSG' -- this should
+ probably be changed.
+ """
+ from django.contrib.gis.models import SpatialRefSys
+ from django.contrib.gis.gdal import SpatialReference
+
+ if not isinstance(srs, SpatialReference):
+ srs = SpatialReference(srs)
+
+ if srs.srid is None:
+ raise Exception('Spatial reference requires an SRID to be compatible with PostGIS.')
+
+ # Creating the spatial_ref_sys model.
+ sr, created = SpatialRefSys.objects.get_or_create(
+ srid=srs.srid, auth_name='EPSG', auth_srid=srs.srid,
+ srtext=srs.wkt, proj4text=srs.proj4)
diff --git a/django/contrib/gis/utils/wkt.py b/django/contrib/gis/utils/wkt.py
new file mode 100644
index 0000000000..4aecc6247d
--- /dev/null
+++ b/django/contrib/gis/utils/wkt.py
@@ -0,0 +1,55 @@
+"""
+ Utilities for manipulating Geometry WKT.
+"""
+
+def precision_wkt(geom, prec):
+ """
+ Returns WKT text of the geometry according to the given precision (an
+ integer or a string). If the precision is an integer, then the decimal
+ places of coordinates WKT will be truncated to that number:
+
+ >>> pnt = Point(5, 23)
+ >>> pnt.wkt
+ 'POINT (5.0000000000000000 23.0000000000000000)'
+ >>> precision(geom, 1)
+ 'POINT (5.0 23.0)'
+
+ If the precision is a string, it must be valid Python format string
+ (e.g., '%20.7f') -- thus, you should know what you're doing.
+ """
+ if isinstance(prec, int):
+ num_fmt = '%%.%df' % prec
+ elif isinstance(prec, basestring):
+ num_fmt = prec
+ else:
+ raise TypeError
+
+ # TODO: Support 3D geometries.
+ coord_fmt = ' '.join([num_fmt, num_fmt])
+
+ def formatted_coords(coords):
+ return ','.join([coord_fmt % c[:2] for c in coords])
+
+ def formatted_poly(poly):
+ return ','.join(['(%s)' % formatted_coords(r) for r in poly])
+
+ def formatted_geom(g):
+ gtype = str(g.geom_type).upper()
+ yield '%s(' % gtype
+ if gtype == 'POINT':
+ yield formatted_coords((g.coords,))
+ elif gtype in ('LINESTRING', 'LINEARRING'):
+ yield formatted_coords(g.coords)
+ elif gtype in ('POLYGON', 'MULTILINESTRING'):
+ yield formatted_poly(g)
+ elif gtype == 'MULTIPOINT':
+ yield formatted_coords(g.coords)
+ elif gtype == 'MULTIPOLYGON':
+ yield ','.join(['(%s)' % formatted_poly(p) for p in g])
+ elif gtype == 'GEOMETRYCOLLECTION':
+ yield ','.join([''.join([wkt for wkt in formatted_geom(child)]) for child in g])
+ else:
+ raise TypeError
+ yield ')'
+
+ return ''.join([wkt for wkt in formatted_geom(geom)])