简体   繁体   English

如何从 SQL Server 2008 地理线获取纬度经度?

[英]How to get Latitude Longitude from SQL Server 2008 geography line?

I'm new to the mapping world and I'm trying to convert a SQL Server geography line column back into it's latitude \\ longitude points to draw on a map.我是地图世界的新手,我正在尝试将 SQL Server 地理线列转换回它的纬度\\经度点以在地图上绘制。

The line is being set like this这条线是这样设置的

Set @GeoPoly = geography::STGeomFromText('LINESTRING('+@Polyline+')',4326)

Anyone know how to do this?有人知道怎么做吗? Thanks in advance提前致谢

I had luck with this:我很幸运:

DECLARE @g geography;
SET @g = geography::STLineFromText(
   'LINESTRING(-122.360 47.656, -122.343 47.656 )'
    , 4326
); 
SELECT @g.STPointN(1).ToString(), @g.STPointN(2).ToString();

Does your LineString consist of only one straight line segment connecting two points?您的 LineString 是否仅由一条连接两点的直线段组成? If so, you can retrieve the latitude and longitude of those points as:如果是这样,您可以将这些点的纬度和经度检索为:

SELECT
  @GeoPoly.STStartPoint.Lat AS Start_Lat,
  @GeoPoly.STStartPoint.Long AS Start_Long,
  @GeoPoly.STEndPoint.Lat AS End_Lat,
  @GeoPoly.STEndPoint.Long AS End_Long;

If your LineString consists of multiple line segments connecting a series of points then you can retrieve the Well-Known Text representation using the ToString() method, and then parse the resulting string into coordinate pairs by splitting on commas:如果您的 LineString 由连接一系列点的多个线段组成,那么您可以使用 ToString() 方法检索 Well-Known Text 表示,然后通过逗号分割将结果字符串解析为坐标对:

SELECT @GeoPoly.ToString()

The result will be in the format: LINESTRING(Lon1 Lat1, Lon2, Lat2, .... , Lonn, Latn)结果将采用以下格式:LINESTRING(Lon1 Lat1, Lon2, Lat2, .... , Lonn, Latn)

You can achieve this in a query by combining STasText(), STRING_SPLIT(), CROSS APPLY and STRING_AGG().您可以通过组合 STasText()、STRING_SPLIT()、CROSS APPLY 和 STRING_AGG() 在查询中实现这一点。 Here is an example query:这是一个示例查询:

WITH Links AS (
    SELECT Id, REPLACE(REPLACE(PosList.STAsText(), 'LINESTRING (', ''), ')', '') as points_string
    FROM LinkSequenceProjections
    WHERE ImportFileId = 1
    AND Id < 5
)
, Points AS (
    SELECT Id, ltrim(value) as point_string, row_number() OVER (PARTITION BY Id ORDER By Id) as Nr
    FROM Links
    CROSS APPLY STRING_SPLIT(points_string, ',')
)
, Coords AS (
    SELECT Id, Nr, CAST(value AS [varchar](max)) AS coord
    FROM Points
    CROSS APPLY STRING_SPLIT(point_string, ' ')
)
, GroupedByNr AS (
    SELECT Id, Nr, MIN(coord) AS Lon, MAX(coord) AS Lat
    FROM Coords
    GROUP BY Id, Nr
)
, GroupedById AS (
    SELECT Id, 'LINSESTRING (' + STRING_AGG(Lon + ' ' + Lat, ', ') WITHIN GROUP (ORDER BY Nr) + ')' as wkt2
    FROM GroupedByNr
    GROUP BY Id
)
SELECT Id, geography::STGeomFromText(wkt2, 4326) AS PosList2
FROM GroupedById

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM