PDA

View Full Version : Reverse Geocoding, Pt. III

Anonymous
10-31-2001, 10:48 PM
Walt Cygan, a frequent contributor of late, submits this solution for tackling reverse geocoding

Mossoft
12-17-2003, 10:10 AM
I have a similar/simpler/less accurate(but good enough for my purposes) method which I call when a point on the map is clicked, passing in the location's X and Y values:

Function FindNearestAddress&#40;locX As Long, locY As Long&#41; As String
'Mossoft2003
Dim dblTolerance As Double
Dim blnFound As Boolean
Dim lngCount As Long
Dim fr As MapPoint.FindResults
Dim obj As Object
Dim lngAttempt As Long
Dim ToleranceStep As Long
Dim dX As Long
Dim dY As Long
Const ALTITUDE_LIMIT = 15

On Error Resume Next

If mapWhere.ActiveMap.Altitude < ALTITUDE_LIMIT Then

blnFound = False
lngAttempt = 0
ToleranceStep = ALTITUDE_LIMIT - mapWhere.ActiveMap.Altitude
dX = locX
dY = locY

Do
Set fr = mapWhere.ActiveMap.ObjectsFromPoint&#40;dX, dY&#41;
For Each obj In fr
If Not sa Is Nothing Then
FindNearestAddress = sa.Value & " &#40;" & CStr&#40;mapWhere.ActiveMap.Distance&#40;mapWhere.ActiveMa p.XYToLocation&#40;locX, locY&#41;, obj&#41;&#41; & " miles&#41;"
blnFound = True
Exit For
End If
Next
If blnFound Then Exit Do
lngAttempt = lngAttempt + 1
Select Case lngAttempt Mod 8
Case 1
dX = locX
dY = locY + ToleranceStep
Case 2
dX = locX + ToleranceStep
dY = locY + ToleranceStep
Case 3
dX = locX + ToleranceStep
dY = locY
Case 4
dX = locX + ToleranceStep
dY = locY - ToleranceStep
Case 5
dX = locX
dY = locY - ToleranceStep
Case 6
dX = locX - ToleranceStep
dY = locY - ToleranceStep
Case 7
dX = locX - ToleranceStep
dY = locY
Case 0
dX = locX - ToleranceStep
dY = locY + ToleranceStep
ToleranceStep = ToleranceStep + 1
End Select
Loop While Not blnFound And ToleranceStep < &#40;2 * ALTITUDE_LIMIT&#41;
End If

FNA_Exit&#58;
Exit Function
FNA_Error&#58;
Debug.Print "ERROR&#58; " & Err.Description
Resume FNA_Exit

End Function

The search pattern is an 8 pointed star eminating, and spiralling out, from the original point.
The altitude check is to ensure the view point is low enough to display address level locations.

M.