ThinkGeo.com    |     Documentation    |     Premium Support

Wrap dateline not matching up correctly

Hello,


I am currently testing out mapsuite to replace a current GIS application which has been developed for Pacific Island Countries. The reagion falls right on the dateline, so this functionality is very important for us. I have been setting up an app which brings in google imagery and overlays shapefiles with data which is thematically mapped. I have noticed that along the dateline the wrap isnt correct and parts of countries are missing from the google imagery. My shape polygons are also cropped.


Here is my code to load google maps:


 // MAP UNITS AND COORDS

            wpfMap1.MapUnit = GeographyUnit.Meter;

            wpfMap1.CurrentExtent = new RectangleShape(17897271, -1367305, 19514067, -2411741);//(17897271, -1367305, 19514067, -2411741);

            wpfMap1.MapTools.MouseCoordinate.IsEnabled = true;

            wpfMap1.MapTools.MouseCoordinate.MouseCoordinateType = MouseCoordinateType.LatitudeLongitude;

            wpfMap1.BackgroundOverlay.BackgroundBrush = new GeoSolidBrush(GeoColor.StandardColors.White);

            wpfMap1.MapTools.PanZoomBar.HorizontalAlignment = System.Windows.HorizontalAlignment.Right;


 //OPEN GOOGLEMAP

                GoogleMapsLayer googleMapLayer = new GoogleMapsLayer();

                LayerOverlay googleOverlay = new LayerOverlay();

                googleOverlay.Layers.Add(googleMapLayer);

                googleOverlay.WrappingMode = WrappingMode.WrapDateline;

                //GoogleMapsOverlay googleOverlay = new GoogleMapsOverlay();

                googleOverlay.DrawTilesProgressChanged += new System.EventHandler<DrawTilesProgressChangedTileOverlayEventArgs>(googleOverlay_DrawTilesProgressChanged);

                //googleOverlay.WebProxy = System.Net.WebProxy.GetDefaultProxy();

                //googleOverlay.CacheDirectory = @"C:\temp\GEMapLayerCache1";

                googleMapLayer.WebProxy = System.Net.WebProxy.GetDefaultProxy();

                googleMapLayer.CacheDirectory = @"C:\temp\GEMapLayerCache1";

                googleMapLayer.MapType = GoogleMapsMapType.Satellite;

                //googleOverlay.IsVisible = false;

                googleOverlay.Name = "GE";

                wpfMap1.Overlays.Add("GE", googleOverlay);

                wpfMap1.Overlays.MoveToBottom("GE");

                wpfMap1.Refresh();


 


If you look at the eastern part of Fiji you can see that some of the country is missing. If you are unable to replicate this error then i am happy to send the whole sample applications.


thanks


Phil



 Phil,


Sorry for delay.


We have recreated your problem by using the sample code you provided, it's obviously a bug that some part of island is being cut off from screen-shot I attached, however I did some research but couldn't fix it immediately, I check our source code and found that we use RectangleShape(-20001365, 20001365, 20001365, -20001365) to represent the whole world extent in meter map unit, I am not sure it's exactly the same as RectangleShape(-180, 90, 180, -90) in decimal degree. If you have some note to help us solve the problem please let me know.


And we are still working on it, and progress I will let you know.


James



Hello James,


Thanks for your quick reply. There must be a built in wrapping extent on google, bing, OSM layers no? In your response you said "however I did some research but could fix it immediately". So you "could" fix it? 


On a slightly different question, i have my map coordinates in google mercator because i couldnt get it to work any other way. How can i keep my map in WGS84 and translate my google, bing, OSM layers?


thanks


Phil



 Phil,


I made mistake and I have modified it, it should be “couldn’t”.


Our developer team has found the root cause but still researching the solution, it’s due to the MaxExtent for Google maps and we need to modify our GoogleMapsLayer to fix it. Wrapping Data Line may have the same problem for the other layer which using meter as map unit, we will review them and fix the bug as well.


I am glad you have more different question, the more questions you have, the better for you to get familiar with our MapSuite product. 


We can set projection in all FeatureLayer to keep the map in WGS84, we provide dozens feature layers,  such as ShapeFileFeatureLayer, MsSql2008FeatureLayer, InMemoryFeatureLayer, however we also have some other type of layer, RasterLayer and some special layers, such as google, bing or OSM, their data are not geometry, many of them are images so that we couldn’t convert them to WGS84 that display them in decimal degree map unit, unless the original data are WGS84, but Google only provide Mercator map.


So usually, if you want to use google map as background map, you will use our Projection object make you own data to the same map unit, about projection, we have HowDoI samples which you can find it easy to do it by using our API.


Thanks,


James




Phil, 
  
 The bug had been fixed, please get the latest daily build from the development branch (5.0.45.0 or later) to have another try.  
  
 Any more questions please let us know, 
  
 Thanks, 
  
 Scott,

Hello Scott, 
  
 That is great news! I am having problems updating the dlls. Is there a correct procedure i should use? Do i simply copy them over the ones i currently have in the Developer Reference folder? When i do this i get build errors. 
  
 thanks 
  
 Phil

I think i found another bug. When i set custom zoom levels the tiling for google/OSM/bing gets all stuffed up. I used an example similar to what i found on another thread: 
  
 ZoomLevelSet newZoomLevelSet = new ZoomLevelSet(); 
             double maxScale = 50000000; 
             for (int i = 0; i < 20; i++) 
             { 
                 newZoomLevelSet.CustomZoomLevels.Add(new ZoomLevel(maxScale)); 
                 maxScale = maxScale / 2; 
             } 
  
             wpfMap1.ZoomLevelSet = newZoomLevelSet; 
  
 Phil

Phil, 
  
 Update the dlls is pretty simple, like you mentioned that just put new dlls to your development reference folder and overrides the old ones, could you tell me what the errors you encounter? And also let me know the file version of dll include the old one and the new one. 
  
 About another bug, could you provide a screen-shot that we could know what happened. 
  
 Thanks, 
 James 


James,



I restarted visual studio and it seems to run now. I cant get the dateline imagery to stitch up properly though. I downloaded :WpfDesktopEditionEvaluation5.0.0.45DllPackage.zip



Could you please provide some same code with wrapping extents that you used to get it to work.



In regards to the zoomlevelset error, i found that if i use the following there is no problem:



 ZoomLevelSet zoomLevelSet = new ZoomLevelSet();

 


          for (int i = 3; i <= 18; i++)

            {

                ZoomLevel level = new ZoomLevel(wpfMap1.ZoomLevelScales);

                zoomLevelSet.CustomZoomLevels.Add(level);

            }

            wpfMap1.ZoomLevelSet = zoomLevelSet;



But if i change the maxscale then create custom zoomlevels as in my previous example that the tiles look like the attached image.



thanks.



Phil




 Phil,



 


I am glad it’s working with you.


 


We did change for max extent for meter and feet, 


The old value:


        maxExtentForMeter = new RectangleShape(-20001365, 20001365, 20001365, -20001365);


        maxExtentForFeet = new RectangleShape(-65621310, 65621310, 65621310, -65621310);


The new value:


       maxExtentForMeter = new RectangleShape(-20037376, 20026376, 20037376, -20026376);


       maxExtentForFeet = new RectangleShape(-65739422, 65739422, 65739422, -65739422);


 


And also I provide a method that adjusts extent for wrapping data line:


private RectangleShape AdjustExtentForWrapDateline(RectangleShape targetDrawingExtent)


        {


            double left = targetDrawingExtent.UpperLeftPoint.X;


            double right = targetDrawingExtent.UpperRightPoint.X;


            RectangleShape worldFullExtent = GetWorldFullExtent();


            if (left < worldFullExtent.UpperLeftPoint.X && right <= worldFullExtent.UpperLeftPoint.X)


            {


                while (left < worldFullExtent.UpperLeftPoint.X && right <= worldFullExtent.UpperLeftPoint.X)


                {


                    left += worldFullExtent.Width;


                    right += worldFullExtent.Width;


                }


            }


            else if (left >= worldFullExtent.UpperRightPoint.X && right > worldFullExtent.UpperRightPoint.X)


            {


                while (left >= worldFullExtent.UpperRightPoint.X && right > worldFullExtent.UpperRightPoint.X)


                {


                    left -= worldFullExtent.Width;


                    right -= worldFullExtent.Width;


                }


            }


            if (right > worldFullExtent.UpperRightPoint.X)


            {


                left -= worldFullExtent.Width;


                right -= worldFullExtent.Width;


            }


            return new RectangleShape(left, targetDrawingExtent.UpperLeftPoint.Y, right, targetDrawingExtent.LowerLeftPoint.Y);


        }


 


Let me know if you have more questions.


 


Thanks,


James



James,


Using the max extents you provide i am still having wrapping problems. See the attached image for Fiji. I cleared the cache.


Phil


 




Hi Phil, 
  
 I have posted this issue again to our development team, any progress I will let you know. 
  
 Thanks, 
 James

Hi Support, 
  
 Has the max wrapping extent changed? Using the parameters as defined in James’ message above leaves a gap. I use 
  
        double WrapExtentMinX = -20001365; 
        double WrapExtentMaxY = 20001365;
        double WrapExtentMaxX = 20001365; 
        double WrapExtentMinY = -20001365; 
 
 and it is a little better, but still doesn’t line up correctly. Google mercator is my projection. How can this keep changing all the time? Is it possibly to have a property which returns the max extent? 
  
 thanks 
  
 Phil

Hello Phil, 
  
 I got response from development team, this issues has fixed, could you please try to get the latest dlls and have another try? 
  
 Please let me know if it’s still not working, I can check it again. 
  
 Regards, 
  
 Gary

Hello Gary, 
  
 Thanks for your reply. Using the latest build i still get the same error. What wrapping extents should I now be using? How is it not possible to have a property which automatically returns the max extent? 
  
 Phil

Hi Gary, could you please check again. 
  
 thanks 
  
 Phil

Hi Phil,


Sorry for the long time delay, this bug has been fixed one month ago, but there is something wrong of the communication between the develop team and us. In order to take the advantage of the bug fixing, please get the latest dlls 6.0.126.0 or later and change the value 



        double WrapExtentMinX = -20001365; 
        double WrapExtentMaxY = 20001365;
        double WrapExtentMaxX = 20001365; 
        double WrapExtentMinY = -20001365; 

to



        double WrapExtentMinX = -20037508; 
        double WrapExtentMaxY = 20037508;
        double WrapExtentMaxX = 20037508; 
        double WrapExtentMinY = -20037508; 

and the image will be correct,



Hope it helps,


Edgar