我正在使用PostGis搜索相对于给定原点的给定范围内的所有点。我正在查看PostGis提供的所有文档,但似乎无法弄清楚如何为此解决方案?
我的位置表如下所示:
Id - INT(11)
Longitude - DOUBLE
Latitude - DOUBLE
Address - LONGTEXT
City - LONGTEXT
Region - LONGTEXT
Country - LONGTEXT
输入将是Longitude
,Latitude
和一个Range
(以公里或英里为单位)。
我希望是接收Range
内所有记录的输出。
欢迎您加入。
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
进行查询
ST_DWithin
请注意,SELECT * FROM your_table
WHERE ST_DWithin(geom,
ST_MakePoint(input_lon, input_lat),input_distance)
和geometry
具有不同的度量单位。有关更多详细信息,请参见此geography
或answer
。
如果无法更改表结构,则必须坚持使用@Michael Entin发布的解决方案,但请记住,创建answer
或documentation
值会产生不必要的开销在查询时,您还可以not对其进行索引,这可能会使查询变慢!
祝你好运。>>
进一步阅读:
documentation
geometry
对于PostGIS来说很简单,例如