type != MS_SHAPE_POLYGON and $shape_buffer == 0) { $shape_buffer = $shape_buffer + 0.0001; } $drawnSelection = $selectShape->buffer($shape_buffer); 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(); 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; $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(); 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($drawnSelection); $query_shapefile->addShape($queryShape); $query_shapefile->addShape($originalselect); $query_shapefile->free(); # create record to differentiate the different forms of # selection results dbase_create($selectShapeFilename.'.dbf', array(array("AREA", "C", 10))); $query_dbase = dbase_open($selectShapeFilename.'.dbf', 2); dbase_add_record($query_dbase, array("DRAWN")); dbase_add_record($query_dbase, array("QUERY")); dbase_close($query_dbase); # 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; } ?>