[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/