当前位置:编程学习 > 网站相关 >>

给定已知100个地址的经纬度 如何求出每个地址对应最近的三个地址?

已知100个地址的经纬度:地址1 地址2 地址3 ... 地址100

根据经纬度求出地址1对应最近的三个地址?
--------------------编程问答-------------------- 存到数据库里面..用SQL语句选择 经纬度差值最小的3条记录即可.

自己遍历计算也可以,就是麻烦 --------------------编程问答-------------------- 求两点间的距离。再求个最值 --------------------编程问答--------------------
引用 1 楼 xzhui 的回复:
存到数据库里面..用SQL语句选择 经纬度差值最小的3条记录即可.

自己遍历计算也可以,就是麻烦


经纬度差值最小的 这个是如何算呢? --------------------编程问答-------------------- 先把经纬度转换成投影坐标系再直接做加减运算 --------------------编程问答--------------------
引用 4 楼 cuit 的回复:
先把经纬度转换成投影坐标系再直接做加减运算


经纬度转换成投影坐标系 这个怎么算的 
我百度下投影坐标系 好像只有介绍 没有具体计算的方法 --------------------编程问答-------------------- 干嘛转呢,直接用经纬度比较不行吗?
虽然可能有误差,我认为可以忽略 --------------------编程问答--------------------
引用 6 楼 xzhui 的回复:
干嘛转呢,直接用经纬度比较不行吗?
虽然可能有误差,我认为可以忽略


地球是球体 三个经度数值连接起来可不是直线,谈何距离?
//经纬度转web墨卡托
 MapPoint lonLat2Mercator(MapPoint lonLat)
        {
            MapPoint mercator = new MapPoint();
            double x = lonLat.X * 20037508.34 / 180;
            double y = Math.Log(Math.Tan((90 + lonLat.Y) * Math.PI / 360)) / (Math.PI / 180);
            y = y * 20037508.34 / 180;
            mercator.X = x;
            mercator.Y = y;
            return mercator;
        }
//web墨卡托转经纬度
MapPoint Mercator2lonLat(MapPoint mercator)
        {
            MapPoint lonLat = new MapPoint();
            double x = mercator.X / 20037508.34 * 180;
            double y = mercator.Y / 20037508.34 * 180;
            y = 180 / Math.PI * (2 * Math.Atan(Math.Exp(y * Math.PI / 180)) - Math.PI / 2);
            lonLat.X = x;
            lonLat.Y = y;
            return lonLat;
        } --------------------编程问答-------------------- 我认为经纬度之间差值的平方和的1/2次方 与 两点间距离 的大小关系是对应的..
我一般都想象把地球从-180,-90到180,90展开成一个矩形..

当然,楼上追求严谨的作风本人很佩服

--------------------编程问答-------------------- 你展开成一个矩形的过程就是投影的过程。
--------------------编程问答--------------------
引用 7 楼 cuit 的回复:
引用 6 楼 xzhui 的回复:

干嘛转呢,直接用经纬度比较不行吗?
虽然可能有误差,我认为可以忽略


地球是球体 三个经度数值连接起来可不是直线,谈何距离?
//经纬度转web墨卡托
 MapPoint lonLat2Mercator(MapPoint lonLat)
        {
            MapPoint mercator = new MapP……




baidu了下 发现要安装arcgis api for silverlight
有没有更直接点的可以拿来用的函数? --------------------编程问答-------------------- 我这函数还不够直接??
哪里含蓄了? --------------------编程问答-------------------- 如果100个地址属于同一个城市,可以直接用平面几何两点距离公式计算,然后选出值最小的三个 --------------------编程问答--------------------
引用 11 楼 cuit 的回复:
我这函数还不够直接??
哪里含蓄了?


Math.Log(Math.Tan((90 + lonLat.Y) * Math.PI
Math.Atan(Math.Exp(y * Math.PI / 180)) - Math.PI / 2);
zMath.Log 
Math.Tan
Math.Atan
Math.Exp
这四个函数不知道啊
Math.PI 这个是3.14159吧?
--------------------编程问答-------------------- 这是C#的语法 --------------------编程问答-------------------- 有c++的么 --------------------编程问答-------------------- 如果经度在一个区域,例如同是东经或同是西经,则可以使用xZhui的方法,但是如果跨区域,就要小心了,东经179度到西经179度的距离是很小的,要进行坐标换算才能够进行。
如果精度要求很高,则需要直接计算球坐标上的直线或测地线距离,否则,从不在赤道上的一个点,向西南45度移动和向西北45度移动同样的程度,则向赤道方向的距离要远一点,很复杂的。 --------------------编程问答-------------------- 同意1楼的做法,使用使用支持geometary类型的数据库比如postgresql或mysql都有geometary类型的add-on,然后转成geometary存入数据库,数据库里使用query来筛选。 --------------------编程问答-------------------- 如果没有其他的控件帮助的话
1、使用大圆距离公式求距离,然后逐个计算,这是一种比较笨的方法,不过如果是只有100(或1000个以内)个点的话,也算是一种快速实现的方法;
2、创建一个R类文件索引,这个实现起来难度就比较高了,可以谷歌一下相关的实现原理(查Lucene Spatial)和实现方法,我也没试过,只是知道有那么一种方法。

如有其他的控件
1、arcgis api 这个不用说(好像是有最近距离的方法,不过很久没用不清楚了)
2、其他的GIS软件API(其实跟ARCGIS差不多)
3、网络地图API(也只能是先求距离的笨方法)
4、用Lucene Spatial;
5、可支持空间查询(最邻近查询)功能的数据库,如ORACLE、postgreSQL等。 --------------------编程问答-------------------- java后台写的,功能需求与楼主一致,如何实现 ?? --------------------编程问答--------------------
引用 8 楼 xzhui 的回复:
我认为经纬度之间差值的平方和的1/2次方 与 两点间距离 的大小关系是对应的..
我一般都想象把地球从-180,-90到180,90展开成一个矩形..

当然,楼上追求严谨的作风本人很佩服

假设纬度都是0度,经度三个,标准点是东179,两个点分别是东159和西179,谁更近?
代码之美上的优化是全部转3维坐标先,然后求标准点与所有点的距离,然后返回最近的一个即可 --------------------编程问答-------------------- 除 --------------------编程问答--------------------    呵呵,使用数据库的话最方便了!
补充:企业软件 ,  地理信息系统
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,