Multi-feature query
Mark Westenberger
mjw at STORM.CA
Fri Jan 12 07:09:23 PST 2007
Hello all. Brand new shiny user here and just got Mapserver running on
Fedora and have a query, er, query.
I have several shapefile layers, each of which may have multiple
features at the identical lat/lon. Each feature only has
an ID (or Key) as an attribute within the dbf while the remaining
attributes are maintained in other files. Upon a query,
all the features from a unique layer need to contribute their attributes
to a collective computation with the result of
that being presented to the browser. In essence, a "Venn diagram" of
their attributes.
So I've digested the Template issue in the Layer's Class, conceptually
seeking a capability to do something like:
TEMPLATE "http://mymachine/crunch_stuff.cgi?<key=[id1]>...<key=[idn]>
but see that the template doesn't
behave like that. After a bit of experimentation, I invented my own an
HTML tag and have things structured as per
the following extracts, which essentially is a Mapserver wrapper to do
that cgi above. The invented tag is only seen
momentarily by the wrapper. Each time the wrapper has collected a
command in SHELL_ESCAPE, it runs it, whose
purpose is to chew through the feature keys, collect attributes, crunch
them, and send HTML chatter back to the browser.
When complete, the command looks like: "./species.cgi key1 key2 key3
key4 key5 [etc]"
What I don't yet know is whether there exists a more elegant,
"Mapserver-ish" solution to this and seek suggestions.
Here are the extracts:
============my.map==============
<...snip>
LAYER
NAME Species
TYPE POINT
DATA species
STATUS ON
TOLERANCE 5 # 5 pixels
CLASS
<...snip...>
TEMPLATE "templates/species.html"
END
HEADER "templates/species_header.html"
FOOTER "templates/species_footer.html"
METADATA
<...snip...>
END
END
<...snip>
=====species_header.html with the invented "<?sh" tag ==========
<?sh species.cgi
============species.html===============
[SYMBOL_KEY]
============species_footer.html==========
?>
=============mapserv.cgi===========
#!/bin/sh
./mapserv | while read INPUT; do
# set a latch when we see the <?sh opening tag
if `echo "$INPUT" | grep -q "<?sh"`; then
BUILDING_SHELLCMD=y
fi
# collect feature "keys" one by one since they are NL delimited by Mapserver
if [ "$BUILDING_SHELLCMD" = "y" ]; then
SHELL_CMD="$SHELL_CMD $INPUT"
if `echo "$INPUT" | grep -q "?>"`; then
# we found the closing tag
BUILDING_SHELLCMD=n
# Now strip the command of those tags
SHELL_ESCAPE=`echo $SHELL_CMD | sed 's/<?sh \(.*\)?>/\1/'`
# and run ./$SHELL_ESCAPE"
./$SHELL_ESCAPE
# and reinit
SHELL_CMD=
fi
else
# Otherwise just dump output through to browser
echo $INPUT
fi
done
More information about the MapServer-users
mailing list