0

我想要一个过程来获取两个点并在它们之间建立一条路线,并且能够按州计算英里数。在 Access VBA 或 VB.net 中可以实现这样的过程吗?

到目前为止,我能够制定路线并获得距离,但我不确定接下来会发现哪些州已经旅行以及每个州的里程数。

这是我到目前为止所拥有的:

Public Sub route()


  Dim objApp As New MapPoint.Application
  Dim objMap As MapPoint.Map
  Dim objRoute As MapPoint.route


  'Set up application
  Set objMap = objApp.ActiveMap
  Set objRoute = objMap.ActiveRoute
  objApp.Visible = True
  objApp.UserControl = True


  'Add route stops and calculate the route
  objRoute.Waypoints.Add objMap.FindResults("Iron Mountain, MI").Item(1)
  objRoute.Waypoints.Add objMap.FindResults("Chicago, IL").Item(1)
  objRoute.Calculate

    For Each Item In objRoute.Directions
        MsgBox Item.Instruction & " " & Item.ElapsedDistance
    Next

End Sub

我仍然遇到的一个问题是我尝试使用 Item.Location.StreetAddress.Region 但我得到:“对象变量或未设置块变量。” 谁能告诉我如何找到特定方向点的状态?如果是这样,我相信我可以通过添加经过的里程来按州查找经过的里程 - 以前经过的里程添加到它所属的州。

谢谢!

4

3 回答 3

0

我一直在修改以下 Access VBA 代码。它是问题中代码的扩展,但我使用它GetObject()以便可以附加到现有的 MapPoint 实例。这样我就可以在 MapPoint 中创建我的路线(并根据需要进行调整),然后 [Alt-Tab] 进入 Access 并运行代码。

代码绝不是完整的,但它似乎涵盖了基础知识。作为测试,我计划了一条从“纽约,纽约”到“洛杉矶,加利福尼亚”的路线,当我运行我的 VBA 代码时,VBA 编辑器的即时窗口中会出现以下内容:

"Origin_State: New York",0
"Entering New Jersey",1.57828283309937
"Entering Pennsylvania",76.8766632080078
"Entering Ohio",387.730041503906
"Entering Indiana",624.323974609375
"Entering Illinois",776.259155273438
"Entering Iowa",939.418151855469
"Entering Nebraska",1245.23413085938
"Entering Colorado",1599.96252441406
"Entering Utah",2054.32885742188
"Entering Arizona",2418.78686523438
"Entering Nevada",2448.091796875
"Entering California",2572.029296875
"End_of_route",2798.63793945313

代码如下:

Option Compare Database
Option Explicit

Dim objApp As MapPoint.Application
Dim objMap As MapPoint.Map

Const DebugMode = True  '' controls how error messages are displayed

Public Sub RouteTest()
    Dim objRoute As MapPoint.Route
    Dim objDirection As MapPoint.Direction
    Dim StateOfOrigin As String

    On Error GoTo RouteTest_Error
    '' attach to existing instance of MapPoint
    Set objApp = GetObject(, "MapPoint.Application")
    On Error GoTo 0  '' for debugging
    Set objMap = objApp.ActiveMap
    Set objRoute = objMap.ActiveRoute

    If objRoute.Directions Is Nothing Then
        DisplayErrorMessage "No route.", vbExclamation
        Exit Sub
    End If

    StateOfOrigin = GetState(objRoute.Directions(1).Location)
    Debug.Print """Origin_State: " & StateOfOrigin & """,0"

    For Each objDirection In objRoute.Directions
        If objDirection.Instruction Like "Entering *" Then
            Debug.Print """" & Replace(objDirection.Instruction, """", """""", 1, -1, vbBinaryCompare) & """," & objDirection.ElapsedDistance
        End If
    Next
    Set objDirection = objRoute.Directions(objRoute.Directions.Count)
    Debug.Print """End_of_route""," & objDirection.ElapsedDistance
    Set objDirection = Nothing

    Set objRoute = Nothing
    Set objMap = Nothing
    Set objApp = Nothing
    Exit Sub

    RouteTest_Error:
    If Err.Number = 429 Then
        DisplayErrorMessage "Unable to attach to existing instance of MapPoint.", vbCritical
    Else
        Err.Raise Err.Number
    End If
End Sub

Public Function GetState(loc As MapPoint.Location) As String
    '' adapted from code at http://www.mp2kmag.com/articles.asp?ArticleID=47
    Dim objResults As MapPoint.FindResults
    Dim objTempLoc As MapPoint.Location
    Dim rgn As String
    rgn = ""
    loc.Goto
    objMap.Altitude = 1
    Set objResults = objMap.ObjectsFromPoint(objMap.LocationToX(loc), objMap.LocationToY(loc))
    If objResults.ResultsQuality = geoAllResultsValid Then
        For Each objTempLoc In objResults
            If objTempLoc.Type = geoShowByRegion1 Then
                rgn = objTempLoc.Name
                Exit For
            End If
        Next
        Set objTempLoc = Nothing
    End If
    Set objResults = Nothing
    GetState = rgn
End Function

Private Sub DisplayErrorMessage(ErrorMessage As String, MessageBoxStyle As Long)
    If DebugMode Then
        Debug.Print ErrorMessage
    Else
        MsgBox ErrorMessage, MessageBoxStyle
    End If
End Sub
于 2013-04-13T10:41:02.387 回答
0

您看到的实际错误是由于滥用 FindResults 集合。您盲目地假设元素 1 已设置。不一定是这种情况,您应该首先检查 ResultsQuality 属性。这是一个非常常见的问题,经常出现在各种在线论坛上 - 很常见,我在这里写了一篇关于它的快速文章:

http://www.mapping-tools.com/howto/programming/using-the-findresults-collection/

对于 City、State 位置,您可能还会使用 FindAddressResults 做得更好。在大多数情况下,这将导致“不明确的结果”,但您可以遍历结果并选择第一个城市(通常有两个结果:城市和州)。


以上是对问题第二部分的回答。以下是我对总体策略的回应。从评论中,看起来 OP 已经解决了,但我将其保留在这里,以便评论有意义。

我不认为你可以做你想做的事,除非你在内部有一个形状定义列表并做了一个多边形点测试(是的,很多编程)。

仅当 Location 对象是从街道地址显式创建时(例如,在导入时),才设置 Location 的 StreetAddress 属性。

另请注意,您的方法可能会出现一些大错误,因为无法保证方向靠近州边界。此外,Direction Location 对象并不位于路线上 - 它们仅供查看。是的,有时它们确实位于路段上,但无法保证。这个想法是您可以缩放到该位置,并获得该方向的理想地图视图(左转等)。

于 2013-04-11T11:53:16.680 回答
0

我认为它实际上在更改状态时添加了一个方向,所以它不应该那么不准确吗?我知道出于会计目的计算里程数+/-几美元并没有太大区别,而且它可能比依靠司机记住在穿越州界线时低头并正确记录里程更准确。在任何情况下,您都可以添加休息站以强制将其他方向添加到路线中,这可能会使其更加准确 - http://www.mp2kmag.com/update/mappoint.newsletter/2011-05-05 /
埃里克米
:312-399-1586

于 2013-04-11T17:26:58.967 回答