【发布时间】:2015-11-20 17:38:25
【问题描述】:
有没有一种简单的方法可以像这样组合几个 GEOGRAPHY 点:
CREATE TABLE #Points
(
Id INT IDENTITY(1,1),
Point GEOGRAPHY
)
到 Sql Server 2014 中的 GEOGRAPHY LINESTRING?
【问题讨论】:
标签: sql-server tsql geospatial sql-server-2014
有没有一种简单的方法可以像这样组合几个 GEOGRAPHY 点:
CREATE TABLE #Points
(
Id INT IDENTITY(1,1),
Point GEOGRAPHY
)
到 Sql Server 2014 中的 GEOGRAPHY LINESTRING?
【问题讨论】:
标签: sql-server tsql geospatial sql-server-2014
要结合两点,你可以这样做:
@Point1.STUnion(@Point2).STConvexHull()
要创建线,点必须按顺序排列,所以像 ConvexHullAggregate 这样的东西不起作用。您可以尝试编写一个循环来按顺序组合它们,然后存储组合。
【讨论】:
另一种方法是从点的 (xy) 坐标构造字符串(通过 point.StX() 和 point.StY()),连接它们并构建描述线串的 WKT 字符串,然后将其转换为地理类型。
【讨论】:
我有一个场景,我有一些观点:
| PathId | Step | PointGeo |
|---|---|---|
| 1 | 1 | 0xE61... |
| 1 | 2 | 0xE61... |
我想将它们作为线串放入父表(路径;一个路径有很多点)
| PathId | PathAsLineStringGeo |
|---|---|
| 1 | NULL |
我写了一个写SQL的SQL:
select
concat(
'update Paths set PathAsLineStringGeo = geography::STGeomFromText(''LINESTRING(',
string_agg(cast(concat(PointGeo.Long, ' ', PointGeo.Lat) as varchar(max)), ' ') within group(order by Step),
')'', 4326) where PathId = ',
PathId
)
from points
group by pathid
您需要调整以使其与您的上下文相关的列在 PascalCase 中
这生成了一堆我从结果窗口复制并运行的更新语句:
UPDATE Paths SET PathAsLineStringGeo = geography::STGeomFromText('LINESTRING(-1.22 3.44, 5.66 7.88)', 4326) where PathId = 1
UPDATE Paths SET PathAsLineStringGeo = geography::STGeomFromText('LINESTRING(-7.89 10.11 -12.13 14.15 -16.17 18.19)', 4326) where PathId = 2
没有什么能阻止你把它变成一个典型的可更新连接。也许是这样的:
update x
set somelinestringgeocolumn = geography::STGeomFromText(y.calculatedlinestringWKT, 4326)
from
parent_table x
inner join
(
select
pathId,
CONCAT(
'LINESTRING(',
string_agg(cast(concat(point.Long, ' ', point.Lat) as varchar(max)), ', ') within group(order by Step),
')'
) as calculatedlinestringWKT
from child_table_with_points
) y
ON x.pathid = y.pathid
【讨论】: