考慮在VBA函數中使用半正向公式(借用here)。然後讓它在你的SQL查詢中調用。甚至可以按照您的需求通過WHERE
條款按距離過濾您的查詢。請注意:此解決方案僅適用於MSAccess.exe程序。您將無法通過ODBC/OLEDB從外部調用它。
而且由於您需要比較地理編碼,因此下面的SQL查詢使用交叉連接,其中每個記錄都與表中的每個其他記錄進行比較。另外,查詢避免了反向重複和相同匹配的配對,從而減小了大小。但是,如果表格很大,因爲交叉連接對自我返回N 記錄,即在重複過濾之前。
SQL
SELECT z1.Zipcode, z2.Zipcode,
GetDistance(z1.Lat, z1.Lon, z2.Lat, z2.Lon) As km_distance
FROM tblZip z1, tblZip z2
WHERE z1.Zipcode > z2.Zipcode
AND GetDistance(s1.lat, s1.lon, s1.lat, s2.lon) <= 5;
VBA(具有5 km或更小距離郵政編碼配對)(獨立模塊中保存)
Function GetDistance(lat1Degrees As Double, lon1Degrees As Double, lat2Degrees As Double, lon2Degrees As Double) As Double
Dim earthSphereRadiusKilometers As Double
Dim kilometerConversionToMilesFactor As Double
Dim lat1Radians As Double
Dim lon1Radians As Double
Dim lat2Radians As Double
Dim lon2Radians As Double
Dim AsinBase As Double
Dim DerivedAsin As Double
'Mean radius of the earth (replace with 3443.89849 to get nautical miles)
earthSphereRadiusKilometers = 6371
'Convert kilometers into miles (replace 0.621371 with 1 to keep in kilometers)
kilometerConversionToMilesFactor = 0.621371
'Convert each decimal degree to radians
lat1Radians = (lat1Degrees/180) * (4 * ATN(1))
lon1Radians = (lon1Degrees/180) * (4 * ATN(1))
lat2Radians = (lat2Degrees/180) * (4 * ATN(1))
lon2Radians = (lon2Degrees/180) * (4 * ATN(1))
AsinBase = Sin(Sqr(Sin((lat1Radians - lat2Radians)/2)^2 + Cos(lat1Radians) * Cos(lat2Radians) * Sin((lon1Radians - lon2Radians)/2)^2))
DerivedAsin = (AsinBase/Sqr(-AsinBase * AsinBase + 1))
'Get distance from [lat1,lon1] to [lat2,lon2]
GetMiles = Round(2 * DerivedAsin * (earthSphereRadiusKilometers * kilometerConversionToMilesFactor), 2)
End Function
你會被計算兩條記錄之間或一條記錄與任意點之間的距離?如果前者,那麼你如何選擇這兩點? – toonice
我正在計算特定記錄與表tblZip中所有其他記錄之間的距離。 –