summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorluxagraf <sng@luxagraf.net>2014-06-15 12:56:16 -0400
committerluxagraf <sng@luxagraf.net>2014-06-15 12:56:16 -0400
commit1c76369b3d1eb99202cdba9a741fe7ac68e2f582 (patch)
treed511b59a77ad86ebe9637c09d34949aa3df3d00f
parenta0f107b3ff79ca9aebb75c8becd65c5708bb0538 (diff)
added get_bounds function to query nominatim for admin boundaries based on lat/lon. Not used anywhere just yet
-rw-r--r--app/locations/models.py38
1 files changed, 38 insertions, 0 deletions
diff --git a/app/locations/models.py b/app/locations/models.py
index 5c27702..25326fc 100644
--- a/app/locations/models.py
+++ b/app/locations/models.py
@@ -1,3 +1,6 @@
+import json
+import requests
+from django.contrib.gis.geos import GEOSGeometry, fromstr, MultiPolygon
from django.contrib.gis.db import models
from django.contrib.sitemaps import Sitemap
from django.utils.safestring import mark_safe
@@ -157,3 +160,38 @@ class WritingbyCountrySitemap(Sitemap):
def items(self):
return Country.objects.filter(visited=True)
+
+
+def get_bounds(lat, lon):
+ '''
+ given a set of lat,lon coords return the nearest administrative level boundary (usually turn out to be city, but sometimes it's a county, occasionally a state)
+ '''
+ r = requests.get('http://nominatim.openstreetmap.org/reverse',
+ params={
+ 'lat': lat,
+ 'lon': lon,
+ 'accept-language': 'en',
+ 'format': 'json'
+ })
+ r.raise_for_status()
+ data = json.loads(r.text)
+ adr = data.get('address', {})
+ city = adr.get('hamlet') or adr.get('village') or adr.get('town') or adr.get('city')
+ state = adr.get('state')
+ country = adr.get('country')
+ r = requests.get('http://nominatim.openstreetmap.org/search',
+ params={
+ 'city': city,
+ 'state': state,
+ 'country': country,
+ 'polygon_text': 1,
+ 'format': 'json',
+ 'featuretype': 'neighborhood'
+ })
+ r.raise_for_status()
+ data = json.loads(r.text)
+ poly = GEOSGeometry(data[0]['geotext'])
+ # Sometimes you get a multipolygon, sometimes just a polygon
+ if poly.geom_type == 'Polygon':
+ poly = MultiPolygon(fromstr(data[0]['geotext']))
+ return poly