mysql存储地图经纬度的表怎么设计?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了mysql存储地图经纬度的表怎么设计?相关的知识,希望对你有一定的参考价值。
我用百度地图API做了一个地图, 需要存储海量的坐标。
一个坐标是由经度和纬度组成的。 如,经度:116.447962 纬度:39.928216
我现在用的是mysql数据库,表结构大概是这样的:
id 主键,自增
lng 类型:decimal(10,7) 经度
lat 类型:decimal(10,7) 纬度
info 类型:char(80) 其他
---------------------------------------------------------------------------------
我的地图要实现的功能是: 每当用户拖动地图,或者放大缩小地图, 就必须动态加载视野内的坐标。
---------------------------------------------------------------------------------
我现在的思路是这样的:
每当用户拖动地图或者放大地图后, 首先获取地图矩形视野内的左上角和右下角的经纬度。
如,左上角经度 left_lng 左上角纬度 left_lat , 右下角经度 right_lng , 右下角纬度 right_lat ,
然后把四个值用http请求发到服务器, 服务器端php用sql语句查库后返回此矩形区域内的坐标,
sql 语句是:
SELECT * FROM 表
WHERE
lng>left_lng AND
lng<right_lng AND
lat>right_lat AND
lat<left_lat
---------------------------------------------------------------------------------
我的问题是:
1. 我的坐标将来很可能是海量的, 而且用户使用地图的时候肯定会非常频繁的拖动,也就意味着非常频繁的查库。 如果按照我上述的思路的话, 会不会非常耗费服务器资源, 数据库会不会受不了?
2. 我这样的应用很常见, 业界现在主流的解决方案是什么? 比如用的什么数据库? 怎样设计的表结构 ? 怎样加的索引? 是否还有什么我不知道的软件等等。
3. 貌似这个是GIS的知识,但我对GIS没有一点了解。 听说mysql 有个专门存储空间信息的版本,是不是专门为了解决我这个问题的?
4. 我是数据库菜鸟, 算法菜鸟 兼 GIS 白痴, 请给我这个应用解决方法的简单指导(技术方面的) 。
谢谢。
若有问题,请您及时追问我
若满意,请您及时采纳
谢谢您的关照~ 参考技术A 建议你看下MongoDB数据库。
MongoDB提供了一种GEO数据类型,专门处理地理位置坐标的,跟你这个应用场景极其吻合。
另外你的坐标数量是海量的,用MySQL很难抗的住。
MySQL到千万级的数据量就很吃力了。
LBS高德地图百度地图的经纬度科普|MySQL和编程语言是如何计算两个坐标之间的距离?
目录
一、经纬度的科普
什么是经纬度呢?其实各位上学的时候地理课上都学过,作为本文中基础中的基础,有必要普及一下。
地理坐标系一般是指由经度、纬度和相对高度组成的坐标系,能够标示地球上的任何一个位置。经度和纬度常合称为经纬度,把球面上的经纬度显示在平面地图上需要采用某种地图投影。
经度、纬度能够标记地球上的位置。
经纬度以度数表示,一般可直接以小数点表示,但亦可把度数的小数点分为角分(1角分等于六十分之一度),和秒(一秒等于六十分之一分)。
- 度分秒表示(度:分:秒)-49°30’00"-49d30m00s
- 度分表示(度:分)-49°30.0’-49d30.0m
- 度数表示-49.5000°-49.5000d(一般会有四位小数)。
经度范围是0-180°,纬度范围是0-90°。
二、目前各大地图平台的经纬度标注方式
1. 百度地图
百度地图的页面不支持查看经纬度坐标,你需要到百度地图开放平台找打拾取坐标工具,地址是 https://api.map.baidu.com/lbsapi/getpoint/index.html ,可以在地图选点,找到经纬度。
下图所示,我在地图上找到的点的作为116.415979,39.888558
。
百度地图的坐标是经度在前纬度在后的方式。
2. 高德地图
高德地图同样也需要在开放平台找到坐标拾取器,可以查看具体位置的坐标,地址是https://lbs.amap.com/tools/picker , 比如我还是在天坛公园内随便找了一个点,坐标为116.410829,39.881913
。
百度地图和高德地图都是保留了小数点后6位。
3. 谷歌地图
谷歌地图在位置上点击,就能显示位置的坐标,下图的坐标为39.883966, 116.414634
.
和上面两个不同的是,谷歌地图的坐标为纬度在前经度在后,需要你在实际项目开发中注意。
三、坐标体系
1. 目前的坐标体系有哪些
WGS84:为一种大地坐标系,也是目前广泛使用的GPS全球卫星定位系统使用的坐标系。
GCJ02:又称火星坐标系,是由中国国家测绘局制定的地理坐标系统,是由WGS84加密后得到的坐标系。
BD09:为百度坐标系,在GCJ02坐标系基础上再次加密。其中bd09ll表示百度经纬度坐标,bd09mc表示百度墨卡托米制坐标。
2. 各大地图平台使用的是哪种坐标体系
- 百度地图——BD09
- 高德地图——GCJ02
- 谷歌地图——GCJ02
目前百度地图提供了非百度坐标系转换为百度坐标系的API,文档地址是 https://lbsyun.baidu.com/index.php?title=webapi/guide/changeposition 。
注意的是,根据相关法律规定,不支持将任何一种坐标系坐标转换为GPS标准坐标。
我们从接下来要讲的的距离测算方法来看,不同的坐标体系内测量距离的方式是一样的,坐标体系更多的意义是在于对于真实坐标系的隐藏而不影响日常大众对于位置服务的使用。
三、两个坐标之间的距离计算
目前市面上计算两点之间距离的基本都是基于余弦球面定律,该定律使用三角函数来测量地球的曲率,以准确测量地球上的距离。
1. geodatasource
这个网站提供了全世界各个城市的经纬度信息,他自带了距离计算器,地址是 https://www.geodatasource.com/demo ,并且提供各种语言的距离计算函数。你在网上搜索到的各种文章,也基本都是这个源码。
function distance($lat1, $lon1, $lat2, $lon2, $unit)
if (($lat1 == $lat2) && ($lon1 == $lon2))
return 0;
else
$theta = $lon1 - $lon2;
$dist = sin(deg2rad($lat1)) * sin(deg2rad($lat2)) + cos(deg2rad($lat1)) * cos(deg2rad($lat2)) * cos(deg2rad($theta));
$dist = acos($dist);
$dist = rad2deg($dist);
$miles = $dist * 60 * 1.1515;
$unit = strtoupper($unit);
if ($unit == "K")
return ($miles * 1.609344);
else if ($unit == "N")
return ($miles * 0.8684);
else
return $miles;
echo distance(32.9697, -96.80322, 29.46786, -98.53506, "M") . " Miles<br>";
echo distance(32.9697, -96.80322, 29.46786, -98.53506, "K") . " Kilometers<br>";
echo distance(32.9697, -96.80322, 29.46786, -98.53506, "N") . " Nautical Miles<br>";
其他语言参考 https://www.geodatasource.com/resources/categories/technical/
2. MYSQL
MySQL的5.7版本内建了函数,可以计算距离。文档地址是 https://dev.mysql.com/doc/refman/5.7/en/spatial-convenience-functions.html#function_st-distance-sphere 。
SELECT ST_Distance_Sphere(ST_GeomFromText('POINT(116.41294 39.883374)'), ST_GeomFromText('POINT(116.413085 39.882777)')) as d_distance;
如下图所示,返回的距离单位是米。
四、总结
在实际项目中,要统一使用的地图API,尽量不要多种地图一起使用,不同的坐标体系在地图上标记位置会不准确。
以上是关于mysql存储地图经纬度的表怎么设计?的主要内容,如果未能解决你的问题,请参考以下文章