怎样在谷歌地图中生成自驾游线路图?


近期一个网站项目中有一个需求是在谷歌地图中生成自驾游线路图,颇费周折,记录下来供需要的朋友参考。最后生成的线路图如下,从香港到丹东,所用kmz文件119k。整个制作过程分成好几个部分,每个部分都有些注意事项。 一、合并和处理GPS数据。客户提供的数据为NMEA 0183格式的文本文件,全程接近300个文件,每个大小200k左右,用FileJoin.exe(用于文本文件合并的小软件,免费)把这些小文件合并成一个大文件all.txt,有54M。在http://www.gpsbabel.org/download.html下载GPSBabel,我下载的是GPSBabel-1.4.3-Setup.exe,11M,免费软件。利用GPSBabel处理all.txt,输出csv文件,设置参见下图:注意:GPSBabel软件设置,要选择合适的输入和输出格式,见上图红色标识。网上另外有个免费软件KML Generator,也可以输出csv格式文件,但不能处理大文件,GPSBabel可以。GPSBabel还有google map预览功能,在More Options里设置。NMEA 0183是GPS通用的数据格式,可以转化为google地图的kml文件,不过我这里选择转化成了csv文件。二、处理csv文件,生成txt文件。csv文件里有很多列信息,我只要LATITUDE和LONGITUDE这两列,小数点后至少保留6位,生成txt文件,一行一条数据,每行的经纬度用英文逗号隔开,比如:22.509663,114.12706722.50966,114.12707822.509647,114.12709322.50962,114.127092注意:由于csv文件将近18万行数据,如果用excel打开,只能打开前面的65535行数据,造成数据丢失,可以用access处理。不要利用access的链接数据方式导入csv数据,而要先新建一个数据库,然后把csv数据实实在在导入进来,因为只有这样,才能设置LATITUDE和LONGITUDE的数据格式(改成文本格式,参见下图),使得输出的txt文件保留所有的小数位,否则输出结果中只会保留2位小数。导入的过程中可以设定只保留LATITUDE和LONGITUDE这两列的数据。利用access导入导出时,注意分隔符为英文逗号,字段间隔符没有。三、利用txt文件生成kml文件。Ethan对比过几种方法,感觉利用模板的思路借助php语句生成kml文件最好。大家知道kml文件规定了线路的显示方式,包括颜色、粗细等,这些做在php文件里,上文中生成的txt文件里仅包含经纬度信息,这些通过读取文件的方式引入到php文件中,本质上就是一个二维数组。注意:虽然GPSBabel、KML Generator等软件可以直接生成kml文件,也提供了一些设置,但不如自己在php文件里规定灵活和方便。不一定非要使用php5的集成 DOM 库或php4的dom_xml 扩展模块,但如果想用也可以,参阅使用 PHP 和 MySQL 创建 KML。Ethan感觉用kml生成工具生成一个模板kml文件,把头尾修改成自己需要的,直接放到php文件中,中间抓取txt文件效率更高,更方便。一些非标准和不十分成熟的东西最好暂时不要用,比如kmlcreator和GeoXML。四、线路偏移问题。由于各个GPS设备利用的地图和google地图存在差异,Ethan发现生成的线路图和实际路线之间大概有一个固定的偏移,但是由于这里是利用php文件生成kml文件,加入x和y两个方向的偏移量就可以了,比如“/google-map/kml.php?line_no=5&x=0.0018&y=0.0057”。五、数据量精简和压缩的问题。从香港到丹东,经过上述处理,得到的kml文件有7M多,为了明示线路,没必要用这么多个点,至少可以精简为十分之一。好在我们是利用php文件生成kml文件,间隔10取经纬度数据即可,这样变成700多k,再压缩成kmz格式,只有119k。注意kmz就是zip格式的压缩文件,后缀名zip改成kmz即可。六、谷歌地图缓存问题为了减轻服务器负担,对于同一个kml或kmz引用的url,谷歌服务器会在服务器端保存一定时间的缓存,这给我们测试带来很大不便。没有办法,只有每次测试都新建一个kml或kmz文件并上传。七、把线路图整合到其它谷歌地图中。创建完map后,加入下述语句:var ctaLayer = new google.maps.KmlLayer(‘<?php echo $gmap_kmz?>’, { suppressInfoWindows: true, preserveViewport: true }); ctaLayer.setMap(map);$gmap_kmz为kmz文件的url地址,这样线路就会加载入map地图中。