【问题标题】:finding sql geography point within rectangular (polygon)在矩形(多边形)内查找sql​​地理点
【发布时间】:2016-02-17 02:50:19
【问题描述】:

我遇到了一个有趣/烦人的问题,即在矩形边界内查找地标的经纬度。 我相信我的两点在我的矩形边界内。但是您可以测试自己,第一次选择的结果是假而不是真!

DECLARE @boundingRect varchar(1000)
DECLARE @maxLat VARCHAR(20)
DECLARE @minLong VARCHAR(20)
DECLARE @minLat VARCHAR(20)
DECLARE @maxLong VARCHAR(20)


set @maxLat ='-36.06631759541187'
set @minLong ='125.23310677812492'
set @minLat ='-44.43329881450396'
set @maxLong='167.04707162187492'


SET @boundingRect = 'POLYGON((' +   @minLong + ' '  + @minLat + ', ' +
                                        @maxLong + ' ' + @minLat + ', ' + 
                                        @maxLong + ' ' + @maxLat + ', ' + 
                                        @minLong + ' ' + @maxLat + ', ' + 
                                        @minLong + ' ' + @minLat + '))'

DECLARE @Bounds AS Geography =GEOGRAPHY::STPolyFromText(@boundingRect,4326)

DECLARE @point1 AS GEOGRAPHY = GEOGRAPHY::Point(-37.81502, 144.94601, 4326)
DECLARE @point2 AS GEOGRAPHY = GEOGRAPHY::Point(-38.81502, 144.94601, 4326)


SELECT @Bounds.STIntersects(@point1)
SELECT @Bounds.STIntersects(@point2) 

为了给你背景,我有我想在谷歌地图上加载的地标列表(纬度、经度)。由于地标的数量太多,我无法一次返回所有地标。我需要返回用户可见区域中的地标,在他们的查看边界中。我正在获取谷歌地图边界的西北(最大纬度,最小长度)和东南部(最小纬度,最大长度)并将其发送到我的存储过程以返回该边界内的地标列表。但是,正如我在上面解释的那样,我遇到了一些问题,并且列表中缺少一些地标。

【问题讨论】:

  • @point1 由于地球曲率不相交:
  • Azadeh,如果你想使用 Geography 多边形并且仍然处理曲率问题,我建议你在多边形中添加更多点。
  • 对于小距离,geometry数据类型很好,很远距离最好用geographyc,但总分很少,也可以用集群developers.google.com/maps/articles/toomanymarkers

标签: sql-server tsql spatial sqlgeography


【解决方案1】:

@point1 不相交 这可以通过以下方式验证:

DECLARE @boundingRect varchar(1000)
DECLARE @maxLat VARCHAR(20)
DECLARE @minLong VARCHAR(20)
DECLARE @minLat VARCHAR(20)
DECLARE @maxLong VARCHAR(20)


set @maxLat ='-36.06631759541187'
set @minLong ='125.23310677812492'
set @minLat ='-44.43329881450396'
set @maxLong='167.04707162187492'


SET @boundingRect = 'POLYGON((' +   @minLong + ' '  + @minLat + ', ' +
                                        @maxLong + ' ' + @minLat + ', ' + 
                                        @maxLong + ' ' + @maxLat + ', ' + 
                                        @minLong + ' ' + @maxLat + ', ' + 
                                        @minLong + ' ' + @minLat + '))'

DECLARE @Bounds AS Geography =GEOGRAPHY::STPolyFromText(@boundingRect,4326);

DECLARE @point1 AS GEOGRAPHY = GEOGRAPHY::Point(-37.81502, 144.94601, 4326);
DECLARE @point2 AS GEOGRAPHY = GEOGRAPHY::Point(-38.81502, 144.94601, 4326);


SELECT @Bounds.STIntersects(@point1);
SELECT @Bounds.STIntersects(@point2); 


SELECT @point1, 'Point 1'
UNION ALL
SELECT @Point2, 'Point 2'
UNION ALL
SELECT @BoundingRect, 'Rect'

【讨论】:

  • 你又赢了,霍纳。
  • 谢谢杰森!喜欢使用联合的想法并在“空间结果”窗口中查看结果
【解决方案2】:

其实地理多边形不是矩形:

如果你想要矩形,你可以使用几何多边形:

【讨论】:

  • 可以使用几何,但不应该。为什么?因为数据代表我们称之为家的扁球体上的点和区域,因此不符合笛卡尔几何。
猜你喜欢
  • 2010-10-11
  • 2012-04-30
  • 1970-01-01
  • 2017-02-18
  • 1970-01-01
  • 2016-06-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多