ThinkGeo.com    |     Documentation    |     Premium Support

Offset in pre-generated tiles

Hi,



I am pre-generating tiles for caching (using code I found in this forum – “TileCache strategy”).

Tiles are generated ok, but with a little X-offset. I only have this problem when I am reprojecting map to Mercator.

When I am not using pre-generated tiles, but only cache enabled, tiles are generated without any offset.



Hope you can help,

Vicky


Wrong image (using pre-generated tiles):


Correct Image (regular bitmap cache):



 Hi Vicky,


 
I created a sample with pre-generating the cache in meter unit, but it works fine on my machine. Please see the attached sample. I think their might be some thing in the code causes this result; please show us the sample code if possible and we will check for you or compare with my code if there is anything help.
 
Thanks,
Howard

Post9995.zip (16.4 KB)

Hi,


Please see attached sample code.


Vicky


 



Hi Vicky, 
  
 I checked your sample and I found it’s the wrapping world property affects the cache. But we haven’t fixed this issue yet, just let you know we are tracking this issue and let you know when we have a good solution these days. 
  
 Thanks, 
 Howard

Hi Howard,


Thank you for your help. I generated tiles without wrapping world property and it works perfect.


I have another question - Do you know if PopupOverlay supports wrapping?


Vicky


 



Spoke too soon. Generating tiles without wrapping and then use them with wrapping mode, does not work.

Do you know when the fix will be available?

I can’t continue to evaluate map control without caching and wrapping.


Vicky


 


 



Hi Vicky,  



We are still tracking this issue for using pre-generated caches in wrapping world mode. I think we can have a solution next Monday or Tuesday.  



The popup overlay doesn't support wrapping for now. You know the popup is a content control which accepts an object content; users can set any thing like string, image, user control and compound control. Most of these object cannot be cloned as a normal way, so we cannot make the popup wrapping the world. Hope it makes sense. 



Thanks and let you know when the cache issue is done. 

Howard



 Hi Vicky,


 
The issues is fixed. Please download the version 5.5.80.0 tomorrow and test. General speaking, the issue is caused by the tiling system is not exactly the same as the cache tiling system we used in wrapping dateline mode. In wrapping dateline mode, there must be some limits like the tiling system's max extent's width and height should be integer time of current world extent, but the default value we used to pre-generate cache is not matched. These two tile systems are not the same so that the issue exists.
 
Please see my commends in the attached sample in mapcontrol.xaml.cs and generatetiles.cs; hope it helps.
 
Thanks,
Howard

002_001_TestShapeFile.zip (14.2 KB)

Hi Howard,


Thanks,

It is working now.


I have another question:

What is a best approach to display hundreds clickable icons?

I was considering to use PopupOverlay, but icons have to wrap around the world.


Vicky


 



 Hello Vicky,


 
We have two ways to deal with large numbers of markers.
 
One way is add the markers to high zoomlevel to prevent load all markers at the beginning. For example, zoomlevel1-10, show your inmemoryfeaturelayer, and zoomlevel 11-20 show your markers, just make sure at the first time of map load, doesn't load the zoomlevel of your markers exist. 
 
Here is some code you can see:

InMemoryMarkerOverlay markerOverlay = new InMemoryMarkerOverlay();
                Marker marker = new Marker(-118, 30);
                marker.WebImage = new WebImage("../../theme/default/samplepic/circle.png");
                markerOverlay.Features.Add("Feature1", new Feature(-118, 30));
                markerOverlay.ZoomLevelSet.ZoomLevel11.DefaultMarkerStyle.WebImage.ImageWidth = 21;
                markerOverlay.ZoomLevelSet.ZoomLevel11.DefaultMarkerStyle.WebImage.ImageHeight = 25;
                markerOverlay.ZoomLevelSet.ZoomLevel11.DefaultMarkerStyle.WebImage.ImageOffsetX = -10.5f;
                markerOverlay.ZoomLevelSet.ZoomLevel11.DefaultMarkerStyle.WebImage.ImageOffsetY = -25f;
                markerOverlay.ZoomLevelSet.ZoomLevel11.ApplyUntilZoomLevel = ApplyUntilZoomLevel.Level20;

Then you just need to make sure your Map.CurrentExtent is not in the zoomlevel 11-20, otherwise ,improve your zoomlevel to 15-20 etc.


 
Another way is use the Inmemoryfeaturelayer simulate the marker, use InmemoryFeatureLayer + Click event to make this.
 
 First create the InMemoryFeatureLayer and set it's default pointshape style as same as your marker image.

private void DisplayMap_Load(object sender, EventArgs e)
        {
            winformsMap1.MapUnit = GeographyUnit.DecimalDegree;
            winformsMap1.CurrentExtent = new RectangleShape(-155.733, 95.60, 104.42, -81.9);

            WorldMapKitWmsDesktopOverlay worldMapKitOverlay = new WorldMapKitWmsDesktopOverlay();
            winformsMap1.Overlays.Add(worldMapKitOverlay);
            InMemoryFeatureLayer inmemoryFeatureLayer = new InMemoryFeatureLayer();
            inmemoryFeatureLayer.ZoomLevelSet.ZoomLevel01.DefaultPointStyle = new PointStyle(new GeoImage(Properties.Resources.AQUA)); 
            inmemoryFeatureLayer.ZoomLevelSet.ZoomLevel01.ApplyUntilZoomLevel = ApplyUntilZoomLevel.Level20;

            LayerOverlay markerOverlay = new LayerOverlay();
            markerOverlay.Layers.Add(inmemoryFeatureLayer);
            winformsMap1.Overlays.Add("MarkerOverlay", markerOverlay);
            winformsMap1.Refresh();
        }

 Then, the Click event to help you find the marker and do something.

private void winformsMap1_MapClick(object sender, MapClickWinformsMapEventArgs e)
        {
            LayerOverlay markerOverlay = (LayerOverlay)winformsMap1.Overlays["MarkerOverlay"];
            InMemoryFeatureLayer inmemoryFeatureLayer = markerOverlay.Layers[0] as InMemoryFeatureLayer;
            inmemoryFeatureLayer.InternalFeatures.Clear();
            MultipolygonShape buffer = e.WorldLocation.Buffer(350, GeographyUnit.DecimalDegree, DistanceUnit.Kilometer);
            Collection<Feature> clickedMarker = inmemoryFeatureLayer.QueryTools.GetFeaturesWithin(buffer, ReturningColumnsType.NoColumns);
            if (clickedMarker.Count > 0)
            {
                Collection<Feature> features = winformsMap1.FindFeatureLayer("WorldLayer").FeatureSource.GetFeaturesNearestTo(new PointShape(e.WorldLocation.X, e.WorldLocation.Y), GeographyUnit.DecimalDegree, 10, ReturningColumnsType.AllColumns);
                //do anything you want to do, like hight it, change the color, show some tooltip.
            }

            winformsMap1.Refresh();
        }

 
I hope this can help you.

Regards,

Gary