当前位置: 首页 > 面试题库 >

使用空间点类型在MySQL中存储Lat Lng值

淳于思淼
2023-03-14
问题内容

使用的技术:MySQL 5.1和PHP 5.3

我正在为我正在编写的网站设计一个新的数据库。我正在寻找现在存储纬度和经度值的最佳方法。

过去,我一直使用DECIMAL并使用PHP / MySQL选择以下形式:

SQRT(POW(69.1 * (fld_lat - ( $lat )), 2) + POW(69.1 * (($lon) - fld_lon) * COS(fld_lat / 57.3 ), 2 )) AS distance

查找最近的匹配地点。

开始阅读有关新技术的更多信息,我想知道是否应该使用Spatial
Extensions。http://dev.mysql.com/doc/refman/5.1/en/geometry-property-
functions.html

但是,地面上的信息非常稀少,并且对如何存储数据存在疑问。我现在将POINT用作数据类型,而不是使用DECIMAL?

另外,一旦存储为POINT,就很容易从中获取Lat Lng值,以防万一我想在地图上绘制该Lat Lng值,或者我还应该另外将lat
lng存储为DECIMALS?

我知道我应该使用PostGIS,因为这里的大多数帖子都说我只是不想学习新的数据库!

跟进

我一直在玩新的POINT类型。我已经可以使用以下方法添加Lat Lng值:

INSERT INTO spatialTable (placeName, geoPoint) VALUES( "London School of Economics", GeomFromText( 'POINT(51.514 -0.1167)' ));

然后,我可以使用以下命令从Db中获取Lat和Lng值:

SELECT X(geoPoint), Y(geoPoint) FROM spatialTable;

一切看起来不错,但是距离的计算是我需要解决的问题。显然,MySQL具有距离函数的占位符,但暂时不会发布。在几篇文章中,我发现我需要做以下类似的事情,但是我认为我的代码有点错误:

SELECT
 placeName,
 ROUND(GLength(
  LineStringFromWKB(
   LineString(
    geoPoint, 
    GeomFromText('POINT(52.5177, -0.0968)')
  )
  )
))
AS distance
FROM spatialTable
ORDER BY distance ASC;

在此示例中,geoPoint是使用上面的INSERT输入到数据库中的POINT。

GeomFromText('POINT(52.5177, -0.0968)' 是我想计算距离的Lat Lng值。

更多跟进

愚蠢的是,我只是没有真正考虑就把SQL的ROUND部分放进去了。把这个拿出来给我:

SELECT
placeName,
(GLength(
LineStringFromWKB(
  LineString(
    geoPoint, 
    GeomFromText('POINT(51.5177 -0.0968)')
  )
 )
))
AS distance
FROM spatialTable
ORDER BY distance ASC

这似乎给了我所需的正确距离。

我想目前唯一需要回答的就是对我是否只是通过现在使用Spatial或使自己适应未来的想法使自己的生活变得困难…


问题答案:

我认为您应该始终使用容易获得的最高级别的抽象。如果您的数据是地理空间的,则使用地理空间的对象

但小心点。MySQL是最糟糕的地理空间数据库。对于点来说,它还可以,但是其所有多边形函数都被破坏了-它们将多边形更改为其边界矩形,然后对此进行解答。

打给我的最糟糕的例子是,如果您有一个代表日本的多边形,并且您问日本境内有哪些地方,符拉迪沃斯托克就会进入列表!

Oracle和PostGIS没有这个问题。我希望MSSQL不会,并且使用JTS作为其引擎的任何Java数据库都不会。地理空间优势。MySQL
Geospatial错误。

只需在这里阅读如何使用MySQL空间查询查找X半径内的所有记录?在5.6.1中已修复。

哎呀!



 类似资料:
  • 我正在经历一个有趣的情况,虽然不是一个实际的问题,但我不能理解为什么会发生这种情况。 我们有一个mongo数据库,主要由存储在数组中的大量数据组成。由于团队中90%以上的人熟悉mysql,而我们中只有少数人熟悉mongo,再加上mysql不是一个关键的db,所有查询都是在两个字段(客户端或产品)上完成的,我们决定将mysql中的数据移动到如下表中 其中数据是包含数百个属性及其值的巨大json。 我

  • 问题内容: 我需要计算用户在网站上花费的时间。登出时间与登出时间之间的区别是,给我类似“ X先生花了4个小时43分钟”。因此,为了存储the4小时43分钟,我这样声明: 时间NOT NULL 这是有效的还是更好的存储方式?我需要存储在数据库中,因为我还有其他计算需要将其用于+其他用例。 问题答案: 最好将其存储为整数秒数。 该会是干净和简单-即 正如Tristram所指出的,使用该字段存在局限性

  • 不,这个问题不是众多“存储密码的最佳MySQL数据类型是什么”的重复。 我的密码哈希当前在节点上使用pbkdfSync进行。js,我将输出设置为128(无论它是什么字节位),它将输出256个字符的哈希。 你可能会问有什么问题?嗯,这就是我的想法。在我遇到这个问题之前:使用VARCHAR时,“列密码的值太长”。 许多谷歌搜索都说varchar字符限制为65535个字符,但出于某种原因,我认为只有25

  • 问题内容: 我需要以分钟/秒为单位存储歌曲持续时间,我需要使用TIME,但是在编写INSERT语句时如何指代某个持续时间?我表中的数据类型已经是TIME,我应该只将STR_TO_DATE字符串值“ 4:29”吗? 问题答案: 首先,在这里看看:http : //dev.mysql.com/doc/refman/5.0/en/time.html 将缩写值分配给TIME列时要小心。MySQL将冒号的缩

  • 问题内容: 如果我有一个表,该表的字段声明为接受varchar(100),然后实际上插入单词“ hello”,那么在mysql服务器上将使用多少实际存储空间?即使声明了varchar(100),插入NULL也会导致不使用任何存储吗? 答案是什么,在不同的数据库实现中是否一致? 问题答案: 如果我有一个表,该表的字段声明为接受varchar(100),然后我实际上插入单词“ hello”,那么在my

  • 问题内容: 我正在使用geotools库提取位置信息。这样我得到一个类型的对象 我现在想通过jdbc连接将该字段存储在我的mysql表中。当我 遇到此错误时直接尝试插入它 时 问题答案: MySql不知道如何存储您的GEO对象,或者他的大小是多少。您不应该以尝试的方式存储对象。 该PreparedStatement的#的setObject()文档说: JDBC规范指定了从Java对象类型到SQL类