验证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查询今天昨天7天内30天(转)