2012-07-04 55 views
1

空间数据的操作我怎么能存储矩形 - 由2分东北和西南各点一的lattitude和经度与谷歌地图在SQL Server 2008 R2

协调和补充由中心的圈子(lat-lng)和半径(int/float值)

如果lat-lng位于任何圆或矩形的范围内,什么是存储和稍后查询的最佳方式? 另外,我可以存储这些数组吗?在一条记录中说10个矩形和5个圆圈? 我可以使用Nhibernate缓解疼痛吗?

对不起,如果这看起来不太清爽,我从来没有做过任何空间数据,我什至不知道从哪里开始。 任何样本和指针都很有帮助! 在此先感谢。

回答

2

下面是我将如何使用TSQL来解决这个问题。

对于矩形,最简单的方法是通过使用原始点的相关坐标来外推额外的2个点。例如

为东北(LAT1,lon1)西北*(LAT1,lon2)

东南*(LAT2,lon1)西南(LAT2,lon2)

*新点

这不给你是一个真正的矩形(在数学意义上),但它是GIS中的一种常用方法(它是如何形成地理杂乱的)你得到的是一个粗糙的矩形,其大小根据距离赤道的距离而变化。如果您需要一定高度/宽度的矩形,您应该使用Haversine公式计算余下的2个点,这将考虑轴承和大圆距离。

http://www.movable-type.co.uk/scripts/latlong.html

要存储的矩形,我想创建一个地理类型列SQL表,这将允许你指定附加属性(如名称)与将使得未来的查询快得多空间索引一起。

CREATE TABLE dbo.geographies 
(
    NAME VARCHAR(50) 
    ,GEOG GEOGRAPHY 
) 

INSERT INTO dbo.geographies (NAME, GEOG) 
VALUES ('Rectangle', geography::STPolyFromText('POLYGON((lon1 lat1, lon2 lat1, lon2 lat2, lon1 lat2, lon1 lat1))', 4326)) 

注意的是,第一点和最后一点是相同的,这是必需的,以“关闭”的多边形,以及最后的数字代表SRID或坐标系,在这种情况下WGS84。您可以参考这个网页:http://msdn.microsoft.com/en-us/library/bb933971

至于圈,它是简单的存储点,然后使用半径申请围绕该点的缓冲区:

INSERT INTO dbo.geographies (NAME, GEOG) 
VALUES ('Circle with Radius', geography::STPointFromText('POINT(lon lat)', 4326).STBuffer([radius])) 

注意,缓冲需要的投入,米,所以你可能需要应用转换,本页有更多笔记:http://msdn.microsoft.com/en-us/library/bb933979

现在有趣的部分,很容易检查使用STIntersects 方法的点上的交点。

http://msdn.microsoft.com/en-us/library/bb933962.aspx

DECLARE @point GEOGRAPHY = geography::STPointFromText('POINT(lon lat)', 4326) 

SELECT * FROM dbo.geographies 
WHERE @point.STIntersects(GEOG) = 1 

的代码示例的一个点,并返回所有的点中发现的地域的列表。新点的SRID与表格中的地理位置相匹配非常重要,否则您将得到零匹配(并且可能会让您撞到墙壁一段时间,直到您意识到自己的错误,至少,这就是我所做的) 。

至于用C#整合这个,我不知道我是多么的帮助就可以了,但它不应该是太大的一个挑战返回SQLGeography型

http://msdn.microsoft.com/en-us/library/microsoft.sqlserver.types.sqlgeography.aspx

希望这至少指出你在正确的方向。

+0

嘿,谢谢指点!原来有人在我的工作上实现了相当的simialr事情,但是这是2 - 3年前,所以现在我正在更新它,我会发布解决方案(并发表一篇关于它的博客文章)。再一次,谢谢! – Aviatrix