ThinkGeo.com    |     Documentation    |     Premium Support

Retreive xcord; ycord and label from a SQLSERVER database

Hello,


I'm evaluating MapSuite for my project(c# wpfform). Ihave a SQLSERVER table name TOWN where i save information concerning differents town. this my table:


                         TOWN                                


ID        NAME            XCORD              YCORD


 


 


 


I want to place the different town of my table on the map according the xcord and ycord and then label the added point but i don't know how to do , I need your help. Thankx











Hi Moussa,


 


Thanks for evaluating our Map Suite product.


 


To implement the requirement you mentioned, I think you need to write your own FeatureLayer and FeatureSource, maybe you could call them SqlServerPointFeatureSource and SqlServerPointFeatureLayer. You do not need to worry about this, it’s very easy to implement these two classes because we have already had an almost same sample project in our code community. You can find it at following link:


 



code.thinkgeo.com/projects/s...intfeature


 


The only difference between that sample and your requirement is that it is using a Microsoft Access database to store the coordinate and label information, so you just need to modify the connect string and some ADO.NET classes used in that sample. Please have a try.


 


Hope this helps and any more questions please let us know.


 


Thanks,


 


Sun




Thank you I will look at it. Before I tried this method and it works this is code line: 
  
 private void ShowPoint() 
         {                         
             try 
             {                 
                 //chargement de la carte 
                 RectangleShape imgSize = new RectangleShape(0, 300, 300, 0); 
                 GdiPlusRasterLayer imgCalque = new GdiPlusRasterLayer(@“C:\Yamba\Dundas\Dundas\Dundas\ci1.jpg”,imgSize);                                                                 
                 //ajout des points                                 
                 InMemoryFeatureLayer pointCalque = new InMemoryFeatureLayer(); 
                 pointCalque.ZoomLevelSet.ZoomLevel01.DefaultPointStyle = PointStyles.Capital1;//new PointStyle(PointSymbolType.Circle,new GeoSolidBrush(GeoColor.StandardColors.Pink),10);                 
                 pointCalque.ZoomLevelSet.ZoomLevel01.ApplyUntilZoomLevel = ApplyUntilZoomLevel.Level20; 
                 //ajout des libelle                                 
                 InMemoryFeatureLayer libCalque = new InMemoryFeatureLayer(); 
                 libCalque.ZoomLevelSet.ZoomLevel01.DefaultTextStyle = new TextStyle(“designation”, new GeoFont(“Arial”, 10, DrawingFontStyles.Italic), new GeoSolidBrush(GeoColor.StandardColors.Red)); 
                 libCalque.ZoomLevelSet.ZoomLevel01.ApplyUntilZoomLevel = ApplyUntilZoomLevel.Level20;   
                 libCalque.Open(); 
                 libCalque.Columns.Add(new FeatureSourceColumn(“designation”)); 
                 //ajout des population                                 
                 InMemoryFeatureLayer popCalque = new InMemoryFeatureLayer(); 
                 popCalque.ZoomLevelSet.ZoomLevel01.DefaultTextStyle = new TextStyle(“population”, new GeoFont(“Arial”, 10, DrawingFontStyles.Italic), new GeoSolidBrush(GeoColor.StandardColors.Green)); 
                 popCalque.ZoomLevelSet.ZoomLevel01.ApplyUntilZoomLevel = ApplyUntilZoomLevel.Level20; 
                 popCalque.Open(); 
                 popCalque.Columns.Add(new FeatureSourceColumn(“population”)); 
                 //ajout des superficie                                 
                 InMemoryFeatureLayer supCalque = new InMemoryFeatureLayer(); 
                 supCalque.ZoomLevelSet.ZoomLevel01.DefaultTextStyle = new TextStyle(“superficie”, new GeoFont(“Arial”, 10, DrawingFontStyles.Italic), new GeoSolidBrush(GeoColor.StandardColors.Blue)); 
                 supCalque.ZoomLevelSet.ZoomLevel01.ApplyUntilZoomLevel = ApplyUntilZoomLevel.Level20; 
                 supCalque.Open(); 
                 supCalque.Columns.Add(new FeatureSourceColumn(“superficie”));    
                 foreach (DataRow row in source.VILLE) 
                 { 
                     //les points a placer 
                     PointShape pointXY = new PointShape(double.Parse(row[“xcord”].ToString()),double.Parse(row[“ycord”].ToString())); 
                     pointCalque.InternalFeatures.Add(row[“idville”].ToString(), new Feature(pointXY)); 
                     //libelle des points placés 
                     PointShape pointXYLib = new PointShape(double.Parse(row[“xcord”].ToString())+4, double.Parse(row[“ycord”].ToString())+4); 
                     Feature libFeature = new Feature(pointXYLib); 
                     libFeature.ColumnValues.Add(“designation”, row[“designation”].ToString()); 
                     libCalque.InternalFeatures.Add(row[“idville”].ToString(), libFeature); 
                      //libelle des population 
                     PointShape pointXYPop = new PointShape(double.Parse(row[“xcord”].ToString())+4, double.Parse(row[“ycord”].ToString())-4); 
                      Feature popFeature = new Feature(pointXYPop); 
                      popFeature.ColumnValues.Add(“population”, row[“population”].ToString()); 
                      popCalque.InternalFeatures.Add(row[“idville”].ToString(), popFeature); 
                      //libelle des superficie 
                      PointShape pointXYSup = new PointShape(double.Parse(row[“xcord”].ToString()) + 4, double.Parse(row[“ycord”].ToString()) - 12); 
                      Feature supFeature = new Feature(pointXYSup); 
                      supFeature.ColumnValues.Add(“superficie”, row[“superficie”].ToString()); 
                      supCalque.InternalFeatures.Add(row[“idville”].ToString() + “sup”, supFeature); 
                 } 
                 libCalque.Close();//fermeture du calque libelle 
                 popCalque.Close();//fermeture du calque population 
                 supCalque.Close();//fermeture du calque superficie 
                 //ajout des calques 
                 LayerOverlay coucheImg = new LayerOverlay(); 
                 coucheImg.Layers.Add(“imgCalque”, imgCalque);//couche de la carte 
                 LayerOverlay couchePoint = new LayerOverlay(); 
                 couchePoint.Layers.Add(“pointCalque”, pointCalque);//couche des villes 
                 LayerOverlay coucheLib = new LayerOverlay(); 
                 coucheLib.Layers.Add(“libCalque”, libCalque);//couche des libelles 
                 LayerOverlay couchePop = new LayerOverlay(); 
                 couchePop.Layers.Add(“popCalque”, popCalque);//couche des populations 
                 LayerOverlay coucheSup = new LayerOverlay(); 
                 coucheSup.Layers.Add(“supCalque”, supCalque);//couche des superficie 
                 //attribuer la couche au control map 
                 mapFenetre.Overlays.Add(“coucheImg”, coucheImg);//carte 
                 mapFenetre.Overlays.Add(“couchePoint”,couchePoint);//les villes 
                 mapFenetre.Overlays.Add(“coucheLib”,coucheLib);//les libelles des ville 
                 mapFenetre.Overlays.Add(“couchePop”,couchePop);//la population des villes 
                 mapFenetre.Overlays.Add(“coucheSup”,coucheSup);//la superficie des villes 
                 mapFenetre.MapUnit = GeographyUnit.DecimalDegree; 
                 mapFenetre.BackgroundOverlay.BackgroundBrush = new GeoSolidBrush(GeoColor.GeographicColors.Grass); 
                 mapFenetre.CurrentExtent = new RectangleShape(0, 300, 300, 0); 
                 mapFenetre.Refresh(); 
             } 
             catch (Exception mes) 
             { 
                 MessageBox.Show(mes.Message); 
             }             
  
         } 
  
 I don’t know if it’s the good way but it works; Tell me something about it please. 
  
 Now I want to do another thing, it is to give the possibilite to the user to change the xcord and ycord of the point by clicking on the map. I give explaining : 
 The user have a combobox that contains the list of the town and a button edit. if he click on the button, all the points and labels must disappear only the point that matches the selected town in the combobox and if he clicks on the map the point take the new coordonate. if he click on the button show all, all the points and label must appear 
  
 Thank you 









 




Hi Moussa,


 



About the code you pasted on this thread, you just host all the data in the SQL server table into an InMemoryFeatureLayer. I don’t think this is better than creating your own SqlServerPointFeatureSource, because it may lead to pressure on the memory of your machine when the dataset becomes large. 


 



About your second requirement, you need to create another InMemoryFeatureLayer instance to host the selected point(s), when the customer click button to begin editing, move the selected point to the new InMemoryFeatureLayer and set other InMemoryFeatureLayers visible to false. Hook the map click event the map control, updates the selected point in the new InMemoryFeatureLayer in the map click event. 


 



Hope this helps and any more questions please let us know.


 



Thanks,


 



Sun


 



Ok this  what i did 
  
 private void mapFenetre_MapClick(object sender, MapClickWpfMapEventArgs e) 
         { 
             if (SetXY == true) 
             {                                 
                 InMemoryFeatureLayer pointLayer = (InMemoryFeatureLayer)mapFenetre.FindFeatureLayer(“pointCalque”); 
                 PointShape pointShape = new PointShape(); 
                 pointShape.X = e.WorldX; 
                 pointShape.Y = e.WorldY; 
                 pointShape.Id = idville;                                 
                 int xcord=(int)e.WorldX; 
                 int ycord=(int)e.WorldY; 
                 //enregistrement dans la base de donnees 
                 int i = ville.ModifierXY(xcord, ycord, idville); 
                 if (i > 0) 
                 { 
                     pointLayer.Open(); 
                     pointLayer.EditTools.BeginTransaction(); 
                     pointLayer.EditTools.Update(pointShape); 
                     pointLayer.EditTools.CommitTransaction(); 
                     pointLayer.Close(); 
                     //libelle 
                     InMemoryFeatureLayer libLayer = (InMemoryFeatureLayer)mapFenetre.FindFeatureLayer(“libCalque”); 
                     PointShape libShape = new PointShape(); 
                     libShape.X = e.WorldX+4; 
                     libShape.Y = e.WorldY+4; 
                     libShape.Id = idville; 
                     libLayer.Open(); 
                     libLayer.EditTools.BeginTransaction(); 
                     libLayer.EditTools.Update(libShape); 
                     libLayer.EditTools.CommitTransaction(); 
                     libLayer.Close(); 
                     //population 
                     InMemoryFeatureLayer popLayer = (InMemoryFeatureLayer)mapFenetre.FindFeatureLayer(“popCalque”); 
                     PointShape popShape = new PointShape(); 
                     popShape.X = e.WorldX + 4; 
                     popShape.Y = e.WorldY - 4; 
                     popShape.Id = idville; 
                     popLayer.Open(); 
                     popLayer.EditTools.BeginTransaction(); 
                     popLayer.EditTools.Update(popShape); 
                     popLayer.EditTools.CommitTransaction(); 
                     popLayer.Close(); 
                     //superficie 
                     InMemoryFeatureLayer supLayer = (InMemoryFeatureLayer)mapFenetre.FindFeatureLayer(“supCalque”); 
                     PointShape supShape = new PointShape(); 
                     supShape.X = e.WorldX + 4; 
                     supShape.Y = e.WorldY - 12; 
                     supShape.Id = idville; 
                     supLayer.Open(); 
                     supLayer.EditTools.BeginTransaction(); 
                     supLayer.EditTools.Update(supShape); 
                     supLayer.EditTools.CommitTransaction(); 
                     supLayer.Close(); 
                     //rafraichissement 
                     mapFenetre.Refresh(mapFenetre.Overlays[“couchePoint”]); 
                     mapFenetre.Refresh(mapFenetre.Overlays[“coucheLib”]); 
                     mapFenetre.Refresh(mapFenetre.Overlays[“couchePop”]); 
                     mapFenetre.Refresh(mapFenetre.Overlays[“coucheSup”]); 
                 } 
                 else 
                 { 
                     MessageBox.Show(“Echec”); 
                 } 
                  
             } 
         } 
  
  
 I am working on what you said, i 'll inform you later. Thank for your availability

Sounds good, any more questions please let me know. And one little thing is that I remember that we have an overload of the Refresh method which can pass in an array of overlays, it would be better to use that overload instead of Refresh many times.  
  
 Thanks, 
  
 Sun 


Thank for the advice.Now I am trying to add alegend to my map but i can’t find nothing about it. It seems we have to use a method but i don’t know, thanks to help me.

I think i have to search on the forum before posting something . I found the adornmentLayer tutorial and it is working. 
 Thanks

 


Moussa,
 
Thank Sun for his sharing.
 
If you want to add a legend to your map, here is a good sample you can look at:
gis.thinkgeo.com/Support/Dis...fault.aspx
 
Thanks
 
James