ThinkGeo.com    |     Documentation    |     Premium Support

Finding a shape that contains a point

Is there a way to find a shape that contains a point? I want to find a shape and change its color based on a given point. Here is my code for loading the two layers that I need.  If I were given another point in India could I do a lookup of some sort to get the India shape and change some of its features?


 
Map1.MapBackground.BackgroundBrush = new GeoSolidBrush(GeoColor.FromHtml("#B3C6D4")); 
var worldLayer = new ShapeFileFeatureLayer(MapPath("~/Content/Maps/cntry02.shp")); 
Map1.MapUnit = GeographyUnit.DecimalDegree; 
worldLayer.ZoomLevelSet.ZoomLevel01.DefaultAreaStyle = AreaStyles.Country1;
worldLayer.ZoomLevelSet.ZoomLevel01.ApplyUntilZoomLevel = ApplyUntilZoomLevel.Level20;
LayerOverlay shapeOverlay = new LayerOverlay("Shape Overlay", false, TileType.MultipleTile);
shapeOverlay.Layers.Add(worldLayer); 
shapeOverlay.TransitionEffect = TransitionEffect.Stretching;
Map1.CustomOverlays.Add(shapeOverlay); 
SimpleMarkerOverlay markerOverlay = new SimpleMarkerOverlay("Markers"); 
AddMarker(markerOverlay, "Kansas City",-94.558 , 39.078); 
AddMarker(markerOverlay,"Salt Lake City",-111.893919,40.721292); 
AddMarker(markerOverlay, "India", 74.99861, 32.55694); 
Map1.CustomOverlays.Add(markerOverlay);





 


Jeremy,


Welcome to the community, hope you have a good time learning and sharing here.





 


Here is the complete code for your scenario(click the button and highlight India), I added some comments for the key part.



using System;
using ThinkGeo.MapSuite.Core;
using ThinkGeo.MapSuite.WebEdition;

namespace CSSamples.Samples
{
    public partial class DisplayASimpleMap : System.Web.UI.Page
    {
        protected void Page_Load(object sender, EventArgs e)
        {
            if (!Page.IsPostBack)
            {
                Map1.MapBackground.BackgroundBrush = new GeoSolidBrush(GeoColor.FromHtml("#B3C6D4"));
                Map1.CurrentExtent = new RectangleShape(-140, 60, 140, -60);
                Map1.MapUnit = GeographyUnit.DecimalDegree;

                var worldLayer = new ShapeFileFeatureLayer(MapPath("~/SampleData/world/cntry02.shp"));
                worldLayer.ZoomLevelSet.ZoomLevel01.DefaultAreaStyle = AreaStyles.Country1;
                worldLayer.ZoomLevelSet.ZoomLevel01.ApplyUntilZoomLevel = ApplyUntilZoomLevel.Level20;

                LayerOverlay shapeOverlay = new LayerOverlay("Shape Overlay", true, TileType.MultipleTile);
                shapeOverlay.Layers.Add("worldLayer", worldLayer);
                shapeOverlay.TransitionEffect = TransitionEffect.Stretching;
                Map1.CustomOverlays.Add(shapeOverlay);

                // Add the hightlight overlay to hole the highlight features
                InMemoryFeatureLayer highlightFeatureLayer = new InMemoryFeatureLayer();
                highlightFeatureLayer.ZoomLevelSet.ZoomLevel01.DefaultAreaStyle = AreaStyles.CreateSimpleAreaStyle(GeoColor.SimpleColors.Red);
                highlightFeatureLayer.ZoomLevelSet.ZoomLevel01.ApplyUntilZoomLevel = ApplyUntilZoomLevel.Level20;
                LayerOverlay highlightOverlay = new LayerOverlay("HighLight Overlay", false, TileType.MultipleTile);
                highlightOverlay.Layers.Add("highLightFeatureLayer", highlightFeatureLayer);
                Map1.CustomOverlays.Add(highlightOverlay);

                SimpleMarkerOverlay markerOverlay = new SimpleMarkerOverlay("Markers");
                markerOverlay.Markers.Add(new Marker(-94.558, 39.078));
                markerOverlay.Markers.Add(new Marker(-111.893919, 40.721292));
                markerOverlay.Markers.Add(new Marker(74.99861, 32.55694));
                Map1.CustomOverlays.Add(markerOverlay);
            }
        }

        protected void Button1_Click(object sender, EventArgs e)
        {
            PointShape indiaPoint = new PointShape(74.99861, 32.55694);
            ShapeFileFeatureLayer worldLayer = (ShapeFileFeatureLayer)((LayerOverlay)Map1.CustomOverlays["Shape Overlay"]).Layers["worldLayer"];
            worldLayer.Open();
            System.Collections.ObjectModel.Collection<Feature> features = worldLayer.QueryTools.GetFeaturesContaining(indiaPoint, ReturningColumnsType.NoColumns);
            worldLayer.Close();

            LayerOverlay layerOverlay = (LayerOverlay)Map1.CustomOverlays["HighLight Overlay"];
            foreach (Feature feature in features)
            {
                ((InMemoryFeatureLayer)(layerOverlay.Layers["highLightFeatureLayer"])).InternalFeatures.Add(feature);
            }
            // here you only need to redraw the highlight overlay, do not need to refresh the background map or the marker overlay
            layerOverlay.Redraw();
        }
    }
}




 


Also here is the result snapshot.



Thanks,


Ben


 






Thank you for your quick reply. I will give your code a try!


Jeremy



OK, let me know what you find out.

This works great Thanks!

You are welcome Jeremy, let me know if you have more issues. 
  
 Ben