ThinkGeo.com    |     Documentation    |     Premium Support

Three maps in one control

Hello


I have three maps (shp files), one of regions,  one of provincies and other of local areas. I want to load three in same Map Suite Control but I need regions with thick contour area, provinces with half contour area and local areas with fine contour area.


Is that posible, can I help me. If somebody can show a code example I will appreciate it much. Tanks and regards


 



Hi Pablo, 
  
 Could you please provide us some pictures (thick contour area, half contour area, fine contour area) to illustrate your requirement. It will be helpful to find the right solution for you. 
  
 Regards, 
  
 Ivan

Hi Ivan,  I send you two images of my problem and image that looks like what I do. I have this two maps (shp files) and I can load separately, but now I want to load at the same in the control, and I want to mark lines on the map of provinces as thick as in "Result" map image.  I have a shp files, I haven´t images. Hope I have explained better, thanks.



Regions_Map.JPG (30.3 KB)
Provincies_Map.JPG (16 KB)
Result_Map.JPG (14.8 KB)

Hi Pablo, 
  
 It seems that you didn’t attach the images you mentioned. Please attach them and I will do my best to assist you. 
  
 Regards, 
  
 Ivan

Hi Ivan,  



sorry, now you have the images in previus post, thanks.



Hi Pablo,


Here we provide a candidate solution which may meet your requirement. The steps are as follows:


1. Load region shape file


2. Examine province shape file to get the inner lines for provinces, then save lines into a InMemoryFeatureLayer


3. Load this InMemoryFeatureLayer


We also provide some code snippet for your reference. 


protected void Page_Load(object sender, EventArgs e)
{
if (!Page.IsPostBack)
{
    Map1.MapBackground.BackgroundBrush = new GeoSolidBrush(GeoColor.FromHtml("#E5E3DF"));
    Map1.CurrentExtent = new RectangleShape(-125, 72, 50, -46);
    Map1.MapUnit = GeographyUnit.DecimalDegree;

    ShapeFileFeatureLayer regionLayer = new ShapeFileFeatureLayer(MapPath("~/SampleData/Region.shp"));
    regionLayer.ZoomLevelSet.ZoomLevel01.DefaultAreaStyle = AreaStyles.County1;
    regionLayer.ZoomLevelSet.ZoomLevel01.ApplyUntilZoomLevel = ApplyUntilZoomLevel.Level20;

    InMemoryFeatureLayer innerLineLayer = new InMemoryFeatureLayer();
    innerLineLayer.ZoomLevelSet.ZoomLevel01.DefaultLineStyle = LineStyles.Interstate1;
    innerLineLayer.ZoomLevelSet.ZoomLevel01.ApplyUntilZoomLevel = ApplyUntilZoomLevel.Level20;

    ShapeFileFeatureLayer provinceLayer = new ShapeFileFeatureLayer(MapPath("~/SampleData/Province.shp"));
    provinceLayer.Open();
    Collection<Feature> features = provinceLayer.QueryTools.GetAllFeatures(ReturningColumnsType.NoColumns);
    provinceLayer.Close();

    Collection<PolygonShape> polygons = new Collection<PolygonShape>();
    foreach (Feature feature in features)
    {
        MultipolygonShape multiPolygon = (MultipolygonShape)feature.GetShape();
        foreach (PolygonShape polygon in multiPolygon.Polygons)
        {
            polygons.Add(polygon);
        }
    }

    foreach (PolygonShape polygon in polygons)
    {
        foreach (PolygonShape anotherPolygon in polygons)
        {
            if (polygon.Id != anotherPolygon.Id)
            {
                LineShape line = new LineShape();
                MultipointShape resultMultiPoint = polygon.GetCrossing(anotherPolygon);
                if (resultMultiPoint != null && resultMultiPoint.Points.Count > 0)
                {
                    foreach (PointShape point in resultMultiPoint.Points)
                    {
                        line.Vertices.Add(new Vertex(point.X, point.Y));
                    }

                    if (line.Vertices.Count > 1)
                    {
                        innerLineLayer.InternalFeatures.Add(line.GetFeature());
                    }
                }
            }
        }
    }

    LayerOverlay staticOverlay = new LayerOverlay();
    staticOverlay.TileType = TileType.MultipleTile;
    staticOverlay.Layers.Add(regionLayer);
    staticOverlay.Layers.Add(innerLineLayer);
    Map1.CustomOverlays.Add(staticOverlay);
}


Please let us know if you have further questions.


Regards,


Ivan



 


Hi Ivan,


you solution is good but a I have little problem. I think my map have wrong polygon and add a straight wrong line



My solution is add a new condition in the "if" but is a horrible solution:


  foreach (PolygonShape polygon in polygons)

            {

                foreach (PolygonShape anotherPolygon in polygons)

                {

                    if (polygon.Id != anotherPolygon.Id &&

                        anotherPolygon.GetFeature().GetWellKnownText().ToString().Substring(0, 50) != "POLYGON((504954 4701296,504941 4701305,504922 4701")


It´s possible that I identify the poligon otherwise, for example for his DataBase ID, I have not found possible. Thanks and regards.

                    


 



Hi Pablo,


I think you could identify the polygon from feature's columnValues. I modify the code snippet which maybe helpful to you.


protected void Page_Load(object sender, EventArgs e)
{
    if (!Page.IsPostBack)
    {
        Map1.MapBackground.BackgroundBrush = new GeoSolidBrush(GeoColor.FromHtml("#E5E3DF"));
        Map1.CurrentExtent = new RectangleShape(-125, 72, 50, -46);
        Map1.MapUnit = GeographyUnit.DecimalDegree;

        ShapeFileFeatureLayer regionLayer = new ShapeFileFeatureLayer(MapPath("~/SampleData/Region.shp"));
        regionLayer.ZoomLevelSet.ZoomLevel01.DefaultAreaStyle = AreaStyles.County1;
        regionLayer.ZoomLevelSet.ZoomLevel01.ApplyUntilZoomLevel = ApplyUntilZoomLevel.Level20;

        InMemoryFeatureLayer innerLineLayer = new InMemoryFeatureLayer();
        innerLineLayer.ZoomLevelSet.ZoomLevel01.DefaultLineStyle = LineStyles.Interstate1;
        innerLineLayer.ZoomLevelSet.ZoomLevel01.ApplyUntilZoomLevel = ApplyUntilZoomLevel.Level20;

        ShapeFileFeatureLayer provinceLayer = new ShapeFileFeatureLayer(MapPath("~/SampleData/Province.shp"));
        provinceLayer.Open();
        Collection<Feature> features = provinceLayer.QueryTools.GetAllFeatures(ReturningColumnsType.AllColumns);
        provinceLayer.Close();

        if (features.Count > 1)
        {
            Feature feature = features[0];
            MultipolygonShape multiPolygon = (MultipolygonShape)feature.GetShape();
            features.RemoveAt(0);
            foreach (Feature innerFeature in features)
            {
                if (innerFeature.ColumnValues["IdentifyName"] != "SomeName")
                {
                    LineShape line = new LineShape();
                    MultipolygonShape innerMultiPolygon = (MultipolygonShape)innerFeature.GetShape();
                    MultipointShape resultMultiPoint = multiPolygon.GetCrossing(innerMultiPolygon);
                    if (resultMultiPoint != null && resultMultiPoint.Points.Count > 0)
                    {
                        foreach (PointShape point in resultMultiPoint.Points)
                        {
                            line.Vertices.Add(new Vertex(point.X, point.Y));
                        }
                        if (line.Vertices.Count > 1)
                        {
                            innerLineLayer.InternalFeatures.Add(line.GetFeature());
                        }
                    }
                }
            }
        }

        LayerOverlay staticOverlay = new LayerOverlay();
        staticOverlay.TileType = TileType.MultipleTile;
        staticOverlay.Layers.Add(regionLayer);
        staticOverlay.Layers.Add(innerLineLayer);
        Map1.CustomOverlays.Add(staticOverlay);
    }
}


Regards,


Ivan



Hi Ivan, 


now it is perfect, thank you very much, regards.



Hi Pablo, 
  
 You’re welcome. Just feel free to ask us any questions while using ThingGeo products, we’ll do our best to assist you. 
  
 Regards, 
  
 Ivan