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

更新时间:2023-07-13 00:59:46 阅读: 评论:0

坐标经纬度的基本运算(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.03102000AS DECIMAL(18, 8)) /180
*PI()) +COS(23.03057/180*PI())
*COS(CAST(23.03102000AS DECIMAL(18, 8)) /180
*PI()) *COS(( 113.75213
-CAST(113.75212000AS 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;
}
View Code
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) +
s = s * 6378.137;// EARTH_RADIUS;
s = und(s * 10000) / 10000;
return s;
}
// 调⽤ return的距离单位为km
//GetDistance(23.03057,113.75213,23.03102000,113.75212000)
View Code
扩展
⼤量频繁的计算消耗过多的服务器资源。特别在数据库⽐如计算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 Distance
FROM      Store WITH ( NOLOCK )
) T
WHERE  T.Distance <=10*1000
ORDER BY Distance ASC
View Code
这样不就计算了全部记录⾏后再排序嘛,既然已经限定了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)) / s(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
};
}
中国历代皇帝顺序表View Code
得到这四个值后就可以在sql中添加条件了
WHERE [Latitude] BETWEEN @minLatitude AND @maxLatitude
AND [Longitude] BETWEEN @minLongitude AND @maxLongitude
配合索引将⼤⼤提升效率。
LBS的服务场景随处可见,对应⼩型的应⽤基于有限的资源,这种优化设计很⼤作⽤。拉祜族

本文发布于:2023-07-13 00:59:46,感谢您对本站的认可!

本文链接:https://www.wtabcd.cn/fanwen/fan/89/1079158.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:坐标   距离   服务   经纬度   计算   信息
相关文章
留言与评论(共有 0 条评论)
   
验证码:
推荐文章
排行榜
Copyright ©2019-2022 Comsenz Inc.Powered by © 专利检索| 网站地图