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')
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)
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')
def removeUsaFromQuerySet(qs=None): if qs is None: qs = Mpa.objects.all().defer(*Mpa.get_geom_fields()) return qs.exclude(country__in=UsaCodes)