查询或存储过程以获取定义 polygon/multipolygon 的点
Query or Stored Proc to get points defining a polygon/multipolygon
我有一个 SQL Server 2012 table,其中包含一个包含多边形或多边形的地理类型列。一些多边形中有孔。我想要一个查询或存储过程来获取定义形状的所有点,以及该点属于多面体的哪个环。
请注意,其中一些形状有数千个点,这可能会在使用递归 CTE 时产生问题。
我没有使用查询或存储过程来执行此操作,而是编写了代码。我正在使用 Entity Framework,而 SchoolDistrict 是 SQL 服务器中 table 的对象。 DistrictLocation 是地理类型字段。这是我用来获取 VB.NET 中的代码。它returns一个坐标集列表,每个坐标集都是多边形中的一个环。
Public Function SchoolDistrictVertices() As List(Of List(Of Coordinate))
If SchoolDistrict Is Nothing OrElse SchoolDistrict.DistrictLocation Is Nothing Then
Return Nothing
Else
'get the points that define the shape by parsing the shape's WKT
Dim result = New List(Of List(Of Coordinate))
Dim wkt = SchoolDistrict.DistrictLocation.Location.WellKnownValue().WellKnownText
Dim startPos = wkt.IndexOf("((")
Do Until startPos = -1
Dim list = New List(Of Coordinate)
Dim endPos = wkt.IndexOf(")", startPos)
Dim piece = wkt.Substring(startPos + 1, endPos - (startPos + 1))
Dim coords = piece.Split(","c)
For Each item In coords
item = item.Trim().Replace("(", "")
Dim parts = item.Split(" "c)
Dim lng = parts(0)
Dim lat = parts(1)
Dim coord = New Coordinate()
coord.Latitude = Convert.ToDouble(lat)
coord.Longitude = Convert.ToDouble(lng)
list.Add(coord)
Next
result.Add(list)
startPos = wkt.IndexOf("(", endPos)
Loop
Return result
End If
End Function
Public Structure Coordinate
Public Property Latitude As Double
Public Property Longitude As Double
End Structure
我有一个 SQL Server 2012 table,其中包含一个包含多边形或多边形的地理类型列。一些多边形中有孔。我想要一个查询或存储过程来获取定义形状的所有点,以及该点属于多面体的哪个环。
请注意,其中一些形状有数千个点,这可能会在使用递归 CTE 时产生问题。
我没有使用查询或存储过程来执行此操作,而是编写了代码。我正在使用 Entity Framework,而 SchoolDistrict 是 SQL 服务器中 table 的对象。 DistrictLocation 是地理类型字段。这是我用来获取 VB.NET 中的代码。它returns一个坐标集列表,每个坐标集都是多边形中的一个环。
Public Function SchoolDistrictVertices() As List(Of List(Of Coordinate))
If SchoolDistrict Is Nothing OrElse SchoolDistrict.DistrictLocation Is Nothing Then
Return Nothing
Else
'get the points that define the shape by parsing the shape's WKT
Dim result = New List(Of List(Of Coordinate))
Dim wkt = SchoolDistrict.DistrictLocation.Location.WellKnownValue().WellKnownText
Dim startPos = wkt.IndexOf("((")
Do Until startPos = -1
Dim list = New List(Of Coordinate)
Dim endPos = wkt.IndexOf(")", startPos)
Dim piece = wkt.Substring(startPos + 1, endPos - (startPos + 1))
Dim coords = piece.Split(","c)
For Each item In coords
item = item.Trim().Replace("(", "")
Dim parts = item.Split(" "c)
Dim lng = parts(0)
Dim lat = parts(1)
Dim coord = New Coordinate()
coord.Latitude = Convert.ToDouble(lat)
coord.Longitude = Convert.ToDouble(lng)
list.Add(coord)
Next
result.Add(list)
startPos = wkt.IndexOf("(", endPos)
Loop
Return result
End If
End Function
Public Structure Coordinate
Public Property Latitude As Double
Public Property Longitude As Double
End Structure