【问题标题】:What to expect when using mariadb/phpmyadmin when working with datatype 'geometry'使用数据类型“几何”时使用 mariadb/phpmyadmin 时会发生什么
【发布时间】:2020-09-28 00:19:58
【问题描述】:

为了熟悉“几何”数据类型,我想在表格中导入 GPX 文件并将其显示在 OSM 地图上。我正在使用 MariaDB/phpmyadmin,因为这是我的主机提供给我的。我使用“几何”类型是因为我喜欢 ST_functions(而不是将 lat-lon 放在两列中并开发/复制所需的算法)。

在谷歌搜索和 youtube 上搜索了一段时间后,我想知道我做错了什么还是遇到了错误。因为我不知道会发生什么,我希望有人能让我走上正轨。

我从安装了 XAMPP 7.3.4 (phpmyadmin 4.8.5/mariadb 10.1.38) 的本地 PC 开始。我从一个列数据类型 POINT 开始,很惊讶 phpmyadmin 可以选择在地图上显示记录的内容,并且很失望我只看到了蓝色的水。编辑记录时,phpmyadmin 显示了必须呈现的地图和数据,这清楚地表明 SRID 为“0”。无法获取“4326”上的 SRID,直到某处提示的某些文本遇到使用数据类型 GEOMETRY 的列。但只显示了一张世界地图。

经过大量尝试,我决定使用托管环境(phpmyadmin 4.9.5/mariadb 10.3.22)。令我惊讶的是,这一点在地图上是可见的。只是,在世界不同的地方。看着lat-lon,我看到它们被互换了。将它们放在经纬度序列中,该点在我预期的位置可见。

因为主机提供了更高版本的安装,我安装了更新的 XAMPP 7.4.6 (phpmyadmin 5.0.2/mariadb 10.4.1)。 很惊讶我的观点没有出现,只是再次出现在世界地图上。那么需要注意的是本地机器上的 OSM-map 的一些配置吗? lat-lon 还是要互换的。

Mapping is ok, lat-lon interchanged

Mapping wrong, lat-lon ok

在巴黎散步的地图。首先是在 Prune 中映射 GPX,其次是在 MariaDB 中导入跟踪点。完全相同的映射,只需要交换纬度点。因此,我认为使用的 SRID 和/或坐标没有问题,只是 phpmysql 将 lat 作为 y 和 lon 作为 x,而不是预期的 lat 作为 x 和 lon 作为 Y,这将步行放在索马里前面的海中某处:

Mapping of walk in Paris presented in Prune

Mapping of same gps-points in phpmyadmin, lat-lon interchanged

除了数据的呈现之外,我在使用 phpmyadmin 的插入选项时也遇到了困难。使用 sql 时,我只在表中一次获取数据。插入选项生成的 sql 会给出错误。我必须编辑那个 sql,我必须删除“'”和“\”。比较使用的版本,我发现删除“'”和“\”的数量和位置存在差异。

我查看了 phpmyadmin-issues,似乎没有打开任何内容。我可以找到那些表明我遇到的某种问题的封闭的人。 geo 上的很多文档都是关于 postgresql 的,一些是关于 mysql 的,但很少是关于 mariadb 和 phpmysql 的,很难找到好的方向。

所以,我最大的三个问题是它是否打算存储 lon-lat 而不是 lat-lon(或者我是否必须使用另一个 srid?)第二个问题是我必须配置什么才能让地图像它一样在本地工作和我的主人一起做(如果这是导致问题的原因)?第三是是否可以在不编辑生成的sql的情况下使用phpmysql的insert-option?

提前致谢。

【问题讨论】:

    标签: sql phpmyadmin geometry mariadb


    【解决方案1】:

    如果您要使用大圆距离,请务必使用包含st_distance_sphere 的 MySQL/MaraiDB 版本。 (我认为这会限制你使用 MySQL 8.0。)

    如果您要编写“查找最近的”代码,您会发现这很有挑战性。这是我对此类技术的讨论。 http://mysql.rjweb.org/doc.php/find_nearest_in_mysql(还包括一个用于进行大圆计算的存储函数。)讨论使用SPATIAL 和其他技术。

    您的部分问题是从 y 和 x 映射到您的地图所具有的世界的任何投影。球形长纬度认为“球体”而不是“投影”。

    phpmyadmin 只是一个 UI 顶部。 可能不够聪明,无法处理一些空间问题。建议您切换到 MySQL 命令行工具和/或您的应用程序代码。顺便说一句,你会用什么语言写作?

    反引号用于表名和列名。引号(' 或 ")用于字符串周围。在某些情况下,反斜杠 (\) 可能需要加倍甚至加倍。

    POINT 是 25 字节的二进制格式。最好动态构造值,而不是拼写出值,这可以使用十进制数来完成 INTFLOAT

    而且,是的,经度在 POINT() 和其他 SPATIAL 事物中排在首位。

    【讨论】:

    • 我想要映射的 GPX 文件是我的自行车/跑步会话。我们不是在谈论大圆距离:)
    • 我正在使用 (cake)php,phpmyadmin 可以方便地检查地图上某个点的映射。在这种情况下,我主要使用命令行工具来检查当 phpmyadmin 出现问题时我的 sql 是否正常工作。
    • 添加地图示例,不确定思考球体或投影是否会给出此结果。
    • 纬度 51 度的 1 度经度大约是赤道 1 度的一半。由于您的 x 和 y 是经纬度,因此您确实需要一个适当的 SRID。对于这样的本地化工作,您可以简单地将经度除以 cos(latitude) 以获得一起工作的 x 和 y 值。 (但他们将不再能很好地映射。)
    • 添加了在巴黎步行。真的认为 SRID 不是问题,也不需要获取 x 和 y 值。希望有人可以确认相同或相反的结果。 x 是否被认为是 lat 和 y lon?反之亦然?
    猜你喜欢
    • 2011-11-03
    • 2014-09-06
    • 2012-04-22
    • 1970-01-01
    • 1970-01-01
    • 2014-02-17
    • 1970-01-01
    • 2020-08-14
    相关资源
    最近更新 更多