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.
欢迎来到SO。
geometryPostGIS 依赖于嵌入在或类型字段中的坐标geography。话虽如此,您的表结构不应将坐标存储到两个不同的double precision字段中,而应存储在单个字段中。
如果您仍然可以更改表结构,只需在表中添加一个新的几何列:
SELECT AddGeometryColumn ('your_schema','your_table','geom',4326,'POINT',2);
Run Code Online (Sandbox Code Playgroud)
要从longitude和latitude列中创建几何图形,您可以执行以下操作:
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)
请记住这一点geometry并geography具有不同的测量单位。请参阅此answer或此documentation了解更多详细信息。
如果您无法更改表结构,则必须坚持@Michael Entin 发布的解决方案,但请记住,在查询时间中创建geometry或geography值会产生不必要的开销,并且您还将无法对它们建立索引,可能会使查询速度变慢!
祝你好运。
进一步阅读: