Thread View: pl.comp.gis
1 messages
1 total messages
Started by geowrw
Fri, 03 Jun 2011 21:51
metoda ExecuteSQL() w OGR
Author: geowrw
Date: Fri, 03 Jun 2011 21:51
Date: Fri, 03 Jun 2011 21:51
127 lines
6604 bytes
6604 bytes
Witam,
Pytanie dotyczy OGR w Python.
Po utworzeniu obiektu źródła danych z pliku SHP próbuję pobrać i
przetwarzać część danych. Korzystam z metody ExecuteSQL(). Zauważyłem,
że zwracany jest zawsze podzbiór liczebnie odpowiadający spodziewanemu
wynikowi lecz zawierający pierwsze rekordy ze zbioru: jeżeli zapytanie
ma zwrócić 3 rekordy, zwraca 3 ale nie te które wynikają z klauzuli
WHERE ale pierwsze trzy; jeżeli pięć - zwracane jest pierwszych 5.
Przykład na danych z http://www.gis.usu.edu/~chrisg/python/2009/ Week
1 (Data), tam jest zbiór sites.shp. (tak przy okazji bardzo polecam
ten tutorial!)
A oto kod:
>>> import os
>>> from osgeo import ogr
>>> drv = ogr.GetDriverByName('ESRI Shapefile')
>>> dsrc = drv.Open('sites.shp',0)
>>> lyr = dsrc.GetLayer(0)
>>> lyr
<osgeo.ogr.Layer; proxy of <Swig Object of type 'OGRLayerShadow *' at
0x014BB120> >
>>> lyr.GetFeatureCount()
42
>>> for i in range(0,lyr.GetFeatureCount()):
f = lyr.GetFeature(i)
[i, f.GetField('id'), f.GetField('cover'),
f.geometry().GetX(),f.geometry().GetY()]
[0, 1, 'shrubs', 455552.41836086405, 4641822.053684879]
[1, 2, 'trees', 449959.8408513342, 4633802.508576875]
[2, 3, 'rocks', 441201.6534307497, 4619029.662325286]
[3, 4, 'grass', 468214.85800508264, 4608688.669949174]
[4, 5, 'shrubs', 456713.1419949174, 4617974.459021601]
[5, 6, 'trees', 472330.15088945365, 4619873.824968234]
[6, 7, 'bare', 456396.58100381197, 4627576.8090851335]
[7, 8, 'bare', 480033.13500635326, 4628104.410736976]
[8, 9, 'trees', 477395.12674714107, 4633169.386594663]
[9, 10, 'grass', 491429.33068615, 4635701.874523507]
[10, 11, 'grass', 483093.22458703944, 4642560.695997459]
[11, 12, 'rocks', 490690.68837357056, 4646781.509212199]
[12, 13, 'grass', 488580.2817662008, 4629581.695362135]
[13, 14, 'trees', 488791.32242693775, 4616286.133735705]
[14, 15, 'shrubs', 482671.14326556545, 4603307.133100381]
[15, 16, 'bare', 470114.2239517154, 4603518.173761118]
[16, 17, 'grass', 467898.29701397714, 4597292.474269377]
[17, 18, 'bare', 473068.79320203303, 4592966.14072427]
[18, 19, 'trees', 479716.5740152478, 4591699.896759847]
[19, 20, 'trees', 485098.1108640407, 4596448.31162643]
[20, 21, 'shrubs', 478766.8910419314, 4601091.206162643]
[21, 22, 'trees', 474018.47617534944, 4603518.173761118]
[22, 23, 'rocks', 457029.7029860229, 4603412.65343075]
[23, 24, 'grass', 443312.06003811944, 4599613.921537484]
[24, 25, 'rocks', 435503.55559085135, 4606050.661689962]
[25, 26, 'trees', 432548.9863405337, 4612276.361181702]
[26, 27, 'shrubs', 445000.3853240153, 4611432.198538755]
[27, 28, 'grass', 456607.62166454893, 4611221.157878018]
[28, 29, 'bare', 451437.12547649303, 4619451.74364676]
[29, 30, 'rocks', 445422.4666454892, 4628948.573379924]
[30, 31, 'grass', 440779.57210927573, 4638023.3217916135]
[31, 32, 'rocks', 441096.13310038124, 4647836.712515883]
[32, 33, 'shrubs', 448377.03589580685, 4653007.208703939]
[33, 34, 'trees', 458190.4266200763, 4652690.647712833]
[34, 35, 'bare', 447110.79193138506, 4646148.387229987]
[35, 36, 'trees', 462938.8414866582, 4634541.1508894535]
[36, 37, 'grass', 466209.97172808135, 4625782.963468869]
[37, 38, 'water', 470536.3052731893, 4639817.167407878]
[38, 39, 'water', 470958.3865946633, 4651635.444409149]
[39, 40, 'grass', 474651.5981575604, 4623039.434879288]
[40, 41, 'trees', 428117.1324650572, 4641083.4113723]
[41, 42, 'grass', 443628.62102922495, 4593493.742376111]
>>> a = dsrc.ExecuteSQL("SELECT * FROM sites WHERE cover = 'water'") # są dwa takie rekordy
>>> for i in range(0,a.GetFeatureCount()):
f = lyr.GetFeature(i)
[i, f.GetField('id'), f.GetField('cover'),
f.geometry().GetX(),f.geometry().GetY()]
[0, 1, 'shrubs', 455552.41836086405, 4641822.053684879]
[1, 2, 'trees', 449959.8408513342, 4633802.508576875]
#Jak widać nie wybiera 'water'!
>>> a = dsrc.ExecuteSQL("SELECT * FROM sites WHERE cover = 'bare'") # takich rekordów jest 6
>>>
>>> for i in range(0,a.GetFeatureCount()):
f = lyr.GetFeature(i)
[i, f.GetField('id'), f.GetField('cover'),
f.geometry().GetX(),f.geometry().GetY()]
[0, 1, 'shrubs', 455552.41836086405, 4641822.053684879]
[1, 2, 'trees', 449959.8408513342, 4633802.508576875]
[2, 3, 'rocks', 441201.6534307497, 4619029.662325286]
[3, 4, 'grass', 468214.85800508264, 4608688.669949174]
[4, 5, 'shrubs', 456713.1419949174, 4617974.459021601]
[5, 6, 'trees', 472330.15088945365, 4619873.824968234]
# I znowu: ilość sie zgadza, ale wynik bledny!
>>> a = dsrc.ExecuteSQL("SELECT * FROM sites WHERE id > 35") # siedem ostatnich rekordów
>>> for i in range(0,a.GetFeatureCount()):
f = lyr.GetFeature(i)
[i, f.GetField('id'), f.GetField('cover'),
f.geometry().GetX(),f.geometry().GetY()]
[0, 1, 'shrubs', 455552.41836086405, 4641822.053684879]
[1, 2, 'trees', 449959.8408513342, 4633802.508576875]
[2, 3, 'rocks', 441201.6534307497, 4619029.662325286]
[3, 4, 'grass', 468214.85800508264, 4608688.669949174]
[4, 5, 'shrubs', 456713.1419949174, 4617974.459021601]
[5, 6, 'trees', 472330.15088945365, 4619873.824968234]
[6, 7, 'bare', 456396.58100381197, 4627576.8090851335]
>>>
Pytanie: czy jest to błąd biblioteki, czy ja wykorzystuję ją
nieprawidłowo (np. składnia SQL)?
Będę wdzięczny za podpowiedzi!
Pozdrawiam,
Wojtek
Thread Navigation
This is a paginated view of messages in the thread with full content displayed inline.
Messages are displayed in chronological order, with the original post highlighted in green.
Use pagination controls to navigate through all messages in large threads.
Back to All Threads