Complex query on Shapefiles attributes
Peter H.M. Jacobs
peter.jacobs at vs42.nl
Fri Feb 18 08:57:32 PST 2000
Hello Brian,
what you want is to my opinion exactly the same question as I posed a couple
of days ago. The only difference is that I want to highlite just one street
and you want to highlite several polygons. This makes it a bit more
difficult.
My question and answer were the following:
This is the case:
A user enters the name of a streetin a textbox. I query the street in the
following layer with an item/value itemquery and send the result back to
mapserv to create a map with the street in te center of the new map. Finally
I want to mark that street. I thought to do this with these two layers.
LAYER
NAME QueryLayer18Text # Straatnamen doorlopende wegen
TYPE ANNOTATION
STATUS QUERYONLY
DATA Layer18Text
QUERYITEM "TEXTSTRING"
QUERY
TEMPLATE
"http://../?map=/sites/../delft.map&mode=browse&scale=3000&mapxy=[shpmid]&va
lue=[value]"
END
END
LAYER
NAME Layer18Text # Straatnamen doorlopende wegen
TYPE ANNOTATION
STATUS DEFAULT
DATA Layer18Text
MAXSCALE 12000
LABELITEM "TEXTSTRING"
LABELANGLEITEM "TEXT_ANGLE"
LABELSIZEITEM "TEXT_SIZE"
CLASSITEM "TEXTSTRING"
CLASS
NAME SELECTED
EXPRESSION ([TEXTSTRING] eq [value])
SYMBOL 0
COLOR 0 0 0
LABEL
ANTIALIAS
COLOR 0 0 0
FONT arial
TYPE TRUETYPE
SIZE 20
POSITION UR
END
END
CLASS
NAME NOTSELECTED
EXPRESSION /./ #the rest
...
END
END
This was the reaction I recieved from Stephen.
Peter and all... At issue here is making queries persistant. An interesting
problem. The current version allows you to tackle the problem 2 ways:
1) save the item and value as hidden variables
and use mode=itemquery with a query map
This works but is difficult to use. It actually pretty easy but is not well
documented and lightly tested.
2. use the [shpmidx] and [shpmidy] to define an
inline feature in the query object TEMPLATE
url for the 1st (item/value). Then save that
feature (and text if necessary) using hidden
vars in the main pan/zoom template.
To do this your template after the item/value query would contain something
like this:
...map_streetmarker_feature_points=[shpmidx]+[shpmidy]&map_streetmarker_feat
ure_text=some text that is escaped...
This assumes you have a layer called "streetmarker" at the end of your
mapfile (so it'll be drawn and labeled for sure).
Again, this method works and I do have examples where a point is added to
the map in this manner. Problem is that it is really hard to use with more
than one feature. You can use javascript but it ain't easy. In Peters case I
believe this is the
best method.
It ain't perfect. Know, before everyone goes "well, that sucks" I believe I
have a solution to this problem, at least in part. Version 3.3.008 will
allow you to save/load query results so they can be made persistant. For
example, in Peters case the itemvalue query could be saved and the name of
the saved query could be passed to the map generation call for the
mapserver. Instead of simply drawing the map normally, the def for querymap
would be used and the matching road might show up in yellow. It's still in
development but it looks promising.
---
Because you, Brian, want to create a map with several spots highlited, I
think you have to use the querymap. I found some help about the use of the
querymap in one of the articles posted by Ken Boss (december 1999)
I'm sorry I can't give you the solution, but perhaps this will help
Regards,
Peter
More information about the MapServer-users
mailing list