示例#1
0
文件: views.py 项目: mci/mpatlas
def lookup_point(request):
    """Find nearby polygons with a point and search radius.
    Three lookup methods are supported:
        sphericalmercator: radius (in km) is applied to search buffer in
            900913 (aka Google Spherical Mercator) projection.  This method
            is appropriate when used in conjuction with web maps.
        greatcircle: uses PostGIS ST_DWithin spatial query on a geography
            column, using great circle distances.
        point: simple test if point is inside polygons (e.g., radius=0)
    These methods assume the geometries are in a Geography column.  Edge
    cases across the dateline are handled correctly.
    Different methods are needed if a regular Geometry column is used
    in order to handle cases across the dateline."""
    mpa_list = ()
    default_method = 'webmercator'
    try:
        lon = float(request.GET['lon'])
        lat = float(request.GET['lat'])
        try:
            radius = float(request.GET['radius'])
        except:
            radius = 225.0 # km
        try:
            method = request.GET['method'] or default_method # set default if empty string passed
        except (KeyError):
            method = default_method
        if method not in ('point', 'greatcircle', 'webmercator', 'webmercator_buffer', 'webmercator_box', 'webmercator_simple'):
            raise LookupMethodError('Unknown or malformed lookup method passed in GET query string.')
        if (radius == 0):
            method = 'point'
    except:
        # Bad input, return empty list
        return render(request, 'mpa/mpalookup.json', {
            'mpa_list': mpa_list,
        }, content_type='application/json; charset=utf-8')
    else:
        mpas_valid = mpas_norejects_nogeom
        # We need to normalize the longitude into the range -180 to 180 so we don't
        # make the cast to PostGIS Geography type complain
        point = geos.Point(normalize_lon(lon), lat, srid=gdal.SpatialReference('WGS84').srid) # srid=4326 , WGS84 geographic
        origpoint = point.clone()
        if (method == 'webmercator'):
            if (normalize_lon(lon) < 0):
                lon360 = normalize_lon(lon) + 360
            else:
                lon360 = normalize_lon(lon) - 360
            point360 = geos.Point(lon360, lat, srid=gdal.SpatialReference('WGS84').srid)
            point.transform(3857) # Google Spherical Mercator srid
            point360.transform(3857)
            #mpa_list = Mpa.objects.filter(geom_smerc__dwithin=(point, Distance(km=radius))).defer(*Mpa.get_geom_fields())
            mpa_list = mpas_valid.filter(Q(geom_smerc__dwithin=(point, Distance(km=radius))) | Q(geom_smerc__dwithin=(point360, Distance(km=radius)))).defer(*Mpa.get_geom_fields())
            search = point
        elif (method == 'webmercator_buffer'):
            point.transform(3857) # Spherical Mercator srid
            searchbuffer = point.buffer(radius * 1000) # convert km to m, create buffer
            mpa_list = mpas_valid.filter(geog__intersects=searchbuffer).defer(*Mpa.get_geom_fields())
            search = searchbuffer
        elif (method == 'webmercator_box'):
            point.transform(3857) # Spherical Mercator srid
            searchbuffer = point.buffer(radius * 1000)
            mpa_list = mpas_valid.filter(geog__intersects=searchbuffer.envelope).defer(*Mpa.get_geom_fields()) # use simple bounding box instead
            search = searchbuffer.envelope
        elif (method == 'webmercator_simple'):
            point.transform(3857) # Spherical Mercator srid
            searchbuffer = point.buffer(radius * 1000, quadsegs=2) # simple buffer with 2 segs per quarter circle
            mpa_list = mpas_valid.filter(geog__intersects=searchbuffer).defer(*Mpa.get_geom_fields())
            search = searchbuffer
        elif (method == 'greatcircle'):
            mpa_list = mpas_valid.filter(geog__dwithin=(point, Distance(km=radius))).defer(*Mpa.get_geom_fields())
            search = point
        elif (method == 'point'):
            mpa_list = mpas_valid.filter(geog__intersects=point).defer(*Mpa.get_geom_fields())
            search = point
        candidate_radius = radius * 2.2 # We're using big icons on a point, this let's us catch it better
        mpa_point_list = mpas_norejects_nogeom.filter(is_point=True, point_geog__dwithin=(origpoint, Distance(km=candidate_radius)))
        #mpa_candidate_list = mpas_proposed_nogeom
        # mpa_list = list(mpa_list)
        # ids = [m.mpa_id for m in mpa_list]
        # cleaned_mpa_list
        # for mpa in mpa_list:
        #     if mpa.mpa_id >= 7700000:
        #         orig_id = int(str(mpa_id)[-5:])
        #         if orig_id in ids:
        #             ids.remove(orig_id)
        # for mpa in mpa_list:
        #     if mpa.mpa_id in ids:
        #         cleaned_mpa_list.append(mpa)
        search.transform(4326)
        return render(request, 'mpa/mpalookup.json', {
            'search': search.coords,
            'mpa_list': mpa_list | mpa_point_list, # this joins the query sets with an OR
        }, content_type='application/json; charset=utf-8')
示例#2
0
文件: views.py 项目: mci/mpatlas
from mpa.forms import MpaForm, MpaGeomForm

from mpa.filters import apply_filters

#import reversion
from reversion import revisions as reversion
from django.db import connection, transaction
from reversion.models import Revision
from mpa.models import Mpa, Contact, WikiArticle, VersionMetadata

from django.views.decorators.cache import never_cache
from django.contrib.auth.decorators import login_required

# Predefined querysets
mpas_norejects = Mpa.objects.exclude(verification_state='Rejected as MPA')
mpas_norejects_nogeom = mpas_norejects.defer(*Mpa.get_geom_fields())
mpas_all_nogeom = Mpa.objects.all().defer(*Mpa.get_geom_fields())
mpas_noproposed_nogeom = mpas_norejects.exclude(status='Proposed').defer(*Mpa.get_geom_fields())
mpas_proposed_nogeom = mpas_norejects.filter(status='Proposed').defer(*Mpa.get_geom_fields())

def do_revision(request):
    mpa = Mpa.objects.get(pk=4)
    mpa.summary = 'Test123'
    mpa.save()
    reversion.set_comment('Test comment')

@never_cache
@transaction.atomic
@reversion.create_revision()
def revision_view(request):
    do_revision(request)
示例#3
0
文件: views.py 项目: mci/mpatlas
def get_mpa_geom_json(request, pk, simplified=True, webmercator=False):
    try:
        simplified = request.GET['simplified'].lower() not in ('false', 'f', 'no', '0', 0)
    except:
        pass
    try:
        webmercator = (request.GET['webmercator'].upper() == 'TRUE')
    except:
        pass
    geomfield = sgeomfield = 'geom'
    if (webmercator):
        geomfield = 'geom_smerc'
    mpaq = Mpa.objects.geojson(field_name=geomfield).geojson(field_name='point_within', model_att='geojson_point').defer(*Mpa.get_geom_fields())
    if simplified:
        sgeomfield = 'simple_' + geomfield
        mpaq = mpaq.geojson(field_name=sgeomfield, model_att='geojson_simple')
    mpa = mpaq.get(pk=pk)
    if mpa.is_point:
        geojson = mpa.geojson_point
    else:
        geojson = mpa.geojson if not simplified else mpa.geojson_simple
    if not geojson and simplified:
        geojson = mpa.geojson
    return HttpResponse(geojson or '{}', content_type='application/json; charset=utf-8')
示例#4
0
文件: merge.py 项目: mci/mpatlas
def removeUsaFromQuerySet(qs=None):
    if qs is None:
        qs = Mpa.objects.all().defer(*Mpa.get_geom_fields())
    return qs.exclude(country__in=UsaCodes)