ThinkGeo Cloud
ThinkGeo UI Controls
ThinkGeo Open Source
Help and Support
External Resources
ThinkGeo Cloud
ThinkGeo UI Controls
ThinkGeo Open Source
Help and Support
External Resources
using System; using System.Configuration; using System.Collections.ObjectModel; using ThinkGeo.MapSuite.Core; using ThinkGeo.MapSuite.WebEdition; namespace GetFeatureClickedOnWeb2 { public partial class TestForm : System.Web.UI.Page { protected void Page_Load(object sender, EventArgs e) { if (!Page.IsPostBack) { Map1.MapBackground.BackgroundBrush = new GeoSolidBrush(GeoColor.FromHtml("#E5E3DF")); Map1.CurrentExtent = new RectangleShape(-97.7567,30.2701,-97.7361,30.2592); Map1.MapUnit = GeographyUnit.DecimalDegree; Map1.MapTools.MouseCoordinate.Enabled = true; LayerOverlay layerOverlay = new LayerOverlay("StreetOverlay", false, TileType.SingleTile); layerOverlay.IsBaseOverlay = false; string polygonPath = MapPath("App_Data polygons.shp"); ShapeFileFeatureLayer polygonLayer = new ShapeFileFeatureLayer(polygonPath); polygonLayer.ZoomLevelSet.ZoomLevel01.DefaultAreaStyle = AreaStyles.CreateSimpleAreaStyle(GeoColor.StandardColors.LightGreen); polygonLayer.ZoomLevelSet.ZoomLevel01.ApplyUntilZoomLevel = ApplyUntilZoomLevel.Level20; layerOverlay.Layers.Add("PolygonLayer", polygonLayer); string polygonPath2 = MapPath("App_Data polygons2.shp"); ShapeFileFeatureLayer polygonLayer2 = new ShapeFileFeatureLayer(polygonPath2); polygonLayer2.ZoomLevelSet.ZoomLevel01.DefaultAreaStyle = AreaStyles.CreateSimpleAreaStyle(GeoColor.StandardColors.LightSteelBlue); polygonLayer2.ZoomLevelSet.ZoomLevel01.ApplyUntilZoomLevel = ApplyUntilZoomLevel.Level20; layerOverlay.Layers.Add("PolygonLayer2", polygonLayer2); string streetPath = MapPath("App_Data Streets.shp"); ShapeFileFeatureLayer streetLayer = new ShapeFileFeatureLayer(streetPath); streetLayer.ZoomLevelSet.ZoomLevel01.DefaultLineStyle = LineStyles.LocalRoad1; streetLayer.ZoomLevelSet.ZoomLevel01.ApplyUntilZoomLevel = ApplyUntilZoomLevel.Level20; layerOverlay.Layers.Add("StreetLayer", streetLayer); string pointPath = MapPath("App_Data points.shp"); ShapeFileFeatureLayer pointLayer = new ShapeFileFeatureLayer(pointPath); pointLayer.ZoomLevelSet.ZoomLevel01.DefaultPointStyle = PointStyles.CreateSimplePointStyle(PointSymbolType.Circle, GeoColor.StandardColors.LightPink, GeoColor.StandardColors.Black,10); pointLayer.ZoomLevelSet.ZoomLevel01.ApplyUntilZoomLevel = ApplyUntilZoomLevel.Level20; layerOverlay.Layers.Add("PointLayer", pointLayer); string pointPath2 = MapPath("App_Data points2.shp"); ShapeFileFeatureLayer pointLayer2 = new ShapeFileFeatureLayer(pointPath2); pointLayer2.ZoomLevelSet.ZoomLevel01.DefaultPointStyle = PointStyles.CreateSimplePointStyle(PointSymbolType.Circle, GeoColor.StandardColors.LightSeaGreen, GeoColor.StandardColors.Black, 10); pointLayer2.ZoomLevelSet.ZoomLevel01.ApplyUntilZoomLevel = ApplyUntilZoomLevel.Level20; layerOverlay.Layers.Add("PointLayer2", pointLayer2); Map1.CustomOverlays.Add(layerOverlay); //InMemoryFeature to show the selected feature (the feature clicked on). InMemoryFeatureLayer selectLayer = new InMemoryFeatureLayer(); selectLayer.Open(); selectLayer.Columns.Add(new FeatureSourceColumn("FENAME")); selectLayer.Close(); selectLayer.ZoomLevelSet.ZoomLevel01.DefaultLineStyle = LineStyles.CreateSimpleLineStyle(GeoColor.FromArgb(150, GeoColor.StandardColors.Red), 10, true); selectLayer.ZoomLevelSet.ZoomLevel01.DefaultPointStyle = PointStyles.CreateSimplePointStyle(PointSymbolType.Circle, GeoColor.FromArgb(150, GeoColor.StandardColors.Red), 10); selectLayer.ZoomLevelSet.ZoomLevel01.DefaultAreaStyle = AreaStyles.CreateSimpleAreaStyle(GeoColor.FromArgb(150, GeoColor.StandardColors.Red)); selectLayer.ZoomLevelSet.ZoomLevel01.ApplyUntilZoomLevel = ApplyUntilZoomLevel.Level20; LayerOverlay selectOverlay = new LayerOverlay(); selectOverlay.Layers.Add("SelectLayer", selectLayer); selectOverlay.IsBaseOverlay = false; Map1.CustomOverlays.Add(selectOverlay); ScaleBarAdornmentLayer scaleBar = new ScaleBarAdornmentLayer(); scaleBar.UnitFamily = UnitSystem.Metric; scaleBar.Location = AdornmentLocation.LowerLeft; LayerOverlay adornmentLayerOverlay = new LayerOverlay("AdornmentOverlay", false, TileType.SingleTile); adornmentLayerOverlay.Layers.Add(scaleBar); Map1.CustomOverlays.Add(adornmentLayerOverlay); } } protected void Map1_Click(object sender, MapClickedEventArgs e) { //Here we use a buffer of 15 in screen coordinate. This means that regardless of the zoom level, we will always find the nearest feature //within 1 pixels to where we clicked. int screenBuffer = 1; //Here we have to use the ToScreencoordinate function because the MapClickedEventArgs does not provide the mouse screen position, only the //mouse world position. ScreenPointF clickedPointF = ExtentHelper.ToScreenCoordinate(Map1.CurrentExtent, e.Position, (float)Map1.Width.Value, (float)Map1.Height.Value); ScreenPointF bufferPointF = new ScreenPointF(clickedPointF.X + screenBuffer, clickedPointF.Y); //Logic for converting screen coordinate values to world coordinate for the spatial query. Notice that the distance buffer for the spatial query //will change according to the zoom level while it remains the same for the screen buffer distance. double distanceBuffer = ExtentHelper.GetWorldDistanceBetweenTwoScreenPoints(Map1.CurrentExtent, clickedPointF, bufferPointF, (float)Map1.Width.Value, (float)Map1.Height.Value, Map1.MapUnit, DistanceUnit.Meter); LayerOverlay layerOverlay = (LayerOverlay)Map1.CustomOverlays[0]; //Loops thru all the layers to find the nearest feature clicked on giving priority to point features, then line features and //last to polygon features. //We have that priority order because due to the gemetric nature polygons and then lines are more likely to be clicked on. Feature closestPointFeature = new Feature(); Feature closestLineFeature = new Feature(); Feature closestPolygonFeature = new Feature(); double minPointDist= double.MaxValue ; double minLineDist = double.MaxValue; double minPolygonDist = double.MaxValue; foreach (ShapeFileFeatureLayer shapefileLayer in layerOverlay.Layers) { shapefileLayer.Open(); PointShape pointShape = new PointShape(e.Position.X, e.Position.Y); Collection<Feature> tempFeatures = shapefileLayer.FeatureSource.GetFeaturesNearestTo(pointShape, Map1.MapUnit, 1, ReturningColumnsType.NoColumns); shapefileLayer.Close(); if (tempFeatures.Count > 0) { BaseShape baseShape = tempFeatures[0].GetShape(); double currentDist = baseShape.GetDistanceTo(pointShape, Map1.MapUnit, DistanceUnit.Meter); switch (baseShape.GetType().Name) { case "MultipolygonShape": if ((currentDist < minPolygonDist)&& (currentDist <= distanceBuffer)) { closestPolygonFeature = tempFeatures[0]; minPolygonDist = currentDist; } break; case "MultilineShape": if ((currentDist < minLineDist)&& (currentDist <= distanceBuffer)) { closestLineFeature = tempFeatures[0]; minLineDist = currentDist; } break; case "PointShape": if ((currentDist < minPointDist)&& (currentDist <= distanceBuffer)) { closestPointFeature = tempFeatures[0]; minPointDist = currentDist; } break; } } } LayerOverlay selectOverlay = (LayerOverlay)Map1.CustomOverlays[1]; InMemoryFeatureLayer selectLayer = (InMemoryFeatureLayer)selectOverlay.Layers["SelectLayer"]; selectLayer.InternalFeatures.Clear(); if (minPointDist < double.MaxValue) { selectLayer.InternalFeatures.Add(closestPointFeature); } else if (minLineDist < double.MaxValue) { selectLayer.InternalFeatures.Add(closestLineFeature); } else if (minPolygonDist < double.MaxValue) { selectLayer.InternalFeatures.Add(closestPolygonFeature); } selectOverlay.Redraw(); } } }
<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="TestForm.aspx.cs" Inherits="GetFeatureClickedOnWeb2.TestForm" %> <%@ Register Assembly="WebEdition" Namespace="ThinkGeo.MapSuite.WebEdition" TagPrefix="cc1" %> <html xmlns="http://www.w3.org/1999/xhtml"> <head id="Head1" runat="server"> <link href="~/theme/default/samplepic/style.css" rel="stylesheet" type="text/css" /> <title>Get Feature Clicked On</title> </head> <body> <form id="form1" runat="server"> <asp:ScriptManager ID="ScriptManager1" runat="server"> </asp:ScriptManager> <cc1:Map ID="Map1" runat="server" Height="100%" Width="100%" onclick="Map1_Click"> </cc1:Map> <%-- <description:descriptionpanel ID="DescPanel" runat="server"> This sample shows how to get the feature clicked on. <br /> <br /> <asp:Button CssClass="btn" ID="btnRoad" runat="server" Text="Normal" OnClientClick="Map1.SetCurrentBackgroundMapType(G_NORMAL_MAP); return false;" /> <asp:Button CssClass="btn" ID="btnAerial" runat="server" Text="Hybrid" OnClientClick="Map1.SetCurrentBackgroundMapType(G_HYBRID_MAP); return false;" /><br /> <asp:Button CssClass="btn" ID="btnSatellite" runat="server" Text="Satellite" OnClientClick="Map1.SetCurrentBackgroundMapType(G_SATELLITE_MAP); return false;" /> <asp:Button CssClass="btn" ID="btnPhysical" runat="server" Text="Physical" OnClientClick="Map1.SetCurrentBackgroundMapType(G_PHYSICAL_MAP); return false;" /> </description:descriptionpanel>--%> </form> </body> </html>