我有一个表格包含代表客户区域的POLYGONS/MULTIPOLYGONS:
这是一个简化的查询,将重现我遇到的问题:
DECLARE @point GEOGRAPHY = GEOGRAPHY::STGeomFromText('POINT (-76.992188 39.639538)', 4326)
SELECT terr_offc_id
FROM tbl_office_territories
WHERE terr_territory.STIntersects(@point) = 1
Run Code Online (Sandbox Code Playgroud)
看起来像一个简单,直接的查询需要12或13秒才能执行,对于这样一个简单的查询来说,这似乎是一个非常复杂的执行计划.
在我的研究中,有几个消息来源建议在查询中添加索引提示,以确保查询优化器正确使用空间索引.添加WITH(INDEX(idx_terr_territory))
没有任何效果,并且从执行计划中可以清楚地看出,无论提示如何,它都引用了我的索引.
从美国人口普查数据导入的领土多边形似乎有可能是不必要的复杂,因此我创建了第二列,并测试了具有不同程度公差的缩小多边形(带有Reduce()方法).对新列运行与上面相同的查询会产生以下结果:
显然朝着正确的方向前进,但精确度下降似乎是一个不优雅的解决方案.这不是索引应该是什么?对于这样的基本查询,执行计划似乎仍然很复杂.
出于好奇,我删除了空间索引,并被结果震惊:
考虑SQL Server的"地理"数据类型......
我可以输入一个纬度和经度数组(顺便说一句,这是正确的顺序还是经度纬度?),如下所示:
INSERT INTO SpatialZonePolygons (Coordinates)
VALUES (geography::STGeomFromText('POLYGON((-122.358 47.653 , -122.348 47.649, -122.348 47.658, -122.358 47.658, -122.358 47.653))', 4326));
GO
Run Code Online (Sandbox Code Playgroud)
然后显示为:
0xE6100000010405000000DD24068195D34740F4FDD478E9965EC0508D976E12D3474083C0CAA145965EC04E62105839D4474083C0CAA145965EC04E62105839D44740F4FDD478E9965EC0DD24068195D34740F4FDD478E9965EC001000000020000000001000000FFFFFFFF0000000003
Run Code Online (Sandbox Code Playgroud)
如何将它们选择回纬度和经度格式?
非常感谢.
任何人都有将 KML 转换为 SqlGeography (SQLServer DataType) 的函数或 DLL?
如果有必要,我会自己写出来,但我很惊讶我在那里找不到。
在实体框架中实现空间类型(System.Data.Spatial.DBGeometry)之前,我们可以使用"Microsoft.SqlServer.Types.SqlGeometry"来处理缺少空间支持.该库具有类SqlGeometryBuilder,用于根据不同的几何点创建SqlGeometry.
我决定从SqlGeometry继续到DBGeometry,但我找不到任何与SqlGeometryBuilder过去相同的函数.你知道这有什么功能吗?或者你知道它是否会包含在下一个版本中吗?
提前致谢.
我使用SQL Server地理数据类型来存储我的数据库中的记录位置.我想选择给定位置给定距离内的所有记录:
DECLARE @location AS geography = geography::Point(@latitude, @longitude, 4326)
DECLARE @distance AS INT = 10000
SELECT *
FROM records
WHERE records.location.STDistance(@location) <= @distance
Run Code Online (Sandbox Code Playgroud)
在我的测试数据库一对夫妇的十几记录本上运行很迅速,我没有任何问题,但我知道,WHERE子句运行STDistance针对我的数据库中的所有记录,一旦我有成千上万的记录,这将慢慢爬行.
有一个更好的方法吗?也许创建某种区域并首先在邻近区域选择数据?
我正在尝试Location
在数据库中的列上创建索引.
收到此错误: Mismatch in column datatype and tessellation scheme
它是纬度和经度字段的简单地理计算字段.
[Location] AS ([geography]::Point([Latitude],[Longitude],(4326))) PERSISTED,
Run Code Online (Sandbox Code Playgroud)
我在这做错了什么?
在我的应用程序中,我对此Location
列进行了大量过滤,因此我想确保将其编入索引.
考虑下面的函数计算之间的距离两分
CREATE FUNCTION CoordinateDistanceMiles(
@Latitude1 float,
@Longitude1 float,
@Latitude2 float,
@Longitude2 float
)
RETURNS float
AS
BEGIN
-- CONSTANTS
DECLARE @EarthRadiusInMiles float;
SET @EarthRadiusInMiles = 3963.1
DECLARE @PI float;
SET @PI = PI();
-- RADIANS conversion
DECLARE @lat1Radians float;
DECLARE @long1Radians float;
DECLARE @lat2Radians float;
DECLARE @long2Radians float;
SET @lat1Radians = @Latitude1 * @PI / 180;
SET @long1Radians = @Longitude1 * @PI / 180;
SET @lat2Radians = @Latitude2 * @PI / 180;
SET @long2Radians = @Longitude2 * @PI / …
Run Code Online (Sandbox Code Playgroud) 我正在澳大利亚的地图上显示大约 40,000 个纬度经度点,我怀疑大多数点都在城镇中,但没有城镇的数据,并且希望能够将这些点聚集到我所在的大小可以在地图上放置带有总数的图钉,以帮助更好地理解数据。
是否有某种方法可以查询以获取包含集群位置的集群列表并对该集群的点进行计数?
我需要编写一个查询,该查询查找所有未闭合的多边形,并通过复制第一个点并创建另一个终点来关闭它们。
我可以选择无效的行:
SELECT delivery_zone_id, polygon from delivery_zone WHERE ST_IsClosed(polygon::geometry) = FALSE;
Run Code Online (Sandbox Code Playgroud)
而且我能够转储来自每个多边形的各个点:
SELECT delivery_zone_id, ST_AsText((dp).geom) FROM
(SELECT delivery_zone_id, ST_DumpPoints(polygon::geometry) AS dp
FROM delivery_zone
WHERE ST_IsClosed(polygon::geometry) = FALSE
) AS coords;
Run Code Online (Sandbox Code Playgroud)
结果看起来像这样:
1 POINT(-96.80037 33.09812) ## Copy this point and add it to the set
1 POINT(-96.80427 33.0956)
1 POINT(-96.80401 33.09219)
1 POINT(-96.79603 33.09222)
1 POINT(-96.79346 33.09647)
1 POINT(-96.80037 33.09857)
4 POINT(-96.80037 33.099) ## Copy this point and add it to the set
4 POINT(-96.80427 33.0956)
4 POINT(-96.80401 33.09219)
4 POINT(-96.79603 …
Run Code Online (Sandbox Code Playgroud) 我正在使用SQL Server并创建一个脚本,该脚本将从我的数据库中获取工作者的地理位置.脚本如下.
SELECT w.display_name, w.geo_location
FROM jobs j WITH(NOLOCK)
INNER JOIN workers w WITH(NOLOCK) ON w.worker_id = j.worker_id
WHERE .....
Run Code Online (Sandbox Code Playgroud)
问题是我想添加GROUP BY w.display_name, w.geo_location
到脚本,因为显示了重复的记录.向group by子句添加了具有数据类型geography的列会导致抛出错误.
添加此内容时抛出的错误是:
"地理"类型无法比较.它不能在GROUP BY子句中使用.
有没有解决的办法?我无法转换w.geo_location
为VARCHAR
地理数据类型中所需的a .
sqlgeography ×10
sql ×5
sql-server ×5
c# ×2
t-sql ×2
group-by ×1
indexing ×1
kml ×1
postgis ×1
postgresql ×1
select ×1
spatial ×1
sqlgeometry ×1