Cod*_*eef 420 mysql mapping maps database-design latitude-longitude
请记住,我将在lat/long对上执行计算,哪种数据类型最适合与MySQL数据库一起使用?
Ted*_*ery 147
谷歌为使用谷歌地图的"商店定位器"应用程序提供了一个开始完成PHP/MySQL解决方案.在此示例中,它们将lat/lng值存储为"Float",长度为"10,6"
http://code.google.com/apis/maps/articles/phpsqlsearch.html
Sim*_*mon 125
基本上,它取决于您所在位置所需的精度.使用DOUBLE,你将拥有3.5nm的精度.DECIMAL(8,6)/(9,6)下降到16cm.FLOAT是1.7米......
这个非常有趣的表有一个更完整的列表:http://mysql.rjweb.org/doc.php/latlng:
Datatype Bytes Resolution
Deg*100 (SMALLINT) 4 1570 m 1.0 mi Cities
DECIMAL(4,2)/(5,2) 5 1570 m 1.0 mi Cities
SMALLINT scaled 4 682 m 0.4 mi Cities
Deg*10000 (MEDIUMINT) 6 16 m 52 ft Houses/Businesses
DECIMAL(6,4)/(7,4) 7 16 m 52 ft Houses/Businesses
MEDIUMINT scaled 6 2.7 m 8.8 ft
FLOAT 8 1.7 m 5.6 ft
DECIMAL(8,6)/(9,6) 9 16cm 1/2 ft Friends in a mall
Deg*10000000 (INT) 8 16mm 5/8 in Marbles
DOUBLE 16 3.5nm ... Fleas on a dog
Run Code Online (Sandbox Code Playgroud)
希望这可以帮助.
Jam*_*hek 74
MySQL的Spatial Extensions是最佳选择,因为您可以使用空间运算符和索引的完整列表.空间索引将允许您非常快速地执行基于距离的计算.请记住,从6.0开始,Spatial Extension仍然不完整.我没有放下MySQL Spatial,只是在你对这个问题做出太多分析之前让你知道陷阱.
如果您严格处理积分并且只处理DISTANCE功能,那么这很好.如果需要使用"多边形","线"或"缓冲点"进行任何计算,则除非使用"关联"运算符,否则空间运算符不会提供精确结果.请参阅21.5.6顶部的警告.诸如包含,内部或相交之类的关系使用MBR,而不是精确的几何形状(即椭圆被视为矩形).
此外,MySQL Spatial中的距离与第一个几何体的距离相同.这意味着如果您使用十进制度数,则您的距离测量值为十进制度数.这将使你很难得到准确的结果,因为你从赤道得到了更好的结果.
Ric*_*son 70
当我为ARINC424构建的导航数据库执行此操作时,我进行了大量测试并回顾了代码,我使用了DECIMAL(18,12)(实际上是NUMERIC(18,12)因为它是firebird).
浮点数和双打数据并不精确,可能会导致舍入错误,这可能是一件非常糟糕的事情.我不记得我是否发现任何有问题的真实数据 - 但我相当确定无法准确存储在浮点数或双数据中可能会导致问题
关键是当使用度数或弧度时,我们知道值的范围 - 并且小数部分需要最多的数字.
在MySQL中的空间扩展是一个很好的选择,因为他们遵循的开放GIS几何模型.我没有使用它们,因为我需要保持数据库的可移植性.
Gaj*_*jus 41
取决于您需要的精度.
Datatype Bytes resolution
------------------ ----- --------------------------------
Deg*100 (SMALLINT) 4 1570 m 1.0 mi Cities
DECIMAL(4,2)/(5,2) 5 1570 m 1.0 mi Cities
SMALLINT scaled 4 682 m 0.4 mi Cities
Deg*10000 (MEDIUMINT) 6 16 m 52 ft Houses/Businesses
DECIMAL(6,4)/(7,4) 7 16 m 52 ft Houses/Businesses
MEDIUMINT scaled 6 2.7 m 8.8 ft
FLOAT 8 1.7 m 5.6 ft
DECIMAL(8,6)/(9,6) 9 16cm 1/2 ft Friends in a mall
Deg*10000000 (INT) 8 16mm 5/8 in Marbles
DOUBLE 16 3.5nm ... Fleas on a dog
Run Code Online (Sandbox Code Playgroud)
来自:http://mysql.rjweb.org/doc.php/latlng
总结一下:
DOUBLE.DECIMAL(8,6)/(9,6).从MySQL 5.7开始,考虑使用空间数据类型(SDT),专门POINT用于存储单个坐标.在5.7之前,SDT不支持索引(当表类型为MyISAM时,5.6除外).
注意:
POINTclass时,存储坐标的参数顺序必须是POINT(latitude, longitude).ST_Distance)并确定一个点是否包含在另一个区域内(ST_Contains).sae*_*jad 33
基于这篇wiki文章 http://en.wikipedia.org/wiki/Decimal_degrees#Accuracy,MySQL中 的相应数据类型是Decimal(9,6),用于将经度和纬度存储在单独的字段中.
Ale*_*ove 19
使用DECIMAL(8,6)纬度(90至-90度)和DECIMAL(9,6)经度(180〜-180度).对于大多数应用程序,小数点后6位.两者都应该"签名"以允许负值.
Mar*_*dor 14
根据谷歌地图,没有必要走远,最好的是lat和lng的FLOAT(10,6).
小智 7
我们将oracle数据库中的纬度/经度X 1,000,000存储为NUMBERS,以避免双打出现错误.
鉴于小数点后第6位的纬度/经度是10厘米精度,这就是我们所需要的.许多其他数据库也将lat/long存储到第6个小数位.
从一个完全不同和更简单的角度来看:
VARCHAR),例如:" - 0000.0000001,-0000.000000000000001 "(长度为35,如果数字的小数位数超过7位则会被舍入);google.maps.geometry.poly.containsLocation(latLng, bermudaTrianglePolygon))这样您就不必担心索引数字以及与数据类型相关的所有其他问题,这些问题可能会破坏您的坐标.
纬度范围从 -90 到 +90(度),因此 DECIMAL(10, 8) 就可以了
经度范围从 -180 到 +180(度),因此您需要 DECIMAL(11, 8)。
注:第一个数字是存储的总位数,第二个数字是小数点后的数字。
简而言之:lat DECIMAL(10, 8) NOT NULL, lng DECIMAL(11, 8) NOT NULL
虽然它不是所有操作的最佳选择,但如果您正在制作地图图块或仅使用一个投影来处理大量标记(点)(例如墨卡托,如 Google 地图和许多其他滑地图框架所期望的),我发现了什么我称“庞大坐标系”非常非常方便。基本上,您以某种放大方式存储 x 和 y 像素坐标——我使用缩放级别 23。这有几个好处:
我在最近的一篇博客文章中讨论了这一切: http://blog.webfoot.com/2013/03/12/optimizing-map-tile- Generation/
TL; 博士
如果您不在 NASA / 军事部门工作并且不制造飞机导航系统,请使用 FLOAT(8,5)。
要完全回答您的问题,您需要考虑以下几点:
格式
所以答案的第一部分是 - 您可以以应用程序使用的格式存储坐标,以避免不断来回转换并进行更简单的 SQL 查询。
很可能您使用 Google Maps 或 OSM 来显示您的数据,而 GMaps 使用“十进制度数 2”格式。所以以相同的格式存储坐标会更容易。
精确
然后,您想定义所需的精度。当然你可以存储像“-32.608697550570334,21.278081997935146”这样的坐标,但是你有没有在导航到点的时候关心毫米?如果你不是在 NASA 工作,也不是在研究卫星、火箭或飞机的轨迹,那么几米的精度应该没问题。
常用格式是点后 5 位数字,精度为 50 厘米。
示例:X,21.278081 8和 X,21.278081 9之间有 1cm 的距离。所以点之后的 7 位数字给你 1/2cm 的精度,点之后的 5 位数字给你 1/2 米的精度(因为不同点之间的最小距离是 1m,所以舍入误差不能超过它的一半)。对于大多数民用目的,它应该足够了。
度十进制分钟格式(40° 26.767?N 79° 58.933?W)为您提供与点后 5 位数字完全相同的精度
节省空间的存储
如果您选择了十进制格式,那么您的坐标是一对 (-32.60875, 21.27812)。显然,2 x(符号为 1 位,度数为 2 位,指数为 5 位)就足够了。
所以在这里我想从评论中支持 Alix Axel说谷歌建议将它存储在 FLOAT(10,6) 中真的是额外的,因为主要部分不需要 4 位数字(因为符号是分开的,纬度是有限的到 90,经度限制为 180)。您可以轻松地使用 FLOAT(8,5) 获得 1/2m 的精度或使用 FLOAT(9,6) 获得 50/2cm 的精度。或者,您甚至可以将 lat 和 long 存储在分离的类型中,因为 FLOAT(7,5) 对 lat 来说就足够了。请参阅 MySQL 浮点类型参考。它们中的任何一个都将像正常的 FLOAT 一样并且等于 4 个字节。
现在空间通常不是问题,但是如果您出于某种原因想要真正优化存储(免责声明:不要进行预优化),您可以压缩 lat(不超过 91 000 个值 + 符号)+ long(不超过 181 000 个值 + 符号)到 21 位,这明显小于2xFLOAT(8 字节 == 64 位)
| 归档时间: |
|
| 查看次数: |
293174 次 |
| 最近记录: |