我的数据库中有一个记录列表,每个记录都与一个邮政编码相关联.
查询数据库中所有记录以查找距离另一个邮政编码n英里内的所有条目的"最佳做法"是什么?
每个邮政编码在数据库中都有一个lat/long与之关联,所以我知道我必须使用它.但是,我无法想象在每对邮政编码上运行任何类型的距离公式,转换为里程并拒绝不在我的范围内的那些.
对于这样的常见查询来说,这看起来非常昂贵.
我也考虑过进行全对预计算,但它似乎也太大了.美国大约有大约40,000个邮政编码.因此,每个邮政编码的所有对数据库将是(40,000)^ 2,或16亿条目.
我知道这是网站上的一个常见问题,所以希望有人可以指出我正确的方向以获得最佳方式.我正在使用SQL Server 2008,如果有预先构建的解决方案,那么很棒,因为我真的不想在这个例子中重新发明轮子.
相关问题:获取半径范围内的所有邮政编码(这对我没有帮助)
另外,我知道这个SourceForge项目,但它已经废弃,不再使用.
我正在尝试找出最有效的查询,以获得给定点半径内的点.结果不一定非常准确,所以我赞成速度超过准确性.
我们尝试使用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)
这些查询中的任何一个是首选还是我错过了另一个功能?
我有一个包含大约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) 我在 MySQL 数据库中有一个表,其中有一个 POINT 类型的空间几何列。我希望能够在地图中心取一个点并找到它 X 英里(或任何距离)内的所有记录。我似乎找不到一个很好的例子或解释如何做到这一点,而不是几何数学。我很高兴走这条路,但首先想尝试使用真正的空间数据库来解决它。
我正在使用 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] 的所有文档(更重要)如果这是不可能的,我有什么选择?我已经在考虑切换到 MongoDB,但我更愿意以不同的方式解决。
笔记
参考
我正在使用 .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) 我需要在 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) 输入:
\n\n\xe2\x80\xa2 N 个点{P1,\xe2\x80\xa6。, Pn} - 每个点都来自同一维度 t:
\n\n\xe2\x80\xa2 距离函数 \xe2\x80\x93 dist(Pi, Pj) - 返回一个数字,即点之间的距离。(该函数是自定义函数 \xe2\x80\x93 不是标准 Minkowski 距离)。
\n\n问题:
\n\n\xe2\x80\xa2 主要问题:
\n\n\xe2\x80\xa2 第二个问题:
\n\n\xe2\x80\xa2 很高兴拥有:
\n\n相关数据结构:
\n\n\xe2\x80\xa2 KD-树
\n\nspatial spatial-query multidimensional-array knn spatial-index
我使用mysql空间函数。
我必须了解点是否位于多边形内。
最初我使用过MBRContains,但它的工作方式很奇怪,所以我遇到了以下错误:Mysql function MBRContains is not strict
我的下一步是切换到功能ST_Contains。但我发现,如果我使用多边形(来自多重多边形)顶点作为参数 - 函数返回 false 但我想排除所有多重多边形边界。
我发现函数在哪里:
ST_触摸(g1,g2)
如果两个几何图形的内部不相交,则它们在空间上接触,但其中一个几何图形的边界与另一个几何图形的边界或内部相交
看起来它像我想要的那样工作(在OR条件下ST_contains),但文档对我来说不清楚。你能解释一下两个条件如何同时成立吗
1. 内部不相交
2. 边界与内部相交。
?
我怎样才能实现我想要的行为?
编辑:我已将登录详细信息添加到演示 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) spatial-query ×10
geospatial ×3
spatial ×3
sql-server ×3
mysql ×2
c# ×1
couchdb ×1
knn ×1
linq ×1
r ×1
r-sf ×1
sql ×1
zipcode ×1