sql - 点和多边形之间的 STDistance 始终返回 0,即使它们相距数英里

标签 sql sql-server geospatial spatial

我正在尝试使用地理类型在 MSSQL 中获取从点到多边形的距离。然而,有一大堆多边形总是以 0 距离返回,即使它们位于国家的两端。

在此示例中,点位于伯恩茅斯(英格兰南海岸),多边形位于阿伯丁(苏格兰)。距离返回为 0。

declare @point geography = 'POINT(-1.776684 50.735450)';
declare @polygon geography = 'POLYGON ((-2.092672379931 57.150644202815, -2.0919910988412 57.150551088059, -2.0921198448739 57.150289201548, -2.0927850327096 57.150379407111, -2.092672379931 57.150644202815))';
select @polygon.STDistance(@point) as distance

版本是

Microsoft SQL Server 2012 (SP4) (KB4018073) - 11.0.7001.0 (X64) 
    Aug 15 2017 10:23:29 
    Copyright (c) Microsoft Corporation
    Developer Edition (64-bit) on Windows NT 6.3 <X64> (Build 14393: ) (Hypervisor)

最佳答案

我怀疑您的多边形存在常见问题。具体来说,是环方向问题。多边形顶点的定义顺序是有意义的。 SQL Server 中的多边形遵循“左手法则”。这意味着,如果您按顶点顺序围绕多边形的边界行驶,则汽车左侧的区域将被视为多边形的内部。

检查一下,如果您调用 .EnvelopeAngle() 来对抗它会发生什么?如果它显示 180,则您的多边形(如您所定义的)是“整个地球减去阿伯丁”。但一切并没有失去!有一个简单的修复方法 - 针对多边形调用 .ReorientObject() ,它应该可以纠正问题。

关于sql - 点和多边形之间的 STDistance 始终返回 0,即使它们相距数英里,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62267640/

相关文章:

c# - 系统.Data.SqlClient.SqlException : 'The INSERT statement conflicted with the FOREIGN KEY constraint

r - 带传单/R的时间 slider

java - 安卓 : how to get the walking distance between two geo coordinates?

SQL Server 2019 安装失败

SQL - 如何查找年初至今的金额?

mysql SQL 优化

sql-server - 为什么使用 JOIN 而不是内部查询

php - 查询以在表中的间隔内计数

mysql - 从边界坐标列创建mysql多边形列

sql - 当行值非零时获取列表聚合中的列名称