buffer($shape_buffer)); } else { $queryMap = getMapfile($mapbook, $queryLayer); $layer = array_reverse(explode('/', $queryLayer)); $layer = $layer[0]; $shapeLayersToQuery = array(); # Open the layers. $map = ms_newMapObj($CONFIGURATION['root'].$queryMap); if($layer == 'all') { for($i = 0; $i < $map->numlayers; $i++) { array_push($shapeLayersToQuery, $map->getLayer($i)); } } else { array_push($shapeLayersToQuery, $map->getLayerByName($layer)); } if($selectShape->type != MS_SHAPE_POLYGON) { # Small buffer converts points and lines to polygons $selectShape = $selectShape->buffer(.01); } for($i = 0; $i < sizeof($shapeLayersToQuery); $i++) { $shapeLayersToQuery[$i]->set('template','dummy.html'); $shapeLayersToQuery[$i]->queryByShape($selectShape); $shapeLayersToQuery[$i]->open(); for($r = 0; $r < $shapeLayersToQuery[$i]->getNumResults(); $r++) { $result = $shapeLayersToQuery[$i]->getResult($r); array_push($queryShapes, $shapeLayersToQuery[$i]->getFeature($result->shapeIndex, $result->tileIndex)); } $shapeLayersToQuery[$i]->close(); } } $map = ms_newMapObj($CONFIGURATION['root'].$selectMap); $layersToQuery = array(); $shapesFound = array(); $layer = array_reverse(explode('/', $selectLayer)); $layer = $layer[0]; if($layer == 'all') { for($i = 0; $i < $map->numlayers; $i++) { array_push($layersToQuery, $map->getLayer($i)); } } else { array_push($layersToQuery, $map->getLayerByName($layer)); } # Build a massive shape $queryShape = array_pop($queryShapes); $queryShape = $queryShape->buffer($selection_buffer); foreach($queryShapes as $shape) { if($shape->type != MS_SHAPE_POLYGON and $selection_buffer == 0) { $shape = $shape->buffer(.0001); } $queryShape = $queryShape->union_geos($shape->buffer($selection_buffer)); } $foundShapes = array(); $attributes = false; $results = ''; for($i = 0; $i < $map->numlayers; $i++) { $layer = $map->getLayer($i); $layer->set('status', MS_OFF); # Turn off extraneous layers } foreach($layersToQuery as $layer) { $layer->set('template', $layer->getMetadata('select_record')); if($layer->getMetadata('select_header')) { $layer->set('header', $layer->getMetadata('select_header')); } if($layer->getMetadata('select_footer')) { $layer->set('footer', $layer->getMetadata('select_footer')); } $layer->set('status', MS_DEFAULT); $map->queryByShape($queryShape); $results = $results . $map->processquerytemplate(array(), false); $layer->open(); $attributes = $layer->getItems(); for($r = 0; $r < $layer->getNumResults(); $r++) { $result = $layer->getResult($r); array_push($foundShapes, $layer->getFeature($result->shapeindex, $result->tileindex)); #$sh = $lay->getFeature($res->shapeindex, $res->tileindex); } $layer->close(); } $fields = array(); foreach($attributes as $attribute) { # this is a hack in need of much fixing, but it actually kinda works because # "C" fields work like varchars, not fixed width character fields. array_push($fields, array($attribute, "C", 128)); } $uniqueId = 'select_'.getmypid().time(); $dbaseFilename = $tempDirectory.$uniqueId.'.dbf'; $shapeFilename = $tempDirectory.$uniqueId; # Create a Dbase File dbase_create($dbaseFilename, $fields); $dbase = dbase_open($dbaseFilename, 2); # Set up a few variables for substitution later $dict = array(); $dict['LAYER_TYPE'] = 'POLYGON'; $dict['UNIQUEID'] = $uniqueId; $dict['QUERYID'] = $uniqueId; $dict['SHAPEPATH'] = $tempDirectory; # Create the shapefile $shapeFileType = MS_SHP_POLYGON; if($foundShapes[0]->type == MS_SHAPE_POINT) { $shapeFileType = MS_SHP_POINT; $dict['LAYER_TYPE'] = 'POINT'; } $shapefile = ms_newShapefileObj($shapeFilename, $shapeFileType); foreach($foundShapes as $shape) { $recordArray = array(); foreach($attributes as $attribute) { array_push($recordArray, $shape->values[$attribute]); } dbase_add_record($dbase, $recordArray); $shapefile->addShape($shape); } $shapefile->free(); dbase_close($dbase); $selectShapeFilename = $tempDirectory.$uniqueId.'_selection'; $query_shapefile = ms_newShapefileObj($selectShapeFilename ,MS_SHP_POLYGON); $query_shapefile->addShape($queryShape); $query_shapefile->free(); # Create a dummy file. $f = fopen($selectShapeFilename.'.dbf', 'w'); fclose($f); # Process and output the template. # $results = $map->processquerytemplate(array(), false); # Form the mapfile. $mapfile = implode('', file($CONFIGURATION['highlight_map'])); $mapfile = processTemplate($mapfile, $dict); $mapfileOut = fopen($tempDirectory.'/'.$uniqueId.'.map', 'w+'); fwrite($mapfileOut, $mapfile); fclose($mapfileOut); # All that work for a dozen lines of output. header('Content-type: application/xml'); print ""; print ""; print "Found Shapes: '.sizeof($foundShapes).'
'; print "Query ID: " . $uniqueId.'
'; print processTemplate($results, $dict); print "]]>
"; function processTemplate($str, $dict) { foreach($dict as $k => $v) { $str = str_replace('['.$k.']', $v, $str); } return $str; } ?>