下面是我将如何使用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
希望这至少指出你在正确的方向。
嘿,谢谢指点!原来有人在我的工作上实现了相当的simialr事情,但是这是2 - 3年前,所以现在我正在更新它,我会发布解决方案(并发表一篇关于它的博客文章)。再一次,谢谢! – Aviatrix