decimal lat1 = decimal.Parse(slat1);
decimal lat2 = decimal.Parse(slat2);
decimal lng1 = decimal.Parse(slng1);
decimal lng2 = decimal.Parse(slng2);
bool res = false;
var left1 = Math.Abs(((lat1 - lat2) * (lat1 - lat2))) + Math.Abs(((lng1 - lng2) * (lng1 - lng2)));
var left2 = (radius / 1000) * (radius / 1000);
if (left1 < left2)
{
res = true;
}
这是别人写的代码,我不懂这句的意思
var left2 = (radius / 1000) * (radius / 1000);
而且,给出的radius是2000
用来判断从数据库里面读出来的景点信息的经纬度作比较,然后,让客户端那边获得相应的在指定经纬度(该经纬度是由客户端那边指定的)1000m的范围内的景点信息
>>闪存
已知一个经纬度,怎么判断另外一个经纬度点在该已知经纬度1000m以内呢?
红线距离就是两点距离,只要用两个地点的经纬度(可看作xy坐标)用勾股定理计算出直线距离即可,也就是红线距离。经纬度可以看成是直角坐标系的x和y。
>>博问
decimal lat1 = decimal.Parse(slat1);
decimal lat2 = decimal.Parse(slat2);
decimal lng1 = decimal.Parse(slng1);
decimal lng2 = decimal.Parse(slng2);
//以上4句应该是分别定义了2个地点的经度和纬度,也就是xy
bool res = false;
var left1 = Math.Abs(((lat1 - lat2) * (lat1 - lat2))) + Math.Abs(((lng1 - lng2) * (lng1 - lng2)));
//以上应该是求出了两点的 经度差绝对值² 和 纬度差绝对值² 的和
//就相当于勾股定理中两个直角边的平方和
//简单理解,就像是上图中,(a-x)²+(b-y)²
var left2 = (radius / 1000) * (radius / 1000);
if (left1 < left2)
//这句代码就是拿来做比较,将实际两地距离和最大的距离做比较,看是否小于1000米
{
res = true;
}
//具体的,实际中需要考虑的经纬度和实际距离的比例尺问题我这里没去细说
你这不是跟我的一样吗?我这些的代码是不行的。。。
@魔女小溪: 我就是把上面的代码拿来的。上面那代码的原理是对的,所以我就顺着代码解读了一下。其实,说到底我只是想表达,怎么去求“已知一个经纬度,怎么判断另外一个经纬度点在该已知经纬度1000m以内”这个问题的方法。
直接把经纬度转化成米,这样比较好解决。根据地球周长、经线的长度分别得出,实际地面上的距离等于多少经度、纬度(举个例子,地球上东西走向的大街多少千米,可以换算成对应的经度)。这样算下来,只要知道原问题中的“另外一个经纬度”应该与“已知经纬度”相差多少经度、多少纬度即可。也就是把问题中的1000米转化成经纬度,这样,去比较“另外一个经纬度”是否在“1000米”范围内。
这个1000米是直线距离,利用两点的坐标根据勾股定理换算。
地球虽然是圆的,但是,相距1000m以及以内的两个点,把它们所在的地球近似的看成是平面还是比较精确的。我是往简单了想,这种方法在精度上不是非常精确的。我看上面的代码就是用这种思路,精确度应该够了。
@justwj: 呜呜,大哥 ,你可不可以别文字,可不可以来点代码?
@justwj:
double lat1 = double.Parse(slat1); double lat2 = double.Parse(slat2); double lng1 = double.Parse(slng1); double lng2 = double.Parse(slng2); var left1 = Math.Abs(((lat1 - lat2) * (lat1 - lat2))) + Math.Abs(((lng1 - lng2) * (lng1 - lng2))); double lngLong = 40075 / 360; double latLong = EARTH_RADIUS * 2 / 180; double newlng = 1000 / lngLong; double newlat = 1000 / latLong; var left2 = newlng * newlng + newlat * newlat; if(left1<left2) { return true; }
这是我根据你回我的闪存,写的一个方法,不知道写对的没有,反正不行
@魔女小溪: 代码写得比较丑的,还处于混沌菜鸟阶段。我写一段。等着。
另外,我又想到一个问题,地球上不同纬度,高纬度和低纬度他们各自的【经度和周长比】是不一样的,每个地方都是有360度经度,但是赤道周长最大,越往两极周长越小。所以实际运用中,不同纬度应该用自己对应的周长来计算【经度和周长比】
个人见解,有不正确的地方希望高手指正。
@justwj: 呵呵,我就是出于菜鸟阶段,太伤心了,别这么说人家嘛
@魔女小溪: 我代码写得比较丑的,还处于混沌菜鸟阶段。我写一段
@justwj: 额。。不要怕出丑,敢于出丑,才会进步嘛
@魔女小溪: C代码
#include<stdio.h> #include<math.h> int mian() { float a, b, c, d;//俩个地点的坐标(a,b)和(c,d),单位:度,保留小数! float earth_circumference, warp, across_length, vertical_length;//地球周长,经线长度,横向距离,纵向距离 float x_max_length, y_max_length; int tmp_length = 1000;//米转化度需要用到 printf("输入已知地点经度:"); scanf_s("%f", &a); printf("输入已知地点纬度:"); scanf_s("%f", &b); printf("输入当前地点经度:"); scanf_s("%f", &c); printf("输入当前地点纬度:"); scanf_s("%f", &d); printf("输入你当前所在纬度的地球周长:");//此处需要专业地理数据,单位:米 scanf_s("%f",&earth_circumference); warp = 0;//经线的长度,0要修改,需搜集资料,单位:米 across_length = earth_circumference / 360;//得出1经度的地面长度 vertical_length = warp / 180;//得出1纬度的地面长度,单位米 x_max_length = sqrt( 1000.0);//因为1000米是直线距离,所以需要换算出横向和纵向长度 y_max_length = sqrt(1000.0); x_max_length = x_max_length / across_length;//两点间的最大横向距离,单位:度 y_max_length = y_max_length / vertical_length;//两点间的最大纵向距离 if ((((a - c)*(a - c)) < x_max_length) && (((b - d)*(b - d)) < y_max_length))//判断,两者同时满足表示在1000米以内 { printf("该地距离原地点1000米以内"); } else { printf("该地没有在原地点1000米以内"); } return 0; }
@justwj: 呵呵,有点晕的感觉,我换了一种做法,我通过已知的经纬度,和距离,得出最大的经纬度和最小的经纬度,然后,让数据库里面的商家经纬度,跟最大和最下经纬度做比较,
没看懂
代码易懂,但我不知道具体用意,是不是该给出个上下文呢
作用就是用来判断从数据库里面读出来的景点信息的经纬度作比较,然后,让客户端那边获得相应的在指定经纬度1000m的范围内的景点信息
我这有现成的代码,供参考下啊
public class CalcDistance { private static double EARTH_RADIUS = 6378.137;// 地球半径 private static double rad(double d) { return d * Math.PI / 180.0; } public static double GetDistance(double lat1, double lng1, double lat2, double lng2) { double radLat1 = rad(lat1); double radLat2 = rad(lat2); double a = radLat1 - radLat2; double b = rad(lng1) - rad(lng2); return 2 * Math.asin(Math.sqrt(Math.pow(Math.sin(a / 2), 2) + Math.cos(radLat1) * Math.cos(radLat2) * Math.pow(Math.sin(b / 2), 2))) * EARTH_RADIUS; } public static void main(String[] args) { String p1 = "31.205736,121.396884"; String p2 = "30.897403,121.940815"; System.out.println(GetDistance(Double.parseDouble(p1.split(",")[0]), Double.parseDouble(p1.split(",")[1]), Double.parseDouble(p2.split(",")[0]), Double.parseDouble(p2.split(",")[1]))); } }
你这代码的作用是用来干嘛的?有点看不懂
@魔女小溪: 计算两点之间的距离。。。。
@jieyuefeng: 那你知道如何判断从数据库获取的经纬度在已知经纬度的1000m以内吗?真心不知道怎么下手
@魔女小溪: 我不知道怎么反推出在1000米之内的经纬度,除了计算每个景点的距离然后对比之外我也不知道有什么更好的办法,也许可以试着画个方框出来过滤掉完全不对的经纬度
@jieyuefeng: 我先试试你给我的代码,呵呵
女汉子 没弄明白你要干嘛啊
用来判断从数据库里面读出来的景点信息的经纬度作比较,然后,让客户端那边获得相应的在指定经纬度1000m的范围内的景点信息
@魔女小溪: 当我没来过 ~
求经纬度 不就是要求球面上的二个点之间距离吗
那怎么求呢?
两点(商家提供的坐标,客户端提供的坐标)之间的距离小于1000即可。
var left2 = (radius / 1000) * (radius / 1000);这句本质是半径的平方。除以1000,我猜应该是比例尺的问题。