Manikanta
Manikanta

Reputation: 335

Why my contained Query doesnot work in spatial coordinates in GeoDjango?

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

Answers (1)

John Moutafis
John Moutafis

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

Related Questions