ThinkGeo.com    |     Documentation    |     Premium Support

Add LayerOverlay on GoogleMapsOverlay

Hello,


With MapSuite Desktop 5.0, is it possible to add a LayerOverlay on a  GoogleMapsOverlay ?


In the sample GPStoGoogleMapDesktop, I tried to add the LayerOverlay from sample data USStates.shp, without success.


 



 private void TestForm_Load(object sender, EventArgs e)
        {
            winformsMap1.MapUnit = GeographyUnit.Meter;
            winformsMap1.BackgroundOverlay.BackgroundBrush = new GeoSolidBrush(GeoColor.FromArgb(255, 198, 255, 255));

           LayerOverlay layerOverlay = new LayerOverlay();
           

            GoogleMapsOverlay googleOverlay = new GoogleMapsOverlay(); //(@"Insert your key here!", @"C:\GoogleCache");
            googleOverlay.MapType = GoogleMapsMapType.Hybrid;
            winformsMap1.Overlays.Add(googleOverlay);
            layerOverlay.Layers.Add("Google",  googleOverlay);


            //==========================================================================
            // Add LayerOverlay : SampleData\\Data\\USStates.shp
            //==========================================================================
            ShapeFileFeatureLayer worldLayer = new ShapeFileFeatureLayer("D:\\ThinkGeo\\Map Suite Desktop Evaluation Edition 5.0\\Samples\\SampleData\\Data\\USStates.shp");
            worldLayer.ZoomLevelSet.ZoomLevel01.DefaultAreaStyle = AreaStyles.CreateSimpleAreaStyle( GeoColor.SimpleColors.Transparent, GeoColor.FromArgb(100, GeoColor.SimpleColors.Red));
            worldLayer.ZoomLevelSet.ZoomLevel01.DefaultAreaStyle.OutlinePen.LineJoin = DrawingLineJoin.Round;
            worldLayer.ZoomLevelSet.ZoomLevel01.ApplyUntilZoomLevel = ApplyUntilZoomLevel.Level20;

            LayerOverlay staticOverlay = new LayerOverlay();
            staticOverlay.Layers.Add("WorldLayer", worldLayer);

            winformsMap1.Overlays.Add(staticOverlay);
            //============================================================================
            // ...
     

The LayerOverlay  USStates.shp is not displayed. May be I miss something !


Regards,


Eric 



Hi Eric, 
  
 Your code have some errors. And you forget reprojection the USState data and set correct extent. 
  
 Please try this code: 
  
             winformsMap1.MapUnit = GeographyUnit.Meter; 
             winformsMap1.BackgroundOverlay.BackgroundBrush = new GeoSolidBrush(GeoColor.FromArgb(255, 198, 255, 255)); 
  
             LayerOverlay layerOverlay = new LayerOverlay(); 
  
  
             GoogleMapsOverlay googleOverlay = new GoogleMapsOverlay(); //(@"Insert your key here!", @"C:\GoogleCache"); 
             googleOverlay.MapType = GoogleMapsMapType.Hybrid; 
             winformsMap1.Overlays.Add(googleOverlay); 
  
             //========================================================================== 
             // Add LayerOverlay : SampleData\Data\USStates.shp 
             //========================================================================== 
             ShapeFileFeatureLayer worldLayer = new ShapeFileFeatureLayer(@"C:\Program Files (x86)\ThinkGeo\Map Suite Desktop Full Edition 5.0\Samples\SampleData\Data\USStates.shp"); 
             worldLayer.ZoomLevelSet.ZoomLevel01.DefaultAreaStyle = AreaStyles.CreateSimpleAreaStyle(GeoColor.SimpleColors.Transparent, GeoColor.FromArgb(100, GeoColor.SimpleColors.Red)); 
             worldLayer.ZoomLevelSet.ZoomLevel01.DefaultAreaStyle.OutlinePen.LineJoin = DrawingLineJoin.Round; 
             worldLayer.ZoomLevelSet.ZoomLevel01.ApplyUntilZoomLevel = ApplyUntilZoomLevel.Level20; 
  
             LayerOverlay staticOverlay = new LayerOverlay(); 
             staticOverlay.Layers.Add("WorldLayer", worldLayer); 
  
             winformsMap1.Overlays.Add(staticOverlay); 
  
             Proj4Projection proj4 = new Proj4Projection(); 
             proj4.InternalProjectionParametersString = Proj4Projection.GetEpsgParametersString(4326); 
             proj4.ExternalProjectionParametersString = Proj4Projection.GetGoogleMapParametersString(); 
             proj4.Open(); 
             worldLayer.Open(); 
  
             worldLayer.FeatureSource.Projection = proj4; 
             winformsMap1.CurrentExtent = worldLayer.GetBoundingBox(); 
              
             winformsMap1.Refresh(); 
  
 Regards, 
  
 Don

Thank you very much Don.

It works well with shape file USStates.shp.


 


 But if I put my own shape file in place of  USStates.shp and change the GPS point with one on my shape file, I don't see the layerOverlay !

 (removing GoogleMapsOverlay and reprojection on my shapefile data, my LayerOverlay displayed correctly)


May be the projection parameter  (EPSG 4326) is not correct ? 

How to know what is the right parameter according to the shape file used ?



Hello,


After many tests, I think I have a first problem with the GPS coordinates on which I center the map.

After removing the Google layer and without projection, the GPS point (located on my map) is displayed outside the map (see attached image after zooming out).


 I found the coordinates of this point by georeferencing an address on my map using google.

 What may be the explanation for this discrepancy?


Here is the code I use (no Google layer, no projection)



 WinformsMap.MapUnit = GeographyUnit.Meter
 WinformsMap.BackgroundOverlay.BackgroundBrush = New GeoSolidBrush(GeoColor.FromArgb(255, 198, 255, 255))

 '============================================================================
 Dim worldLayer As New ShapeFileFeatureLayer("P:\\Maps\\mylayer.shp")
 worldLayer.ZoomLevelSet.ZoomLevel01.DefaultAreaStyle = AreaStyles.CreateSimpleAreaStyle(GeoColor.SimpleColors.Transparent, GeoColor.FromArgb(100, GeoColor.SimpleColors.Red), 2)
 worldLayer.ZoomLevelSet.ZoomLevel01.DefaultAreaStyle.OutlinePen.LineJoin = DrawingLineJoin.Round
 worldLayer.ZoomLevelSet.ZoomLevel01.ApplyUntilZoomLevel = ApplyUntilZoomLevel.Level20

 Dim staticOverlay As New LayerOverlay()
 staticOverlay.Layers.Add("mylayer", worldLayer)

 WinformsMap.Overlays.Add(staticOverlay)

 '============================================================================

 ' This sets the zoom levels to map to Googles.  We next make sure we snap to the zoomlevels
 Dim pointLayer As New InMemoryFeatureLayer()
 pointLayer.Open()
 pointLayer.Columns.Add(New FeatureSourceColumn("Text"))
 pointLayer.Close()

 'Values in Longitude and Latitude.
 Dim Longitude As Double = 4.0505555
 Dim Latitude As Double = 44.0717963

 'Creates the feature made of a PointShape with the Longitude and Latitude values.
 Dim GPSFeature As New Feature(New PointShape(Longitude, Latitude))

 'Format the Longitude and Latitude into a nice string as Degrees Minutes and Seconds
 Dim LongLat As String = DecimalDegreesHelper.GetDegreesMinutesSecondsStringFromDecimalDegreePoint(GPSFeature)

 'Sets the InMemoryFeatureLayer to have it displayed with Square symbol and with text.
 GPSFeature.ColumnValues.Add("Text", LongLat)
 pointLayer.InternalFeatures.Add(GPSFeature)

 pointLayer.ZoomLevelSet.ZoomLevel01.DefaultPointStyle = PointStyles.CreateSimplePointStyle(PointSymbolType.Square, GeoColor.StandardColors.Red, GeoColor.StandardColors.Black, 2, 12)
 pointLayer.ZoomLevelSet.ZoomLevel01.DefaultTextStyle = TextStyles.CreateSimpleTextStyle("Text", "Arial", 12, DrawingFontStyles.Bold, GeoColor.StandardColors.Black, GeoColor.StandardColors.White, 3, -10, 10)
 pointLayer.ZoomLevelSet.ZoomLevel01.ApplyUntilZoomLevel = ApplyUntilZoomLevel.Level20

 Dim pointOverlay As New LayerOverlay()
 pointOverlay.Layers.Add("PointLayer", pointLayer)
 WinformsMap.Overlays.Add("PointOverlay", pointOverlay)

 Dim extendWidth As Double = 500000
 Dim extendHeight As Double = 500000
 WinformsMap.CurrentExtent = New RectangleShape((Longitude - extendWidth), (Latitude + extendHeight), (Longitude + extendWidth), (Latitude - extendHeight))

 WinformsMap.Refresh()


GPS_Point_Focus.JPG (6.52 KB)

Eric, 



Thanks for your code. 



I will have a look at it and update the post later. 



Regards, 



Don



Eric, 
  
 I think your problem is the MapUnit you are using is Meter. But your Longitude and Latitude of GPS point looks like under DecimalDegree. 
  
 I think before you set WinformsMap.CurrentExtent, you need reprojection your Longitude and Latitude. 
  
 Regards, 
  
 Don

Don,


Thank you very much for your help,I think you are right.


Please could you have a look at the attachement.


It seems now that the projection is not correctly applied to the layer of my shape file.


Does this come from my shapefile format ?

How can it be different from the USStates.shp ?

What can I check on these files ?

 



MapSuite_Layer_on_Google_Layer.pdf (281 KB)

Eric, 
  
 I have read your pdf file. 
  
 I have some questions want to make sure. 
  
 1. What’s your shape file for? It looks don’t like the USA states border. Does that some countries border? 
  
 2. Could you make sure your shape file’s projection? Sorry till now we cannot get the projection information directly from shape file. I think you should have a .prj file or documentation for that. 
  
 And if you thought that should be 4326, you can did a test like this, load your shape file and our USStates in MapSuiteExplorer, if your shape file in correct position compare with USStates, that should be 4326. 
  
 Regards, 
  
 Don

Thank you Don,


The shape file 'fr_dpt_region.shp' is FRANCE Departments border (almost like states for USA).


There is a  .prj file with the shape file :



PROJCS["NTF_France_II_degrees",GEOGCS["GCS_NTF",DATUM["D_NTF",SPHEROID["Clarke_1880_IGN",6378249.2,293.46602]],PRIMEM["Greenwich",0],UNIT["Degree",0.0174532925199432955]],PROJECTION["Lambert_Conformal_Conic"],PARAMETER["False_Easting",600000],PARAMETER["False_Northing",2200000],PARAMETER["Central_Meridian",2.337229166666667],PARAMETER["Standard_Parallel_1",46.8],PARAMETER["Scale_Factor",0.99987742],PARAMETER["Latitude_Of_Origin",46.8],UNIT["Meter",1]]

But I'm too newbie to understand the content !

 


In MapSuiteExplorer, I can't see USStates.shp and fr_dpt_region.shp at the same time, even zooming -.

I go from one to another by clicking on the layer + Track to extend.


In the state bar of MapSuiteExplorer, the coordonates are (sample for one point on the shape) :


USStates.shp :

101° 09' 33'' W  38° 55' 5''N   X: -101.1591  Y: 38.9179


fr_dpt_region.shp :

X: 599755.4377  Y: 2428757.9965


I can send you the shape file (< 1 Mo) by private messaging if it helps.

 



Eric, 
  
 Thanks for your information, I will help you to make sure the projection of your data later. 
  
 If that’s the border of France, you cannot see it together with USState unless zoom out many times. So don’t worry about this. 
  
 I think if you can mail your shape file will be helpful, you can sent that to support@thinkgeo.com and ask him forward to me. 
  
 Regards, 
  
 Don

Eric, 



Could you have a look at this post? 




gis.thinkgeo.com/Support/Dis...fault.aspx


 


 I think the customer's data use the same projection with you. 



And please let me know if his solution is helpful for you. 



Regards, 



Don



Eric, 
  
 About your projection, please try this code: 
  
 Proj4Projection proj4 = new Proj4Projection(); 
 proj4.InternalProjectionParametersString = Proj4Projection.ConvertPrjToProj4("PROJCS[&#34;NTF_France_II_degrees&#34;,GEOGCS[&#34;GCS_NTF&#34;,DATUM[&#34;D_NTF&#34;,SPHEROID[&#34;Clarke_1880_IGN&#34;,6378249.2,293.46602]],PRIMEM[&#34;Greenwich&#34;,0],UNIT[&#34;Degree&#34;,0.0174532925199432955]],PROJECTION[&#34;Lambert_Conformal_Conic&#34;],PARAMETER[&#34;False_Easting&#34;,600000],PARAMETER[&#34;False_Northing&#34;,2200000],PARAMETER[&#34;Central_Meridian&#34;,2.337229166666667],PARAMETER[&#34;Standard_Parallel_1&#34;,46.8],PARAMETER[&#34;Scale_Factor&#34;,0.99987742],PARAMETER[&#34;Latitude_Of_Origin&#34;,46.8],UNIT[&#34;Meter&#34;,1]]"); 
 proj4.ExternalProjectionParametersString = Proj4Projection.GetGoogleMapParametersString(); 
  
 Or you can search in these pages: 
  
 spatialreference.org/ 
 prj2epsg.org/search 
  
 Wish helpful. 
  
 Regards, 
  
 Don

Don,


This is the solution :

1) before proj4 need to set temporarily the thread CultureInfo to Invariant (as Puthirak said in his post)

     Otherwise, it throws an exception: Initialize Ellps Failed!. (it seems to be a bug related with culture info)

2) Use the prjString found in the *.prj file

and it works ... almost .


There is a slight gap between the Google layer and Layer, do you think it is possible to change the prjString to shift the layer correctly on the Google layer (see attachment) ?


Thanks to you !

 



Eric, 
  
 You can test change that, but I don’t think change the prjString is a good idea ,and it shouldn’t be easy to modify prjString and make it work well manual. 
  
 If your prj file is correct for the shape file, I think maybe we missed some points. 
  
 Could create a really simple sample include your France data file and your latest code then sent to us? 
  
 I think I can help you have a look at that and try to fix this if possible. 
  
 Regards, 
  
 Don

Don, 



I sent a sample at support@thinkgeo.com. 

 



Hello Don,


 ... just to know if you received the sample ?



Eric,  



I recieved your sample, sorry I haven't update the status in topic. We are busy yesterday, I will have a look at that when I get time today. 



Regards, 



Don 



 



Eric, 
  
 Sorry response you so late, I tested your code and make sure how you used it totally correct. 
  
 I think we can nearly make sure that’s because your prj file incorrect but cannot make sure that. 
  
 I will asked someone who is good at projection and update this post if we get progress. 
  
 Regards, 
  
 Don

Don, 
  Thank you for your work,  I am interested in expert advice. 
   Regards 


Eric, 
  
 Thanks for your reply, I think you will get update next week. 
  
 Regards, 
  
 Don