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

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

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

  1. Id - INT(11)
  2. Longitude - DOUBLE
  3. Latitude - DOUBLE
  4. Address - LONGTEXT
  5. City - LONGTEXT
  6. Region - LONGTEXT
  7. Country - LONGTEXT

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

eqqqjvef

eqqqjvef1#

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

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

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

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

在此之后,您可能需要创建一个索引,例如。。

  1. 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)

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

3qpi33ja2#

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

  1. SELECT * FROM Table
  2. WHERE ST_DWithin(
  3. Geography(ST_MakePoint(Longitude, Latitude)),
  4. Geography(ST_MakePoint(@Longitude, @Latitude)),
  5. @Range * 1000)

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

相关问题