【问题标题】:Update Geography column in table更新表中的地理列
【发布时间】:2015-04-29 08:25:17
【问题描述】:

我有下表

如您所愿,Geo 列(数据类型 Geography)为 null 我目前在此表中有 11913 行,我正在尝试使用以下语句更新 Geo 列,并使用以下数据填充 Geo 列由 Geography::STGeomFromText 提供

DECLARE @Temp TABLE
(
Id bigint,
Latitude decimal(9,6),
Longitude decimal(9,6)
)

Insert Into @Temp (Id, Latitude, Longitude)
    Select id, Latitude, Longitude from Location.Cities 
where Active = 1

Update Location.Cities
set Geo = geography::STGeomFromText (POINT(Select Latitude, Longitude from  @Temp), 4326)
where Id = -- massively confused.....

我遇到了两个问题,我说从@Temp 选择纬度、经度,它说 POINT 不是公认的内置函数名称,另一个是我如何确保我更新正确的记录/行已经选择了纬度和经度。

我需要这样做的原因是,在我们的应用程序中,我们允许最终用户按半径搜索。

任何帮助都会很棒。

【问题讨论】:

    标签: sql-server sql-server-2008 sqlgeography


    【解决方案1】:

    您不需要临时表@Temp。你可以直接在你的桌子上使用geography::PointLocation.Cities

    类似的东西。

    Update Location.Cities
    set Geo = geography::Point(Latitude, Longitude , 4326)
    

    如果要使用geography::STGeomFromText,可以这样使用。

        Update Location.Cities
            set Geo = geography::STGeomFromText('POINT(' + CONVERT(VARCHAR(30),Longitude ) + ' ' + CONVERT(VARCHAR(30),Latitude) + )',4326)
    

    【讨论】:

    • 我没有意识到我可以按照您首先提供的方式进行操作,但是我怎么知道它为每一行拉出了正确的纬度和经度,而不是选择了不正确的经纬度?抱歉,我的 SQL 知识有限,所以如果我刚刚问的问题很愚蠢,我很抱歉。
    • 因为这就是 SQL 的全部意义所在。这是一个基于行的操作,并递归地遍历每一行。
    • @ScottAtkinson - 每行将使用存储在行中的纬度/经度值。
    【解决方案2】:

    ughai 的答案会起作用,但您会发现性能问题。你最好使用 STPointFromText:

    UPDATE Location.Cities
    SET Geo = geography::STPointFromText('POINT(' + CAST([Longitude] AS VARCHAR(20)) + ' ' + CAST([Latitude] AS VARCHAR(20)) + ')', 4326)
    

    附带说明您收到错误的原因是因为该函数需要一个 varchar 参数作为它的第一个参数。

    【讨论】:

    • 我不知道STPointFromTextPoint 快。您是否有任何参考资料详细说明geography 上的性能研究
    【解决方案3】:

    如果是我,我会这样做: 声明@batchsize int = 1000; 而(1=1) 开始

        Update top(@batchsize) Location.Cities
        set Geo = geography::Point(Latitude, Longitude), 4326)
        where Geo is null;
    
        if (@@rowcount < @batchsize)
           break;
    
    end
    

    一些注意事项

    • Point 静态方法是 MS 扩展。也就是说,它不是标准的 OGC 方法。但这很好,它会给你同样的结果。我发现它更具可读性,因为您不需要创建代表点的 WKT。
    • 我正在批量更新。 太多 应该没关系,因为您的表大约有 10k 行,但如果它更大就很重要。这个成语很值得了解。

    【讨论】:

      猜你喜欢
      • 2020-06-10
      • 1970-01-01
      • 2016-01-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多