Detecting whether a GPS coordinate falls within a polygon on a map

前端 未结 8 1303
野趣味
野趣味 2020-12-07 10:17

As stated in the title, the goal is to have a way for detecting whether a given GPS coordinate falls inside a polygon or not.

The polygon itself can be either convex

8条回答
  •  独厮守ぢ
    2020-12-07 10:46

    Runner.Java code in VB.NET

    For the benefit of .NET folks the same code is put in VB.NET. Have tried it and is quite fast. Tried with 350000 records, it finishes in just few minutes. But as said by author, i'm yet to test scenarios intersecting equator, multizones etc.

    'Usage

    If coordinate_is_inside_polygon(CurLat, CurLong, Lat_Array, Long_Array) Then
        MsgBox("Location " & CurLat & "," & CurLong & " is within polygon boundary")
    Else
        MsgBox("Location " & CurLat & "," & CurLong & " is NOT within polygon boundary")
    End If
    

    'Functions

    Public Function coordinate_is_inside_polygon(ByVal latitude As Double, ByVal longitude As Double, ByVal lat_array() As Double, ByVal long_array() As Double) As Boolean
        Dim i As Integer
        Dim angle As Double = 0
        Dim point1_lat As Double
        Dim point1_long As Double
        Dim point2_lat As Double
        Dim point2_long As Double
        Dim n As Integer = lat_array.Length()
        For i = 0 To n - 1
            point1_lat = lat_array(i) - latitude
            point1_long = long_array(i) - longitude
            point2_lat = lat_array((i + 1) Mod n) - latitude
            point2_long = long_array((i + 1) Mod n) - longitude
            angle += Angle2D(point1_lat, point1_long, point2_lat, point2_long)
        Next
    
        If Math.Abs(angle) < PI Then Return False Else Return True
    End Function
    
    Public Function Angle2D(ByVal y1 As Double, ByVal x1 As Double, ByVal y2 As Double, ByVal x2 As Double) As Double
        Dim dtheta, theta1, theta2 As Double
        theta1 = Math.Atan2(y1, x1)
        theta2 = Math.Atan2(y2, x2)
        dtheta = theta2 - theta1
        While dtheta > PI
             dtheta -= TWOPI
        End While
    
        While dtheta < -PI
            dtheta += TWOPI
        End While
        Return (dtheta)
    End Function
    
    
    
     Public Function is_valid_gps_coordinate(ByVal latitude As Double, ByVal longitude As Double) As Boolean
            If latitude > -90 AndAlso latitude < 90 AndAlso longitude > -180 AndAlso longitude < 180 Then
                Return True
            End If
    
            Return False
    End Function
    

提交回复
热议问题