【问题标题】:Postgres - Geospatial Search in LINQ or SQL with PostGisPostgres - 使用 PostGis 在 LINQ 或 SQL 中进行地理空间搜索
【发布时间】:2020-09-10 16:06:58
【问题描述】:

我正在使用 PostGis 搜索给定范围内相对于给定原点的所有点。我正在查看 PostGis 提供的所有文档,但似乎无法弄清楚如何为此提出解决方案?

我的位置表如下所示:

Id         - INT(11)  
Longitude  - DOUBLE  
Latitude   - DOUBLE   
Address    - LONGTEXT  
City       - LONGTEXT   
Region     - LONGTEXT  
Country    - LONGTEXT

输入将是LongitudeLatitudeRange(以公里或英里为单位)。

我希望收到Range 中所有记录的输出。

【问题讨论】:

    标签: sql postgresql linq geospatial postgis


    【解决方案1】:

    欢迎来到 SO。

    PostGIS 依赖于嵌入在 geometrygeography 类型字段中的坐标。话虽如此,您的表结构不应将坐标存储到两个不同的 double precision 字段中,而应存储在一个字段中。

    如果您仍然可以更改表格结构,只需在表格中添加一个新的几何列:

    SELECT AddGeometryColumn ('your_schema','your_table','geom',4326,'POINT',2);
    

    要从 longitudelatitude 列中创建几何图形,您可以执行以下操作:

    UPDATE TABLE your_table
    SET geom = ST_MakePoint(Longitude, Latitude);
    

    之后您可能想要创建一个索引,例如..

    CREATE INDEX my_index ON my_table USING GIST (geom);
    

    .. 并使用ST_DWithin查询它

    SELECT * FROM your_table
    WHERE ST_DWithin(geom,
                     ST_MakePoint(input_lon, input_lat),input_distance)
    

    请记住,geometrygeography 具有不同的度量单位。有关详细信息,请参阅此 answerdocumentation

    如果您无法更改表结构,则必须坚持使用 @Michael Entin 发布的解决方案,但请记住,创建 geometrygeography 会产生不必要的开销查询时间中的值,并且您也将能够索引它们,可能会使查询慢得多!

    祝你好运。

    进一步阅读:

    【讨论】:

    • 感谢您的详细回复!是的,我在等待有人回答时再次浏览了文档。我在想 ST_Distance 和 ST_Within 之间的东西,然后瞧,我找到了 ST_DWithin。
    • 很高兴它有帮助 :-) 如果您想知道 ST_Distance,您可能想查看我的其他答案:stackoverflow.com/a/51889638/2275388 干杯!
    【解决方案2】:

    这对于 PostGIS 来说是微不足道的,比如

    SELECT * FROM Table
    WHERE ST_DWithin(
        Geography(ST_MakePoint(Longitude, Latitude)),
        Geography(ST_MakePoint(@Longitude, @Latitude)),
        @Range * 1000)
    

    这里@Range 的单位是公里,所以我乘以 1000 得到用于地理计算的米。请注意,如果您有大量数据,查询可能会很慢。为了使其更快:将地理类型的列添加到表中 - 与ST_DWithin 的第一个参数相同,并在查询中使用它而不是此参数。您还需要为此表创建空间索引。

    【讨论】:

      猜你喜欢
      • 2013-02-23
      • 2018-06-29
      • 1970-01-01
      • 2018-07-28
      • 1970-01-01
      • 2014-07-10
      • 1970-01-01
      • 2014-06-02
      • 2011-04-07
      相关资源
      最近更新 更多