[mapserver-users] itemfeaturequery & qstring
Ted Spradley
tspradley at snoogems.com
Sat Nov 21 12:12:30 PST 2009
Hi all,
I apologize in advance for maybe supplying too much detail. I have
highlighted my questions to try to make this post faster to look through.
I am using mode=itemfeaturequery to locate a polygon by column 'objectid' in
'slayer=parcels', then searching 'qlayer=parcels_01' which is identical to
layer 'parcels' to find all of the parcels within TOLERANCE 500,
TOLERANCEUNITS FEET.
Questions here and then in context:
1: Why doesn't changing the TOLERANCE in layer 'parcels_01' change the
number of parcels returned?
2: What is the difference between my scenario and the Test Suite? Besides
attempting to use TOLERANCE > 0? And the use of FILTER? And the Test Suite
layer being a shapefile and mine being a spatial DB? :-)
CGI control 'qstring' appears to pass a string to be used in the WHERE
clause of the SQL query correct?
As always, many, many thanks in advance,
Ted S.
I have encountered two obstacles:
1. My understanding of TOLERANCE and TOLERANCEUNITS - The returned results
are not as expected. Using units FEET, the returned/mapped records are
identical as long as the value of TOLERANCE is > 0.
Here is the url query:
http://url.com/cgi-bin/mapserv?
qstring=objectid+%3D+1019608 (qstring=objectid = 1019608) ** this is the
subject of 2nd question
&map=/path/to/cad.map
&mode=itemfeaturequery
&slayer=parcels
&qitem=objectid
&qlayer=parcels_01
&qformat=selected_parcel
&mapext=shape
&layers=all
Here are map and layer definitions for 'parcels' and 'parcels_01'
MAP
NAME "CAD"
SIZE 800 800
EXTENT -125 24 -65 50
UNITS DD # modifying map units changes the number of records returned
IMAGECOLOR 100 100 255
PROJECTION
"init=epsg:4326"
END
QUERYMAP
STATUS ON
STYLE hilite
COLOR 212 212 212
END
OUTPUTFORMAT
NAME 'selected_parcel'
DRIVER 'TEMPLATE'
MIMETYPE 'text/html'
FORMATOPTION 'FILE=selected_parcel.tmpl'
END
SCALEBAR
STATUS embed
INTERVALS 5
ALIGN left
POSITION lr
SIZE 600 8
UNITS feet
COLOR 0 0 0
BACKGROUNDCOLOR 212 212 212
END # End Scalebar
LAYER
NAME 'parcels'
TYPE POLYGON
STATUS DEFAULT
DEBUG 3
TEMPLATE 'dummy'
DUMP TRUE
MAXSCALEDENOM 7000
CONNECTIONTYPE POSTGIS
CONNECTION "dbname=cad1 user=user password=pw host=localhost port=5432"
DATA "the_geom from parcels using unique gid using srid=-1"
LABELITEM "owner_name"
PROCESSING 'LABEL_NO_CLIP=1'
# TOLERANCEUNITS feet (these two parameters appear to not have any
effect in this layer)
# TOLERANCE 500
CLASS
STYLE
WIDTH 1
OUTLINECOLOR 0 255 0
END
LABEL
COLOR 0 0 0
TYPE TRUETYPE
FONT ARIAL
SIZE 10
BUFFER 5
MINFEATURESIZE 20
POSITION AUTO
ANGLE AUTO
END
END # End class
PROJECTION
"init=epsg:2278"
END
METADATA
"wms_title" "County Property Parcels"
"wfs_title" "County Property Parcels"
"wms_srs" "epsg:2278"
"gml_include_items" "all"
"gml_featureid" "ogc_fid" ## REQUIRED
"qstring_validation_pattern" '.'
END
END # End layer 'parcels'
LAYER
NAME 'parcels_01'
TYPE POLYGON
STATUS ON
DEBUG 3
TEMPLATE 'dummy'
DUMP TRUE
MAXSCALEDENOM 7000
CONNECTIONTYPE POSTGIS
CONNECTION "dbname=cad1 user=user password=pw host=localhost port=5432"
DATA "the_geom from parcels using unique gid using srid=-1"
LABELITEM "owner_name"
PROCESSING 'LABEL_NO_CLIP=1'
TOLERANCEUNITS feet
TOLERANCE 1500 # The same records are returned whether this is 500 or
1500
CLASS
STYLE
WIDTH 2
COLOR 139 136 120
OUTLINECOLOR 212 212 212
END
LABEL
COLOR 0 0 0
TYPE TRUETYPE
FONT ARIAL
SIZE 10
MINFEATURESIZE 20
POSITION AUTO
ANGLE AUTO
END
END # End class
PROJECTION
"init=epsg:2278"
END
METADATA
"wms_title" "County Property Parcels Comparison Layer"
"wfs_title" "County Property Parcels Comparison Layer"
"wms_srs" "epsg:2278"
"gml_include_items" "all"
"gml_featureid" "ogc_fid" ## REQUIRED
"qstring_validation_pattern" '.'
END
END # End layer 'parcels_01'
*******************************************************************************
To summarize question 1: Why doesn't changing the TOLERANCE in layer
'parcels_01' change the number of parcels returned?
*******************************************************************************
2. My understanding of qstring -
My qstring and related qitem in the above url is:
qstring=objectid+%3D+1019608 (qstring=objectid = 1019608)
&qitem=objectid
My intuition is that it should be 'qstring=1019608' and 'qitem=objectid' -
by looking at the test suite example (modified to work with MS 5.4.1) of
mode=itemfeaturequery, there is a html select object with the name of
'qstring' and it's only values are the names of the counties.
The url query from the case3 is:
http://url.com/cgi-bin/mapserv?
mapserv=/Fcgi-bin/Fmapserv
&map=/path/to/case3.map
&imagepath=/path/to/temp/
&imageurl=/temp/
&mode=itemfeaturequery
&slayer=county
&qitem=cty_name
&qlayer=usgs100k
&qformat=selected_county
&qstring=Aitkin
The map file from case 3:
MAP
NAME case3
SHAPEPATH ../data
SIZE 300 300
EXTENT 74000 4775000 798000 5499000
UNITS meters
IMAGETYPE PNG24
OUTPUTFORMAT
NAME 'selected_county'
DRIVER 'TEMPLATE'
MIMETYPE 'text/html'
FORMATOPTION 'FILE=selected_county.tmpl'
END
WEB
IMAGEPATH "/path/to/httpdocs/temp/"
IMAGEURL "/temp/"
HEADER case3_header.html
FOOTER case3_footer.html
END
QUERYMAP
STATUS ON
STYLE SELECTED
COLOR 255 255 0
END
SCALEBAR
STATUS ON
INTERVALS 3
STYLE 1
SIZE 200 4
COLOR 212 212 212
LABEL
SIZE TINY
COLOR 0 0 0
END
END
LAYER
NAME county
DATA county
STATUS DEFAULT
TYPE POLYGON
FILTERITEM cty_name
FILTER "%name%"
CLASS
TEMPLATE 'dummy'
COLOR 255 255 0
OUTLINECOLOR 0 0 0
END
# Necessary for queries using qstring
METADATA
"qstring_validation_pattern" '.'
END
END
LAYER
NAME usgs100k
DATA usgs100k
STATUS DEFAULT
TYPE POLYGON
CLASS
TEMPLATE 'dummy'
OUTLINECOLOR 255 0 0
END
TOLERANCE 0
# Necessary for queries using qstring
METADATA
"qstring_validation_pattern" '.'
END
END
END
**************************************************************************
Here is the heart of my misunderstanding: Does MS combine qstring & qitem
in the query to make 'AND qstring=Aitkin'? Why doesn't MS complain about
that?
To summarize question 2: What is the difference between my scenario and the
Test Suite? Besides attempting to use TOLERANCE > 0? And the use of
FILTER? And the Test Suite layer being a shapefile and mine being a spatial
DB? :-)
CGI control 'qstring' appears to pass a string to be used in the WHERE
clause of the SQL query correct?
****************************************************************************
If I change my url to correspond to the case of the test suite, it is:
http://url.com/cgi-bin/mapserv?qstring=1019608
&map=/path/to/cad.map
&mode=itemfeaturequery
&slayer=parcels
&qitem=objectid
&qlayer=parcels_01
&qformat=selected_parcel
&mapext=shape
&layers=all
And MS complains:
msPostGISLayerWhichShapes(): Query error. Error (ERROR: argument of AND must
be type boolean, not type integer LINE 1: ...0875,-6675211.21357807
11727570.9530875))',-1) and (1019608) ^ ) executing query: select
"objectid",encode(AsBinary(force_collection(force_2d("the_geom")),'NDR'),'base64')
as geom,"gid" from parcels where the_geom &&
GeomFromText('POLYGON((-6675211.21357807 11727570.9530875,-6675211.21357807
22614794.4837544,13205599.111978 22614794.4837544,13205599.111978
11727570.9530875,-6675211.21357807 11727570.9530875))',-1) and (1019608)
Which is obvious: PostGIS wants the end of the query to be:
'AND objectid = 1019608'
which when changed behaves as expected, returning one record with the
parcel's info from table 'parcels'.
--
View this message in context: http://n2.nabble.com/itemfeaturequery-qstring-tp4043863p4043863.html
Sent from the Mapserver - User mailing list archive at Nabble.com.
More information about the MapServer-users
mailing list