提取行政區邊界經緯度坐標(高德+百度)

来源:http://www.cnblogs.com/lijinfeng042/archive/2016/01/20/5146821.html
-Advertisement-
Play Games

前言 近來由於工作需要,需要提取某些城市的經緯度坐標,稍微搜索了一下,發現百度地圖和高德地圖都提供了相關的函數和例子.那麼剩餘的工作也就比較簡單了,保存坐標,然後轉換為WGS坐標,這樣才能和現有的GPS數據以及地圖匹配.主要問題和解決方法本地保存文件跨瀏覽器支持 由於安全的原因,JavaScript...


前言

   近來由於工作需要,需要提取某些城市的經緯度坐標,稍微搜索了一下,發現百度地圖和高德地圖都提供了相關的函數和例子.那麼剩餘的工作也就比較簡單了,保存坐標,然後轉換為WGS坐標,這樣才能和現有的GPS數據以及地圖匹配.

主要問題和解決方法

本地保存文件跨瀏覽器支持

      由於安全的原因,JavaScript本地保存文件的方式通常都只有IE支持的ActiveXObject/Open方法,每次都要提示不安全和允許運行,非常麻煩.好在其他瀏覽器目前都支持<a>標簽實現文件下載的方法.經測試最新的Google Chrome, Mozilla Firefox,百度瀏覽器,360瀏覽器下都可以運行.不說廢話,直接上代碼:

 function Download() {
     // IE
    if(/msie/i.test(navigator.userAgent)) {
            var w = window.open("", "導出", "height=0,width=0,toolbar=no,menubar=no,scrollbars=no,resizable=on,location=no,status=no");
            var filename = document.getElementById("filename").value  ;
            var content = document.getElementById("content").value;
            w.document.charset = "UTF-8";
            w.document.write(content);
            w.document.execCommand("SaveAs", false,  filename+'.txt');
            w.close();
            }
                // Firefox/Chrome/Safari/Opera
    else {
             var filename = document.getElementById("filename").value  ;
         var content = document.getElementById("content").value;
         str =  encodeURIComponent(content);  
         document.getElementById("SaveChrome").download = filename+'.txt'; 
        var aLink = document.getElementById("SaveChrome") ;                 
         aLink.href = "data:text/csv;charset=utf-8,"+str;  
         aLink.click();  
    }
      }  
跨瀏覽器保存文件

 

經緯度轉換

     這個話題感興趣的朋友可以自己搜索火星坐標相關轉換,精度在1m範圍的網上提供有服務可以免費使用.自寫程式經驗證精度在6m 以內.

百度地圖方法

    關鍵函數是 BMap.Boundary() 生成的類,調用它的方法get就可以通過名稱獲得縣或市級以上的行政區域.

        function getBoundary() {
            var bdary = new BMap.Boundary();
            var name = document.getElementById("districtName").value;
                bdary.get(name, function (rs) {       //獲取行政區域
                    var fileName = "";
                    var newFileObject = fso.CreateTextFile(folderName + "\\" + name + ".txt", true);
                    map.clearOverlays();        //清除地圖覆蓋物
                    var count = rs.boundaries.length; //行政區域的點有多少個
                    for (var i = 0; i < count; i++) {
                        var ply = new BMap.Polygon(rs.boundaries[i], { strokeWeight: 2, strokeColor: "#ff0000" }); //建立多邊形覆蓋物
                        map.addOverlay(ply);  //添加覆蓋物
                        map.setViewport(ply.getPath());    //調整視野
                    }
                    newFileObject.write(rs.boundaries[0]);
                    newFileObject.Close();
                });
        }
百度提取方法

 

高德地圖

關鍵代碼通過閱讀示例文件可以發現在下拉列表返回裡面有邊界值的出現.

    amapAdcode.search = function(adcodeLevel, keyword, selectId) {//查詢行政區劃列表並生成相應的下拉列表
        var me = this;
        if (adcodeLevel == 'district'||adcodeLevel == 'city') {//第三級時查詢邊界點
            this._district.setExtensions('all');
        } else {
            this._district.setExtensions('base');
        }
        this._district.setLevel(adcodeLevel); //行政區級別
        this._district.search(keyword, function(status, result) {//註意,api返回的格式不統一,在下麵用三個條件分別處理
            var districtData = result.districtList[0];
            if (districtData.districtList) {
                me.createSelectList(selectId, districtData.districtList);
            } else if (districtData.districts) {
                me.createSelectList(selectId, districtData.districts);
            } else {
                document.getElementById(selectId).innerHTML = '';
            }
            map.setCenter(districtData.center);
            me.clearMap();
            me.addPolygon(districtData.boundaries);
高德提取方法

 

其中的districtData.boundaries 就是我們需要的.調試了一下,大膽猜測果然是實現了Tostring() 方法的一個對象. "104.639106,26.863388,104.644771,26.861842,104.64767,26.854997,104.647748..." 很明顯的就是我們需要的gcj坐標.

 

總結

至此,基本也就沒有什麼問題了,剩餘的工作就是解析得到的文件.需要提取全國的數據也就是迴圈讀取全國城市列表文件了.(通常搜索cityname,電腦裡面都會找到的,原因,呵呵,猜測是迅雷,QQ之類的IP定位需要吧.)

重要的一點,推薦使用高德地圖,原因就是百度地圖得到的行政規劃有問題,不包含縣級市.最典型的就是貴州省,很多地市都是分離的,是帶島或洞的複雜多邊形.百度在這裡完敗.關於怎麼處理這裡複雜的多邊形以支持在MapWinGIS顯示和處理,下次會寫一篇筆記.

高德示例


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 在網上看到很多的JQuery跨域請求的文章,比較有意思。這裡我發表一個Servlet與JQuery配置實現跨域的代碼,供大家參考。不足之處請指教原理:JavaScript的Ajax不可以跨域,但是可以通過向本地的一個Servlet發出請求,由Servlet完成跨域。再把遠程的結構返回給客戶端。這樣A...
  • 只能輸入中文
  • css樣式表中四種屬性選擇器1> 簡易屬性tag[class]{ font-weight:bold }It will affect all tag with any class.e.g. or 2>精確屬性值a[href="http://www.cnblogs.cn"][title="textTi....
  • 一、Asp.net中的線程池設置 在Asp.net的服務處理中,每當伺服器收到一個請求,HttpRuntime將從HttpApplication池中獲取一個HttpApplication對象處理此請求,請求的處理過程將被排入線程池中,對於Asp.net來說,在Machine.config文件的pr....
  • 關於繼承好吧,說到底JS還是原型繼承的,而不是類繼承。所以在這個上面要經常用到prototype去繼承另一個對象。所有的構造器函數都約定命名為首字母大寫的形式,並且不以首字母大寫的形式拼寫任何其它的東西。當然一個更好的備選方案是根本就不用new。(太棒了,你說什麼就是什麼咯,我就當JS沒這個東西了)...
  • 一提到非同步交互大家就會說ajax,仿佛ajax這個技術已經成為了非同步交互的代名詞.那下麵將研究ajax的核心對象!利用ajax實現非同步交互無非4步:1.創建ajax核心對象2.與伺服器建立連接3.向伺服器發送請求4.接收伺服器響應的數據看似神秘的非同步交互當明確這4步後,也許在大家腦海裡已經有了初步的...
  • 由於本人也是邊學邊寫,因此整理的比較亂,下麵放出我例子的完整代碼,方便大家交流測試,如有問題歡迎評論首先,表格採用的是BootStrap樣式編輯的,主要使用的是angularjs,為了方便也有jQuery的方法,在測試時需自行引入bootstrap,angularjs和jq的文件。 整體代碼預覽:H...
  • 在ng-repeat中使用ng-model時會有許多問,有的人碰到無法獲取綁定的數據內容,有的人遇到改動綁定的數據內容時所有迴圈生成的內容一起改變。上面的問題我在開發時也遇到過,但是解決後我卻怎麼也還原不了那種情況了,只能先簡單介紹一下無法獲取的情景該如何解決。例如:html: ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...