【问题标题】:Using PostGIS for location based data使用 PostGIS 获取基于位置的数据
【发布时间】:2012-12-06 11:43:55
【问题描述】:

我在 postgresql 9.2 中有一个表,它将位置的纬度和经度存储为整数值。

我打算做一些事情,比如当用户搜索某个位置时,他还会获取该搜索位置 7 英里半径范围内的其他位置的信息。

我如何使用 postGIS,因为我是新手。有什么想法吗?

【问题讨论】:

    标签: postgresql postgis postgresql-9.2 postgresql-9.0


    【解决方案1】:

    您实际上希望将纬度和经度存储为一个点。

    CREATE TABLE postal_codes
    (
      zip character varying(7) NOT NULL,
      state character(2) NOT NULL,
      city character varying(50) NOT NULL,
      geoloc geography(Point,4326) NOT NULL
    );
    INSERT INTO postal_codes
    VALUES (
        '35004', 'AL', 'Moody',
        ST_GeographyFromText('SRID=4326;POINT(-86.50249 33.606379)') -- lon lat
    );
    

    然后您可以使用STDWithin 获取一定距离内的所有点。

    SELECT geoloc
    FROM postal_codes
    WHERE ST_DWithin(
        geoloc,                            -- The current point being evaluated
        'thegeolocyoustoredawaysomewhere', -- the location of the person
                                           -- you're giving info to
        7 * 1.6 * 1000                     -- Miles to meters
    );
    

    或者:

    SELECT geoloc
    FROM postal_codes
    WHERE ST_DWithin(
        geoloc,
        (
            SELECT geoloc
            FROM postal_codes
            WHERE zip = '12345'
        ),
        7 * 1.6 * 1000
    );
    

    要稍微提高其他类型查询的性能(此处没有任何查询),请使用 GiST 索引:

    CREATE INDEX geoloc_idx
    ON postal_codes
    USING gist (geoloc);
    

    【讨论】:

    • 性能怎么样?我假设用户 Neville 将 lat/lng 存储为整数以提高性能(可能是因为使用了适度的硬件)
    • 在我的 Pentium II 233 MHz 服务器(没错,服务器)上,类似的查询大约需要 30 秒才能完成。在我的现代工作站上大约 5 秒。
    • 这就是重点。我正在使用 Atom N550 为网站 www.mapatia.com 提供服务。该服务器在 Postgresql 表上存储了数百万个地理点,我还将 lat/lng 管理为整数,以实现更快的索引操作。我需要 100 毫秒或更快的响应时间。
    • 您可以生成一个 3 列的表(geo1、geo2、距离)来缓存此类数据以获得低于 100 毫秒的数据,而不是重复执行相同的计算。或者,部分索引(USING gist (ST_DWithin(geo1, geo2, distance))),或对表进行分区。
    猜你喜欢
    • 1970-01-01
    • 2020-11-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多