【问题标题】:MariaDB and MySQL POINT type: In which order are Latitude and Longitude returned?MariaDB 和 MySQL POINT 类型:纬度和经度按什么顺序返回?
【发布时间】:2022-08-09 04:15:23
【问题描述】:

在将POINT 等地理空间列类型与 MySQL 和 MariaDB 一起使用时,对于指定纬度和经度的顺序(123)存在很多混淆,并且不同的应用程序使用不同的约定。然而,当使用一些函数时——例如ST_DISTANCE_SPHERE——经纬度的顺序很重要。

在 MySQL 和 MariaDB 中创建 POINT 时以什么顺序指定纬度和经度?

我稍微改编了 MariaDB 文档中的一个示例,并在 MariaDB 10.6.7 和 MySQL 8.0.28 上进行了测试。两个数据库都返回数字相同的结果:

set @zenica   = ST_GeomFromText(\'POINT(17.907743 44.203438)\');
set @sarajevo = ST_GeomFromText(\'POINT(18.413076 43.856258)\');


set @zenica2   = ST_GeomFromText(\'POINT(44.203438 17.907743)\');
set @sarajevo2 = ST_GeomFromText(\'POINT(43.856258 18.413076)\');
SELECT ST_Distance_Sphere(@zenica, @sarajevo), ST_Distance_Sphere(@zenica2, @sarajevo2);
-- Result: 55878.59337591705    67103.51207765185

所以在 MySQL 和 MariaDB 中,我们应该在创建 POINTS 时使用 long-lat 格式,即经度在前

MySQL 和 MariaDB 以什么顺序返回 GIS 坐标?

选择一个点时,MySQL和MariadB返回点的二进制格式。但是,根据我使用的数据库,我会得到不同的响应

    标签: php mysql mariadb geospatial


    【解决方案1】:

    MySQL 和 MariaDB 使用不兼容的二进制格式来表示 POINT

    不幸的是,MySQL 在 POINT 的二进制格式中使用 lon-lat,而 MariaDB 则相反。以下是 PHP 中的一些示例代码:

    $testCase = DB::select("SELECT ST_PointFromText('POINT(24.00 12.00)', 4326) AS samplePoint")[0];
    $testUnpacked = unpack("lSRID/CByteOrder/lTypeInfo/dFirst/dSecond", $testCase->samplePoint);
    var_dump($testUnpacked['First'])
    # double(12) -- MySQL output
    # double(24) -- MariaDB output
    

    当在我的应用程序中遇到这个问题时,我需要放弃使用版本字符串或类似内容显式检查数据库供应商,而是使用“功能检测” - 查看我对 testCase 的响应并相应地调整解包格式。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-12-30
      • 2018-01-27
      • 1970-01-01
      • 2021-06-08
      • 2015-05-09
      • 1970-01-01
      • 1970-01-01
      • 2016-09-15
      相关资源
      最近更新 更多