type != MS_SHAPE_POLYGON and $shape_buffer == 0) {
$shape_buffer = $shape_buffer + 0.0001;
}
array_push($queryShapes, $selectShape->buffer($shape_buffer));
#} else {
if(isset($queryLayer) && $queryLayer != null) {
$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); # this should be the initial selection area.
#$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($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();
array_push($fields, 'wkt_geometry text');
foreach($attributes as $attribute) {
array_push($fields, $attribute.' text');
}
$uniqueId = 'select_'.getmypid().time();
$sqlFilename = $tempDirectory.'/'.$uniqueId.'.db';
# make a sqlite connection
try {
$sqlite = new PDO('sqlite:'.$sqlFilename);
} catch(Exception $e) {
echo "Failed to connect!
";
echo $sqlFilename."
";
echo $e->getMessage();
}
# create the featuers table
$sqlite->beginTransaction();
$sqlite->exec('create table features ('.implode(',', $fields).')');
$sqlite->commit();
# Set up a few variables for substitution later
$dict = array();
$dict['LAYER_TYPE'] = 'POLYGON';
$dict['UNIQUEID'] = $uniqueId;
$dict['QUERYID'] = $uniqueId;
$dict['SHAPEPATH'] = $tempDirectory;
$dict['SHAPE_WKT'] = $shape_wkt;
$dict['SELECT_LAYER'] = $selectLayer;
$dict['QUERY_LAYER'] = $queryLayer;
$dict['SHAPE_BUFFER'] = $shape_buffer;
$dict['SELECTION_BUFFER'] = $selection_buffer;
# 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();
array_push($recordArray, $shape->toWKT());
foreach($attributes as $attribute) {
array_push($recordArray, $shape->values[$attribute]);
}
$sqlite->beginTransaction();
$sqlite->exec("insert into features values ('".implode("','", $recordArray)."')");
$sqlite->commit();
}
$sqlite->beginTransaction();
$sqlite->exec('create table selection (wkt_geometry text, area text)');
$cursor = $sqlite->prepare("insert into selection values (?,?)");
$shape = ''; $shape_type = '';
$cursor->bindParam(1, $shape);
$cursor->bindParam(2, $shape_type);
$shape = $drawnShape->toWKT(); $shape_type = 'DRAWN';
$cursor->execute();
$shape = $queryShape->toWKT(); $shape_type = 'QUERY';
$cursor->execute();
$sqlite->commit();
# 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;
}
?>