Example #1
0
def areas_by_name(request, name, legacy=False, format='json'):
    generation = Generation.objects.current()
    try:
        min_generation = int(request.REQUEST['min_generation'])
    except:
        min_generation = generation

    type = request.REQUEST.get('type', '')

    args = {
        'name__istartswith': name,
        'generation_low__lte': generation,
        'generation_high__gte': min_generation,
    }
    if ',' in type:
        args['type__in'] = type.split(',')
    elif type:
        args['type'] = type

    areas = add_codes(Area.objects.filter(**args))
    if legacy:
        out = dict( (area.id, {
            'area_id': area.id,
            'name': area.name,
            'type': area.type,
            'parent_area_id': area.parent_area_id,
        }) for area in areas )
    else:
        out = dict( ( area.id, area.as_dict() ) for area in areas )
    if format == 'html': return output_html(request, 'Areas starting with %s' % name, areas)
    return output_json(out)
Example #2
0
def areas_by_name(request, name, format='json'):
    generation = request.REQUEST.get('generation',
                                     Generation.objects.current())
    if not generation: generation = Generation.objects.current()

    try:
        min_generation = int(request.REQUEST['min_generation'])
    except:
        min_generation = generation

    type = request.REQUEST.get('type', '')

    args = {
        'name__istartswith': name,
        'generation_low__lte': generation,
        'generation_high__gte': min_generation,
    }
    if ',' in type:
        args['type__code__in'] = type.split(',')
    elif type:
        args['type__code'] = type

    areas = add_codes(Area.objects.filter(**args))
    if format == 'html':
        return output_html(request, 'Areas starting with %s' % name, areas)
    out = dict((area.id, area.as_dict()) for area in areas)
    return output_json(out)
Example #3
0
def areas_by_type(request, type, format='json'):
    generation = request.REQUEST.get('generation',
                                     Generation.objects.current())
    if not generation: generation = Generation.objects.current()

    try:
        min_generation = int(request.REQUEST['min_generation'])
    except:
        min_generation = generation

    args = {}
    if ',' in type:
        args['type__code__in'] = type.split(',')
    elif type:
        args['type__code'] = type

    if min_generation == -1:
        areas = add_codes(Area.objects.filter(**args))
    else:
        args['generation_low__lte'] = generation
        args['generation_high__gte'] = min_generation
        areas = add_codes(Area.objects.filter(**args))
    if format == 'html':
        return output_html(request, 'Areas in %s' % type, areas)
    return output_json(dict((a.id, a.as_dict()) for a in areas))
Example #4
0
def output_areas(request, title, format, areas, **kwargs):
    areas = add_codes(areas)
    if format == 'map.html':
        format = 'html'
        kwargs['show_map'] = True
    if format == 'html':
        return output_html(request, title, areas, **kwargs)
    return output_json(iterdict((area.id, area.as_dict()) for area in areas))
Example #5
0
def output_areas(request, title, format, areas, **kwargs):
    areas = add_codes(areas)
    if format == 'map.html':
        format = 'html'
        kwargs['show_map'] = True
    if format == 'html':
        return output_html(request, title, areas, **kwargs)
    return output_json(iterdict((area.id, area.as_dict()) for area in areas))
Example #6
0
def areas_by_point(request, srid, x, y, bb=False, format='json'):
    type = request.REQUEST.get('type', '')
    generation = request.REQUEST.get('generation',
                                     Generation.objects.current())
    if not generation: generation = Generation.objects.current()

    location = Point(float(x), float(y), srid=int(srid))
    gdal.UseExceptions()
    try:
        location.transform(settings.MAPIT_AREA_SRID, clone=True)
    except:
        raise ViewException(format, 'Point outside the area geometry', 400)

    method = 'box' if bb and bb != 'polygon' else 'polygon'

    args = {
        'generation_low__lte': generation,
        'generation_high__gte': generation
    }

    if ',' in type:
        args['type__code__in'] = type.split(',')
    elif type:
        args['type__code'] = type

    if type and method == 'polygon':
        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).
        args['polygon__bbcontains'] = location
        shapes = Geometry.objects.filter(**args).defer('polygon')
        areas = []
        for shape in shapes:
            try:
                areas.append(
                    Area.objects.get(polygons__id=shape.id,
                                     polygons__polygon__contains=location))
            except:
                pass
    else:
        if method == 'box':
            args['polygons__polygon__bbcontains'] = location
        else:
            geoms = list(
                Geometry.objects.filter(
                    polygon__contains=location).defer('polygon'))
            args['polygons__in'] = geoms
        areas = Area.objects.filter(**args)

    areas = add_codes(areas)
    if format == 'html':
        return output_html(request,
                           'Areas covering the point (%s,%s)' % (x, y),
                           areas,
                           indent_areas=True)
    return output_json(dict((area.id, area.as_dict()) for area in areas))
Example #7
0
def area_children(request, area_id, legacy=False, format='json'):
    area = get_object_or_404(Area, id=area_id)
    if isinstance(area, HttpResponse): return area
    generation = Generation.objects.current()
    children = add_codes(area.children.filter(
        generation_low__lte=generation, generation_high__gte=generation
    ))
    if legacy: return output_json( [ child.id for child in children ] )
    if format == 'html': return output_html( children )
    return output_json( dict( (child.id, child.as_dict() ) for child in children ) )
Example #8
0
def area_touches(request, area_id, format='json'):
    area = get_object_or_404(Area, id=area_id)
    if isinstance(area, HttpResponse): return area
    all_areas = area.polygons.all()
    if len(all_areas) > 1:
        all_areas = all_areas.collect()
    elif len(all_areas) == 1:
        all_areas = all_areas[0].polygon
    else:
        return output_json({ 'error': 'No polygons found' }, code=404)
    areas = Area.objects.filter(polygons__polygon__touches=all_areas, type=area.type)
    if format == 'html': return output_html( areas )
    return output_json( dict( (a.id, a.as_dict() ) for a in areas ) )
Example #9
0
def area_intersect(query_type, title, request, area_id, format):
    area = get_object_or_404(Area, format=format, id=area_id)
    if isinstance(area, HttpResponse): return area

    all_areas = area.polygons.all()
    if len(all_areas) > 1:
        all_areas = all_areas.collect()
    elif len(all_areas) == 1:
        all_areas = all_areas[0].polygon
    else:
        return output_error(format, 'No polygons found', 404)

    generation = Generation.objects.current()
    args = {
        'generation_low__lte': generation,
        'generation_high__gte': generation,
    }

    type = request.REQUEST.get('type', '')
    if ',' in type:
        args['type__in'] = type.split(',')
    elif type:
        args['type'] = type
    elif area.type in ('EUR'):
        args['type'] = area.type

    if isinstance(query_type, list):
        or_queries = [ Q(**{'polygons__polygon__%s' % t: all_areas}) for t in query_type ]
        areas = Area.objects.exclude(id=area.id).filter(**args)
        areas = areas.filter(reduce(operator.or_, or_queries))
    elif len(all_areas) == 1:
        areas = Area.objects.intersect(query_type, area)
        areas = areas.exclude(id=area.id).filter(**args)
    else:
        areas = Area.objects.exclude(id=area.id).filter(**args)
        areas = areas.filter(**{'polygons__polygon__%s' % query_type : all_areas })

    areas = areas.distinct()

    set_timeout(format)
    try:
        if format == 'html':
            return output_html(request,
                title % ('<a href="/area/%d.html">%s</a>' % (area.id, area.name)),
                areas, norobots=True
            )
        return output_json( dict( (a.id, a.as_dict() ) for a in areas ) )
    except QueryCanceledError:
        return output_error(format, 'That query was taking too long to compute - try restricting to a specific type, if you weren\'t already doing so.', 500)
Example #10
0
def areas_by_point(request, srid, x, y, bb=False, format="json"):
    type = request.REQUEST.get("type", "")
    generation = request.REQUEST.get("generation", Generation.objects.current())
    if not generation:
        generation = Generation.objects.current()

    location = Point(float(x), float(y), srid=int(srid))
    gdal.UseExceptions()
    try:
        location.transform(settings.MAPIT_AREA_SRID, clone=True)
    except:
        raise ViewException(format, "Point outside the area geometry", 400)

    method = "box" if bb and bb != "polygon" else "polygon"

    args = {"generation_low__lte": generation, "generation_high__gte": generation}

    if "," in type:
        args["type__code__in"] = type.split(",")
    elif type:
        args["type__code"] = type

    if type and method == "polygon":
        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).
        args["polygon__bbcontains"] = location
        shapes = Geometry.objects.filter(**args).defer("polygon")
        areas = []
        for shape in shapes:
            try:
                areas.append(Area.objects.get(polygons__id=shape.id, polygons__polygon__contains=location))
            except:
                pass
    else:
        if method == "box":
            args["polygons__polygon__bbcontains"] = location
        else:
            geoms = list(Geometry.objects.filter(polygon__contains=location).defer("polygon"))
            args["polygons__in"] = geoms
        areas = Area.objects.filter(**args)

    areas = add_codes(areas)
    if format == "html":
        return output_html(request, "Areas containing (%s,%s)" % (x, y), areas, indent_areas=True)
    return output_json(dict((area.id, area.as_dict()) for area in areas))
Example #11
0
def area_intersect(query_type, title, request, area_id, format):
    area = get_object_or_404(Area, format=format, id=area_id)
    if isinstance(area, HttpResponse): return area

    if not area.polygons.count():
        return output_error(format, 'No polygons found', 404)

    generation = Generation.objects.current()
    args = {
        'generation_low__lte': generation,
        'generation_high__gte': generation,
    }

    type = request.REQUEST.get('type', '')
    if ',' in type:
        args['type__code__in'] = type.split(',')
    elif type:
        args['type__code'] = type
    elif area.type.code in ('EUR'):
        args['type__code'] = area.type.code

    set_timeout(format)
    areas = Area.objects.intersect(
        query_type, area).exclude(id=area.id).filter(**args).distinct()

    try:
        if format == 'html':
            return output_html(request,
                               title % ('<a href="/area/%d.html">%s</a>' %
                                        (area.id, area.name)),
                               areas,
                               norobots=True)
        return output_json(dict((a.id, a.as_dict()) for a in areas))
    except QueryCanceledError:
        return output_error(
            format,
            'That query was taking too long to compute - try restricting to a specific type, if you weren\'t already doing so.',
            500)
    except DatabaseError, e:
        # Django 1.2+ catches QueryCanceledError and throws its own DatabaseError instead
        if 'canceling statement due to statement timeout' not in e.args[0]:
            raise
        return output_error(
            format,
            'That query was taking too long to compute - try restricting to a specific type, if you weren\'t already doing so.',
            500)
Example #12
0
def areas_by_point(request, srid, x, y, bb=False, format='json'):
    type = request.REQUEST.get('type', '')
    generation = request.REQUEST.get('generation', Generation.objects.current())
    if not generation: generation = Generation.objects.current()

    location = Point(float(x), float(y), srid=int(srid))
    gdal.UseExceptions()
    try:
        location.transform(settings.MAPIT_AREA_SRID, clone=True)
    except:
        return output_error(format, 'Point outside the area geometry', 400)

    method = 'box' if bb and bb != 'polygon' else 'polygon'

    args = { 'generation_low__lte': generation, 'generation_high__gte': generation }

    if ',' in type:
        args['type__code__in'] = type.split(',')
    elif type:
        args['type__code'] = type

    if type and method == 'polygon':
        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).
        args['polygon__bbcontains'] = location
        shapes = Geometry.objects.filter(**args).defer('polygon')
        areas = []
        for shape in shapes:
            try:
                areas.append( Area.objects.get(polygons__id=shape.id, polygons__polygon__contains=location) )
            except:
                pass
    else:
        if method == 'box':
            args['polygons__polygon__bbcontains'] = location
        else:
            geoms = list(Geometry.objects.filter(polygon__contains=location).defer('polygon'))
            args['polygons__in'] = geoms
        areas = Area.objects.filter(**args)

    if format == 'html': return output_html(request, 'Areas containing (%s,%s)' % (x,y), areas)
    return output_json( dict( (area.id, area.as_dict() ) for area in areas ) )
Example #13
0
def area_children(request, area_id, format="json"):
    area = get_object_or_404(Area, format=format, id=area_id)

    generation = request.REQUEST.get("generation", Generation.objects.current())
    if not generation:
        generation = Generation.objects.current()
    args = {"generation_low__lte": generation, "generation_high__gte": generation}

    type = request.REQUEST.get("type", "")
    if "," in type:
        args["type__code__in"] = type.split(",")
    elif type:
        args["type__code"] = type

    children = add_codes(area.children.filter(**args))

    if format == "html":
        return output_html(request, "Children of %s" % area.name, children)
    return output_json(dict((child.id, child.as_dict()) for child in children))
Example #14
0
def area_children(request, area_id, format='json'):
    area = get_object_or_404(Area, format=format, id=area_id)

    generation = request.REQUEST.get('generation', Generation.objects.current())
    if not generation: generation = Generation.objects.current()
    args = {
        'generation_low__lte': generation,
        'generation_high__gte': generation,
    }

    type = request.REQUEST.get('type', '')
    if ',' in type:
        args['type__code__in'] = type.split(',')
    elif type:
        args['type__code'] = type

    children = add_codes(area.children.filter(**args))

    if format == 'html': return output_html(request, 'Children of %s' % area.name, children)
    return output_json( dict( (child.id, child.as_dict() ) for child in children ) )
Example #15
0
def areas_by_name(request, name, format="json"):
    generation = Generation.objects.current()
    try:
        min_generation = int(request.REQUEST["min_generation"])
    except:
        min_generation = generation

    type = request.REQUEST.get("type", "")

    args = {"name__istartswith": name, "generation_low__lte": generation, "generation_high__gte": min_generation}
    if "," in type:
        args["type__code__in"] = type.split(",")
    elif type:
        args["type__code"] = type

    areas = add_codes(Area.objects.filter(**args))
    if format == "html":
        return output_html(request, "Areas starting with %s" % name, areas)
    out = dict((area.id, area.as_dict()) for area in areas)
    return output_json(out)
Example #16
0
def area_children(request, area_id, format='json'):
    area = get_object_or_404(Area, format=format, id=area_id)
    if isinstance(area, HttpResponse): return area

    generation = Generation.objects.current()
    args = {
        'generation_low__lte': generation,
        'generation_high__gte': generation,
    }

    type = request.REQUEST.get('type', '')
    if ',' in type:
        args['type__code__in'] = type.split(',')
    elif type:
        args['type__code'] = type

    children = add_codes(area.children.filter(**args))

    if format == 'html': return output_html(request, 'Children of %s' % area.name, children)
    return output_json( dict( (child.id, child.as_dict() ) for child in children ) )
Example #17
0
def areas_by_type(request, type, format='json'):
    generation = Generation.objects.current()
    try:
        min_generation = int(request.REQUEST['min_generation'])
    except:
        min_generation = generation

    args = {}
    if ',' in type:
        args['type__code__in'] = type.split(',')
    elif type:
        args['type__code'] = type

    if min_generation == -1:
        areas = add_codes(Area.objects.filter(**args))
    else:
        args['generation_low__lte'] = generation
        args['generation_high__gte'] = min_generation
        areas = add_codes(Area.objects.filter(**args))
    if format == 'html':
        return output_html(request, 'Areas in %s' % type, areas)
    return output_json( dict( (a.id, a.as_dict() ) for a in areas ) )
Example #18
0
def areas_by_type(request, type, format="json"):
    generation = Generation.objects.current()
    try:
        min_generation = int(request.REQUEST["min_generation"])
    except:
        min_generation = generation

    args = {}
    if "," in type:
        args["type__code__in"] = type.split(",")
    elif type:
        args["type__code"] = type

    if min_generation == -1:
        areas = add_codes(Area.objects.filter(**args))
    else:
        args["generation_low__lte"] = generation
        args["generation_high__gte"] = min_generation
        areas = add_codes(Area.objects.filter(**args))
    if format == "html":
        return output_html(request, "Areas in %s" % type, areas)
    return output_json(dict((a.id, a.as_dict()) for a in areas))
Example #19
0
def area_intersect(query_type, title, request, area_id, format):
    area = get_object_or_404(Area, format=format, id=area_id)
    if isinstance(area, HttpResponse): return area

    if not area.polygons.count():
        return output_error(format, 'No polygons found', 404)

    generation = Generation.objects.current()
    args = {
        'generation_low__lte': generation,
        'generation_high__gte': generation,
    }

    type = request.REQUEST.get('type', '')
    if ',' in type:
        args['type__code__in'] = type.split(',')
    elif type:
        args['type__code'] = type
    elif area.type.code in ('EUR'):
        args['type__code'] = area.type.code

    set_timeout(format)
    areas = Area.objects.intersect(query_type, area).exclude(id=area.id).filter(**args).distinct()

    try:
        if format == 'html':
            return output_html(request,
                title % ('<a href="%sarea/%d.html">%s</a>' % (reverse('mapit_index'), area.id, area.name)),
                areas, norobots=True
            )
        return output_json( dict( (a.id, a.as_dict() ) for a in areas ) )
    except QueryCanceledError:
        return output_error(format, 'That query was taking too long to compute - try restricting to a specific type, if you weren\'t already doing so.', 500)
    except DatabaseError, e:
        # Django 1.2+ catches QueryCanceledError and throws its own DatabaseError instead
        if 'canceling statement due to statement timeout' not in e.args[0]: raise
        return output_error(format, 'That query was taking too long to compute - try restricting to a specific type, if you weren\'t already doing so.', 500)
Example #20
0
def output_areas(request, title, format, areas, **kwargs):
    areas = add_codes(areas)
    if format == 'html':
        return output_html(request, title, areas, **kwargs)
    return output_json(dict((area.id, area.as_dict()) for area in areas))
Example #21
0
def areas(request, area_ids, format="json"):
    area_ids = area_ids.split(",")
    areas = add_codes(Area.objects.filter(id__in=area_ids))
    if format == "html":
        return output_html(request, "Areas ID lookup", areas)
    return output_json(dict((area.id, area.as_dict()) for area in areas))
Example #22
0
def areas(request, area_ids, format='json'):
    area_ids = area_ids.split(',')
    areas = add_codes(Area.objects.filter(id__in=area_ids))
    if format == 'html': return output_html(request, 'Areas ID lookup', areas)
    return output_json( dict( ( area.id, area.as_dict() ) for area in areas ) )
Example #23
0
def output_areas(request, title, format, areas, **kwargs):
    areas = add_codes(areas)
    if format == 'html':
        return output_html(request, title, areas, **kwargs)
    return output_json(dict((area.id, area.as_dict()) for area in areas))
Example #24
0
    set_timeout(format)
    try:
        areas = list(Area.objects.intersect(query_type, area).filter(**args).distinct())
        areas = add_codes(areas)
    except QueryCanceledError:
        return output_error(format, 'That query was taking too long to compute - try restricting to a specific type, if you weren\'t already doing so.', 500)
    except DatabaseError, e:
        # Django 1.2+ catches QueryCanceledError and throws its own DatabaseError instead
        if 'canceling statement due to statement timeout' not in e.args[0]: raise
        return output_error(format, 'That query was taking too long to compute - try restricting to a specific type, if you weren\'t already doing so.', 500)
    except InternalError:
        return output_error(format, 'There was an internal error performing that query.', 500)

    if format == 'html':
        return output_html(request,
            title % ('<a href="%sarea/%d.html">%s</a>' % (reverse('mapit_index'), area.id, area.name)),
            areas, norobots=True
        )
    return output_json( dict( (a.id, a.as_dict() ) for a in areas ) )

@ratelimit(minutes=3, requests=100)
def area_touches(request, area_id, format='json'):
    # XXX Exempt an error that throws a GEOS Exception
    if area_id == '2658':
        return output_error(format, 'There was an internal error performing that query.', 500)
    return area_intersect('touches', 'Areas touching %s', request, area_id, format)

@ratelimit(minutes=3, requests=100)
def area_overlaps(request, area_id, format='json'):
    return area_intersect('overlaps', 'Areas overlapping %s', request, area_id, format)

@ratelimit(minutes=3, requests=100)
Example #25
0
    except DatabaseError, e:
        # Django 1.2+ catches QueryCanceledError and throws its own DatabaseError instead
        if 'canceling statement due to statement timeout' not in e.args[0]:
            raise
        raise ViewException(
            format,
            'That query was taking too long to compute - try restricting to a specific type, if you weren\'t already doing so.',
            500)
    except InternalError:
        raise ViewException(
            format, 'There was an internal error performing that query.', 500)

    if format == 'html':
        return output_html(request,
                           title %
                           ('<a href="%sarea/%d.html">%s</a>' %
                            (reverse('mapit_index'), area.id, area.name)),
                           areas,
                           norobots=True)
    return output_json(dict((a.id, a.as_dict()) for a in areas))


@ratelimit(minutes=3, requests=100)
def area_touches(request, area_id, format='json'):
    return area_intersect('touches', 'Areas touching %s', request, area_id,
                          format)


@ratelimit(minutes=3, requests=100)
def area_overlaps(request, area_id, format='json'):
    return area_intersect('overlaps', 'Areas overlapping %s', request, area_id,
                          format)
Example #26
0
def areas(request, area_ids, format='json'):
    area_ids = area_ids.split(',')
    areas = add_codes(Area.objects.filter(id__in=area_ids))
    if format == 'html': return output_html(request, 'Areas ID lookup', areas)
    return output_json(dict((area.id, area.as_dict()) for area in areas))