"; /* selection variant if set */ $variant = 'intersects'; if (isset($_REQUEST['variant'])) { if (strcasecmp($_REQUEST['variant'],'contains') == 0) { $variant = 'contains'; } else if (strcasecmp($_REQUEST['variant'],'inside') == 0) { $variant = 'inside'; } } /* a filter expression to apply, in the form of an MapServer expression statement */ $filter = isset($_REQUEST['filter']) ? html_entity_decode(urldecode( $_REQUEST['filter'])) : false; $filterItem = isset($_REQUEST['filterItem']) ? html_entity_decode(urldecode( $_REQUEST['filterItem'])) : false; //echo "\n"; /* a spatial filter in the form on a WKT geometry */ $spatialFilter = (isset($_REQUEST['spatialfilter']) && $_REQUEST['spatialfilter'] != '') ? urldecode($_REQUEST['spatialfilter']) : false; //echo "spatial filter is $spatialFilter
"; if (!isset($mapName)) { die('mapname not set'); } if (isset($_SESSION['maps']) && isset($_SESSION['maps'][$mapName])) { $oMap = ms_newMapObj($_SESSION['maps'][$mapName]); } //extension of query template changed as of v5.2.2 $msVersion = ms_GetVersion(); //MapServer version 5.0.2 OUTPUT=GIF OUTPUT=PNG OUTPUT=JPEG OUTPUT=WBMP OUTPUT=PDF OUTPUT=SWF OUTPUT=SVG SUPPORTS=PROJ SUPPORTS=AGG SUPPORTS=FREETYPE SUPPORTS=WMS_SERVER SUPPORTS=WMS_CLIENT SUPPORTS=WFS_SERVER SUPPORTS=WFS_CLIENT SUPPORTS=WCS_SERVER SUPPORTS=SOS_SERVER SUPPORTS=FASTCGI SUPPORTS=THREADS SUPPORTS=GEOS INPUT=JPEG INPUT=POSTGIS INPUT=OGR INPUT=GDAL INPUT=SHAPEFILE $versArray = explode(" ",$msVersion); $versNumber = $versArray[2]; $versParts = explode(".", $versNumber); $queryTemplate = "query.qy"; //convert to an integer value to make the comparison easier $versValue = $versParts[0]*100 + $versParts[1]*10 + $versParts[2]; if ($versValue >= 522) { $queryTemplate = "query.qy"; } /* add the spatial filter if provided. It is expected to come as a WKT string, so we need to convert it to a shape */ if ($spatialFilter !== false ) { $oSpatialFilter = ms_shapeObjFromWkt($spatialFilter); } /* if extending the current selection */ $bExtendSelection = isset($_REQUEST['extendselection']) && strcasecmp($_REQUEST['extendselection'], 'true') == 0; if ($bExtendSelection) { //TODO figure out how to load an existing selection here $oMap->loadquery(getSessionSavePath()."query.qy"); } $bComputedProperties = isset($_REQUEST['computed']) && strcasecmp($_REQUEST['computed'], 'true') == 0; $bAllLayers = false; $nLayers = count($layers); $nSelections = 0; $result = NULL; $result->hasSelection = false; $result->layers = array(); /* ==================================================================== */ /* Get the list of raster layers that are on. We will use it */ /* when doing raster query. Turn them off here. Return them on */ /* before the raster query. bug #73 */ /* ==================================================================== */ $aRasterLayerIndiceOn = array(); $aRasterLayerIndiceDefault = array(); for ($i=0; $i<$oMap->numlayers; $i++) { $oLayer = $oMap->GetLayer($i); if($oLayer->type == MS_LAYER_RASTER) { if ($oLayer->status == MS_ON) array_push($aRasterLayerIndiceOn, $i); else if ($oLayer->status == MS_DEFAULT) array_push($aRasterLayerIndiceDefault, $i); $oLayer->set("status", MS_OFF); } } if ($nLayers == 0) { $nLayers = $oMap->numlayers; $bAllLayers = true; if ($spatialFilter !== false ) { if (@$oMap->queryByShape($oSpatialFilter) == MS_SUCCESS) { $result->hasSelection = true; } } } else { for ($i=0; $i<$nLayers; $i++) { if (!$bAllLayers) { $oLayer = $oMap->GetLayerByName($layers[$i]); } else { $oLayer = $oMap->GetLayer($i); } $oLayer->set('tolerance', 0); if ($oLayer->type == MS_LAYER_RASTER || $oLayer->type == MS_LAYER_QUERY || $oLayer->type == MS_LAYER_CIRCLE || $oLayer->type == MS_LAYER_CHART) { continue; } if ($spatialFilter !== false ) { if (@$oLayer->queryByShape($oSpatialFilter) == MS_SUCCESS) { $result->hasSelection = true; $layerName = $oLayer->name; array_push($result->layers, $layerName); $result->$layerName->featureCount = $oLayer->getNumResults(); //TODO: dump out the extents of the selection } } if ($filter !== false ) { if ($oLayer->connectiontype == MS_POSTGIS && $filterItem != '') { $f = $filter; $filter = $filterItem . ' IN (' . $filter . ')'; } if (@$oLayer->queryByAttributes($filterItem,$filter,MS_MULTIPLE) == MS_SUCCESS) { //if (@$oLayer->queryByAttributes($filterItem,'([REG_CODE] eq 61)',MS_MULTIPLE) == MS_SUCCESS) { //if (@$oLayer->queryByAttributes('NAME_E','/.*Buffalo.*/gi',MS_MULTIPLE) == MS_SUCCESS) { $result->hasSelection = true; $layerName = $oLayer->name; array_push($result->layers, $layerName); $result->$layerName->featureCount = $oLayer->getNumResults(); //TODO: dump out the extents of the selection } if ($oLayer->connectiontype == MS_POSTGIS && $filterItem != '') { $filter = $f; } } if ($bExtendSelection) { } else { } } } if ($bExtendSelection) { } /************************************************************************/ /* Save the query file here before doing any raster queries */ /************************************************************************/ if ($result->hasSelection) { $oMap->savequery(getSessionSavePath()."query.qy"); $result->queryFile = getSessionSavePath()."query.qy"; } /* ==================================================================== */ /* resttoe raster layer status #73 */ /* ==================================================================== */ for ($i=0; $igetlayer($aRasterLayerIndiceOn[$i]); $oLayer->set("status", MS_ON); } for ($i=0; $igetlayer($aRasterLayerIndiceDefault[$i]); $oLayer->set("status", MS_DEFAULT); } /*raster query: limit the result to 100 if it is not already set in the map file*/ for ($i=0; $i<$nLayers; $i++) { if (!$bAllLayers) { $oLayer = $oMap->GetLayerByName($layers[$i]); } else { $oLayer = $oMap->GetLayer($i); } $oLayer->set('tolerance', 0); if ($oLayer->type != MS_LAYER_RASTER) { continue; } $aProcessings = $oLayer->getprocessing(); $nCount = count($aProcessings); $bRasterMaxSet = 0; for ($j=0;$j<$nCount; $j++) { $aKeyVal = explode("=", $aProcessings[$j]); if (count($aKeyVal) == 2 && strcasecmp(trim($aKeyVal[0]), "RASTER_QUERY_MAX_RESULT") == 0) { $bRasterMaxSet = 1; break; } } if (!$bRasterMaxSet) { $oLayer->setprocessing("RASTER_QUERY_MAX_RESULT=100"); } /*are we doing a point query? In that case maxfeatures was set to 1*/ /*this is not ideal but It is better to use querybypoint when we do point query and a query by shape when we do other type of queries*/ if (isset($_REQUEST['maxfeatures']) && $_REQUEST['maxfeatures'] == '1') { $oCenterPoint = ms_newpointobj(); $oPoint = $oSpatialFilter->getCentroid(); $status = @$oLayer->queryByPoint($oPoint, MS_SINGLE, -1); } else { $status = @$oLayer->queryByShape($oSpatialFilter); } if ($status == MS_SUCCESS) { $result->hasSelection = true; $layerName = $oLayer->name; array_push($result->layers, $layerName); $result->$layerName->featureCount = $oLayer->getNumResults(); //TODO: dump out the extents of the selection } if ($bExtendSelection) { } else { } } if ($result->hasSelection) { /*holds selection array*/ $properties = NULL; $properties->layers = array(); $totalminx = 0; $totalminy = 0; $totalmaxx = 0; $totalmaxy = 0; $bFirstElement = 1; $nLayers = $oMap->numlayers; for ($i=0; $i<$nLayers; $i++) { $oLayer = $oMap->GetLayer($i); $numResults = $oLayer->getNumResults(); if ($numResults == 0){ continue; } $oLayer->open(); $layerName = $oLayer->name != "" ? $oLayer->name : "Layer_".$i; array_push($properties->layers, $layerName); $properties->$layerName->numelements = $numResults; $properties->$layerName->propertynames = array(); $properties->$layerName->propertyvalues = array(); $properties->$layerName->propertytypes = array(); $properties->$layerName->values = array(); $aQueryItems = array(); $properties->$layerName->metadatanames= array(); array_push($properties->$layerName->metadatanames, 'dimension'); array_push($properties->$layerName->metadatanames, 'bbox'); array_push($properties->$layerName->metadatanames, 'center'); array_push($properties->$layerName->metadatanames, 'area'); array_push($properties->$layerName->metadatanames, 'length'); /*get first shape to get the attributes*/ $oRes = $oLayer->getResult(0); $oShape = $oLayer->getShape($oRes->tileindex,$oRes->shapeindex); $selFields = array(); if (isset($_SESSION[$mapName][$layerName]['query_items'])) { $aQueryItems = $_SESSION[$mapName][$layerName]['query_items']; } else { //token separator (for parsing displayed attributes on a query) $tokenSeparator = ","; // checking if metadata "query_include_items" is set $metadataItems = $oLayer->getMetaData('query_include_items'); if ( ($metadataItems == "") || ($metadataItems == "all") ) { while ( list($key,$val) = each($oShape->values) ) { $aQueryItems[$key] = NULL; } } else { $token = strtok($metadataItems, $tokenSeparator); while ($token !== false) { $aQueryItems[trim($token)] = NULL; $token = strtok($tokenSeparator); } } // checking if metadata "query_exclude_items" is set $metadataItems = $oLayer->getMetaData('query_exclude_items'); if ($metadataItems != "") { $token = strtok($metadataItems, $tokenSeparator); while ($token !== false) { if (array_key_exists($token, $aQueryItems)) { unset($aQueryItems[$token]); } $token = strtok($tokenSeparator); } } // get all alias while ( list($key,$val) = each($aQueryItems) ) { $keyAlias = $oLayer->getMetaData("query_".$key."_alias"); trim($keyAlias); if ($keyAlias != "") { $aQueryItems[$key] = $keyAlias; } } $_SESSION[$mapName][$layerName]['query_items'] = $aQueryItems; } $oShape = $oLayer->getShape($oRes->tileindex,$oRes->shapeindex); while ( list($key,$val) = each($oShape->values) ) { if (array_key_exists($key, $aQueryItems)) { array_push($selFields, $key); //we check if an alias if provided if (isset($aQueryItems[$key]) && ($aQueryItems[$key] != "")){ $key = $aQueryItems[$key]; } array_push($properties->$layerName->propertynames, $key); //TODO : we should define away to give alias to field names array_push($properties->$layerName->propertyvalues, $key); //TODO we do not know the types of the attributes in MS. Just output 0 //we shouls possibly use OGR to get the attributes array_push($properties->$layerName->propertytypes, 0); } } for ($iRes=0; $iRes < $numResults; $iRes++) { $properties->$layerName->values[$iRes] = array(); $properties->$layerName->metadata[$iRes] = array(); $oRes = $oLayer->getResult($iRes); $oShape = $oLayer->getShape($oRes->tileindex,$oRes->shapeindex); //TODO : area, length and distance are not set $minx = $oShape->bounds->minx; $miny = $oShape->bounds->miny; $maxx = $oShape->bounds->maxx; $maxy = $oShape->bounds->maxy; if ($bFirstElement) { $bFirstElement = 0; $totalminx = $minx; $totalminy = $miny; $totalmaxx = $maxx; $totalmaxy = $maxy; } else { if ($totalminx > $minx) { $totalminx = $minx; } if ($totalminy > $miny) { $totalminy = $miny; } if ($totalmaxx < $maxx) { $totalmaxx = $maxx; } if ($totalmaxy < $maxy) { $totalmaxy = $maxy; } } //metadata : TODO dimension, area, length and distance are not set $dimension = 0; $center = 0; $area = 0; $length = 0; $bbox = $minx.','.$miny.','.$maxx.','.$maxy; array_push($properties->$layerName->metadata[$iRes], $dimension); array_push($properties->$layerName->metadata[$iRes], $bbox); array_push($properties->$layerName->metadata[$iRes], $center); array_push($properties->$layerName->metadata[$iRes], $area); array_push($properties->$layerName->metadata[$iRes], $length); //field values for($iField=0; $iField < count($selFields); $iField++) { $value = $oShape->values[$selFields[$iField]]; //$value = preg_replace( "/\r?\n/", "
", $value ); $value = str_replace("'", "\'", $value); array_push($properties->$layerName->values[$iRes], $value); } } $oLayer->close(); } //extents $properties->extents = NULL; $properties->extents->minx = $totalminx; $properties->extents->miny = $totalminy; $properties->extents->maxx = $totalmaxx; $properties->extents->maxy = $totalmaxy; /*save selection in the session*/ $_SESSION['selection_array'] = $properties; } echo var2json($result); ?>