Querying¶
- Author:
Sean Gillies
- Author:
Seth Girvin
- Contact:
sethg at geographika.co.uk
- Last Updated:
2021-05-22
Introduction¶
The MapScript HowTo docs are intended to complement the API reference with
examples of usage for specific subjects. All examples in this document refer
to the Mapfile and testing layers distributed with MapServer and found in source control
under Mapserver/tests
.
The examples below are written in Python. All MapScript languages use the same API, but will need to be rewritten using the relevant language’s syntax. Querying Overview
The Query Result Set¶
Map layers can be queried to select features using spatial query methods or the attribute query method. Ignoring for the moment whether we are executing a spatial or attribute query, results are obtained like so:
# for any query to be successful it needs to have a template
# set - any value here will do
if not layer.template:
layer_obj.template = "ttt"
layer.query() # not an actual method!
results = layer.getResults()
In the case of a failed query or query with zero results, layerObj.getResults()
returns NULL.
Result Set Members¶
Individual members of the query results are obtained like:
if results:
for i in range(results.numresults): # iterate over results
result = results.getResult(i)
This mapscript.resultObj
is a handle, of sorts, for a feature of the layer,
having resultObj.shapeindex
and resultObj.tileindex
attributes that can be used as
arguments to layerObj.getShape()
.
Resulting Features¶
The previous example code can now be extended to the case of obtaining all queried features:
layer.template = "FAKE"
layer.queryByAttributes(test_map, "FID", '"1"', mapscript.MS_MULTIPLE)
results = layer.getResults()
if results:
# open layer in preparation of reading shapes
layer.open()
for i in range(results.numresults):
result = results.getResult(i)
shape = layer.getShape(result)
# get the value of the attribute at index 1
print(shape.getValue(1))
# close when done
layer.close()
Attribute Queries¶
By Attributes¶
Use layerObj.queryByAttributes()
for querying by attribute. Note attributes
are strings.
# select by feature Id
layer.queryByAttributes(test_map, "FID", "1", mapscript.MS_MULTIPLE)
# select by a string attribute, returning a single result
layer.queryByAttributes(test_map, "FNAME", "A Polygon", mapscript.MS_SINGLE)
Spatial Queries¶
By Rectangle¶
Use layerObj.queryByRect()
for querying using a bounding-box. MS_MULTIPLE
is set
by default.
qrect = mapscript.rectObj(-10.0, 45.0, 10.0, 55.0)
layer.queryByRect(test_map, qrect)
By Point¶
Use layerObj.queryByPoint()
for querying using a point. The point can also be
buffered.
qpoint = mapscript.pointObj(0.0, 51.5)
layer.queryByPoint(test_map, qpoint, mapscript.MS_MULTIPLE, 2.0)
By Shape¶
Use layerObj.queryByShape()
for querying using a shape.
qrect = mapscript.rectObj(-10.0, 45.0, 10.0, 55.0)
qshape = qrect.toPolygon()
self.layer.queryByShape(self.map, qshape)
By Selection¶
Use layerObj.queryByFeatures()
for querying using results from another layer.