[gdal-dev] OGR Geometry methods
Marius Jigmond
mariusjigmond at hotmail.com
Tue Jul 12 12:45:13 EDT 2011
Indeed, SetAttributeFilter returns the right feature. Thanks Luke.
FYI the ExecuteSQL bug submission is http://trac.osgeo.org/gdal/ticket/4156
-marius
Date: Tue, 12 Jul 2011 12:31:03 -0400
Subject: Re: [gdal-dev] OGR Geometry methods
From: luke.peterson at gmail.com
To: mariusjigmond at hotmail.com
CC: gdal-dev at lists.osgeo.org
On Tue, Jul 12, 2011 at 11:56 AM, Marius Jigmond <mariusjigmond at hotmail.com> wrote:
Strangely enough, ExecuteSQL works (it returns an osgeo.ogr.layer object with one feature) with
'select FID from judeteEPSG3844 where DENJUD = "CLUJ"'
but later a GetField('FID') request returns "Illegal field requested in GetField()"
-marius
Another way to do this is to use the AttributeFilter. Run this by itself and see if you get the expected result:
from osgeo import ogrfileName = '/data/romania/judeteEPSG3844.shp'shapeDS = ogr.Open(fileName)shapeLayer = shapeDS.GetLayerByIndex(0)shapeLayer.SetAttributeFilter('DENJUD="CLUJ"')
targetFeature = shapeLayer.GetNextFeature()print targetFeature.GetField('DENJUD') # should print the DENJUD of the feature fitting the attribute filter.
Date: Tue, 12 Jul 2011 09:13:00 -0400
Subject: Re: [gdal-dev] OGR Geometry methods
From: luke.peterson at gmail.com
To: mariusjigmond at hotmail.com
-----
Luke Peterson
- sent via mobile device -
On Jul 11, 2011 11:00 PM, "Marius Jigmond" <mariusjigmond at hotmail.com> wrote:
>
> After some more investigation that is likely NOT the issue. I have an ExecuteSQL statement which selects a certain polygon based on an attribute value. Unfortunately it seems to return the wrong feature. The feature I query for is unique so a duplicate is out of the question. Here's the code:
>
> #!/usr/bin/python
>
> from osgeo import ogr
> import sys, math, time, os
>
> aquifer = '/data/romania/judeteEPSG3844.shp'
> aqDS = ogr.Open(aquifer)
> sql = 'select * from judeteEPSG3844 where DENJUD = "CLUJ"'
> aqLayer = aqDS.ExecuteSQL(sql)
> feat = aqLayer.GetFeature(0)
> print aqLayer.GetFeatureCount()
> print feat.GetField('DENJUD')
> aqDS.ReleaseResultSet(aqLayer)
>
> The result:
> marius at mobi:~/temp$ run_sql.py
> 1
> TELEORMAN
> marius at mobi:~/temp$
>
> This explains why none of my centroids were remotely close to the polygon.
>
> Is there something wrong with my query or should I file a bug?
>
Can you select the feature by its FID instead? (apologies, I'm banging this out on my phone ... probably won't run but you should get the idea):
aqLayer = aqDS.GetLayerByIndex(0) #gets the whole shapefile
aqFID = aqLayer.GetFIDColumn() # I forget the method name here... hope this is right but may have to pull in the layer def
sql = 'select %s from judeteEPSG3844 where DENJUD = "CLUJ"' % aqFID # specifically asking for just the FID field in the resultset
sqlResults = aqDS.ExecuteSQL(sql) # sql results same as before
featFID = sqlResults.GetFeature(0).GetFieldAsInt(aqFID) #this should be the actual FID of the results (problems would occur if your sql returned more than one hit)
feat = aqLayer.GetFeature(featFID) # using the fid to grab the feature from the 0th layer in the shapefile
This may be a long way around ...
> -marius
>
>
> On Mon, 2011-07-11 at 20:46 -0500, Marius Jigmond wrote:
>>
>> I suppose a piece of code speaks louder :):
>>
>> xsect = False
>> for i in range(gridLayer.GetFeatureCount()):
>> feat = gridLayer.GetFeature(i)
>> geom = feat.GetGeometryRef()
>> point = geom.Centroid()
>> for j in range(aqLayer.GetFeatureCount()):
>> aqfeat = aqLayer.GetFeature(j)
>> aqgeom = aqfeat.GetGeometryRef()
>> if point.Intersect(aqgeom):
>> xsect = True
>> print 'ibound = 1'
>> break
>> if xsect:
>> feat.SetField('IBOUND', 1)
>> gridLayer.SetFeature(feat)
>> xsect = False
>>
>> -marius
>>
>> On Mon, 2011-07-11 at 20:34 -0500, Marius Jigmond wrote:
>>>
>>> Hi everyone,
>>>
>>> I am trying to test whether centroids of polygons lie/intersect within another polygon. I have tried Intersect, Within, and Contains but they always return false. Should these methods work for my intended purpose or do I need to implement a point in polygon function? Thanks.
>>>
>>> -marius
>>>
>>> _______________________________________________
>>> gdal-dev mailing list
>>> gdal-dev at lists.osgeo.org
>>> http://lists.osgeo.org/mailman/listinfo/gdal-dev
>>
>> _______________________________________________
>> gdal-dev mailing list
>> gdal-dev at lists.osgeo.org
>> http://lists.osgeo.org/mailman/listinfo/gdal-dev
>
>
> _______________________________________________
> gdal-dev mailing list
> gdal-dev at lists.osgeo.org
> http://lists.osgeo.org/mailman/listinfo/gdal-dev
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://lists.osgeo.org/pipermail/gdal-dev/attachments/20110712/eb9eb126/attachment.html
More information about the gdal-dev
mailing list