我现在用GDI+实现了地图的显示,平移,缩放等功能,但是当地图的数据量过大时地图的显示,平移和缩放会变得非常慢,几乎让人难于接受。我担心我在实现上面的功能时有些思路不正确。现将我的实现方法和我的疑问写在下面,欢迎高手莅临指正。实现方法:
1.读取地图数据,将点和线以及他们的属性信息解析出来,存储在点和线的对象中。
2.遍历对象中的每一个点和线,计算它们的坐标,然后显示出来。
3.平移时,我的做法是坐标系不变,重新计算各个点的坐标,将它们显示出来,在mousemove事件中用 了this.panel1.Invalidate()语句来刷新地图。
4.实现缩放时,改变比例尺Scale,然后调用this.panel1.Invalidate()来刷新地图我的疑问:
1.GDI+中有没有画点的函数?我使用g.FillEllips()方法来实现的。
2.平移和缩放时,我的实现方法是坐标系不变,重新计算各点的坐标,然后显示,不知道各位高手是用什么方法实现平移的?
3.我还实现了拖动的功能,可以拖动点和线,但是我每次都使用了this.panel1.Invalidate()来刷新地图,这样会使显示速度变慢,但我不知道如何得到需要刷新的区域,如果只对需要刷新的区域重绘,速度定然快了许多。
4.在显示点和线时,每个点和线都是用g.FillEllips()和g.drawline()来实现的,这样是不是会降低显示速度?该如何改进呢?
5.缩放时,我没有使用g.ScaleTransform()方法,而是使用了一个全局变量Scale,然后计算坐标来实现的。因为使用了g.ScaleTransform()后,点的大小会随着比例尺的大小而改变,这不是我想要的。我以前没有做过图形编程,看的资料也少,我的实现方法都是自己想出来的,有些地方肯定走了很大的弯路,在此恳请各位前辈高人不吝赐教。

解决方案 »

  1.   

    何必自己写呢,用GIS的控件不是更好。
      

  2.   

    3、this.panel1.Invalidate()会降低效率,
     bmp_bay_map = New Bitmap(800, 900) '(Me.Pl_bay_map.Width, Me.Pl_bay_map.Height) 
            bmpgraphics_bay_map = Graphics.FromImage(bmp_bay_map)
            Me.Pl_bay_map.BackgroundImage = bmp_bay_map
    ……
    bmpgraphics_bay_map.DrawString(bay_col_cabin, Me.Font, Brushes.Black, distolefe + col_count * 10 + 20 * (j - strsmallcol + strcon) + 3, distotop + board_height + 40 + (big_row_cabin - small_row_cabin + 1) * 20 + 1 + 20) '贝列
    ……
    Me.Pl_bay_map.Refresh()
      

  3.   

    Bitmap对象有SetPixel方法,可以直接画点,用其它方法速度会慢很多
      

  4.   

    To lovebanyi(风云 .NET) 
       我设置了一个剪切矩形,就是this.panel1.Bounds,算不算是只显示了该显示的部分,还有更好的办法得到需要加载的那一部分内容吗?
      

  5.   

    .
    以前在C++ builder 里初步学作过,用的是Bitmap.