def postcode(request, postcode, format=None): if hasattr(countries, 'canonical_postcode'): canon_postcode = countries.canonical_postcode(postcode) postcode = canon_postcode # if (postcode != canon_postcode and format is None) or format == 'json': # return redirect('mapit.views.postcodes.postcode', postcode=canon_postcode) if format is None: format = 'json' if not is_valid_postcode(postcode): raise ViewException(format, "Postcode '%s' is not valid." % postcode, 400) postcode = get_object_or_404(Postcode, format=format, postcode=postcode) try: generation = int(request.GET['generation']) except: generation = Generation.objects.current() if not hasattr(countries, 'is_special_postcode') or not countries.is_special_postcode( postcode.postcode): areas = list(add_codes(Area.objects.by_postcode(postcode, generation))) else: areas = [] # Shortcuts shortcuts = {} for area in areas: if area.type.code in ('COP', 'LBW', 'LGE', 'MTW', 'UTE', 'UTW'): shortcuts['ward'] = area.id shortcuts['council'] = area.parent_area_id elif area.type.code == 'CED': shortcuts.setdefault('ward', {})['county'] = area.id shortcuts.setdefault('council', {})['county'] = area.parent_area_id elif area.type.code == 'DIW': shortcuts.setdefault('ward', {})['district'] = area.id shortcuts.setdefault('council', {})['district'] = area.parent_area_id elif area.type.code in ('WMC', ): # XXX Also maybe 'EUR', 'NIE', 'SPC', 'SPE', 'WAC', 'WAE', 'OLF', 'OLG', 'OMF', 'OMG'): shortcuts[area.type.code] = area.id # Add manual enclosing areas. extra = [] for area in areas: if area.type.code in enclosing_areas.keys(): extra.extend(enclosing_areas[area.type.code]) areas = itertools.chain(areas, Area.objects.filter(id__in=extra)) if format == 'html': return render( request, 'mapit/postcode.html', { 'postcode': postcode.as_dict(), 'areas': areas, 'json_view': 'mapit-postcode', }) out = postcode.as_dict() out['areas'] = dict((area.id, area.as_dict()) for area in areas) if shortcuts: out['shortcuts'] = shortcuts return output_json(out)
def convert_address(request, format='json'): address = request.GET.get('address') if not address: raise ViewException(format, 'No address was provided.', 400) converter = AddressConverter() locations = converter.resolve_address(address, partial=bool(request.GET.get('partial'))) # this is a copy from mapit.views.areas.areas_by_point # because it's hard to reuse their code :( if PYGDAL: from osgeo import gdal gdal.UseExceptions() # we find areas for every lat/long coord we got back areas = [] type = request.GET.get('type', '') for coords in locations: location = Point(float(coords['lng']), float(coords['lat']), srid=4326) try: location.transform(settings.MAPIT_AREA_SRID, clone=True) except: raise ViewException(format, _('Point outside the area geometry'), 400) args = query_args(request, format) if type: args = dict(("area__%s" % k, v) for k, v in args.items()) # So this is odd. It doesn't matter if you specify types, PostGIS will # do the contains test on all the geometries matching the bounding-box # index, even if it could be much quicker to filter some out first # (ie. the EUR ones). coords['areas'] = [] args['polygon__bbcontains'] = location shapes = Geometry.objects.filter(**args).defer('polygon') for shape in shapes: try: area = Area.objects.get(polygons__id=shape.id, polygons__polygon__contains=location) coords['areas'].append(str(area.id)) areas.append(area) except: pass else: geoms = list(Geometry.objects.filter(polygon__contains=location).defer('polygon')) args['polygons__in'] = geoms matches = Area.objects.filter(**args).all() coords['areas'] = [str(m.id) for m in matches] areas.extend(matches) areas = add_codes(areas) if format == 'html': return output_html(request, _("Areas matching the address '{0}'").format(address), areas, indent_areas=True) # hack to include the geocoded addresses in the results data = iterdict(chain( ((area.id, area.as_dict()) for area in areas), [("addresses", locations)])) return output_json(data)
def postcode(request, postcode, format=None): if hasattr(countries, 'canonical_postcode'): canon_postcode = countries.canonical_postcode(postcode) postcode = canon_postcode # if (postcode != canon_postcode and format is None) or format == 'json': # return redirect('mapit.views.postcodes.postcode', postcode=canon_postcode) if format is None: format = 'json' if not is_valid_postcode(postcode): raise ViewException(format, "Postcode '%s' is not valid." % postcode, 400) postcode = get_object_or_404(Postcode, format=format, postcode=postcode) try: generation = int(request.GET['generation']) except: generation = Generation.objects.current() if not hasattr(countries, 'is_special_postcode') or not countries.is_special_postcode(postcode.postcode): areas = list(add_codes(Area.objects.by_postcode(postcode, generation))) else: areas = [] # Shortcuts shortcuts = {} for area in areas: if area.type.code in ('COP', 'LBW', 'LGE', 'MTW', 'UTE', 'UTW'): shortcuts['ward'] = area.id shortcuts['council'] = area.parent_area_id elif area.type.code == 'CED': shortcuts.setdefault('ward', {})['county'] = area.id shortcuts.setdefault('council', {})['county'] = area.parent_area_id elif area.type.code == 'DIW': shortcuts.setdefault('ward', {})['district'] = area.id shortcuts.setdefault('council', {})['district'] = area.parent_area_id elif area.type.code in ('WMC',): # XXX Also maybe 'EUR', 'NIE', 'SPC', 'SPE', 'WAC', 'WAE', 'OLF', 'OLG', 'OMF', 'OMG'): shortcuts[area.type.code] = area.id # Add manual enclosing areas. extra = [] for area in areas: if area.type.code in enclosing_areas.keys(): extra.extend(enclosing_areas[area.type.code]) areas = itertools.chain(areas, Area.objects.filter(id__in=extra)) if format == 'html': return render(request, 'mapit/postcode.html', { 'postcode': postcode.as_dict(), 'areas': areas, 'json_view': 'mapit-postcode', }) out = postcode.as_dict() out['areas'] = dict((area.id, area.as_dict()) for area in areas) if shortcuts: out['shortcuts'] = shortcuts return output_json(out)
def postcode(request, postcode, format='json'): postcode = check_postcode(format, postcode) try: generation = int(request.REQUEST['generation']) except: generation = Generation.objects.current() if not hasattr(countries, 'is_special_postcode') or not countries.is_special_postcode(postcode.postcode): areas = add_codes(Area.objects.by_postcode(postcode, generation)) else: areas = [] # Shortcuts shortcuts = {} for area in areas: if area.type.code in ('COP','LBW','LGE','MTW','UTE','UTW'): shortcuts['ward'] = area.id shortcuts['council'] = area.parent_area_id elif area.type.code == 'CED': shortcuts.setdefault('ward', {})['county'] = area.id shortcuts.setdefault('council', {})['county'] = area.parent_area_id elif area.type.code == 'DIW': shortcuts.setdefault('ward', {})['district'] = area.id shortcuts.setdefault('council', {})['district'] = area.parent_area_id elif area.type.code in ('WMC'): # XXX Also maybe 'EUR', 'NIE', 'SPC', 'SPE', 'WAC', 'WAE', 'OLF', 'OLG', 'OMF', 'OMG'): shortcuts[area.type.code] = area.id # Add manual enclosing areas. extra = [] for area in areas: if area.type.code in enclosing_areas.keys(): extra.extend(enclosing_areas[area.type.code]) areas = itertools.chain(areas, Area.objects.filter(id__in=extra)) if format == 'html': return render_to_response('mapit/postcode.html', { 'postcode': postcode.as_dict(), 'areas': areas, 'json': '/postcode/', }) out = postcode.as_dict() out['areas'] = dict( ( area.id, area.as_dict() ) for area in areas ) if shortcuts: out['shortcuts'] = shortcuts return output_json(out)
def convert_address(request, format='json'): address = request.GET.get('address') if not address: raise ViewException(format, 'No address was provided.', 400) converter = AddressConverter() locations = converter.resolve_address(address, partial=bool( request.GET.get('partial'))) # this is a copy from mapit.views.areas.areas_by_point # because it's hard to reuse their code :( if PYGDAL: from osgeo import gdal gdal.UseExceptions() # we find areas for every lat/long coord we got back areas = [] type = request.GET.get('type', '') for coords in locations: location = Point(float(coords['lng']), float(coords['lat']), srid=4326) try: location.transform(settings.MAPIT_AREA_SRID, clone=True) except: raise ViewException(format, _('Point outside the area geometry'), 400) args = query_args(request, format) if type: args = dict(("area__%s" % k, v) for k, v in args.items()) # So this is odd. It doesn't matter if you specify types, PostGIS will # do the contains test on all the geometries matching the bounding-box # index, even if it could be much quicker to filter some out first # (ie. the EUR ones). coords['areas'] = [] args['polygon__bbcontains'] = location shapes = Geometry.objects.filter(**args).defer('polygon') for shape in shapes: try: area = Area.objects.get( polygons__id=shape.id, polygons__polygon__contains=location) coords['areas'].append(str(area.id)) areas.append(area) except: pass else: geoms = list( Geometry.objects.filter( polygon__contains=location).defer('polygon')) args['polygons__in'] = geoms matches = Area.objects.filter(**args).all() coords['areas'] = [str(m.id) for m in matches] areas.extend(matches) areas = add_codes(areas) if format == 'html': return output_html( request, _("Areas matching the address '{0}'").format(address), areas, indent_areas=True) # hack to include the geocoded addresses in the results data = iterdict( chain(((area.id, area.as_dict()) for area in areas), [("addresses", locations)])) return output_json(data)