Python struct and mapscript saveQuery

Sean Gillies sgillies at FRII.COM
Wed Nov 17 22:42:16 EST 2004


On Nov 17, 2004, at 6:54 PM, Ryan, Adam wrote:

> Dear List,
>
> This is a picky little question concerning Python struct.pack and
> unpack
> methods, and mapscript saveQuery and loadQuery methods.
>
> I'm using Python Mapscript 4.4.0_beta2 on Windows XP and saving query
> files
> using map.saveQuery().  I subsequently manipulate the saved query file.
> When I read the shape, tile and class index values using
> struct.unpack, the
> only format that seems to work is "iib0i", which means two integers
> and a
> signed char aligned at the end to the requirements of three integers, I
> think.  The issue is the class index value.  Using "iii" or any other
> 12
> byte format gives me bad class index values.
>
> The byte order is not declared in my format string, so it defaults to
> native
> byte order, size and alignment.  Any declaration of byte order doesn't
> work
> with this format.
>
> Here's the snippet that reads the indexes:
>     ...
>     for r in range(nr):
>         tup = struct.unpack("iib0i",f.read(struct.calcsize("iib0i")))
>         print str(tup[0]) + "," + str(tup[1]) + "," + str(tup[2])
>     ...
>
> Can anyone tell me why I can't just use "iii"?  I can write query files
> using struct.pack("iii",... and mapserver will load them without a
> problem.
> Am I doing something wrong or is there something a little freaky in how
> mapserver writes class indexes out to file?
>
> Cheers,
>
> Adam
>

Adam, I can't reproduce your problem on Linux (i686) or with
windows 2000.  Am using Hobu's 4.4.0 beta 1 on the latter, but
there haven't been any recent changes.

Python 2.3.4 (#3, Oct  9 2004, 19:23:21)
[GCC 3.3.3 20040412 (Red Hat Linux 3.3.3-7)] on linux2
Type "help", "copyright", "credits" or "license" for more information.
 >>> import mapscript
 >>> import struct
 >>> m = mapscript.mapObj('projects/ms_43/mapserver/tests/test.map')
 >>> l = m.getLayerByName('POLYGON')
 >>> l.template = 'foo'
 >>> l.queryByPoint(m, mapscript.pointObj(0.0, 51.5), 1, 0.0)
 >>> r = l.getResults()
 >>> m.saveQuery('foo.q')
 >>> q = open('foo.q','r').read(12)
 >>> q
'\x01\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00'
 >>> struct.unpack("iii", q)
(1, 1, 1)

You're not by any chance saving the queries from another machine
are you?  In that case you'd have to explicitly deal with endian-ness.
See the end of this doc

   http://docs.python.org/lib/module-struct.html


Sean

--
Sean Gillies
sgillies at frii dot com
http://users.frii.com/sgillies



More information about the mapserver-users mailing list