请牛人指点,如何以最优的算法,对两点间的距离进行排序。

问题描述

业务要求:根据APP当前位置,取得距离最近的10条记录,再次刷新时,取得后10条最近的数据。。。我考虑的思路:■思路1:查询出数据库中所有的数据,根据两点的经度和纬度计算得到距离。再按照距离排序。缺点是,如果数据库有100万条数据,每次取出来,效率会很慢。■思路2:SQL查询语句中,取得两点间,经度和纬度差值的绝对值,以从小到大排序,取得前10条即可。这样查出来的数据量就比较小了。正确的思路到底是什么呢,不知道别人的APP距离排序怎么个算法。★Java算法是什么呢??★APP客户端传递的参数1:当前位置所在地址2:当前位置的经度3:当前位置的纬度★数据库中表字段。1:城市名2:地址3:经度4:纬度

解决方案

1. 一看你的描述就知道是暴力的做法, 没有任何搜索方面的经验吧.2. 想要快速, 预先存数据的时候, 就做好预处理, 之后取数据的能过滤掉无关的数据.例如你查询杭州市滨江区星光大道附近的临近的位置, 有必要将北京地区的数据也取出来计算么?目前地理位置搜索, 已经有现成的标准的做法了. 我就不用具体说明了, 你自己google一下.给你提供一个博客的参考: http://blog.csdn.net/a221133/article/details/14525197
解决方案二:
不知道你用的什么数据库,如果数据库支持geometry类型字段(比如SqlServer),那么它会自带一系列的相关空间索引的建立,以及空间运算函数的支持。虽然不能直接解决你的问题,但是可以用如下思路进行:1,根据APP所在点的坐标,计算以它为中心的一个类似圆形的多边形(边的个数根据你的精确度要求改变,最简单是正方形),认为这个多边形范围内的数据是我们需要查询的对象。2,使用geometry的空间函数,查询时候作为where条件代入。具体说的话,就是对象形状的空间坐标落在你计算出的多边形范围内即可。这属于点和面的空间计算,一般的空间函数都是支持的。范围内的数据应该很少了,然后自己计算距离取前10件即可。如果数据库不支持,那么就要你自己动动脑子建立相关的索引用来减少计算次数了。一个思路是,自己定义一套匹配规则,根据已知的坐标信息,可以把所有数据2分一下。然后再次二分。。。。直到分配到一个自己可以接受的数据量范围再行遍历。具体说的话,你可以给每条数据做一个列用来存储这个索引信息。比如你把整体地图先切分成若干个格子(比如1000个),每个格子对应相应的经纬度范围,数据插入的时候可以更新这列的信息。那么将来检索的时候,根据这列就可以过滤出来相当小量的数据,那么再遍历就没有那么慢了。可以把这个思路多层次展开,过滤多次,每次限定更小的范围。。。就看速度要求了。

时间: 2024-10-03 23:26:44

请牛人指点,如何以最优的算法,对两点间的距离进行排序。的相关文章

pat-PAT1017 最后两个测试点通不过,请牛人帮忙看下

问题描述 PAT1017 最后两个测试点通不过,请牛人帮忙看下 我的代码 解决方案 http://blog.csdn.net/stevesun13/article/details/39894561

求牛人指点怎么用jmeter做接口性能测试,重点是测并发量和接口反映速度

问题描述 求牛人指点怎么用jmeter做接口性能测试,重点是测并发量和接口反映速度 求牛人指点怎么用jmeter做接口性能测试,最近公司要把从界面.移动端的访问数据库的数据做成接口,需要做这些接口的性能测试.且提及用jmeter做,重点是测并发量和接口反映速度.小弟我都没用过jmeter,就百度了一下.能打开jmeter.bat,然后就是线程组.http请求.结果树.聚合报告.其他都不知道了.编程的话,C有基础.JAVA就只知道纯语法. 现在求牛人指点怎么用jmeter做接口性能测试. 解决方案

Ext Gui Builder 添加Grid控件,请牛人指教

问题描述 因项目需要现在对Ext Gui builder 添加一些组件,如gridpanel,treepanel等.Ext Gui Builder 添加Grid控件,请牛人指教 解决方案 http://www.projectspace.nl/ 这个网站可以添加grid

多线程牛人指点下啊,兄弟我调的眼花心烦

问题描述 import java.util.ArrayList;import java.util.Vector;import java.util.concurrent.BrokenBarrierException;import java.util.concurrent.CyclicBarrier;/** * Created by IntelliJ IDEA. * User: william * Date: 2011-2-28 * Time: 19:34:52 * To change this t

有关DirectInput的游戏柄力反馈编程的问题,请牛人指教

问题描述 我在用DirectX的DirectInput编写游戏的力反馈时,无法实现GUID_Damper,即用DICONDITION参数定义的力反馈,那位牛人有配置的相关参数?我不知道参数该怎么设,网上搜了搜,没有一个例子,光给了一个大概范围,怎么设都出不来!多谢啊 解决方案 解决方案二:关注,目前我只做到directsound部分的解决方案三:up解决方案四:DirectInput有一个接口,DIRECTINPUTEFFECT,只要创建了他就可以实现力反馈.具体实现方法如下:1.首先判断设备是

JAVA传值的问题,请牛人帮忙解答

问题描述 通过实体类GET出两个值传到A方法中,假设传的值为1,abc. 在方法体使用这两个变量的时候结果发现输出的值都为1. 不知道什么原因.. 分都在这里了. 问题补充: 还是谢谢你们 问题已经解决了.. 调用借口的时候,不知道谁把我传的值给覆盖了. 郁闷了半天 都是牛人,我的分也就这么点.. 我就随便给了哈 解决方案 贴出简单代码解决方案二:贴代码吧,问题解决不了那描述多半也是片面的.解决方案三:有代码,有真相,速递代码.解决方案四:代码啊,代码,贴出来,光描述怎么能了解呢.解决方案五:设

请牛人帮忙看一下代码哪里错了

问题描述 rgbBitmap是装载bmp图像数据部分的内容,此程序的目的是想把内存中的图像数据在pictureBox中显示.但是不知道为什么总是在倒数第二行出现一个这样的异常:未处理的"System.ArgumentException"类型的异常出现在system.drawing.dll中.其他信息:使用了无效参数.Image*myImage;MemoryStream*myStream;myStream=newMemoryStream;BinaryWriter*myWriter;myW

做excel导入时 内存溢出 求牛人指点

问题描述 现正在做excel导入功能 但是每次执行到book = Workbook.getWorkbook(theFile.getInputStream()); 这一步时 就出现内存溢出在网上搜索结果比较茫然, 症结在于 JVM内存太小通过tomcate statu 查看jvm内存:于是修改了 myeclipse 安装目录下的:eclipse.ini 文件 内容如下:-showsplashcom.genuitec.myeclipse.product--launcher.XXMaxPermSize

jira 审批功能报错求助,麻烦各位牛人指点

问题描述 上周在jira官网试用ScriptRunner插件,实现了并联审批功能.电子流的设计http://www.xuebuyuan.com/2018423.html这个网页上学习的.今天使用审批功能时就报错了一直找不出原因,请各位指点帮忙指点下.报错如下:TechnicaldetailsLog'sreferralnumber:26177611-92c5-4229-9b35-632e18070ae5CauseRefererURL:http://192.168.19.31/browse/FEED