python2接口:WGS-84转BD坐标系

一、背景
关于python 解析 PL2303设备的原始数据得到WGS坐标系的经纬度的文章查看上一篇;

二、直接上干货,俩种方法,若有其他的请赐教
1.依赖百度API(耗网操作)

    def wgs84tobd09ByNetwork(self, lon, lat):
    	#传入你的ak
        queryStr = '/geoconv/v1/?coords={},{}&from=1&to=5&ak=yourak'.format(lon, lat)
        # 对queryStr进行转码,safe内的保留字符不转换
        encodedStr = urllib.quote(queryStr, safe="/:=&?#+!$,;'@()*[]")
        # 在最后直接追加上yoursk
        rawStr = encodedStr + 'fFyAglwnmgxnYI6c---------------------------'
        # md5计算出的sn值
        my_sn = hashlib.md5(urllib.quote_plus(rawStr)).hexdigest()
        url = 'http://api.map.baidu.com' + queryStr + "&sn=" + my_sn
        res = requests.get(url)
        # get收到的内容
        json_str = res.content
        # print json_str
        dictData = json.loads(json_str)
        print(dictData)
        print (dictData["result"][0]["x"])
        print (dictData["result"][0]["y"])
        return dictData["result"][0]["x"], dictData["result"][0]["y"]

2.算法(误差极小)

    def transformlat(self,lng, lat):
        pi = 3.1415926535897932384626  # π

        ret = -100.0 + 2.0 * lng + 3.0 * lat + 0.2 * lat * lat + \
              0.1 * lng * lat + 0.2 * math.sqrt(math.fabs(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

    def transformlng(self,lng, lat):
        pi = 3.1415926535897932384626  # π
        ret = 300.0 + lng + 2.0 * lat + 0.1 * lng * lng + \
              0.1 * lng * lat + 0.1 * math.sqrt(math.fabs(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
        
    def out_of_china(self,lng, lat):
        """
        判断是否在国内,不在国内不做偏移
        :param lng:
        :param lat:
        :return:
        """
        if lng < 72.004 or lng > 137.8347:
            return True
        if lat < 0.8293 or lat > 55.8271:
            return True
        return False
        
    def wgs84tobd09(self,lng, lat):
        x_pi = 3.14159265358979324 * 3000.0 / 180.0
        pi = 3.1415926535897932384626   # π
        a = 6378245.0  # 长半轴
        ee = 0.00669342162296594323      # 扁率
        if self.out_of_china(lng, lat):  # 判断是否在国内
            return lng, lat
        dlat = self.transformlat(lng - 105.0, lat - 35.0)
        dlng = self.transformlng(lng - 105.0, lat - 35.0)
        radlat = lat / 180.0 * pi
        magic = math.sin(radlat)
        magic = 1 - ee * magic * magic
        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
        z = math.sqrt(mglng * mglng + mglat * mglat) + 0.00002 * math.sin(mglat * x_pi)
        theta = math.atan2(mglat, mglng) + 0.000003 * math.cos(mglng * x_pi)
        bd_lng = z * math.cos(theta) + 0.0065
        bd_lat = z * math.sin(theta) + 0.006
        print('转换成百度坐标:%s,%s'%(bd_lng,bd_lat))
        return bd_lng,bd_lat
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值