【问题标题】:Use haversine formula in java or some advanced postgis queries?在 java 中使用 hasrsine 公式或一些高级 postgis 查询?
【发布时间】:2020-07-03 07:12:34
【问题描述】:

假设我们有一个包含纬度和经度(数字)列、范围列、名称列等的表格。

我们有一个输入 - 坐标纬度和经度

我想构造一个查询以仅获取此表中的行,其中与 输入坐标 的距离(以米为单位)小于 范围列 中的值。

问题是,如何做到这一点最有效?

我可以想象这样做: 首先,对百万条记录(driver_users)进行一些“第一次切割” - 我将应用经典查询来选择最小和最大之间的坐标......所以,我们将减少收集的行数,然后我们将在每一行上应用半正弦公式并进行比较范围列中的值。问题也是如何计算截止的最小值和最大值。假设距离 输入坐标 最大 50 公里 - 我认为也可能是方形的,因为它只是初始选择以减少使用 hasrsine 公式的数量。

但我不确定这是否真的有效。我正在使用 java (spring boot)、hibernate/jpa 和 postgresql。 SQL表如果不好,也可以完全重做。谢谢。

CREATE TABLE public.driver_users
(
    username character varying(100) NOT NULL,
    longitude numeric,
    latitude numeric,
    range integer NOT NULL,
    UNIQUE (username),
    FOREIGN KEY (username)
        REFERENCES public.users (username) MATCH SIMPLE
        ON UPDATE CASCADE
        ON DELETE CASCADE,
    CONSTRAINT driver_users_pkey PRIMARY KEY (username)
);

【问题讨论】:

    标签: java postgresql optimization gps coordinates


    【解决方案1】:

    使用 PostGIS 可以让您使用许多功能,包括距离计算、投影处理、空间索引等。

    对于您的任务,您将创建一个 geography 列并在其上放置一个空间索引。

    SELECT * 
    FROM myTable
    WHERE ST_DWITHIN(geog, ST_SetSRID(ST_Point(-70.123, 40.456), 4326)::geography,50000)
    

    或使用存储在driver_range 列中的可变距离

    SELECT * 
    FROM myTable
    WHERE ST_DWITHIN(geog, ST_SetSRID(ST_Point(-70.123, 40.456), 4326)::geography,driver_range)
    

    【讨论】:

    • 据我了解,我应该用地理(作为点)替换纬度和经度列?或者也保留它们。是否有可能以某种方式构造一个查询,该查询还将比较(过滤)一个 driver_users 范围列与这个由 postgis 计算的距离?谢谢。
    • @jammin197 是的。如果需要,您可以随时检索 X、Y 坐标 (select st_x(geog) from mytable)。请参阅编辑以使用存储在另一列中的米距离
    猜你喜欢
    • 2011-09-22
    • 2015-05-08
    • 1970-01-01
    • 2011-01-14
    • 2012-07-24
    • 1970-01-01
    • 2017-07-24
    • 1970-01-01
    相关资源
    最近更新 更多