分类
笃实好学

坐标转换(火星坐标、百度坐标、WGS84)

先来了解下各坐标系的基本情况:

1、 GPS,WGS-84,原始坐标体系。一般用国际标准的GPS记录仪记录下来的坐标,都是GPS的坐标。很可惜,在中国,任何一个地图产品都不允许使用GPS坐标。
2、 GCJ-02,国测局02年发布的坐标体系。又称“火星坐标”。在中国,必须至少使用GCJ-02的坐标体系。比如谷歌,腾讯,高德都在用这个坐标体系。GCJ-02也是国内最广泛使用的坐标体系。
3、 其他坐标体系。一般都是由GCJ-02进过偏移算法得到的。这种体系就根据每个公司的不同,坐标体系都不一样了。比如,百度和搜狗就使用自己的坐标体系,与其他坐标体系不兼容。

在各种web端平台,或者高德、腾讯、百度上取到的坐标,都不是GPS坐标,都是GCJ-02坐标,或者自己的偏移坐标系。
比如,你在谷歌地图API,高德地图API,腾讯地图API上取到的,都是GCJ-02坐标,他们三家都是通用的,也适用于大部分地图API产品,以及他们的地图产品。
百度API上取到的,是BD-09坐标,只适用于百度地图相关产品。
搜狗API上取到的,是搜狗坐标,只适用于搜狗地图相关产品。
谷歌地球,google earth上取到的,是GPS坐标,而且是度分秒形式的经纬度坐标。在国内不允许使用。必须转换为GCJ-02坐标。

一般设备上获取的都是GPS原始坐标体系,任何一个地图产品都不允许使用GPS坐标,所以直接使用GPS原始坐标体系会存在偏移的情况,这在开发中就要进行坐标转换,最近在互联网找到一段很不错的转换代码,废话不多,直接贴代码:

/**
 * Created by Wandergis on 2015/7/8.
 * 提供了百度坐标(BD09)、国测局坐标(火星坐标,GCJ02)、和WGS84坐标系之间的转换
 */

//定义一些常量
var x_PI = 3.14159265358979324 * 3000.0 / 180.0;
var PI = 3.1415926535897932384626;
var a = 6378245.0;
var ee = 0.00669342162296594323;

/**
 * 百度坐标系 (BD-09) 与 火星坐标系 (GCJ-02)的转换
 * 即 百度 转 谷歌、高德
 * @param bd_lon
 * @param bd_lat
 * @returns {*[]}
 */
function bd09togcj02(bd_lon, bd_lat) {
    var x_pi = 3.14159265358979324 * 3000.0 / 180.0;
    var x = bd_lon - 0.0065;
    var y = bd_lat - 0.006;
    var z = Math.sqrt(x * x + y * y) - 0.00002 * Math.sin(y * x_pi);
    var theta = Math.atan2(y, x) - 0.000003 * Math.cos(x * x_pi);
    var gg_lng = z * Math.cos(theta);
    var gg_lat = z * Math.sin(theta);
    return [gg_lng, gg_lat]
}

/**
 * 火星坐标系 (GCJ-02) 与百度坐标系 (BD-09) 的转换
 * 即谷歌、高德 转 百度
 * @param lng
 * @param lat
 * @returns {*[]}
 */
function gcj02tobd09(lng, lat) {
    var z = Math.sqrt(lng * lng + lat * lat) + 0.00002 * Math.sin(lat * x_PI);
    var theta = Math.atan2(lat, lng) + 0.000003 * Math.cos(lng * x_PI);
    var bd_lng = z * Math.cos(theta) + 0.0065;
    var bd_lat = z * Math.sin(theta) + 0.006;
    return [bd_lng, bd_lat]
}

/**
 * WGS84转GCj02
 * @param lng
 * @param lat
 * @returns {*[]}
 */
function wgs84togcj02(lng, lat) {
    if (out_of_china(lng, lat)) {
        return [lng, lat]
    }
    else {
        var dlat = transformlat(lng - 105.0, lat - 35.0);
        var dlng = transformlng(lng - 105.0, lat - 35.0);
        var radlat = lat / 180.0 * PI;
        var magic = Math.sin(radlat);
        magic = 1 - ee * magic * magic;
        var sqrtmagic = Math.sqrt(magic);
        dlat = (dlat * 180.0) / ((a * (1 - ee)) / (magic * sqrtmagic) * PI);
        dlng = (dlng * 180.0) / (a / sqrtmagic * Math.cos(radlat) * PI);
        var mglat = lat + dlat;
        var mglng = lng + dlng;
        return [mglng, mglat]
    }
}

/**
 * GCJ02 转换为 WGS84
 * @param lng
 * @param lat
 * @returns {*[]}
 */
function gcj02towgs84(lng, lat) {
    if (out_of_china(lng, lat)) {
        return [lng, lat]
    }
    else {
        var dlat = transformlat(lng - 105.0, lat - 35.0);
        var dlng = transformlng(lng - 105.0, lat - 35.0);
        var radlat = lat / 180.0 * PI;
        var magic = Math.sin(radlat);
        magic = 1 - ee * magic * magic;
        var sqrtmagic = Math.sqrt(magic);
        dlat = (dlat * 180.0) / ((a * (1 - ee)) / (magic * sqrtmagic) * PI);
        dlng = (dlng * 180.0) / (a / sqrtmagic * Math.cos(radlat) * PI);
        mglat = lat + dlat;
        mglng = lng + dlng;
        return [lng * 2 - mglng, lat * 2 - mglat]
    }
}

function transformlat(lng, lat) {
    var ret = -100.0 + 2.0 * lng + 3.0 * lat + 0.2 * lat * lat + 0.1 * lng * lat + 0.2 * Math.sqrt(Math.abs(lng));
    ret += (20.0 * Math.sin(6.0 * lng * PI) + 20.0 * Math.sin(2.0 * lng * PI)) * 2.0 / 3.0;
    ret += (20.0 * Math.sin(lat * PI) + 40.0 * Math.sin(lat / 3.0 * PI)) * 2.0 / 3.0;
    ret += (160.0 * Math.sin(lat / 12.0 * PI) + 320 * Math.sin(lat * PI / 30.0)) * 2.0 / 3.0;
    return ret
}

function transformlng(lng, lat) {
    var ret = 300.0 + lng + 2.0 * lat + 0.1 * lng * lng + 0.1 * lng * lat + 0.1 * Math.sqrt(Math.abs(lng));
    ret += (20.0 * Math.sin(6.0 * lng * PI) + 20.0 * Math.sin(2.0 * lng * PI)) * 2.0 / 3.0;
    ret += (20.0 * Math.sin(lng * PI) + 40.0 * Math.sin(lng / 3.0 * PI)) * 2.0 / 3.0;
    ret += (150.0 * Math.sin(lng / 12.0 * PI) + 300.0 * Math.sin(lng / 30.0 * PI)) * 2.0 / 3.0;
    return ret
}

/**
 * 判断是否在国内,不在国内则不做偏移
 * @param lng
 * @param lat
 * @returns {boolean}
 */
function out_of_china(lng, lat) {
    return (lng < 72.004 || lng > 137.8347) || ((lat < 0.8293 || lat > 55.8271) || false);
}
分类
笃实好学

利用js填写网页表单

最近工作中需要在网页中提交数据来打印票证信息,经过几天的录入,感到不胜其烦,因为很多数据都是要重复录入的,这个工作对于我这个懒人来说太困难了,不只是懒的原因,重复做着同样的工作,对于我来说就是在虚度光阴,我想把时间用在有意义的地方,这些重复操作就应该交给电脑去处理,好了,言归正传,首先来说说javascript自动填写网页表单是怎么实现的。

比如有一个管理系统,里面有无数个表单,需要你去不停的录入数据,数据里面有80%的数据都是相同的,每次都需要重复录入,数据条数不多的情况还好,如果几十条,或者每天都需要录入,那工作量很大,每天就只剩录入数据了,导致没时间做其他的事情,其实我想实现的目标很简单,就是手指一点,重复是数据自动填写进网页表单,无需再做打字之类的重复动作,首先编写一段代码,用框架来实现,用百度来做实例。

<!DOCTYPE HTML>
<html>
    <body>
        <a href="javascript:alert('我会自动填写表单');" target="test">baidu</a>
        <iframe src="http://www.baidu.com" name="test"></iframe>
    </body>
</html>

当点击超链接时无法弹出对话框,才知道JavaScript出于安全方面的考虑,这框架违反了同源政策,是不允许跨域操作的,好在chrome浏览器支持可跨域的设置,当设置完可跨域时,换成我需要的网址后发现对方网站设置了 X-Frame-Options: sameorigin,显示此内容不能显示在一个框架中,所以该方法无法实现,废弃。

一筹莫展的时候寻求度娘帮助,原来可以利用浏览器的收藏夹(书签)功能寄存js代码来实现,不得不惊叹,网友的智慧真是无穷无尽,首先随便收藏一个网址,打开浏览器的“收藏夹”,刚刚收藏的网址点右键,把URL里的连接地址修改为:

javascript:alert('我会自动填写表单');

这样点击刚收藏的网址就会弹出对话框,执行了js代码那就好办了,下面是相关填写代码。

使用ID填写表单:

document.getElementById('ID').value = '文字';

使用Name填写表单:

document.getElementsByName('Name')[0].value = '文字';

本想用后台提取数据来填写的,看来无法实现完全自动,虽然不太理想,但也提高了工作效率,最主要的是数据不会有误,在查找表单ID和Name的时候需要用到浏览器的F12功能,中间有一个错误,有必要记录一下:

IE浏览器升级到11版本后,F12打开开发者工具,如果报以下错误:

Exception in window.onload: An error has occuredJSPlugin.3005

解决方法:安装Windows7补丁:KB3008923;

Windows7-32位

http://www.microsoft.com/zh-CN/download/details.aspx?id=45134

Windows7-64位

https://www.microsoft.com/zh-cn/download/details.aspx?id=45154

因为这是公司电脑,几乎都用的是Windows7的系统,还有一台目前仍在使用Windows XP系统。