postgres-在linq或sql中使用postgis进行地理空间搜索

yiytaume  于 2021-07-26  发布在  Java
关注(0)|答案(2)|浏览(472)

我使用postgis搜索给定范围内相对于给定原点的所有点。我正在查看postgis提供的所有文档,但似乎不知道如何找到解决方案?
我的位置表如下所示:

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

输入将是 Longitude , Latitude 和一个 Range (如公里或英里)。
我希望的是接收到 Range .

eqqqjvef

eqqqjvef1#

欢迎来到so。
postgis依赖于类型字段中嵌入的坐标 geometry 或者 geography . 也就是说,表结构不应该将坐标存储到两个不同的 double precision 但在一个单一的领域。
如果仍然可以更改表结构,只需在表中添加新的几何图形列:

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

用你的大脑创造几何图形 longitude 以及 latitude 列可以执行以下操作:

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)

请记住 `geometry` 以及 `geography` 有不同的测量单位。看到这个了吗 `answer` 或者 `documentation` 更多细节。
如果无法更改表结构,则必须使用@michael entin发布的解决方案,但请记住,创建表会带来不必要的开销 `geometry` 或者 `geography` 值,并且您也将无法对它们进行索引,这可能会使查询速度慢得多!
祝你好运。
进一步阅读:
ST_MakePioint `AddGeometryColumn` 
3qpi33ja

3qpi33ja2#

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

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

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

相关问题