Postgres - 使用 PostGis 在 LINQ 或 SQL 中进行地理空间搜索

mor*_*d95 5 sql linq postgresql postgis geospatial

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

我的位置表如下所示:

Id         - INT(11)  
Longitude  - DOUBLE  
Latitude   - DOUBLE   
Address    - LONGTEXT  
City       - LONGTEXT   
Region     - LONGTEXT  
Country    - LONGTEXT
Run Code Online (Sandbox Code Playgroud)

输入将是Longitude,Latitude和 a Range(以公里或英里为单位)。

我希望收到Range.

Jim*_*nes 3

欢迎来到SO。

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

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

SELECT AddGeometryColumn ('your_schema','your_table','geom',4326,'POINT',2);
Run Code Online (Sandbox Code Playgroud)

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

UPDATE TABLE your_table
SET geom = ST_MakePoint(Longitude, Latitude);
Run Code Online (Sandbox Code Playgroud)

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

CREATE INDEX my_index ON my_table USING GIST (geom);
Run Code Online (Sandbox Code Playgroud)

..并使用查询它ST_DWithin

SELECT * FROM your_table
WHERE ST_DWithin(geom,
                 ST_MakePoint(input_lon, input_lat),input_distance)
Run Code Online (Sandbox Code Playgroud)

请记住这一点geometrygeography具有不同的测量单位。请参阅此answer或此documentation了解更多详细信息。

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

祝你好运。

进一步阅读: