标签: spatial-query

在邮政编码的n英里内查询数据库的最佳方法是什么?

我的数据库中有一个记录列表,每个记录都与一个邮政编码相关联.

查询数据库中所有记录以查找距离另一个邮政编码n英里内的所有条目的"最佳做法"是什么?

每个邮政编码在数据库中都有一个lat/long与之关联,所以我知道我必须使用它.但是,我无法想象在每对邮政编码上运行任何类型的距离公式,转换为里程并拒绝不在我的范围内的那些.

对于这样的常见查询来说,这看起来非常昂贵.

我也考虑过进行全对预计算,但它似乎也太大了.美国大约有大约40,000个邮政编码.因此,每个邮政编码的所有对数据库将是(40,000)^ 2,或16亿条目.

我知道这是网站上的一个常见问题,所以希望有人可以指出我正确的方向以获得最佳方式.我正在使用SQL Server 2008,如果有预先构建的解决方案,那么很棒,因为我真的不想在这个例子中重新发明轮子.


相关问题:获取半径范围内的所有邮政编码(这对我没有帮助)
另外,我知道这个SourceForge项目,但它已经废弃,不再使用.

linq zipcode spatial-query sql-server-2008

6
推荐指数
1
解决办法
1085
查看次数

使用sql server spatial获取点的半径范围内的点的最有效方法

我正在尝试找出最有效的查询,以获得给定点半径内的点.结果不一定非常准确,所以我赞成速度超过准确性.

我们尝试使用where子句比较使用STDistance的点的距离,如下所示(其中@point和v.GeoPoint是地理类型):

WHERE v.GeoPoint.STDistance(@point) <= @radius
Run Code Online (Sandbox Code Playgroud)

还有一个使用与此类似的STIntersects:

WHERE @point.STBuffer(@radius).STIntersects(v.GeoPoint) = 1
Run Code Online (Sandbox Code Playgroud)

这些查询中的任何一个是首选还是我错过了另一个功能?

spatial spatial-query sql-server-2008

6
推荐指数
1
解决办法
2548
查看次数

在JOIN之后添加简单的AND会导致性能下降

我有一个包含大约500个点的表,我正在寻找容差范围内的重复项.这需要不到一秒钟,给我500行.大多数的距离为零,因为它给出了相同的点(PointA = PointB)

DECLARE @TOL AS REAL
SET @TOL = 0.05

SELECT 
    PointA.ObjectId as ObjectIDa,
    PointA.Name as PTNameA,
    PointA.[Description] as PTdescA,
    PointB.ObjectId as ObjectIDb,
    PointB.Name as PTNameB,
    PointB.[Description] as PTdescB,
    ROUND(PointA.Geometry.STDistance(PointB.Geometry),3) DIST
FROM CadData.Survey.SurveyPoint PointA
  JOIN [CadData].Survey.SurveyPoint PointB
    ON PointA.Geometry.STDistance(PointB.Geometry) < @TOL
   -- AND
   -- PointA.ObjectId <> PointB.ObjectID
ORDER BY ObjectIDa
Run Code Online (Sandbox Code Playgroud)

如果我使用靠近底部的注释掉的行,我会得到14行,但执行时间最长可达14秒.在我的积分表扩大到数十万之前,这笔交易并不是那么大.

如果答案已经存在,我会提前道歉.我确实看了,但是新的我迷失了阅读的帖子,这些都是我的头脑.

ADDENDUM:ObjectID是一个bigint和表的PK,所以我意识到我可以将语句更改为

AND PointA.ObjectID > PointB.ObjectID
Run Code Online (Sandbox Code Playgroud)

现在这需要一半的时间,并给我一半的结果(7秒内7行).我现在不会重复(因为在第4点接近第8点,然后第8点接近第4点).然而,性能仍然令我担忧,因为该表将非常大,因此任何性能问题都将成为问题.

附录2:如下所示更改JOIN和AND(或建议的WHERE)的顺序也没有区别.

DECLARE @TOL AS REAL
SET @TOL = 0.05

SELECT 
    PointA.ObjectId as ObjectIDa,
    PointA.Name as PTNameA,
    PointA.[Description] as PTdescA,
    PointB.ObjectId as …
Run Code Online (Sandbox Code Playgroud)

sql sql-server geospatial spatial-query

6
推荐指数
1
解决办法
125
查看次数

如何使用 MySQL 空间查询查找 X 半径内的所有记录?

我在 MySQL 数据库中有一个表,其中有一个 POINT 类型的空间几何列。我希望能够在地图中心取一个点并找到它 X 英里(或任何距离)内的所有记录。我似乎找不到一个很好的例子或解释如何做到这一点,而不是几何数学。我很高兴走这条路,但首先想尝试使用真正的空间数据库来解决它。

mysql geospatial spatial-query

5
推荐指数
1
解决办法
1万
查看次数

使用 CouchDB 使用地理空间和非地理空间键查看

我正在使用 CouchDB 和 GeoCouch,我试图了解是否可以通过使用位置和来自另一个字段的值来构建地理空间索引和“查询”数据库。

数据

{
   "_id": "1",
   "profession": "medic",
   "location": [15.12, 30.22]
}

{
   "_id": "2",
   "profession": "secretary",
   "location": [15.12, 30.22]
}

{
   "_id": "3",
   "profession": "clown",
   "location": [27.12, 2.2]
}
Run Code Online (Sandbox Code Playgroud)

问题

有什么方法可以对这些文档执行以下查询:

  • 查找job = "medic"位置接近 [15.12, 30.22] 的所有文档(更重要)
  • 列出该位置附近的所有不同职业 [15.12, 30.22] (加分)

如果这是不可能的,我有什么选择?我已经在考虑切换到 MongoDB,但我更愿意以不同的方式解决。

笔记

  • 数据变化很快,可能会添加新文档,也可能会删除许多文档

参考

使用 CouchDB 使用地理索引进行分面搜索

couchdb spatial-query

5
推荐指数
0
解决办法
1331
查看次数

LINQ to Entity 不支持 DbGeography 条件

我正在使用 .NET 4.5 和 EF 6.0(也尝试过 6.1.3)。我在实体表(System.Data.Entity.Spatial.DbGeography )中有位置地理列。

using System.Data.Spatial; //also tried Entity one

public class Entity
{
    public DbGeography Location {get;set;}
}
Run Code Online (Sandbox Code Playgroud)

在 LINQ 中,我尝试选择指定区域内的所有实体。

var center = DbGeography.FromText(string.Format("POINT({0} {1})", latitude, longitude), 4326);
var region = center.Buffer(radius);
var result = db.Entities.Where(x => SqlSpatialFunctions.Filter(x.Location, region) == true).ToArray();
Run Code Online (Sandbox Code Playgroud)

这个查询返回一个错误:

An unhandled exception of type 'System.NotSupportedException' occurred in EntityFramework.SqlServer.dll

Additional information: The specified type member 'Location' is not supported in LINQ to Entities. Only initializers, entity members, and entity …
Run Code Online (Sandbox Code Playgroud)

c# geospatial spatial-query entity-framework-6

5
推荐指数
1
解决办法
1371
查看次数

两个 SQL Server 层/表的空间相交

我需要在 SQL Server 2016 中的两个空间表之间进行空间交集,每个表中都有一个几何列。我有一段 T-SQL,我从一个表 (tableA) 中获取一组多边形,然后使用每个多边形并对另一个表(表B)执行STIntersects。我生成了一系列与 tableA 中的多边形数量相对应的独立表。这些表具有相同的列。

declare @g geometry

declare @t Cursor 

Set @t = CURSOR FOR select Shape from admin where NAME1 = 'Jefferson'
open @t

FETCH Next FROM @t INTO @g
while @@FETCH_STATUS = 0
BEGIN
    Select * from ANC where ANC.Shape.STIntersects(@g) = 1
    FETCH Next FROM @t INTO @g  
END;
Run Code Online (Sandbox Code Playgroud)

这将返回正确的信息,并为每个相交的多边形提供一个结果表和单独的地图。下一步是将上述各个输出组合到一个输出表中,但我遇到了困难。我尝试了以下方法:

declare @g geometry

declare @t Cursor 

Set @t = CURSOR FOR select Shape from admin where NAME1 = 'Jefferson'

open @t

declare …
Run Code Online (Sandbox Code Playgroud)

sql-server spatial-query sql-server-2016

5
推荐指数
1
解决办法
5173
查看次数

在空间数据库中查找 K 个最接近的对(没有特定查询对象)

输入:

\n\n

\xe2\x80\xa2 N 个点{P1,\xe2\x80\xa6。, Pn} - 每个点都来自同一维度 t:

\n\n
    \n
  • Pi = {x_1, \xe2\x80\xa6., x_t} 其中 k 介于 18-30 之间。
  • \n
\n\n

\xe2\x80\xa2 距离函数 \xe2\x80\x93 dist(Pi, Pj) - 返回一个数字,即点之间的距离。(该函数是自定义函数 \xe2\x80\x93 不是标准 Minkowski 距离)。

\n\n

问题:

\n\n

\xe2\x80\xa2 主要问题:

\n\n
    \n
  • 尽可能快地从所有 N 个点 \xe2\x80\x93 中找到 K 个最接近的对。
  • \n
\n\n

\xe2\x80\xa2 第二个问题:

\n\n
    \n
  • 给定一个点 Q = {x_1, \xe2\x80\xa6, x_t} 返回 K 个最接近的对。
  • \n
\n\n

\xe2\x80\xa2 很高兴拥有:

\n\n
    \n
  • 我们可以在其中添加/删除点 Pi 的数据库,并且上述查询将尽可能快地运行。
  • \n
\n\n

相关数据结构:

\n\n

\xe2\x80\xa2 KD-树

\n\n
    \n …

spatial spatial-query multidimensional-array knn spatial-index

5
推荐指数
0
解决办法
275
查看次数

Mysql: ST_Contains 带边框检测多边形是否包含点

我使用mysql空间函数。

我必须了解点是否位于多边形内。
最初我使用过MBRContains,但它的工作方式很奇怪,所以我遇到了以下错误:Mysql function MBRContains is not strict

在此输入图像描述

我的下一步是切换到功能ST_Contains。但我发现,如果我使用多边形(来自多重多边形)顶点作为参数 - 函数返回 false 但我想排除所有多重多边形边界。

聚苯乙烯

我发现函数在哪里:

ST_触摸(g1,g2)

如果两个几何图形的内部不相交,则它们在空间上接触,但其中一个几何图形的边界与另一个几何图形的边界或内部相交

看起来它像我想要的那样工作(在OR条件下ST_contains),但文档对我来说不清楚。你能解释一下两个条件如何同时成立吗
1. 内部不相交
2. 边界与内部相交。

问题:

我怎样才能实现我想要的行为?

mysql spatial spatial-query point-in-polygon mysql-spatial

5
推荐指数
1
解决办法
1764
查看次数

从 R 查询 SQL Server 地理空间数据

编辑:我已将登录详细信息添加到演示 SQL Server 2017。

我正在使用 FreeTDS 驱动程序(优于 Microsoft odbc 驱动程序,因为它支持 Linux 中的 Windows 身份验证)从 R 查询 SQL Server。

我正在努力解释几何列st_read

连接是这样启动的:

library(odbc)
library(DBI)
library(sf)

username <- 'SO-user'
sql_server_ip <- '35.214.169.110'
password <- 'SQLaskingfortrouble?!'

con <- dbConnect(odbc(),
                 Driver = "FreeTDS",
                 Server = sql_server_ip,
                 Database = "stackoverflow-example",
                 UID = username,
                 PWD = password,
                 Port = 1433)
# I have also tried Driver = "ODBC Driver 17 for SQL Server"
Run Code Online (Sandbox Code Playgroud)

这是一个查询结果:

data <- dbGetQuery(con, 'SELECT TOP 2
                         objectid, geom,
                         geom.STGeometryType() geom_type,
                         geom.STSrid …
Run Code Online (Sandbox Code Playgroud)

sql-server r spatial-query r-sf

5
推荐指数
1
解决办法
1641
查看次数