【发布时间】:2017-01-10 12:06:00
【问题描述】:
在尝试解决这个问题几周后,我不得不给朋友打电话。我想我越是弄乱它,我就会越走越远。我在 MS Access 中有两个表(见下文)
目标是在包含最近城市区域的表 ("tblnewbid") 中得到一个名为 ("O_CityRegion") 的新字段。所以我需要使用每个城市的纬度和经度,其中州的地区匹配(只是为了减少计算时间),并计算它们之间的距离。在 Region 内的城市列表中,我需要找到距离最小的地方,并将相应的 SubRegion 返回到字段“O_CityRegion”中。
从数学上讲,我知道以下公式可用于计算坐标之间的距离:
(ACOS(COS(RADIANS(90-(Latitude1))) * COS(RADIANS(90-(Latitude2))) + SIN(RADIANS(90-(Latitude1))) * SIN(RADIANS(90-(Latitude2))) * COS(RADIANS((Longitude1)-(Longitude2))))*3958
这只是让所有其他部分正常工作的问题。我想我之前已经更接近了,但我只是照原样复制了我的代码。
访问其中的表和字段:
tblnewbid
Origin // O_State Region // Latitude // Longitude
tblClosestCities
CityState // Latitude // Longitude // Region // SubRegion
下面是我的代码:
Private Sub btnInsertClosestCityRegion_Click()
Dim strSQL As Variant
Dim rs1 As DAO.Recordset
Dim db As Database
Dim FSO As New FileSystemObject
Dim Distance As Integer
Set db = CurrentDb
db.Execute ALTER TABLE [tblnewbid] ADD COLUMN O_CityRegion CHAR, dbFailOnError
Set rs1 = db.OpenRecordset(Select [Origin] FROM [tblnewbid];)
rs1.MoveFirst
strSQL = "UPDATE [tblnewbid] INNER JOIN [tblClosestCities]"
strSQL = strSQL & ON [tblClosestCities].[Region] = tblnewbid.[O_StateRegion]
strSQL = strSQL & SET [tblClosestCities].[SubRegion] = [tblnewbid].[O_CityRegion]
strSQL = strSQL & " FROM ( "
strSQL = strSQL & " SELECT [tblClosestCities].[SubRegion], (3958 * ACOS( COS(RADIANS(90-[tblnewbid].[Latitude])) * COS(RADIANS(90-[tblClosestCities].[Latitude])) + SIN(RADIANS(90-[tblnewbid].[Latitude])) * SIN(RADIANS(90-[tblClosestCities].[Latitude])) * COS(RADIANS([tblnewbid].[Longitude]-[tblClosestCities].[Longitude]))) AS " & Distance & ")"
strSQL = strSQL & " FROM tblClosestCities, " & tblnewbid & " )"
strSQL = strSQL & " WHERE " & Distance & " = MIN(" & Distance & ")"
db.Execute (strSQL), dbFailOnError
rs1.Close
Set rs1 = Nothing
Set db = Nothing
DoCmd.Hourglass False
MsgBox "The proxity of the city within the states have been added!"
End Sub
【问题讨论】: