本文给大家介绍 javascript 实现高德地图和百度地图提取行政区边界经纬度坐标的相关知识,本文实用性非常高,代码简单易懂,需要的朋友参考下吧
Javascript 是一种由 Netscape 的 LiveScript 发展而来的原型化继承的基于对象的动态类型的区分大小写的客户端脚本语言,主要目的是为了解决服务器端语言,比如 Perl,遗留的速度问题,为客户提供更流畅的浏览效果。
前言
近来由于工作需要, 需要提取某些城市的经纬度坐标, 稍微搜索了一下, 发现百度地图和高德地图都提供了相关的函数和例子. 那么剩余的工作也就比较简单了, 保存坐标, 然后转换为 WGS 坐标, 这样才能和现有的 GPS 数据以及地图匹配.
主要问题和解决方法
本地保存文件跨浏览器支持
- 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 显示和处理, 下次会写一篇笔记.
来源: http://www.phperz.com/article/17/0221/267452.html