Thomas,
I compared the GoogleMapsOverlay and GoogleMapsLayer, actually the performance is very closest when I processed the pan, zoom in/out operations between these two classes. I'm not sure where is your problem? I just show you my test code both for the two classes below:
1, For GoogleMapsLayer:
private void Sample_Load(object sender, EventArgs e)
{
GoogleMapsLayer layer = new GoogleMapsLayer(@"ABQIAAAAX_L0oJKT0IU2n0u0qxcr3BR3rCYD_eVzP3e6DX1YTr2ah9RbohStaDJYLxi99hL16CJfmL4rjnw9wA", "C:\\ImageCache");
engine.StaticLayers.Add(layer);
RefreshMap();
}
private void RefreshMap()
{
Bitmap image = new Bitmap(pictureBox1.Width, pictureBox1.Height);
GoogleMapZoomLevelSet set = new GoogleMapZoomLevelSet();
double snappedScale = set.GetZoomLevel(currentExtent, image.Width, mapUnit).Scale;
RectangleShape snappedExtent = ExtentHelper.ZoomToScale(snappedScale, currentExtent, mapUnit, image.Width, image.Height);
engine.CurrentExtent = ExtentHelper.GetDrawingExtent(snappedExtent, image.Width, image.Height);
engine.OpenAllLayers();
engine.DrawStaticLayers(image, mapUnit);
if (pictureBox1.Image != null) { pictureBox1.Image.Dispose(); }
pictureBox1.Image = image;
}
private void panRight_Click(object sender, EventArgs e)
{
Stopwatch watch = new Stopwatch();
watch.Start();
currentExtent.TranslateByOffset(currentExtent.Width * 0.3, 0, GeographyUnit.Meter, DistanceUnit.Meter);
RefreshMap();
watch.Stop();
lblStopWatchTime.Text = string.Format("{0} ms", watch.Elapsed.TotalMilliseconds.ToString());
}
private void panLeft_Click(object sender, EventArgs e)
{
Stopwatch watch = new Stopwatch();
watch.Start();
currentExtent.TranslateByOffset(-currentExtent.Width * 0.3, 0, GeographyUnit.Meter, DistanceUnit.Meter);
RefreshMap();
watch.Stop();
lblStopWatchTime.Text = string.Format("{0} ms", watch.Elapsed.TotalMilliseconds.ToString());
}
private void panUp_Click(object sender, EventArgs e)
{
Stopwatch watch = new Stopwatch();
watch.Start();
currentExtent.TranslateByOffset(0, currentExtent.Height * 0.3, GeographyUnit.Meter, DistanceUnit.Meter);
RefreshMap();
watch.Stop();
lblStopWatchTime.Text = string.Format("{0} ms", watch.Elapsed.TotalMilliseconds.ToString());
}
private void panDown_Click(object sender, EventArgs e)
{
Stopwatch watch = new Stopwatch();
watch.Start();
currentExtent.TranslateByOffset(0, -currentExtent.Height * 0.3, GeographyUnit.Meter, DistanceUnit.Meter);
RefreshMap();
watch.Stop();
lblStopWatchTime.Text = string.Format("{0} ms", watch.Elapsed.TotalMilliseconds.ToString());
}
private void zoomIn_Click(object sender, EventArgs e)
{
Stopwatch watch = new Stopwatch();
watch.Start();
scaleNumber--;
if (scaleNumber < 0)
{
scaleNumber = 0;
}
currentExtent = ExtentHelper.ZoomToScale(baseNumber * Math.Pow(2, scaleNumber), currentExtent, GeographyUnit.Meter, pictureBox1.Width, pictureBox1.Height);
RefreshMap();
watch.Stop();
lblStopWatchTime.Text = string.Format("{0} ms", watch.Elapsed.TotalMilliseconds.ToString());
}
private void zoomOut_Click(object sender, EventArgs e)
{
Stopwatch watch = new Stopwatch();
watch.Start();
scaleNumber++;
if (scaleNumber > 19)
{
scaleNumber = 19;
}
currentExtent = ExtentHelper.ZoomToScale(baseNumber * Math.Pow(2, scaleNumber), currentExtent, GeographyUnit.Meter, pictureBox1.Width, pictureBox1.Height);
RefreshMap();
watch.Stop();
lblStopWatchTime.Text = string.Format("{0} ms", watch.Elapsed.TotalMilliseconds.ToString());
}
2, For GoogleMapsOverlay:
private void Sample_Load(object sender, EventArgs e)
{
GoogleMapsOverlay overlay = new GoogleMapsOverlay(@"ABQIAAAAX_L0oJKT0IU2n0u0qxcr3BR3rCYD_eVzP3e6DX1YTr2ah9RbohStaDJYLxi99hL16CJfmL4rjnw9wA"); overlay.CacheDirectory = "C:\\ImageCache";
LayerOverlay layerOverlay = new LayerOverlay();
ShapeFileFeatureLayer shapeLayer = new ShapeFileFeatureLayer(@"..\..\SampleData\cntry02.SHP");
Proj4Projection projection = new Proj4Projection(); projection.InternalProjectionParametersString = Proj4Projection.GetEpsgParametersString(4326);
projection.ExternalProjectionParametersString = Proj4Projection.GetEsriExtraParametersString(900913); shapeLayer.FeatureSource.Projection = projection; shapeLayer.ZoomLevelSet.ZoomLevel01.ApplyUntilZoomLevel = ApplyUntilZoomLevel.Level20;
shapeLayer.ZoomLevelSet.ZoomLevel01.DefaultAreaStyle.OutlinePen.Color = GeoColor.FromArgb(32, 0, 0, 0);
shapeLayer.ZoomLevelSet.ZoomLevel01.DefaultAreaStyle.FillSolidBrush.Color = GeoColor.FromArgb(16, 255, 0, 0);
shapeLayer.Open();
layerOverlay.Layers.Add(shapeLayer);
winformsMap1.Overlays.Add(overlay);
winformsMap1.Overlays.Add(layerOverlay);
winformsMap1.MapUnit = GeographyUnit.Meter;
winformsMap1.ZoomLevelSnapping = ZoomLevelSnappingMode.Default;
winformsMap1.ZoomLevelSet = new GoogleMapZoomLevelSet();
winformsMap1.ThreadingMode = MapThreadingMode.SingleThreaded;
RefreshMap();
}
private void RefreshMap()
{
GoogleMapZoomLevelSet set = new GoogleMapZoomLevelSet();
double snappedScale = set.GetZoomLevel(currentExtent, winformsMap1.Width, mapUnit).Scale;
RectangleShape snappedExtent = ExtentHelper.ZoomToScale(snappedScale, currentExtent, mapUnit, winformsMap1.Width, winformsMap1.Height);
winformsMap1.CurrentExtent = ExtentHelper.GetDrawingExtent(snappedExtent, winformsMap1.Width, winformsMap1.Height);
winformsMap1.Refresh();
}
private void panUp_Click(object sender, EventArgs e)
{
Stopwatch stopWatch = new Stopwatch();
stopWatch.Start();
winformsMap1.Pan(PanDirection.Up, 30);
winformsMap1.Refresh();
stopWatch.Stop();
lblStopWatchTime.Text = string.Format("{0} ms", stopWatch.Elapsed.TotalMilliseconds.ToString());
}
private void panDown_Click(object sender, EventArgs e)
{
Stopwatch stopWatch = new Stopwatch();
stopWatch.Start();
winformsMap1.Pan(PanDirection.Down, 60);
winformsMap1.Refresh();
stopWatch.Stop();
lblStopWatchTime.Text = string.Format("{0} ms", stopWatch.Elapsed.TotalMilliseconds.ToString());
}
private void panLeft_Click(object sender, EventArgs e)
{
Stopwatch stopWatch = new Stopwatch();
stopWatch.Start();
winformsMap1.Pan(PanDirection.Left, 30);
winformsMap1.Refresh();
stopWatch.Stop();
lblStopWatchTime.Text = string.Format("{0} ms", stopWatch.Elapsed.TotalMilliseconds.ToString());
}
private void panRight_Click(object sender, EventArgs e)
{
Stopwatch stopWatch = new Stopwatch();
stopWatch.Start();
winformsMap1.Pan(PanDirection.Right, 30);
winformsMap1.Refresh();
stopWatch.Stop();
lblStopWatchTime.Text = string.Format("{0} ms", stopWatch.Elapsed.TotalMilliseconds.ToString());
}
private void zoomIn_Click(object sender, EventArgs e)
{
Stopwatch stopWatch = new Stopwatch();
stopWatch.Start();
scaleNumber--;
if (scaleNumber < 0)
{
scaleNumber = 0;
}
currentExtent = ExtentHelper.ZoomToScale(baseNumber * Math.Pow(2, scaleNumber), winformsMap1.CurrentExtent, GeographyUnit.Meter, winformsMap1.Width, winformsMap1.Height);
RefreshMap();
stopWatch.Stop();
lblStopWatchTime.Text = string.Format("{0} ms", stopWatch.Elapsed.TotalMilliseconds.ToString());
}
private void zoomOut_Click(object sender, EventArgs e)
{
Stopwatch stopWatch = new Stopwatch();
stopWatch.Start();
scaleNumber++;
if (scaleNumber > 19)
{
scaleNumber = 19;
}
currentExtent = ExtentHelper.ZoomToScale(baseNumber * Math.Pow(2, scaleNumber), winformsMap1.CurrentExtent, GeographyUnit.Meter, winformsMap1.Width, winformsMap1.Height);
RefreshMap();
stopWatch.Stop();
lblStopWatchTime.Text = string.Format("{0} ms", stopWatch.Elapsed.TotalMilliseconds.ToString());
}
You can see I set the StopWatch object to record cost time for each operation on the map, the cost time is very closest for each operation between the GoogleMapsOverlayer and GoogleMapsLayer. You can test the performance for these 2 google extension classes used the code above. If you still find any problems please let me know again,
Thanks,
Scott,