ThinkGeo.com    |     Documentation    |     Premium Support

Diplay a particular country map

Hi,


 


My requirement is such that I want to display a particular's country map at the centre streched out along with cities of that country based on user selection...


 


For e.g. i have drop downlists for countries and when user selects a particular country that country gets displayed on the map at the centre of the screen streched out.


 


 


Thanks,


Lokesh


 


 


 



Lokesh,


 We have a Code Community sample very similar to what you want to accomplish, It is Zoom In To Feature wiki.thinkgeo.com/wiki/Map_Suite_We...To_Feature. Here you click on a feature and the map will center and zoom to that feature (country). There is no dropdown list of countries, but this is a more a general programming issue than a Map Suite specific one and I am sure you will figure that easily on your own. So, the key code here to center and zoom to a country is below. You can see that you need to get the shape of the feature (the country) and you assign the bounding box of the shape to the current extent of the map. I show the code in the Map_Click event where the user click on the country. For  your case, I slightly modified the code where you could use for example GetFeaturesByColumnValue.



    LayerOverlay layerOverlay = (LayerOverlay)Map1.CustomOverlays["WorldOverlay"];
    LayerOverlay dynamicOverlay = (LayerOverlay)Map1.CustomOverlays["HightLightDynamicOverlay"];
 
    ShapeFileFeatureLayer shapeFileLayer = (ShapeFileFeatureLayer)(layerOverlay.Layers["Countries"]);
    InMemoryFeatureLayer highLightLayer = (InMemoryFeatureLayer)(dynamicOverlay.Layers["HighLightLayer"]);
   
    //Gets the features the user clicked on.
    shapeFileLayer.Open();

    //Original code
    //Collection<Feature> selectedFeatures = shapeFileLayer.QueryTools.GetFeaturesContaining(e.Position,ReturningColumnsType.NoColumns);

    //Code more adapted for your case.
    Collection<Feature> selectedFeatures = shapeFileLayer.QueryTools.GetFeaturesByColumnValue("Name", "Algeria");

    shapeFileLayer.Close();

    if (selectedFeatures.Count > 0)
    {
        highLightLayer.InternalFeatures.Clear();
        //Adds the first feature of the selected features to the hightlight layer.
        highLightLayer.InternalFeatures.Add(selectedFeatures[0].Id, selectedFeatures[0]);
        //Sets the extent of the map to the bounding box of the feature.
        //Notice that zoom level snapping is happening due to the image tiling in the web edition.
        RectangleShape featureExtent = selectedFeatures[0].GetShape().GetBoundingBox();
        Map1.CurrentExtent = featureExtent;

        
    }
 

 


 I hope this helps. Otherwise, let us know and we will further assist you.



Hi Val,


 


 


Thank You so much for replying along with the code. Though, I have not tried because  my requirement has changed a bit. Now what I want is to display US map only. I would be making a drop downlist of all the states in US. Requirement is such that when a user select a particular state than the map should narrow down and show the cities with in that particular state.


For e.g. if user selects florida from the state list than all the cities in florida should show up on the map centralized on the page.


Is it possible with thinkgeo?


If yes than please post me the code as well...i can manage it with the events of drop down list...


 


 


Thanks,


Lokesh


 



Lokesh, 
  
  Yes, this is possible. To have the map centering and zooming in to a selected state is basically the same method as in the code showed in the previous post except that you will be using a shapefile for US states.  
  For the cities of the selected state to show up, how do you want that to work exactely? Do you already have the cities shapefile? Do you want to only have the cities of the selected states to show up? Or do you want to have those cities displayed differently compared to cities of non selected states? Does your cities shapefile contain column with the state? We need to know more about your case to help you more concretely with code. Thank you.

Hi Val,


Thanks for the reply...Val to be specific I do not have the shape file for cities...and I only want to show the cities for the selected states to show up...


 


So If you can provide me the shape file for the cities it would be very helpfull (along with the code)........famous cities for a specific state in US would work for me...


 


Please ask if you need any clarifications...


 


Thanks,


Lokesh


 


 



Hi Lokesh,


Please download the attachments to get shape files(STATES.shp and cites_e.shp). For your reference, here is the sample code:protected void Page_Load(object sender, EventArgs e)
{
    if (!Page.IsPostBack)
    {
        Map1.MapBackground.BackgroundBrush = new GeoSolidBrush(GeoColor.FromHtml("#E5E3DF"));
        Map1.MapUnit = GeographyUnit.DecimalDegree;

        ShapeFileFeatureLayer stateLayer = new ShapeFileFeatureLayer(MapPath("~/SampleData/States.shp"));
        stateLayer.ZoomLevelSet.ZoomLevel01.DefaultAreaStyle = AreaStyles.CreateSimpleAreaStyle(GeoColor.SimpleColors.Transparent, GeoColor.FromArgb(100, GeoColor.SimpleColors.Green));
        stateLayer.ZoomLevelSet.ZoomLevel01.ApplyUntilZoomLevel = ApplyUntilZoomLevel.Level20;

        ShapeFileFeatureLayer cityLayer = new ShapeFileFeatureLayer(MapPath("~/SampleData/cities_e.shp"));

        InMemoryFeatureLayer stateCityLayer = new InMemoryFeatureLayer();
        stateCityLayer.ZoomLevelSet.ZoomLevel01.DefaultPointStyle = PointStyles.City1;
        stateCityLayer.ZoomLevelSet.ZoomLevel01.ApplyUntilZoomLevel = ApplyUntilZoomLevel.Level20;

        LayerOverlay staticOverlay = new LayerOverlay("StaticOverlay");
        staticOverlay.IsBaseOverlay = false;
        staticOverlay.Layers.Add("StateLayer", stateLayer);
        staticOverlay.Layers.Add("CityLayer", cityLayer);
        staticOverlay.Layers.Add("StateCityLayer", stateCityLayer);
        Map1.CustomOverlays.Add(staticOverlay);

        stateLayer.Open();
        Map1.CurrentExtent = stateLayer.GetBoundingBox();
        stateLayer.Close();
    }
}

protected void Button1_Click(object sender, EventArgs e)
{
    LayerOverlay dynamicOverlay = (LayerOverlay)Map1.CustomOverlays["StaticOverlay"];
    ShapeFileFeatureLayer stateLayer = (ShapeFileFeatureLayer)dynamicOverlay.Layers["StateLayer"];
    ShapeFileFeatureLayer cityLayer = (ShapeFileFeatureLayer)dynamicOverlay.Layers["CityLayer"];
    InMemoryFeatureLayer stateCityLayer = (InMemoryFeatureLayer)dynamicOverlay.Layers["StateCityLayer"];

    stateLayer.Open();
    Collection<Feature> features = stateLayer.QueryTools.GetFeaturesByColumnValue("STATE_NAME", "Florida");
    stateLayer.Close();

    if (features.Count > 0)
    {
        Map1.CurrentExtent = features[0].GetBoundingBox();

        cityLayer.Open();
        Collection<Feature> cityFeatures = cityLayer.QueryTools.GetFeaturesIntersecting(features[0], ReturningColumnsType.NoColumns);
        cityLayer.Close();

        stateCityLayer.InternalFeatures.Clear();
        foreach (Feature feature in cityFeatures)
        {
            stateCityLayer.InternalFeatures.Add(feature);
        }
    }
}


Thanks,

Ivan



States.zip (90.6 KB)
Cities_1.zip (284 KB)
Cities_2.zip (419 KB)

Hi Ivan,


 


 


Thanks a lot for replying thorowly along with the code. Before implementing it, I have a question and that should i replace the old states shape file or should i include these files into the project directly.


 


I have included shape files that were in the sample code folder.


 


Thanks,


Lokesh



Hi Lokesh,
 
For your reference, there are 2 options:
 
1. Keep the old states shape file. You should use your own logic to find state (for example "Florida") because the columns in your states shape file may be different from the one we provided .
2. Replace the old states shape file with the new one we provided.
 
Thanks,
Ivan