【问题标题】:How to use ST_DWithin to find near point?如何使用 ST_DWithin 找到近点?
【发布时间】:2012-04-12 16:01:16
【问题描述】:

这是我第一次创建 GIS 查询。在我的数据库的一个表中,有一列带有点类型。每条记录是一台 ATM 机。我想写一个查询来获取我所在位置附近1公里范围内的ATM机。如何在SQL查询中使用ST_DWithin来查找记录?

【问题讨论】:

    标签: sql gis postgis


    【解决方案1】:
    SELECT *
      FROM atm_finder
      WHERE ST_Distance(ST_Transform(ST_GeomFromText('POINT([Lon] [Lat])',4326),26986),ST_Transform(location,26986)) <= 1000
    

    Where [Lon] & [Lat] - 点的 GPS 坐标。但就你第一次使用 POINT 类型而言:

    SELECT AddGeometryColumn('atm_finder', 'location', 4326, 'POINT', 2);
    

    当然,在此之前,您应该重命名字段“位置”(为了不丢失数据)并用这些数据填充新字段。

    【讨论】:

    • 有些数字我看不懂:4326、26986。这些是什么意思?
    • 您应该完全阅读 PostGIS 文档和有关地理投影的信息。 4326 是 WGS84 投影(例如用于谷歌地图;它本身就是 GPS)46986 是公制投影。您需要将一种转换为另一种才能进行任何抵押操作。您还可以阅读有关 SRID 的信息 - 这就是数字。
    • 我重新创建了一个几何列使用点类型的表。我成功插入记录。但是,当我像您一样查询时,建议我收到错误:“转换:无法投影点 (2.19832e+007 1.15841e+008 0):纬度或经度超出限制 (-14)”。我该怎么办?
    • 对不起,朋友。我在 AddGeometryColumn 的最后一个参数中犯了一个错误。您需要使用“2”(维度 - 经纬度)。重复整个过程,然后重试。应该不会有什么麻烦。当您制作新的几何列时,请使用SELECT ST_GeomFromText(location) FROM atm_finder 对其进行测试。所以你会看到之前的操作是否正确。
    • 整个代码运行良好:CREATE TABLE atm_finder (id integer NOT NULL, CONSTRAINT atm_finder_pkey PRIMARY KEY (id)); SELECT AddGeometryColumn('atm_finder', 'location', 4326, 'POINT', 2); INSERT INTO atm_finder (id, location) VALUES (1, ST_GeomFromText('POINT(-117.157305 32.715738)', 4326)), (2, ST_GeomFromText('POINT(-117.15046 32.715793)', 4326)), (3, ST_GeomFromText('POINT(-117.130204 32.726624)', 4326)); SELECT id FROM atm_finder WHERE ST_Distance(ST_Transform(ST_GeomFromText('POINT(-117.147605 32.715802)',4326),26986), ST_Transform(location,26986)) &lt;= 1000; 别忘了 push + :)
    【解决方案2】:

    我不太明白 ST_DWithin 可以如何与两点一起使用...

    类似的东西。

    select atm.id
    from atm_finder atm
    where ST_Distance(<your location>, atm.location) <= 1000 
    
    //1000 = meters, works fine with geography types
    //have to check your projection with geometry types
    

    顺便说一句,你的表的创建方式对我来说看起来很奇怪......

    【讨论】:

    • 我将位置设置为类型点。当我根据您的建议运行查询时,出现错误:“列 location.the_geom 不存在”
    • 请显示您的数据库结构。 the_geom 只是在表格中调用“几何/地理”列的当前方式。
    • 这是创建表的语句:CREATE TABLE atm_finder (id integer NOT NULL, location point NOT NULL, serving_hour text NOT NULL, address text NOT NULL, num_machine integer NOT NULL, CONSTRAINT atm_finder_pkey PRIMARY KEY (id))
    • 然后查看编辑。你是如何创建你的表的?用这个脚本?还是使用可视化工具?
    • 我是用可视化工具创建的,上面的代码是自动生成的。运行你的代码,我得到错误:函数 st_distance(geometry, point) 不存在
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-11-04
    • 2021-11-27
    • 2021-09-28
    • 2013-06-28
    相关资源
    最近更新 更多