【问题标题】:Query or Stored Proc to get points defining a polygon/multipolygon查询或存储过程以获取定义多边形/多多边形的点
【发布时间】:2016-01-23 04:24:22
【问题描述】:

我有一个 SQL Server 2012 表,其中包含一个地理类型列,其中包含一个多边形或多面体。一些多面体中有孔。我想要一个查询或存储过程来获取定义形状的所有点,以及该点所属的多面体环。

请注意,其中一些形状有数千个点,这可能会在使用递归 CTE 时产生问题。

【问题讨论】:

  • 你有没有想过这个问题?我也在尝试获取定义多边形的所有点。
  • #Evan,是的,但我写的是代码,请参阅答案。
  • 酷,看起来你只是解析字符串。这也是我要诉诸的。谢谢!

标签: sql-server spatial


【解决方案1】:

我没有使用查询或存储过程来执行此操作,而是编写了代码。我正在使用实体框架,SchoolDistrict 是 SQL Server 中表的对象。 DistrictLocation 是地理类型字段。这是我用来获取 VB.NET 中的代码。它返回一个坐标集列表,每个坐标集都是多面体中的一个环。

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

【讨论】:

    猜你喜欢
    • 2021-10-13
    • 1970-01-01
    • 1970-01-01
    • 2014-10-06
    • 1970-01-01
    • 2016-09-02
    • 2011-07-03
    • 1970-01-01
    • 2011-12-19
    相关资源
    最近更新 更多