Postgres - LINQ 中的地理空间搜索或 SQL with PostGis
Postgres - Geospatial Search in LINQ or SQL with PostGis
我正在使用 PostGis 搜索给定范围内相对于给定原点的所有点。我正在查看 PostGis 提供的所有文档,但似乎无法弄清楚我将如何为此提出解决方案?
我的位置 table 看起来像这样:
Id - INT(11)
Longitude - DOUBLE
Latitude - DOUBLE
Address - LONGTEXT
City - LONGTEXT
Region - LONGTEXT
Country - LONGTEXT
输入将是 Longitude
、Latitude
和 Range
(以千米或英里为单位)。
我希望收到 Range
.
中所有记录的输出
使用 PostGIS 很简单,比如
SELECT * FROM Table
WHERE ST_DWithin(
Geography(ST_MakePoint(Longitude, Latitude)),
Geography(ST_MakePoint(@Longitude, @Latitude)),
@Range * 1000)
这里@Range 的单位是公里,所以我乘以 1000 得到用于地理计算的米。请注意,如果您有大量数据,查询可能会很慢。为了使其更快:将地理类型的列添加到 table - 与 ST_DWithin
的第一个参数相同,并在查询中使用它代替此参数。您还需要为此 table.
创建一个空间索引
欢迎来到 SO。
PostGIS 依赖于 geometry
或 geography
类型字段中嵌入的坐标。也就是说,您的 table 结构不应将坐标存储到两个不同的 double precision
字段中,而应存储在一个字段中。
如果您仍然可以更改 table 结构,只需将一个新的几何列添加到您的 table:
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
具有不同的度量单位。有关详细信息,请参阅此 or the documentation
。
如果您无法更改 table 结构,则必须坚持使用@Michael Entin 发布的解决方案,但请记住,创建 geometry
或 geography
值在查询时间,你也将 not 能够索引它们,可能使查询更慢!
祝你好运。
进一步阅读:
我正在使用 PostGis 搜索给定范围内相对于给定原点的所有点。我正在查看 PostGis 提供的所有文档,但似乎无法弄清楚我将如何为此提出解决方案?
我的位置 table 看起来像这样:
Id - INT(11)
Longitude - DOUBLE
Latitude - DOUBLE
Address - LONGTEXT
City - LONGTEXT
Region - LONGTEXT
Country - LONGTEXT
输入将是 Longitude
、Latitude
和 Range
(以千米或英里为单位)。
我希望收到 Range
.
使用 PostGIS 很简单,比如
SELECT * FROM Table
WHERE ST_DWithin(
Geography(ST_MakePoint(Longitude, Latitude)),
Geography(ST_MakePoint(@Longitude, @Latitude)),
@Range * 1000)
这里@Range 的单位是公里,所以我乘以 1000 得到用于地理计算的米。请注意,如果您有大量数据,查询可能会很慢。为了使其更快:将地理类型的列添加到 table - 与 ST_DWithin
的第一个参数相同,并在查询中使用它代替此参数。您还需要为此 table.
欢迎来到 SO。
PostGIS 依赖于 geometry
或 geography
类型字段中嵌入的坐标。也就是说,您的 table 结构不应将坐标存储到两个不同的 double precision
字段中,而应存储在一个字段中。
如果您仍然可以更改 table 结构,只需将一个新的几何列添加到您的 table:
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
具有不同的度量单位。有关详细信息,请参阅此 documentation
。
如果您无法更改 table 结构,则必须坚持使用@Michael Entin 发布的解决方案,但请记住,创建 geometry
或 geography
值在查询时间,你也将 not 能够索引它们,可能使查询更慢!
祝你好运。
进一步阅读: