Postgres - LINQ 中的地理空间搜索或 SQL with PostGis

Postgres - Geospatial Search in LINQ or SQL with PostGis

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

我的位置 table 看起来像这样:

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

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

我希望收到 Range.

中所有记录的输出

使用 PostGIS 很简单,比如

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

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

创建一个空间索引

欢迎来到 SO。

PostGIS 依赖于 geometrygeography 类型字段中嵌入的坐标。也就是说,您的 table 结构不应将坐标存储到两个不同的 double precision 字段中,而应存储在一个字段中。

如果您仍然可以更改 table 结构,只需将一个新的几何列添加到您的 table:

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 具有不同的度量单位。有关详细信息,请参阅此 or the documentation

如果您无法更改 table 结构,则必须坚持使用@Michael Entin 发布的解决方案,但请记住,创建 geometrygeography 值在查询时间,你也将 not 能够索引它们,可能使查询更慢!

祝你好运。

进一步阅读: