经纬度转换问题

jieweibin 2016-11-28 10:47:30
private static double x_pi = 3.14159265358979324 * 3000.0 / 180.0;

/**
* 中国正常坐标系GCJ02协议的坐标,转到 百度地图对应的 BD09 协议坐标
*
* @param lat
* @param lng
*/
public static void Convert_GCJ02_To_BD09(double lat, double lng) {
double x = lng, y = lat;
double z = Math.sqrt(x * x + y * y) + 0.00002 * Math.sin(y * x_pi);
double theta = Math.atan2(y, x) + 0.000003 * Math.cos(x * x_pi);
lng = z * Math.cos(theta) + 0.0065;
lat = z * Math.sin(theta) + 0.006;
}

public static double Convert_GCJ02_To_BD09_Lat(double lat, double lng) {
double x = lng, y = lat;
double z = Math.sqrt(x * x + y * y) + 0.00002 * Math.sin(y * x_pi);
double theta = Math.atan2(y, x) + 0.000003 * Math.cos(x * x_pi);
lng = z * Math.cos(theta) + 0.0065;
lat = z * Math.sin(theta) + 0.006;
return lat;
}

public static double Convert_GCJ02_To_BD09_Lng(double lat, double lng) {
double x = lng, y = lat;
double z = Math.sqrt(x * x + y * y) + 0.00002 * Math.sin(y * x_pi);
double theta = Math.atan2(y, x) + 0.000003 * Math.cos(x * x_pi);
lng = z * Math.cos(theta) + 0.0065;
lat = z * Math.sin(theta) + 0.006;
return lng;
}

/**
* 百度地图对应的 BD09 协议坐标,转到 中国正常坐标系GCJ02协议的坐标
*
* @param lat
* @param lng
*/
public static void Convert_BD09_To_GCJ02(double lat, double lng) {
double x = lng - 0.0065, y = lat - 0.006;
double z = Math.sqrt(x * x + y * y) - 0.00002 * Math.sin(y * x_pi);
double theta = Math.atan2(y, x) - 0.000003 * Math.cos(x * x_pi);
lng = z * Math.cos(theta);
lat = z * Math.sin(theta);
}

以上代码是从网上搜到的,希望高手能把它转换成VB6的代码,不胜感激!特别是最后 百度转高德的这部分代码,有个atan2函数VB6里没有,网上找了类似的代码,结果转出来的经纬度偏差太大

public static void Convert_BD09_To_GCJ02(double lat, double lng) {
double x = lng - 0.0065, y = lat - 0.006;
double z = Math.sqrt(x * x + y * y) - 0.00002 * Math.sin(y * x_pi);
double theta = Math.atan2(y, x) - 0.000003 * Math.cos(x * x_pi);
lng = z * Math.cos(theta);
lat = z * Math.sin(theta);
}

主要是这段想转换成VB6的,谢谢!
...全文
173 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
jieweibin 2016-11-30
  • 打赏
  • 举报
回复
Tiger_Zhao:嗯,高德经纬度是根据用程序把地址批量解析出来的,现在是把它转换成百度经纬度再批量标注到地图上的,能满足部门的业务需求了。 相信这个帖子能帮到不少人,再次感谢!
Tiger_Zhao 2016-11-30
  • 打赏
  • 举报
回复
用坐标查门牌号本身就是有误差的。
程序已经是完全正确的了。
jieweibin 2016-11-29
  • 打赏
  • 举报
回复
谢谢楼上!晚上到家转换试试
Tiger_Zhao 2016-11-29
  • 打赏
  • 举报
回复
VB 的 Atn() 对应 Math.atan()
按照Math.Atan2 方法 (Double, Double)可得
Option Explicit

Private Const PI As Double = 3.14159265358979
Private Const DOUBLE_MIN As Double = 0.00000000000001 '浮点的极小数视为零'

Function atan2(ByVal y As Double, ByVal x As Double) As Double
Dim theta As Double

If Abs(y) < DOUBLE_MIN Then
theta = IIf(x < 0, PI, 0)
ElseIf Abs(x) < DOUBLE_MIN Then
theta = IIf(y > 0, PI / 2, -PI / 2)
Else
theta = Sgn(y) * Atn(y / x)
End If

atan2 = theta
End Function
jieweibin 2016-11-29
  • 打赏
  • 举报
回复
自己顶一下,高手们快点帮忙,谢谢!或者谁有 VB版 高德地图批量经纬度标注的代码最好
jieweibin 2016-11-29
  • 打赏
  • 举报
回复
Tiger_Zhao,太感谢你了!!!卡壳几天的经纬度转换问题终于解决了,经过百度和高德坐标拾取系统的测试,转换出来的地址还是很精确的,个别偏差仅几个门牌号,结果还是相当满意的!

1,066

社区成员

发帖
与我相关
我的任务
社区描述
VB 资源
社区管理员
  • 资源
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧