diff options
author | luxagraf <sng@luxagraf.net> | 2014-06-15 12:56:16 -0400 |
---|---|---|
committer | luxagraf <sng@luxagraf.net> | 2014-06-15 12:56:16 -0400 |
commit | 1c76369b3d1eb99202cdba9a741fe7ac68e2f582 (patch) | |
tree | d511b59a77ad86ebe9637c09d34949aa3df3d00f | |
parent | a0f107b3ff79ca9aebb75c8becd65c5708bb0538 (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.py | 38 |
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 |