提取行政区边界经纬度坐标(高德+百度)

前言

近来由于工作需要,需要提取某些城市的经纬度坐标,稍微搜索了一下,发现百度地图和高德地图都提供了相关的函数和例子.那么剩余的工作也就比较简单了,保存坐标,然后转换为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显示和处理,下次会写一篇笔记.

时间: 2024-10-04 17:20:02

提取行政区边界经纬度坐标(高德+百度)的相关文章

经纬度坐标转换为百度坐标

<script type="text/javascript" src="http://api.map.baidu.com/api?v=2.0&ak=rmtT1e2a4k770D9jK1ouGODt"></script> <script type="text/javascript" src="http://developer.baidu.com/map/jsdemo/demo/convertor.js

百度地图墨卡托坐标转高德经纬度坐标(偏移小)

基本上是网上常见的方法进行坐标系的转换,但是误差很大.发现之所以误差大是在于百度的墨卡托坐标转百度的经纬度时误差太大,后面找到一个方法,误差较小,基本吻合. 参考:http://www.site-digger.com/tools/mct2latlng.html 这里的转换是直接调用百度地图SDK中的API,通过对其中JavaScript源代码的执行跟踪,提取出其中的墨卡托坐标转百度经纬度坐标的代码如下: Java版本: @Data public static class Point { priv

高德坐标转百度坐标并导航

APP用的是高德SDK 业务是用户点击APP中的导航按钮,会根据用户当前手机安装地图APP进行导航,顺序是 1高德 2百度,如果用户没有安装高德地图APP则判断是否有百度地图APP因为APP是用的高德SDK所以在导航上没有任何问题,跳转百度后 坐标误差比较大有时候 导航提示 未搜索到结果之类的,造成这个原因是高德和百度坐标不一至,这个时候需要坐标转换 百度提供坐标转换接口 http://developer.baidu.com/map/changeposition.htm 按文档操作 http:/

利用百度地图API,获取经纬度坐标

利用百度地图API,获取经纬度坐标 代码很简单,但在网上没找到现成的获取地图经纬度的页面. 就是想,给当前页面传递一个经纬度,自动定位到此经纬度.然后可以重新选择,选择完返回经纬度. 效果如下: 源代码下载:http://files.cnblogs.com/zjfree/select_map.rar 利用百度地图API,获取经纬度坐标,布布扣,bubuko.com

百度地图多边形画区域、获取节点经纬度坐标、判断某一点是否在此区域内

创建可绘画map: 1 <!DOCTYPE html> 2 3 <html> 4 <head> 5 <meta charset="UTF-8"> 6 <meta name="viewport" content="width=device-width, initial-scale=1,maximum-scale=1, user-scalable=no"> 7 <meta name=&

高德百度坐标系转换方法

本文来自:http://blog.csdn.net/meegomeego/article/details/39927017 在开始这个题目之前,先给大家再次扫扫盲,扫的不是坐标系统的盲,而是我们国家所使用的坐标系统.大家都知道,美国GPS使用的是WGS84的坐标系统,以经纬度的形式来表示地球平面上的某一个位置,这应该是国际共识.但在我国,出于国家安全考虑,国内所有导航电子地图必须使用国家测绘局制定的加密坐标系统,即将一个真实的经纬度坐标加密成一个不正确的经纬度坐标,我们在业内将前者称之为地球坐标

BD09坐标(百度坐标) WGS84(GPS坐标) GCJ02(国测局坐标) 的相互转换

BD09坐标(百度坐标) WGS84(GPS坐标) GCJ02(国测局坐标) 的相互转换 http://www.cnphp6.com/archives/24822 by root ⋅ Leave a Comment 谷歌地图采用的是WGS84地理坐标系(中国范围除外),谷歌中国地图.搜搜中国地图.高德地图采用的是GCJ02地理坐标系,百度采用的是BD09坐标系,而设备一般包含GPS芯片或者北斗芯片获取的经纬度为WGS84地理坐标系,所以我们要根据得到的经纬度的坐标类型和地图厂商类型在地图上标点,

WGS84、Web墨卡托、火星坐标、百度坐标互转

转自:1.http://blog.csdn.net/wildboy2001/article/details/12031351 2.http://kongxz.com/2013/10/wgs-cgj/ 3.http://www.oschina.net/code/snippet_260395_39205 GCJ-02坐标系统(火星坐标)简介:http://blog.csdn.net/giswens/article/details/8775121(存档:http://mapbd.com/cms/201

GPS坐标转百度地图并且加载地图示例.支持微信端访问

<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Wx_VehicleLocation.aspx.cs" Inherits="DTMS.WeiXin.wxmgr.govmgr.Wx_VehicleLocation" %> <!DOCTYPE html> <html xmlns="http://www.w3.org/1999