【问题标题】:Lat / Lng store into mysql table [duplicate]Lat / Lng存储到mysql表中[重复]
【发布时间】:2012-08-07 21:32:45
【问题描述】:

我应该使用什么类型的数据将来自 Google 地图的 LatLng 存储到我的数据库中? 我不确定我应该在 mysql 中输入多少位小数。

那么我应该使用DecimalFloat 等吗? 我应该为Length 投入多少? 同时,把LatLng的索引放到Mysql里面好不好?

【问题讨论】:

  • 将它们放在索引中是否“好”取决于您将要做什么...您将如何访问该表?你会做距离计算吗?等等……
  • 是的,我将用于距离计算...所以我需要索引吗?
  • @Soheil Bm:不一定。对索引的需求取决于您如何制定查询。如果您说“计算 ID 为 5 的位置与 ID 为 10 的位置之间的距离”,那么您只需要 ID 字段上的索引,如果您说“找到 10 个最近的位置指向 lat_A/lon_A”,那么是的,索引lat 和 lon 字段会很有用。

标签: php mysql database google-maps indexing


【解决方案1】:

我对 lat 和 lon 都使用 decimal(10,6),这可以为您提供优于 1 米的分辨率。 (记得考虑减号)。


编辑:

引用 MySQL 手册中关于十进制类型的减号:

标准 SQL 要求 DECIMAL(5,2) 能够存储任何值 五位数字和两位小数,因此可以存储在 工资栏范围从 -999.99 到 999.99。 MySQL 强制执行此限制 从 MySQL 5.0.3 开始。 在 5.0.3 之前,在范围的正端, 列实际上可以存储最多 9999.99 的数字。 (对于正 数字,MySQL 5.0.2 及更早版本使用为符号保留的字节 扩大范围的上限。)

来源:

http://dev.mysql.com/doc/refman/5.0/en/fixed-point-types.html

【讨论】:

  • “减号”不包括在精度中。 DECIMAL(10,6) 允许小数点前四位。存储 -9999.999999 和 +9999.999999 之间的值就足够了。对于小数点后六位,经度可以使用 DECIMAL(9,6),纬度可以使用 DECIMAL(8,6)。
  • @spencer7593:查看我对回复的编辑。实际上,根据版本,我们都是对的。 :-)
【解决方案2】:

这取决于您将如何处理这些信息,以及您需要的值有多精确。

一个纬度或经度大约是 69 英里。 (纬度的实际距离略有不同,距离赤道越远,经度的距离越小。

DECIMAL(9,6) allows for a resolution of about  4 inches
DECIMAL(8,5) allows for a resolution of about 3 1/2 feet
DECIMAL(7,4) allows for a resolution of about 36 feet

(纬度只需要小数点前两位,而不是经度需要三位。)

【讨论】:

  • 对于纬度,您需要小数点前 3 位,而不是 2,因为赤道以南的减号。
  • @Marcelo:实际上,没有。 DECIMAL(M,N) 指定 M 位的精度,与符号无关。要在小数点前存储两位数,无论是正数还是负数,DECIMAL(N+2,N) 就足够了。
  • @spencer7593:查看我对回复的编辑。实际上,根据版本,我们都是对的。 :-)
  • @Marcelo:实际上,没有。在任何版本的 MySQL 中,都不需要指定精度为 3 来保存 2 位有符号十进制数。
【解决方案3】:

如果您正在为 Google 地图执行此操作并绘制一条折线(可能有几千个点),您可以将这些点存储在一个数组中,对数组进行序列化,然后将其存储在 BLOB 或 TEXT 字段中。我没有对此进行任何计时试验,但我怀疑它比转换为 DEC 更快。或者,如果您将其传递给 JavaScript,您可以使用 JSON_ENCODE 将其存储为 JSON 字符串,并在每次使用绘图时保存该转换。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-04-13
    • 2011-06-27
    • 2013-06-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-18
    相关资源
    最近更新 更多