关于.gen格式的地图绘制以及地图投影转换,首先肯定是读取.gen格式,那么就得认识.gen格式内部数据样式,下面的图片给出的参考:
可以看到.gen格式文件由线、点数据,加上结束符end以及线的编号组成。那么我们就可以根据里面的数据格式读取并以一种合适的方式存储数据。当然,里面的数据也并非如此单一,比如纬度0.000 003689547189°,在文件里面的格式就是3.689547189e-006形式,这在我们匹配数据经纬度的时候要十分注意。
不多说了,直接解释一下代码吧:(表示不解释逻辑关系,只说实现方法)
1、函数前三行完成网页上本地文件的上传和读取,我们通过str存储文件的每一个字符,可以像数组一样访问文件的每一个字符。当然,str里面包含了文件里面每一行的起始符和换行符。而这种读取文件的方式也不限于读.gen,它可以读取很多文件
2.刚才说过,str里面包含的数据是单个字符,而且是字符型数据,还有一些其他的符号。那么我们必须通过某种手段去提取我们想要的,这里就是里面的经纬度数据。
需要解决的一些问题:
①我们要剔除所有非数字的东西,因为我们要的是数据 ②将单个的字符数字合并转化为有意义是经纬度数据
首先236和237行,将所有文件的起始符和换行符已经里面的逗号转换为A,然后将END这种终止符转换为L(问什么不一起转换为A?想想,L可以用来判断一段线是否结束啊,不然都混成A,你知道什么时候已经存完一段线了么!)。这样文件不就只有数字、小数点还有作为标记的字母了么。
②这个时候,通过循环,遍历整个heap,提取我们想要的。
第一个if语句,自然而然的,利用L判断是否结束一段线的读取,并用-1做上标记。(问我为什么要这步?呵,没有它,待会划线的时候,你知道什么时候用开始划线,什么时候结束划线啊!)
第二到第五个if语句,判断当前记录的点数据属于第几条线段。想想,heap里面的是单个字符,需要这个来判断需要跳过几个字符不是。第136条线段的开始有1 3 6这三个字符,程序怎么知道是属于经纬度的数字还是线段条数的数字呢,所以要用这几个if在开始一段新线段数据存储的时候,来个判断,需要往后跳过几个字符,然后继续存储
第六个if语句,想想这个数据的形式,通过之前的判断过滤以后,A与A之间的不就是一串数据了么,先全部给numcharacer(比如在A与A之间,numcharacter=2.3625,当然它还是自字符型的,可以通过numcharacter[1]访问“.”),然后在else里面把numcharacter转换为数据2.3625,这个时候,它就是一个数据了,一个数字类型数据了,也就是说我们提取经纬度成功了。
通过以上各步,number这个数组里面已经存储了经纬度数据。如下图,824条线段的部分数据先经度后纬度。
效果图参照下图
3、接下来就是墨卡托和兰伯特的投影转换了
读者可以根据公式,调整之前存贮的数据,进行投影转换,这里只提供公式,不做代码接受。因为经纬数据都有了,只是公式转换的问题了,和x=a*b没什么区别,写个函数OK了。