[Date Prev][Date Next]
[Chronological]
[Thread]
[Top]
Re: [mapserver-users] Query by attributes with PHP/MapScript
On Wednesday, October 2, 2002, at 04:41 AM, Armin Burger wrote:
Hi all,
I would like to query shapefiles based on their attibutes using
PHP/MapScript, like
street='mainstreet' and city='newtown'
and then get back all records, including for instance the bounding box
of the shape.
There is the function QueryByAttributes, but as I saw in the mail
archives you have to set a filteritem and then a filter on the layer.
That can only use one field as filteritem. I would need 2 or even more
fields used in the query.
I was thinking about using basic PHP functions for dBase.
Unfortunately the dBase support of pure PHP seems to be very
rudimentary
and does not allow queries. There is the Pear DB module, but there is
no
documentation to what extent dBase files are supported.
hmmmm... does too. And it is not rudimentary at all... in fact, it is
only limited by the limits of the dbase format (which is a pretty poor
limit).
Here is a dbase function that will query whatever you want --
//{{{ getDbfRowid($dbf, $field, $arVals).
// Get dbf row_ids from a $dbf given an array of $arVals for a field
$field
//
function getDbfRowid($dbf, $field, $arVals) {
$db = dbase_open($dbf, 0); // open the dbase
file
$nr = dbase_numrecords($db); // get number of
records
$arResult = array(); // new array to
hold row_ids
for($i=1; $i <= $nr; $i++) { // loop from 1 to $nr
$temp = dbase_get_record($db, $i); // assign fields to
$ar_temp
foreach($arVals as $val) { // loop thru all the
$gis_keys
if(chop($temp[2]) == "$val") {
// create a hash of val and row_id
$hsResult = array("val" => $val, "row_id" => $i);
array_push($arResult, $hsResult); // now push the
hash into the array
}
}
}
dbase_close($db);
return $arResult; // return the array of hashes
} //}}}
This allows you to, for example, find the rows where field is "street"
and the matches you are looking for are "mainstreet", "divisionstreet",
"highstreet", etc. Use those row_ids as indexes for the shapefile to
zoom to the relevant features.
pk/