坐标经纬度的基本运算(2个坐标经纬度的距离、中心点坐标经纬度范围内的坐标计算)

现在的应用大都居于LBS服务,用户地理位置的获取(经纬度坐标、所属行政区域),提供服务场所的地理位置也有行政区域信息和坐标信息。

用户与服务场所的联系,就近服务原则的设计,服务场所相对于用户的排序。

一个简单的案例的设计:

根据用户定位获取服务场所,按距离排序。

用户端提供信息:居于经纬度的坐标信息(例如:纬度23.03057,经度113.75213),区域信息(省市区)

服务场所信息:经纬度,区域信息

相关概念:

目前国内主要有以下三种坐标系:

WGS84:为一种大地坐标系,也是目前广泛使用的GPS全球卫星定位系统使用的坐标系。

GCJ02:又称火星坐标系,是由中国国家测绘局制订的地理信息系统的坐标系统。由WGS84坐标系经加密后的坐标系。

BD09:为百度坐标系,在GCJ02坐标系基础上再次加密。其中bd09ll表示百度经纬度坐标,bd09mc表示百度墨卡托米制坐标。

非中国地区地图,服务坐标统一使用WGS84坐标。

*这里我们先不考虑个坐标系的差异,按统一的公式计算。

地理知识和相关三角函数计算:

地球是一个近似于圆形的球体,半径6378137米。在地球经线上,1纬度为111km左右,在地球纬线上,1经度为111cosα(α表示该纬线的纬度.在不同纬线上,经度每差1度的实际距离是不相等的))。

计算2个经纬度的距离:

坐标点:A点:23.03057,113.75213  B点:23.03102,113.75212

计算2点的距离(米)

1、sql

SELECT  CAST(6378137.0 * ACOS(SIN(23.03057 / 180 * PI())* SIN(CAST(23.03102000 AS DECIMAL(18, 8)) / 180* PI()) + COS(23.03057 / 180 * PI())* COS(CAST(23.03102000 AS DECIMAL(18, 8)) / 180* PI()) * COS(( 113.75213- CAST(113.75212000 AS DECIMAL(18,8)) ) / 180* PI())) AS INT) AS Distance

2、C# 

public static double EARTH_RADIUS = 6378137d;/// <summary>/// 计算两点位置的距离,返回两点的距离,单位:公里或千米/// 该公式为GOOGLE提供,误差小于0.2米/// var dis = Utils.PointUtil.GetDistance(23.03057, 113.75213, 23.03102000, 113.75212000);/// </summary>/// <param name="lat1">第一点纬度</param>/// <param name="lng1">第一点经度</param>/// <param name="lat2">第二点纬度</param>/// <param name="lng2">第二点经度</param>/// <returns>返回两点的距离,单位:公里或千米</returns>public static double GetDistance(double lat1, double lng1, double lat2, double lng2){//地球半径,单位米double radLat1 = Rad(lat1);double radLng1 = Rad(lng1);double radLat2 = Rad(lat2);double radLng2 = Rad(lng2);double a = radLat1 - radLat2;double b = radLng1 - radLng2;double result = 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;return result / 1000;}/// <summary>/// 经纬度转化成弧度/// </summary>/// <param name="d"></param>/// <returns></returns>private static double Rad(double d){return (double)d * Math.PI / 180d;}

3、JavaScript

//计算2个坐标点的距离,返回千米function GetDistance(lat1, lng1, lat2, lng2){var radLat1 = lat1 * Math.PI / 180.0;var radLat2 = lat2 * Math.PI / 180.0;var a = radLat1 - radLat2;var b = lng1 * Math.PI / 180.0 - lng2 * Math.PI / 180.0;var s = 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)));s = s * 6378.137;// EARTH_RADIUS;s = Math.round(s * 10000) / 10000;return s;}// 调用 return的距离单位为km//GetDistance(23.03057,113.75213,23.03102000,113.75212000)

扩展

大量频繁的计算消耗过多的服务器资源。特别在数据库比如计算10W条数据再按距离排序,这性能可想而知。那问题来了,如何优化呢?

技术上:加服务器,加缓存,前端分摊计算

业务上:添加条件嘛,缩写范围,比如添加地区条件

有一种情况:获取距离用户10公里范围内的服务场所。

sql 可能这样写:

 SELECT *FROM   ( SELECT    ID ,Store ,CAST(6378137.0 * ACOS(SIN(@lat / 180 * PI())* SIN(CAST([Latitude] AS DECIMAL(18,8)) / 180 * PI())+ COS(@lat / 180 * PI())* COS(CAST([Latitude] AS DECIMAL(18,8)) / 180 * PI())* COS(( @lng- CAST([Longitude] AS DECIMAL(18,8)) ) / 180* PI())) AS INT) AS DistanceFROM      Store WITH ( NOLOCK )) TWHERE  T.Distance <= 10 * 1000ORDER BY Distance ASC 

这样不就计算了全部记录行后再排序嘛,既然已经限定了10公里范围,想想如果可以得到中心点(用户坐标)10公里范围的最大、最小坐标不就能作为筛选条件了吗。

在平面中,以用户坐标位原点,根据距离取得四个顶点的坐标。

获取最大、最小经纬度坐标值

1、JavaScript

//经度、纬度、多少米 内的最大最小坐标点function FindMaxMinPoint(longitude, latitude, distance){var r = 6378137; //地球半径米var dis = distance; //米 var dlng = 2 * Math.asin(Math.sin(dis / (2 * r)) / Math.cos(latitude * Math.PI / 180));dlng = dlng * 180 / Math.PI;//角度转为弧度var dlat = dis / r;dlat = dlat * 180 / Math.PI;//角度转为弧度var minlat = latitude - dlat;var maxlat = latitude + dlat;var minlng = longitude - dlng;var maxlng = longitude + dlng;console.log(minlat);console.log(maxlat);console.log(minlng);console.log(maxlng);}FindMaxMinPoint(113.75213, 23.03057, 10*1000);

2、C#

/// <summary>/// 获取坐标点多少米内最大、最小坐标值/// </summary>/// <param name="longitude"></param>/// <param name="latitude"></param>/// <param name="distance">多少米</param>/// <returns></returns>public static dynamic FindMaxMinPoint(double longitude, double latitude, double distance){//先计算查询点的经纬度范围  double r = 6378137;//地球半径米  double dis = distance;//米距离    double dlng = 2 * Math.Asin(Math.Sin(dis / (2 * r)) / Math.Cos(latitude * Math.PI / 180));dlng = dlng * 180 / Math.PI;//角度转为弧度  double dlat = dis / r;dlat = dlat * 180 / Math.PI;//角度转为弧度  double minlat = latitude - dlat;double maxlat = latitude + dlat;double minlng = longitude - dlng;double maxlng = longitude + dlng;return new{MinLat = minlat,MaxLat = maxlat,MinLng = minlng,MaxLng = maxlng};}

得到这四个值后就可以在sql中添加条件了

WHERE [Latitude] BETWEEN @minLatitude AND @maxLatitude
AND [Longitude] BETWEEN @minLongitude AND @maxLongitude

配合索引将大大提升效率。

LBS的服务场景随处可见,对应小型的应用基于有限的资源,这种优化设计很大作用。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/599266.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

这些流行的K8S工具,你都用上了吗

关注【云原生百宝箱】公众号&#xff0c;获取更多云原生消息 本文介绍了一些流行的 Kubernetes 工具和常见的集群组件。例如 Helm 作为 Kubernetes 应用的包管理器&#xff0c;以及本地开发所需的 Kubernetes 发行版。另外提及了一些常见的集群组件&#xff0c;如集群自动缩放器…

软件测试|一篇文章带你深入理解SQL约束

深入理解SQL约束&#xff1a;保障数据完整性和一致性的重要工具 SQL约束是在关系型数据库中用于保障数据完整性和一致性的重要工具。本文将深入探讨SQL约束的概念、类型以及应用&#xff0c;以帮助读者更好地理解和使用SQL约束来确保数据库中的数据质量。 SQL约束 约束&…

“巴渝工匠杯”2022年重庆市职业院校技能大赛(高职组)云计算样题

“巴渝工匠杯”2022年重庆市职业院校技能大赛&#xff08;高职组&#xff09;云计算样题 需要软件包环境可私信博主 【赛程名称】云计算赛项第一场次-私有云 某企业拟使用OpenStack搭建一个企业云平台&#xff0c;以实现资源池化弹性管理、企业应用集中管理、统一安全认证和授…

2024年【北京市安全员-A证】考试试卷及北京市安全员-A证试题及解析

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 北京市安全员-A证考试试卷根据新北京市安全员-A证考试大纲要求&#xff0c;安全生产模拟考试一点通将北京市安全员-A证模拟考试试题进行汇编&#xff0c;组成一套北京市安全员-A证全真模拟考试试题&#xff0c;学员可…

python-查漏补缺笔记-更新中

包导入时__init__.py中命令的执行顺序和sys.modules变化 ref: https://edu.csdn.net/skill/practice/python-3-6/164 在有父包和子包的情况下&#xff0c;父包中的“ __ init__.py”语句会在子包的“ __ init__.py”语句之前执行&#xff0c;然后按下列顺序执行导入子包和模块…

计算机毕业设计选题分享-spring boot疾病查询网站01548(赠送源码数据库)JAVA、PHP,node.js,C++、python,大屏数据可视化等

spring boot疾病查询网站 摘 要 随着互联网时代的到来&#xff0c;同时计算机网络技术高速发展&#xff0c;网络管理运用也变得越来越广泛。因此&#xff0c;建立一个B/S结构的疾病查询网站&#xff0c;会使疾病查询工作系统化、规范化&#xff0c;也会提高医院形象&#xff0c…

SpringBoot集成沙箱支付

前言 支付宝沙箱支付&#xff08;Alipay Sandbox Payment&#xff09;是支付宝提供的一个模拟支付环境&#xff0c;用于开发和测试支付宝支付功能的开发者工具。在真实的支付宝环境中进行支付开发和测试可能涉及真实资金和真实用户账户&#xff0c;而沙箱环境则提供了一个安全…

es6中import * as导入方式

es6中import * as导入方式 一、问题和解决方法二、简介import * as三、ES6 模块化语法导入导出1.导入2.导出 一、问题和解决方法 问题报错: export ‘default’ (imported as ‘XLSX’) was not found in ‘xlsx’ (possible exports: CFB, SSF, parse_xlscfb, parse_zip, read…

深入了解Swagger注解:@ApiModel和@ApiModelProperty实用指南

在现代软件开发中&#xff0c;提供清晰全面的 API 文档 至关重要。ApiModel 和 ApiModelProperty 这样的代码注解在此方面表现出色&#xff0c;通过增强模型及其属性的元数据来丰富文档内容。它们的主要功能是为这些元素命名和描述&#xff0c;使生成的 API 文档更加明确。 Api…

STC进阶开发(四)SPI协议、矩阵键盘、EEPROM

前言 这一期我们简单介绍一下SPI协议&#xff0c;然后我们学习一下矩阵键盘&#xff0c;了解EEPROM是干什么用的&#xff0c;话不多说&#xff0c;开整&#xff01; SPI协议 SPI&#xff08;Serial Peripheral Interface&#xff09;是一种同步串行通信协议&#xff0c;用于在…

rtsp解析视频流

这里先说一下 播放rtsp 视频流&#xff0c;尽量让后端转换一下其他格式的流进行播放。因为rtsp的流需要flash支持&#xff0c;现在很多浏览器不支持flash。 先说一下这里我没有用video-player插件&#xff0c;因为它需要用flash ,在一个是我下载flash后&#xff0c;还是无法播放…

Pytorch的GPU版本安装,在安装anaconda的前提下安装pytorch

本文基于conda安装GPU版本的PyTorch 一、CUDA 1.下载CUDA 点击下载 找到对应的版本进行下载 &#xff08;1&#xff09;打开命令提示符查看自己的版本&#xff0c;输入 nvidia-smi 根据自己的版本进行下载 &#xff08;2&#xff09;点击适合自己的版本进行下载 &#…

【MLOps】使用Ray缩放AI

Ray正在人工智能工程领域崭露头角&#xff0c;对扩展LLM和RL至关重要 Spark在数据工程中几乎是必不可少的。Ray正在人工智能工程领域崭露头角。 雷是伦敦大学学院Spark的继任者。Spark和Ray有很多相似之处&#xff0c;例如用于计算的统一引擎。但Spark主要专注于大规模数据分析…

【Python机器学习】k近邻——模型复杂度与泛化能力的关系

以某数据进行研究&#xff0c;先将数据集分为训练集和测试集&#xff0c;然后用不同的邻居数对训练集合测试集的新能进行评估&#xff1a; from sklearn.datasets import load_breast_cancer from sklearn.model_selection import train_test_split from sklearn.neighbors imp…

go执行静态二进制文件和执行动态库文件

目的和需求&#xff1a;部分go的核心文件不开源&#xff0c;例如验证&#xff0c;主程序核心逻辑等等 第一个想法&#xff0c;把子程序代码打包成静态文件&#xff0c;然后主程序执行 子程序 package mainimport ("fmt""github.com/gogf/gf/v2/os/gfile"…

ReCAPTCHA 解决方案的自动识别和解决方法

ReCAPTCHA&#xff0c;作为广泛使用的安全措施&#xff0c;旨在区分人类和自动化机器人。然而&#xff0c;技术的进步导致了自动识别和解决 ReCAPTCHA 挑战的方法的发展。在本文中&#xff0c;我们将探讨自动 ReCAPTCHA 识别和解决技术的概念&#xff0c;以及创新解决方案 Caps…

Yapi部署指南:在 Linux 上 Yapi 教程

YApi YApi 是高效、易用、功能强大的 api 管理平台&#xff0c;旨在为开发、产品、测试人员提供更优雅的接口管理服务。可以帮助开发者轻松创建、发布、维护 API&#xff0c;YApi 还为用户提供了优秀的交互体验&#xff0c;开发人员只需利用平台提供的接口数据写入工具以及简单…

题目:最大数组和(蓝桥OJ 3260)

问题描述&#xff1a; 解题思路&#xff1a; 官方&#xff1a; 总结&#xff1a;使用模拟。排序数组&#xff0c;枚举删除最大个数并推出其删除最小个数 &#xff0c;即可枚举出每一种可能的区间和&#xff0c;依次比较找最大区间和&#xff08;使用前缀和求区间和O(1)…

MySQL数据管理(一)

一、列类型 列类型指规定数据库中该列存放的数据类型 列类型分类 数值类型字符串类型日期和时间型数值类型 数值类型 字符串类型 日期和时间类型 MySQL允许“不严格”语法&#xff0c;任何标点符号都可以作为日期部分之间的间隔符&#xff0c;如“24-01-03”、“24.01.03”…

SSM建材商城网站----计算机毕业设计

项目介绍 本项目分为前后台&#xff0c;前台为普通用户登录&#xff0c;后台为管理员登录&#xff1b; 管理员角色包含以下功能&#xff1a; 管理员登录,管理员管理,注册用户管理,新闻公告管理,建材类型管理,配货点管理,建材商品管理,建材订单管理,建材评价管理等功能。 用…