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; } ?>