受到上次写的“在Google Earth上显示等高线”(镜像1,镜像2)的启发,写了个动态实现在Google Earth中显示中国城市和机场,效果见最下面的图。也可以打开Google Earth后,在临时目录添加一个地址为:http://www.sharesh.cn/chinacity/index.asp? 的network link,或者下载此KML文件:https://files.cnblogs.com/Tangf/ChinaCity.zip(如果使用KML文件打开,暂且发现一个BUG,第一次打开左侧ChinaCity文件夹可能不更新,需要在左侧的ChinaCity文件夹上面右键refresh一下,暂时还没搞清楚具体原因,大概是代码的问题吧,如果知道的高人请告之一下。其实KML也就是包了一个network link,只是没有让你手工操作罢了)
本来是想做成中国城市和机场天气地图的,但能力有限暂且先发个功能性的预览,后面再补充吧。我也终于明白了EEmap的中文导航插件和图拼地球插件(在首页右下角的站点公告中)的原理了,而当年我是多么的羡慕和不解啊。
至于原理呢,其实很简单,就是动态生成KML,不管你使用什么语言来动态生成。KML文件我见到很多,但都是死的文件,不能增加删除更新,要更新则重新生成新的KML文件,所以对这样的文件我是没有任何兴趣的。而现在使用动态语言生成KML则彻底解决了这个问题,当然这里的关键在于,GE能够使用viewRefreshMode来让network link自动刷新。同时,Google Earth的network link是可以返回BBOX参数的,而BBOX参数其实反应了GE当前视图中四个角的坐标,那么我们就可以根据范围来动态显示KML了,而不需要一次性全部生成,并且根据经纬度差可以让其按照比例来显示数据。
OK,我们以本文中的ASP文件并抛开GE使用IE浏览器来说明原理。根据上一段所说,很明显能够看出,在没有运行代码以前就是添加一个network link的KML(具体KML请看此连接:http://www.sharesh.cn/chinacity/index.asp?),运行代码以后也就是运行GE后就开始生成具体的Point数据(请看此链接:http://www.sharesh.cn/chinacity/index.asp?BBOX=121,31,121.5,31.5),这是一个经度为121-121.5和纬度为31-31.5的范围(其实也差不多就是上海的中心城区)内生成的KML文件,可以看到有机场、城市和县级市。另外我也做了分级控制,3度范围以上不显示数据,只显示“请放大地图”,3度范围开始显示城市,2度范围开始显示机场,1度范围开始显示显级市,分级显示有利于地图上不显示的太多太杂乱,所以,如果你使用这样的BBOX=120,30,122,32,只能显示城市了。另外KML也支持地图样式,在KML的前半部分就能看到样式的KML代码,我专门做成了独立的文件来控制(连接:http://www.sharesh.cn/chinacity/stylemap.asp,直接打开仅仅看到文字,如果查看源文件就可以看到XML格式的数据了)。要点差不多说完了,不知道有没有说清楚,我想应该也不复杂。
整个过程中发现的一个怪异现象是,如果我不把第一句<?xml version="1.0" encoding="UTF-8"?>放在第一行的话,GE是无法打开动态链接的,并且显示在network link文件夹中间的小点是深紫色的,为这一个无意的错误我翻遍了Google都没有找到答案,中间的过程是艰辛的:首先由于没有任何的提示信息,所以我无法去Google关键字,于是我想通过GE的network link文件夹的不同状态来查原因,但是我也找遍了Google,翻看了所有GE的KML的教程等等,都没有找到GE的network link文件夹不同状态的说明,这一点我真是够昏死的,在这上面折腾了我一个多小时。没有办法我回忆所有的代码,并在浏览器中不断查看,没有任何问题,重启电脑也不行,最后远程到服务器,让他执行看看,服务器上的GE是一个低版本的,但打开链接后有一个无关痛痒的提示,好像是说XML什么的,于是再Google,没有任何KML和GE的,不过通过这些的查找,在一个英文论坛中大概是说了一下关于头上面的XML开始要从头开始连接什么的,回想我也确实将这个头给回车了一行,于是将XML头放在第一行,结果就真的通过了,GE的network link文件夹也显示绿色的正常图标了,一看时间也差不多要晚上两点了。虽然说最后问题还是解决了,但我不知道为什么我找不到解决这样问题的资料,纳闷也是够晕的。
最后不做总结了,写一下下一步的打算吧。
1.使用Google weather api让城市和机场显示天气信息,其实就是读取和解析Google提供的天气的XML文件并将内容重新组织到description中。
关于Google weather api推荐几篇Google上搜索到的文章:Google Weather API调用说明(一看这个基本上就知道怎么用了,我想用的是通过坐标的方式来生成天气预报),利用prototype和GOOGLE的weather api做天气预报(一看就是JS加HTML,你只要将代码贴到HTML文件中打开就可以看到效果了),使用Google Weather API查询天气预报(提供了C#代码),Animaonline Weather API(直接将API封装到dll中,你就可以直接用他的API了,还提供了WINCE版本)
如果有程序员感兴趣,可以帮我写一个读取天气的function:getWeather(X,Y) as String,也好让我直接调用。不过我也担心远程得到weather XML的速度慢而影响整个KML生成的速度。
2.如果可能,将ASP转换成PHP版本,毕竟PHP+MYSQL的效率要比ASP+ACCESS的效率高很多。再说我有国外的Dreamhost空间那,不用也是浪费。当然,这篇文章也许是非常好的参考:使用 PHP 和 MySQL 创建 KML
3.既然整个流程走通了,那要不做成一个开源的项目?大致分为三个部分:
a,数据库结构。数据结构的差异对于速度也有很大的影响,并且后期加入线和面那字段如何组织。现在总共才2000多条数据,所以用ACCESS也体现不出太大的效率差异。
b,WEB程序。相当于发布平台,那么如何让平台灵活,比如只要某一类的对象,比如如何使用搜索,这些也许是将来需要考虑的高级问题。
c,原始数据导入到数据库中。支持通用的MIF/MID、GPX、KML导入到数据库中。顺便也把MIF/MID和GPX和KML的互导也做了好了。
有兴趣的朋友可以加入。
4.使用Google Earth插件和API在WEB平台上发布数据,或者结合Google Map API来发布数据。
想多了,但看来可以走的路还很长。我这么多年来一直不喜欢使用Google Map API、Google Earth等,至于为什么就等我有空的时候再写成思想吧,不过通过这样的Demo开始让我喜欢Google的东西了,如果有项目的结合或者应用那应该是非常棒的一件事情。
RoverTang@罗孚传说
E-mail:65985498[at]qq.com
微博/微信:rovertang