Reputation: 335
I am trying to use a Polygon which is defined as follows:
from django.contrib.gis.geos import Polygon
parcel = Parcel.objects.filter(objectid="22520").values()
geojson = parcel[0]['geom'].geojson
format_l = ast.literal_eval(geojson)
coordinates_data = format_l['coordinates'][0][0]
poly = Polygon(coordinates_data, srid=3492)
poly_parcel = poly.transform(4326, clone=True)
polygon = poly_parcel.coords
print(polygon)
polygon
then contains the following as shown:
(((-121.49440799279022, 38.55725848782723),
(-121.49438844924772, 38.557303481514126),
(-121.4943760310021, 38.5573320694682),
(-121.49436263531841, 38.557362909896675),
(-121.49402385986245, 38.557269114460084),
(-121.49406987333441, 38.55716268909225),
(-121.49440799279022, 38.55725848782723)),)
I want to locate the Primary data within the Parcel Data, so I tried this:
Primary.objects.filter(geom__contains=polygon).values()
#and also tried with contained lookup
Primary.objects.filter(geom__contained=polygon).values()
When I try this query it throws this error:
"ValueError: Cannot use object with type tuple for a spatial lookup parameter."
Even trying with a List, I am getting the same error...
Upvotes: 2
Views: 398
Reputation: 23134
Let's analyze the error and see from there (Emphasis mine):
"ValueError: Cannot use object with type tuple for a spatial lookup parameter."
So you are trying to use a tuple object as an argument in a spatial lookup. If you see how you define your polygon, it is clear that this is the culprit:
(((-121.49440799279022, 38.55725848782723),
(-121.49438844924772, 38.557303481514126),
(-121.4943760310021, 38.5573320694682),
(-121.49436263531841, 38.557362909896675),
(-121.49402385986245, 38.557269114460084),
(-121.49406987333441, 38.55716268909225),
(-121.49440799279022, 38.55725848782723)),) # Defenitely a tuple!!!
And you are getting the error when you try to use it on a spatial query:
Primary.objects.filter(geom__contains=polygon).values()
I would suggest sticking with GeoDjango's geometries (which you are already using) as shown in the documentation, and more specifically with the GEOS Polygon:
Define your polygon as a GEOS Polygon:
from django.contrib.gis.geos import Polygon
parcel = Parcel.objects.filter(objectid="22520").values()
geojson = parcel[0]['geom'].geojson
format_l = ast.literal_eval(geojson)
coordinates_data = format_l['coordinates'][0][0]
geos_poly = Polygon(coordinates_data, srid=3492)
polygon = geos_poly.transform(4326, clone=True)
Use this polygon in the spatial query:
Primary.objects.filter(geom__contains=polygon).values()
Upvotes: 1