关于地图取多少公里范围内的司机/商户的查询优化

基于百度/高德地图的一些应用经常会有这样一种场景的查询:

取X公里范围内最近的Y位司机/商户。

某公司是这样做的:司机有一张司机信息表DriverInfo,另有一张司机位置信息表DriverPosition。

DriverPosition会实时更新司机目前的经度和纬度。

获取X公里范围内的司机使用到了一个标量值函数GetDistance,传入客户的经度和纬度,以及司机的经度和纬度

结果返回两者之间的距离。那么典型的查询就是这样的:

DECLARE @longitude AS FLOAT = 31.2373453826;
DECLARE @latitude AS FLOAT = 121.4976583979;
DECLARE @Range AS TINYINT = 3;
SELECT TOP 10
  D.ID
 ,D.Phone
 ,GetDistance(@longitude,@latitude,DP.Longitude,DP.Latitude) AS Distance
FROM
 DriverInfo AS D
INNER JOIN
 DriverPosition AS DP
ON D.ID = DP.ID
WHERE
 GetDistance(@longitude,@latitude,DP.Longitude,DP.Latitude) <= @Range
ORDER BY
 GetDistance(@longitude,@latitude,DP.Longitude,DP.Latitude) ASC

问题来了,上面这样的查询由于条件是在字段Longitude和Latitude上进行了运算,所以查询是会走Table Scan的。

大量的这样的并发查询会导致数据库服务器cpu一直爆表,怎么办呢?

--------------------------------------------------------------------------------------------------------------

实际上GetDistance这个函数无非是已客户的经纬度@longitude,@latitude为中心,以@Range为半径画了一个圆圈。

那么为了使用索引,我们也可以以@longitude,@latitude为中心,以@Range * 2为边,画一个正方形。如下图:

至于多少经度或者纬度是1公里呢,这里我们需要测算出一个系数x。例如近似0.009经度或纬度变化是1公里。

于是优化后的查询就成了下面这样:

DECLARE @longitude AS FLOAT = 31.2373453826;
DECLARE @latitude AS FLOAT = 121.4976583979;
DECLARE @Range AS TINYINT = 3;
DECLARE @longitudeLow AS FLOAT = 31.2373453826 - 3*0.009;
DECLARE @longitudeHight AS FLOAT = 31.2373453826 + 3*0.009;
DECLARE @latitudeLow AS FLOAT = 121.4976583979 - 3*0.009;
DECLARE @latitudeHight AS FLOAT = 121.4976583979 + 3*0.009;
SELECT TOP 10
  D.ID
 ,D.Phone
 ,GetDistance(@longitude,@latitude,DP.Longitude,DP.Latitude) AS Distance
FROM
 DriverInfo AS D
INNER JOIN
 DriverPosition AS DP
ON D.ID = DP.ID
WHERE     DP.Longitude BETWEEN @longitudeLow AND @longitudeHightAND DP.Latitude BETWEEN @latitudeLow  AND @latitudeHight
AND GetDistance(@longitude,@latitude,DP.Longitude,DP.Latitude) <= @Range
ORDER BY
 GetDistance(@longitude,@latitude,DP.Longitude,DP.Latitude) ASC
时间: 2024-09-30 04:53:04

关于地图取多少公里范围内的司机/商户的查询优化的相关文章

小爬虫,抓取某贴吧内所有帖子的图片

#!/usr/bin/env python #-*- coding:utf8 -*- import sys reload(sys) sys.setdefaultencoding('gbk') import urllib,urllib2 import re from bs4 import BeautifulSoup class GetHtml(): def __init__(self): headers = { #伪装为浏览器抓取 'User-Agent':'Mozilla/5.0 (Window

根据一个经纬度求几公里范围内的数据

/** *求两个已知经纬度之间的距离,单位为米 *@param lng1,lng2 经度 *@param lat1,lat2 纬度 *@return float 距离,单位米 **/ function getDistance($lng1,$lat1,$lng2,$lat2){ //将角度转为狐度 $radLat1=deg2rad($lat1);//deg2rad()函数将角度转换为弧度 $radLat2=deg2rad($lat2); $radLng1=deg2rad($lng1); $radL

用数组取到当前栈内的ViewController 并根据下标取某个ViewController

NSArray *navArray = self.navigationController.viewControllers; TabsViewController *tabsVC = [[TabsViewController alloc]init]; tabsVC = [navArray objectAtIndex:1]; [self.navigationController popToViewController:tabsVC animated:YES];

iOS-百度地图_屏幕所显示范围内的经纬度

//当前屏幕中心点的经纬度 CGFloat centerLongitude = self.mapView.region.center.longitude; CGFloat centerLatitude = self.mapView.region.center.latitude; //当前屏幕显示范围的经纬度 CLLocationDegrees pointssLongitudeDelta = self.mapView.region.span.longitudeDelta; CLLocationDe

附近门店的实现

门店系统作为O2O体系重要的一环,LBS功能自然是当中必不可少的利器.在搭建附近门店的系统,通常情况需要满足这样的需求: (1)       附近默认距离(比如两公里)内的某商户的门店 (2)       找不到的话,扩大距离继续查询 (3)       查询到门店,返回距离数据 这么看,是球面空间两点的距离分析问题.可是随着门店数据的增加,简单距离计算的次数就会被放大,我们就会自然地考虑到,门店的位置是固定的,能否进行一些预处理,把门店先切片,然后把用户的位置先放到某个片中,再进行距离计算.

【转】通过经纬度坐标计算距离的方法(经纬度距离计算)

最近在网上搜索“通过经纬度坐标计算距离的方法”,发现网上大部分都是如下的代码: #define PI 3.14159265 static double Rc = 6378137;  // 赤道半径 static double Rj = 6356725;  // 极半径 class JWD { public: double m_Longitude, m_Latitude; double m_RadLo, m_RadLa; double Ec; double Ed; public: JWD(doub

百度地图POI数据爬取,突破百度地图API爬取数目“400条“的限制11。

1.POI爬取方法说明 1.1AK申请 登录百度账号,在百度地图开发者平台的API控制台申请一个服务端的ak,主要用到的是Place API.检校方式可设置成IP白名单,IP直接设置成了0.0.0.0/0比较方便. Place API 提供的接口用于返回查询某个区域的某类POI数据,且提供单个POI的详情查询服务,用户可以使用C#.C++.Java,Python等开发语言发送请求,接收json.xml的数据.关于Place API的具体使用可以参考:Place API Web服务API 1.2爬

用百度地图API分析打交通大数据

百度地图API, 文档不全,例子不细致. 在网上还没有太多有用的例子.比如说下面几个需求的解决方案就找不到: 1. 如何用百度地图API查询一个地点的经纬度. 2. 如何用百度地图通过一个经纬度查询商圈和地址. 3.点击百度地图时, 获得点击位置的经纬度. 4. 如果按照时间轴动态显示热力图的变化. 我昨天玩了一下午百度地图javascript API,解决了上面的几个问题,顺道用少量打车用户的抽样数据做一个数据可视化, 给大家提供一个可以参考的例子 首先数据是来自北京市某个周日的出行数据, 其

用R语言制作交互式图表和地图

原文链接:http://tecdat.cn/?p=8032 可以直接从R / RStudio制作在线交互式图表和地图. 配置 启动RStudio,创建一个新的RScript,然后将工作目录设置为下载的数据文件夹. 使ggplot2图表成为交互式Plotly图表 制作交互式 点线图 以下代码将安装并加载程序包(该程序还将自动加载ggplot2),加载readr和dplyr,然后加载我们之前使用的食品券数据. # install and load plotly, load readr and dpl