.gen格式文件读取,完成兰伯特和墨卡托投影转换
關于.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了。
總結
以上是生活随笔為你收集整理的.gen格式文件读取,完成兰伯特和墨卡托投影转换的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: mac电脑下Tomcat和Apach配置
- 下一篇: 【vue开发】vue插件的install