silverlight做一个地图应用

第一步,把shp文件导入到sqlserver里。在这里,我使用了sharpmap的库,非常之简单,一下子就导入进去了。导入进去表里,有四个字段,分别记录了一个矢量图形的上下左右四个顶点。在展示地图的时候,通过where语句,把在视野内的矢量对象读取出来就可以了。好么,这个彻底摧毁了我对空间数据库的神秘感,我甚至怀疑这是不是太山寨了。
说到这里,我估计大家谁都会读取地图数据了.下一步,把读出来的矢量数据传给silverlight.这个也简单,webclient,轻松加愉快,不再废话。
然后,由silverlight进行绘图。人家silverlight干这个可是专业的,不过,这里问题来了,我小结下来问题:
对于上海市地图那如同蜘蛛网一样的路线,直接在前台线程里绘图,那你就完了。浏览器会直接挂死的。


方案一:异步绘图。我是分析传过来的矢量数据之后,不断地生成UIELEMENT对象,然后追加到Canvas画布上的。这里需要使用异步,也就是dispatcher.begininvoke() 来一次生成一个UIELEMENT,然后追加上去。追加完后,如果还有未生成的矢量图形,那么就马上再次调用begininvoke,直到绘制结束。
这样有个问题,就是地图确实是响应速度快了,但是会看到一个一个得元素如同在实时绘画一般地一个一个画上去,速度确实不够快。不过效果很酷,呵呵
方案二:在后台线程中,生成xaml,然后一次性解析并呈现。经比较,让silverlight解析xaml的表现,明显比动态添加uielement的表现强非常多。这也算是一个小发现。使用方案二,就可以解决绘图效率问题。

问题二,数据传输的问题。上海地图会传输非常大量的矢量数据过去。我抓包后看,发现这些文本信息的字节数居然比图片还大 。这下我真的囧了,本来以为文本比图片小,没想到居然倒了过来。不过我们熟悉asp.net的人自然会马上想到解决办法:gzip压缩。呵呵,这个简单,马上上网,抄了一段代码贴进去,哈哈,马上压缩掉70%。
问题三,我们是否需要传输那么多的矢量点?由于我搞来的shp文件,精度很高,所以,在缩放比很大的时候,有些点传输了也没有意义啊,因为根本就是都被压缩到一个像素里去了。而且那些点的经纬度精确到了8位小数,但是事实上,对于像素来讲,一般精确到3-4位小数就足够了,所以服务器在传数据的时候,完全可以压缩掉这些信息。这样,传输的数据量就更小了。现在经压缩,数据量已小于图片的数据量。而且是放的越大越小,和图片正好相反。
现在还有问题是:服务器暂时无法利用缓冲,因为每次查询的经纬度都不同,导致无法根据查询字符串进行cache。 每次取数都要查询20个图层,也就是进行20次数据库查询,暂时没有想出好的解决办法。
现在的进度是,正在制作客户端地图编辑工具。
效果见图:

silverlight做一个地图应用
目前阶段性成果可以在这里看到 http://211.136.156.198/newGIS
呵呵,别的我不说,至少地图呈现的效果已经接近bing地图了,嘿嘿,反正比公司买的那两个引擎都要强很多。
注意,这个地址可能不久后就会失效。还有服务器可能压力过大,请大家不要把地址传出去啊,谢谢

在项目中使用silverlight的好处确实很多,原来要写N多js的东西,轻轻松松就解决了,而且反正在项目中使用,也不用去考虑什么网站用户没安装silverlight之类的,嘿嘿。

你可能感兴趣的:(silverlight)