<%@ Page Language="c#" %> <%@ Import Namespace="System" %> <%@ Import Namespace="System.Collections.Specialized" %> <%@ Import Namespace="System.IO" %> <%@ Import Namespace="OSGeo.MapGuide" %> Viewer Sample Application - Select Within Buffer

Select within buffer area

<% sessionId = Request.Params["SESSION"]; mapName = Request.Params["MAPNAME"]; String selectionXml = HttpUtility.UrlDecode(Request.Params["SELECTION"]); try { // Initialize the Web Extensions and connect to the Server using // the Web Extensions session identifier stored in PHP session state. MapGuideApi.MgInitializeWebTier (Constants.WebConfigPath); MgUserInformation userInfo = new MgUserInformation(sessionId); MgSiteConnection siteConnection = new MgSiteConnection(); siteConnection.Open(userInfo); MgResourceService resourceService = (MgResourceService)siteConnection.CreateService(MgServiceType.ResourceService); MgFeatureService featureService = (MgFeatureService)siteConnection.CreateService(MgServiceType.FeatureService); MgFeatureQueryOptions queryOptions = new MgFeatureQueryOptions(); MgMap map = new MgMap(siteConnection); map.Open(mapName); // Check for selection data passed via HTTP POST MgSelection selection = null; MgReadOnlyLayerCollection selectedLayers = null; if (!string.IsNullOrEmpty(selectionXml)) { selection = new MgSelection(map, selectionXml); selectedLayers = selection.GetLayers(); } if (selectedLayers != null) { int bufferRingSize = 500; // measured in metres // Set up some objects for coordinate conversion String mapWktSrs = map.GetMapSRS(); MgAgfReaderWriter agfReaderWriter = new MgAgfReaderWriter(); MgWktReaderWriter wktReaderWriter = new MgWktReaderWriter(); MgCoordinateSystemFactory coordinateSystemFactory = new MgCoordinateSystemFactory(); MgCoordinateSystem srs = coordinateSystemFactory.Create(mapWktSrs); MgMeasure srsMeasure = srs.GetMeasure(); // Check for a buffer layer. If it exists, delete // the current features. // If it does not exist, create a feature source and // a layer to hold the buffer. BufferHelper helper = new BufferHelper(Server); MgLayer bufferLayer = null; int layerIndex = map.GetLayers().IndexOf("Buffer"); if (layerIndex < 0) { // The layer does not exist and must be created. MgResourceIdentifier bufferFeatureResId = new MgResourceIdentifier("Session:" + sessionId + "//Buffer.FeatureSource"); helper.CreateBufferFeatureSource(featureService, mapWktSrs, bufferFeatureResId); bufferLayer = helper.CreateBufferLayer(resourceService, bufferFeatureResId, sessionId); map.GetLayers().Insert(0, bufferLayer); } else { bufferLayer = (MgLayer)map.GetLayers().GetItem(layerIndex); MgFeatureCommandCollection commands = new MgFeatureCommandCollection(); commands.Add(new MgDeleteFeatures("BufferClass", "ID like '%'")); bufferLayer.UpdateFeatures(commands); } // Check for a parcel marker layer. If it exists, delete // the current features. // If it does not exist, create a feature source and // a layer to hold the parcel markers. MgLayer parcelMarkerLayer = null; layerIndex = map.GetLayers().IndexOf("ParcelMarker"); if (layerIndex < 0) { MgResourceIdentifier parcelFeatureResId = new MgResourceIdentifier("Session:" + sessionId + "//ParcelMarker.FeatureSource"); helper.CreateParcelMarkerFeatureSource(featureService, mapWktSrs, parcelFeatureResId); parcelMarkerLayer = helper.CreateParcelMarkerLayer(resourceService, parcelFeatureResId, sessionId); map.GetLayers().Insert(0, parcelMarkerLayer); } else { parcelMarkerLayer = (MgLayer)map.GetLayers().GetItem(layerIndex); MgFeatureCommandCollection commands = new MgFeatureCommandCollection(); commands.Add(new MgDeleteFeatures("ParcelMarkerClass", "ID like '%'")); parcelMarkerLayer.UpdateFeatures(commands); } // Check each layer in the selection. for (int i = 0; i < selectedLayers.GetCount(); i++) { // Only check selected features in the Parcels layer. MgLayer layer = (MgLayer)selectedLayers.GetItem(i); if (layer.GetName() == "Parcels") { Response.Write( "Marking all parcels inside the buffer that are of type 'MFG'"); MgFeatureReader featureReader = selection.GetSelectedFeatures(layer, layer.GetFeatureClassName(), false); // Process each item in the MgFeatureReader. Get the // geometries from all the selected features and // merge them into a single geometry. MgGeometryCollection inputGeometries = new MgGeometryCollection(); while (featureReader.ReadNext()) { MgByteReader featureGeometryData = featureReader.GetGeometry("SHPGEOM"); MgGeometry featureGeometry = agfReaderWriter.Read(featureGeometryData); inputGeometries.Add(featureGeometry); } MgGeometryFactory geometryFactory = new MgGeometryFactory(); MgGeometry mergedGeometries = geometryFactory.CreateMultiGeometry(inputGeometries); // Create a buffer from the merged geometries double bufferDist = srs.ConvertMetersToCoordinateSystemUnits(bufferRingSize); MgGeometry bufferGeometry = mergedGeometries.Buffer(bufferDist, srsMeasure); // Create a filter to select parcels within the buffer. Combine // a basic filter and a spatial filter to select all parcels // within the buffer that are of type "MFG". queryOptions = new MgFeatureQueryOptions(); queryOptions.SetFilter("RTYPE = 'MFG'"); queryOptions.SetSpatialFilter("SHPGEOM", bufferGeometry, MgFeatureSpatialOperations.Inside); featureReader = layer.SelectFeatures(queryOptions); // Get the features from the feature source, // determine the centroid of each selected feature, and // add a point to the ParcelMarker layer to mark the // centroid. // Collect all the points into an MgFeatureCommandCollection, // so they can all be added in one operation. MgFeatureCommandCollection parcelMarkerCommands = new MgFeatureCommandCollection(); while (featureReader.ReadNext()) { MgByteReader byteReader = featureReader.GetGeometry("SHPGEOM"); MgGeometry geometry = agfReaderWriter.Read(byteReader); MgPoint point = geometry.GetCentroid(); // Create an insert command for this parcel. MgPropertyCollection properties = new MgPropertyCollection(); properties.Add(new MgGeometryProperty("ParcelLocation", agfReaderWriter.Write(point))); parcelMarkerCommands.Add(new MgInsertFeatures("ParcelMarkerClass", properties)); } featureReader.Close(); if (parcelMarkerCommands.GetCount() > 0) { parcelMarkerLayer.UpdateFeatures(parcelMarkerCommands); } else { Response.Write("

No parcels within the buffer area match."); } // Create a feature in the buffer feature source to show the area covered by the buffer. MgPropertyCollection props = new MgPropertyCollection(); props.Add(new MgGeometryProperty("BufferGeometry", agfReaderWriter.Write(bufferGeometry))); MgFeatureCommandCollection commands = new MgFeatureCommandCollection(); commands.Add(new MgInsertFeatures("BufferClass", props)); bufferLayer.UpdateFeatures(commands); // Ensure that the buffer layer is visible and in the legend. bufferLayer.SetVisible(true); bufferLayer.ForceRefresh(); bufferLayer.SetDisplayInLegend(true); parcelMarkerLayer.SetVisible(true); parcelMarkerLayer.ForceRefresh(); map.Save(); } } } else { Response.Write( "No selected layers"); Response.Write( "

"); } } catch (MgException e) { Response.Write( "

" + e.GetExceptionMessage() + "

"); Response.Write( "

" + e.GetDetails() + "

"); } %>

Done.