CreateService(MgServiceType::FeatureService); $renderingSrvc = $siteConnection->CreateService(MgServiceType::RenderingService); //load the map runtime state $map = new MgMap(); $map->Open($resourceService, $mapName); //object to hold response $result = NULL; $result->hasSelection = false; /*holds selection array*/ $properties = NULL; $properties->layers = array(); $layers = explode(",", $layers); if (count($layers) > 0) { $layerNames = new MgStringCollection(); for ($i = 0; $i < count($layers); $i++) { $layerNames->Add($layers[$i]); } // create a multi-polygon or a multi-geometry containing the input selected features $inputGeom = MultiGeometryFromSelection($featureSrvc, $resourceService, $map, $mapName); if ($inputGeom) { // Query all the features belonging the the layer list that intersects with the input geometries $fi = $renderingSrvc->QueryFeatures($map, $layerNames, $inputGeom, MgFeatureSpatialOperations::Intersects, -1); if ($fi) { $resultSel = $fi->GetSelection(); if( $resultSel) { $resultSel->Save($resourceService, $mapName); //this needs to be re-opened for some reason $resultSel = new MgSelection($map); $resultSel->Open($resourceService, $mapName); $layers = $resultSel->GetLayers(); if ($layers && $layers->GetCount() >= 0) { $result->hasSelection = true; //set the extents for the selection object $oExtents = $resultSel->GetExtents($featureSrvc); if ($oExtents) { $oMin = $oExtents->GetLowerLeftCoordinate(); $oMax = $oExtents->GetUpperRightCoordinate(); $result->extents = NULL; $result->extents->minx = $oMin->GetX(); $result->extents->miny = $oMin->GetY(); $result->extents->maxx = $oMax->GetX(); $result->extents->maxy = $oMax->GetY(); /*keep the full extents of the selection when saving the selection in the session*/ $properties->extents = NULL; $properties->extents->minx = $oMin->GetX(); $properties->extents->miny = $oMin->GetY(); $properties->extents->maxx = $oMax->GetX(); $properties->extents->maxy = $oMax->GetY(); } //get properties for individual features $result->layers = array(); for ($i=0; $i<$layers->GetCount(); $i++) { $layer = $layers->GetItem($i); $layerName = $layer->GetName(); $layerClassName = $layer->GetFeatureClassName(); $options = new MgFeatureQueryOptions(); $options->SetFilter($resultSel->GenerateFilter($layer, $layerClassName)); $resourceId = new MgResourceIdentifier($layer->GetFeatureSourceId()); $featureReader = $featureSrvc->SelectFeatures($resourceId, $layerClassName, $options); $properties = BuildSelectionArray($featureReader, $layerName, $properties, false, NULL, false, $layer); array_push($result->layers, $layerName); array_push($properties->layers, $layerName); $count = $resultSel->GetSelectedFeaturesCount($layer, $layerClassName); $result->$layerName->featureCount = $count; } /*save selection in the session*/ $_SESSION['selection_array'] = $properties; } } } } } header('Content-type: text/x-json'); header('X-JSON: true'); echo var2json($result); } catch(MgException $e) { echo "\nException: " . $e->GetDetails(); return; } catch(Exception $ne) { return; } function MultiGeometryFromSelection($featureSrvc, $resourceSrvc, $map, $mapName) { $sel = new MgSelection($map); $sel->Open($resourceSrvc, $mapName); $selLayers = $sel->GetLayers(); $geomColl = new MgGeometryCollection(); $agfRW = new MgAgfReaderWriter(); $polyOnly = true; for($i = 0; $i < $selLayers->GetCount(); $i++) { $layer = $selLayers->GetItem($i); $filter = $sel->GenerateFilter($layer, $layer->GetFeatureClassName()); $query = new MgFeatureQueryOptions(); $query->SetFilter($filter); $featureSource = new MgResourceIdentifier($layer->GetFeatureSourceId()); $features = $featureSrvc->SelectFeatures($featureSource, $layer->GetFeatureClassName(), $query); if($features) { $classDef = $features->GetClassDefinition(); $geomPropName = $classDef->GetDefaultGeometryPropertyName(); $j = 0; $isPoly = true; while($features->ReadNext()) { $geomReader = $features->GetGeometry($geomPropName); $geom = $agfRW->Read($geomReader); if($j ++ == 0) { $type = $geom->GetGeometryType(); if($type == MgGeometryType::MultiPolygon || $type == MgGeometryType::CurvePolygon || $type == MgGeometryType::MultiCurvePolygon) { $isPoly = false; $polyOnly = false; } else if($type != MgGeometryType::Polygon) break; } $geomColl->Add($geom); } $features->Close(); } } if($geomColl->GetCount() == 0) return null; $gf = new MgGeometryFactory(); if($polyOnly) { $polyColl = new MgPolygonCollection(); for($i = 0; $i < $geomColl->GetCount(); $i++) $polyColl->Add($geomColl->GetItem($i)); return $gf->CreateMultiPolygon($polyColl); } else return $gf->CreateMultiGeometry($geomColl); } function GetParameters($params) { global $layers, $mapName, $sessionId, $queryInfo; $mapName = $params['mapname']; $sessionId = $params['session']; $layers = $params['layers']; if(isset($params['queryinfo'])) $queryInfo = $params['queryinfo'] == "1"; } function GetRequestParameters() { if($_SERVER['REQUEST_METHOD'] == "POST") GetParameters($_POST); else GetParameters($_GET); } ?>