验证sql server上几何字段内的点(WGS84)

Posted

技术标签:

【中文标题】验证sql server上几何字段内的点(WGS84)【英文标题】:Validation of a point (WGS84) within geometry field on sql server 【发布时间】:2014-05-19 14:25:31 【问题描述】:

我一直在尝试验证 WGS84 点是否在 SQL Server 2012 的几何字段内。

场景是这样的,我在 SQL Server 2012 数据库(邮政编码和所有内容)中对地理区域进行了政治划定,并经过验证。

然后,我还在 WGS84 系统中找到一些基础设施,其中包含提供商提交的邮政编码,我想验证这些点。

我需要验证每个点 (WGS84) 是否属于与它一起提交的邮政编码。

我不知道从哪里开始。

感谢您的帮助!

奥马尔

【问题讨论】:

Omar,您能否提供更多信息以更好地帮助我了解您的要求?例如,我不完全确定您所说的验证邮政编码是什么意思。您也可以提供您需要的国家/地区吗? 谢谢乔恩,换句话说,我有 2 个表,第一个是全国(秘鲁)城市的划界,此数据来自导出 ARCGIS 形状及其几何图形和另一个字段该划界的对应邮政编码。其次,另一个表格包含来自供应商的报告,其中一个字段具有地理参考 (WGS84) 点,另一个字段包含他们声称所在的邮政编码。我们检测到第二个表格中的数据格式不正确,因此,邮政编码代码与地理参考点不对应。因此,在他们向我们发送数据之前,我们需要对其进行验证。 那么第一个表中的边界是城市边界,还是带有城市参考的邮政编码边界? 在第一张表中,邮政编码边界与城市(区)边界相匹配......我们称它们为城市,但它更像是区供您参考......我为混乱道歉...... 好的,谢谢,我现在开始明白了。所以这里的关键是您希望能够说“这个点(在表 2 中)在几何(在表 1 中)与随该点发送的邮政编码(在表 2 中)相匹配” - 正确吗?如果是这样,还有一个问题,当您说表 1 字段是几何图形时,它实际上是几何图形还是 Geography 字段中的几何形状? 【参考方案1】:

为了让您的生活更轻松,您需要首先更改表 1 以包含一个地理列,该列将保存转换后的几何数据。您可以按如下方式转换:

UPDATE [Table1] SET [NewGeographyColumn] = GEOGRAPHY::STGeomFromWKB([GeometryColumn].STAsBinary(), 4326);

现在您有一个与您的 Table2 点匹配的 SRID 的 Geography 列,请确保您在这个新列上创建一个 SpatialIndex。

然后您可以运行空间查询以确保您收到的数据是正确的:

DECLARE @receivedLatitude DOUBLE = 0;
DECLARE @receivedLongitude DOUBLE = 0;
DECLARE @receivedPostalCodeName VARCHAR(10) = 'Postcode';

DECLARE @receivedPoint GEOGRAPHY = GEOGRAPHY::Point(@receivedLatitude, @receivedLongitude, 4326);

SELECT * FROM [Table1] WHERE [NewGeographyColumn].STIntersects(@receivedPoint) AND [PostalCodeName] = @receivedPostalCodeName;

或者至少要验证一些类似的东西......

希望对你有帮助。

【讨论】:

非常感谢,但由于某种原因,总是显示 0。这是我的测试代码:DECLARE @receivedLatitude FLOAT = 11.8147; -- DOUBLE DECLARE @receivedLongitude FLOAT = 74.7838; -- DOUBLE DECLARE @receivedPostalCodeName VARCHAR(10) = '120135'; DECLARE @receivedPoint GEOGRAPHY = GEOGRAPHY::Point(@receivedLatitude, @receivedLongitude, 4326); SELECT [NewGeographyColumn].STIntersects(@receivedPoint), * FROM [dbo].[CIUDADES] WHERE [CODIGO] = @receivedPostalCodeName; Lat 和 Long 提供的属于显示的邮政编码,但是当我将 Lat 更改为 13(外部定界),STIntersects 剧照变为 0 我运行了更新代码,经过测试,运行正常 很高兴它有帮助。但是我只是想检查一下你最终是否让它工作了?我有点担心你的纬度和经度应该是秘鲁的负数(这可能解释了 0 结果)。你得到正确的结果了吗? 我的意思是这段代码UPDATE [Table1] SET [NewGeographyColumn] = GEOGRAPHY::STGeomFromWKB([GeometryColumn].STAsBinary(), 4326);,但你完全正确,用负值测试效果很好!,我应该更好地了解 lat 和 long 值,这让我看到了一个非常常见的问题报告的数据(有些值是负数,有些是正数,我必须以某种方式解决)非常感谢您的耐心等待。这个问题已经困扰我好几个星期了......【参考方案2】:

例如,您可以为此使用必应地图 REST 服务。

对于每一点你会:

查询“逐点查找”服务(http://msdn.microsoft.com/en-us/library/ff701710.aspx)

使用响应的“邮政编码”字段来验证您的邮政编码。

示例(取自参考页面):

请求:

http://dev.virtualearth.net/REST/v1/Locations/47.64054,-122.12934?key=BingMapsKey

(BingMapsKey可以从www.bingmapsportal.com获取)

响应,其中包括邮政编码:

(...)
"address":
   "addressLine":"1 Microsoft Way",
   "adminDistrict":"WA",
   "adminDistrict2":"King Co.",
   "countryRegion":"United States",
   "formattedAddress":"1 Microsoft Way, Redmond, WA 98052",
   "locality":"Redmond",
   "postalCode":"98052"
,
(...)

【讨论】:

非常感谢您的回答,但遗憾的是,我有两个主要限制,首先,此开发不适用于美国,其次,它将适用于有或没有互联网连接的工作站.我希望只使用 SQL 查询来解决这个问题......

以上是关于验证sql server上几何字段内的点(WGS84)的主要内容,如果未能解决你的问题,请参考以下文章

SQL Server登录方式

几何列上的 SQL Server 平面世界地图

Sql Server日期查询-SQL查询今天昨天7天内30天(转)

查询以将在特定地理距离内的行返回到给定行(使用 sql server 2008)

sql server如何将字段添加到第一列

Sql Server函数日期时间函数日期查询今天昨天7天内30天的数据