ThinkGeo.com    |     Documentation    |     Premium Support

How to draw data from a postGIS layer in asp.net C#

Greetings,


 


I am a new member and tester of Map Suite Web Edition, and I was looking for some kind of a tutorial for drawing a map from postgis layer in asp.net. I searched this forums, and found your begginers guides, but I haven't found any kind of a tutorial on this subject.


I would appreciate any help.


 


Best regards,


 


Luka


 



Hi lux,


We have a layer called PostgreSqlFeatureLayer to draw a map based on postgis data source, and we have a sample which locates in HowDoISamples/DataProviders/LoadAPostgreSQLFeatureLayer to demonstrate how to use this layer, please take a look.
Thanks for evaluating our product and any more questions please let me know.
Sun

Hi


I found something simillar to that sample somewhere on the forums and I mixed it up with sample hello world app.


If I understood properly, I need only one single control (for this simple first app, just to show the data) , winformsmap, i set the units, for example meter, set the connString, eventually the zoom levels, and add an overlay as a layer to winformsmap control?


 



        private void Form1_Load(object sender, EventArgs e)
        {
            winformsMap1.MapUnit = GeographyUnit.Meter;
            winformsMap1.BackgroundOverlay.BackgroundBrush = new GeoSolidBrush(GeoColor.GeographicColors.ShallowOcean);

            string connectString = "Server=127.0.0.1;Port=5433;Database=lala;User Id=postgres;Password=password;";
            PostgreSqlFeatureLayer postgreLayer = new PostgreSqlFeatureLayer(connectString, "topologija", "the_geom");  //table and the column?
            postgreLayer.ZoomLevelSet.ZoomLevel01.DefaultAreaStyle = AreaStyles.Country1;
            postgreLayer.ZoomLevelSet.ZoomLevel01.ApplyUntilZoomLevel = ApplyUntilZoomLevel.Level01;

            LayerOverlay staticOverlay = new LayerOverlay();
            staticOverlay.Layers.Add("PostgreLayer", postgreLayer);  // "PostgreLayer" is just caption of the layer? 
            winformsMap1.Overlays.Add(staticOverlay);

            winformsMap1.Refresh();
        }
 


 


 


It compiles without errors, i see the winformsMap control with catchy ocean blue background :) , but i don't see my map.   p.s. about the conn string, port IS 5433 not 5432  :)


 


Best regards,


Luka



Hi lux,


I think the code in your post is the code of DesktopEdition, while the WebEdition code is like this:

protected void Page_Load(object sender, EventArgs e)
{
    if (!Page.IsPostBack)
    {
        Map1.MapBackground.BackgroundBrush = new GeoSolidBrush(GeoColor.FromHtml("#E5E3DF"));
        Map1.MapUnit = GeographyUnit.Meter;

        string connectString = "Server=192.168.0.235;User Id=userId;Password=password;DataBase=postgis;";
        PostgreSqlFeatureLayer postgreLayer = new PostgreSqlFeatureLayer(connectString, "new_states", "recid");
        postgreLayer.ZoomLevelSet.ZoomLevel01.DefaultAreaStyle = AreaStyles.Country1;
        postgreLayer.ZoomLevelSet.ZoomLevel01.ApplyUntilZoomLevel = ApplyUntilZoomLevel.Level20;
        Map1.StaticOverlay.Layers.Add(postgreLayer);

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

And you need to notice some other stuff to display the postgre layer. 
1.       You should make sure the unit of the coordinate system of this table is meter, because you have set the MapUnit to meter. 
2.       The three passing in parameters of the constructor of PostgreSqlFeatureLayer is connecting string, table name and id column name, so you should make sure “the_geom” is the id column name.
3.       You set the DefaultAreaStyle of this layer, so the shape type of this layer should be Polygon or Multipolygon.
4.       You should set the current extent of the map control to an available value. The current extent could be the bounding box of this PostgreFeatureLayer, you can set it like this:

        postgreLayer.Open();
        Map1.CurrentExtent = postgreLayer.GetBoundingBox();
        postgreLayer.Close();


So please check the above things and try again to see what happens.



Any more questions please let me know.
Thanks,
Sun 

I misstyped in the first post, I was working in DesktopEdition, but after the tips You provided, i tried the WebEd, and i've got simillar situation there too. It compiles, severs is up, and empty map displays with a message in the map "an item with the same key has already been added". 


Someone already posted that problem, but with Oracle base, but only when there is more than one schema in the database, and I have got only one schema.


 


1. unit of the coordinate system of this table has to be meter (although i tried decimal, but with same results), and the data type of the column is geometry


2. table name is topologija and the_geom is the column name


3. geometrytype of the_geom column is Polygon


4. i set the bounding box for current extent


 


Later i copied code You provided above, but with the same message on the map :  "an item with the same key has already been added" 


 


p.s.   


But if i change current extent to rectangle         


    Map1.CurrentExtent = new RectangleShape(-140, 60, 140, -60);


i don't get the same message as above, just an empty map.

 



Lux,


I think the column name “the_geom” is the Geometry column name of your table, if so do not pass it into the constructor of PosgreFeatureLayer. The passing in column name should be an identifier of the table, it could be “recid” means record id in our sample, and it also could be “oid” which is the primer key of the table. And another thing is about map unit, you should make sure it is really in meter or decimal degree. 
Any more questions please let me know.
Thanks,
Sun