Công thức tính khoảng cách giữa 2 mã địa lý là gì? Tôi đã nhìn thấy một số câu trả lời trên trang web này, nhưng về cơ bản họ nói để dựa vào các chức năng SQL Server 08, tôi không phải trên 08 được nêu ra. Bất kỳ trợ giúp sẽ được đánh giá cao.Khoảng cách giữa 2 mã địa lý
Trả lời
Sử dụng phép tính gần đúng của trái đất và công thức Haversine. Bạn có thể nhận được một phiên bản javascript vào url sau, mà bạn có thể dịch sang ngôn ngữ của bạn lựa chọn:
http://www.movable-type.co.uk/scripts/latlong.html
Đây là một cách khác: http://escience.anu.edu.au/project/04S2/SE/3DVOT/3DVOT/pHatTrack_Application/Source_code/pHatTrack/Converter.java
định lý pythagore?
Hãy xem ở đây cho một phiên bản SQL server 2000 SQL Server Zipcode Latitude/Longitude proximity distance search
Bạn đang tìm chiều dài của Đường tròn lớn giữa hai điểm trên hình cầu. Hãy thử tìm kiếm "Đường dẫn vòng kết nối lớn" hoặc "Khoảng cách vòng kết nối tuyệt vời" trên Google.
Rất tiếc, tôi không biết bạn đang ở quốc gia nào. Có phải chúng ta đang nói về Easting and Northings (hệ thống điều tra của Vương quốc Anh, Hệ thống khảo sát thông thường) hoặc Lat/Long hoặc một số hệ thống khác? Nếu chúng ta đang nói chuyện Đông và hướng Bắc thì bạn có thể sử dụng
sqr ((x1-x2)^2 + (y1-y2)^2)
Điều này không cho phép thực tế là trái đất là hình cầu, nhưng đối với khoảng cách ngắn bạn sẽ không nhận thấy. Chúng tôi sử dụng nó tại nơi làm việc cho khoảng cách giữa các điểm trong quận.
Hãy cẩn thận về mức độ tham chiếu lưới dài hơn mà bạn sử dụng. Tôi nghĩ rằng một tài liệu tham khảo 8 con số sẽ cung cấp cho bạn một khoảng cách tính bằng mét. Tôi sẽ có thể nhận được một câu trả lời definate tại nơi làm việc vào tuần tới nếu không có ai khác đã cung cấp nó.
Định lý pythagore như được cung cấp bởi những người khác ở đây không hoạt động tốt như vậy.
Câu trả lời đơn giản, tốt nhất là ước lượng trái đất dưới dạng hình cầu (thực tế là hình cầu hơi phẳng, nhưng điều này rất gần). Trong Haskell, ví dụ bạn có thể sử dụng sau, nhưng toán học có thể được phiên âm ra khá nhiều bất cứ điều gì:
distRadians (lat1,lon1) (lat2,lon2) =
radius_of_earth *
acos (cos lat1 * cos lon1 * cos lat2 * cos lon2 +
cos lat1 * sin lon1 * cos lat2 * sin lon2 +
sin lat1 * sin lat2) where
radius_of_earth = 6378 -- kilometers
distDegrees a b = distRadians (coord2rad a) (coord2rad b) where
deg2rad d = d * pi/180
coord2rad (lat,lon) = (deg2rad lat, deg2rad lon)
distRadians
đòi hỏi góc của bạn sẽ được đưa ra trong radian.
distDegrees
là một hàm trợ giúp có thể lấy các thái độ và kinh độ theo độ.
Xem this series of posts để biết thêm thông tin về nguồn gốc của công thức này.
Nếu bạn thực sự cần độ chính xác phụ cấp bằng cách giả sử trái đất là hình elip, xem FAQ này: http://www.movable-type.co.uk/scripts/gis-faq-5.1.html
này sẽ làm điều đó cho bạn trong C#.
Trong namespace đặt những:
public enum DistanceType { Miles, Kilometers };
public struct Position
{
public double Latitude;
public double Longitude;
}
class Haversine
{
public double Distance(Position pos1, Position pos2, DistanceType type)
{
double preDlat = pos2.Latitude - pos1.Latitude;
double preDlon = pos2.Longitude - pos1.Longitude;
double R = (type == DistanceType.Miles) ? 3960 : 6371;
double dLat = this.toRadian(preDlat);
double dLon = this.toRadian(preDlon);
double a = Math.Sin(dLat/2) * Math.Sin(dLat/2) +
Math.Cos(this.toRadian(pos1.Latitude)) * Math.Cos(this.toRadian(pos2.Latitude)) *
Math.Sin(dLon/2) * Math.Sin(dLon/2);
double c = 2 * Math.Asin(Math.Min(1, Math.Sqrt(a)));
double d = R * c;
return d;
}
private double toRadian(double val)
{
return (Math.PI/180) * val;
}
Sau đó, để sử dụng chúng trong các mã chính:
Position pos1 = new Position();
pos1.Latitude = Convert.ToDouble(hotelx.latitude);
pos1.Longitude = Convert.ToDouble(hotelx.longitude);
Position pos2 = new Position();
pos2.Latitude = Convert.ToDouble(lat);
pos2.Longitude = Convert.ToDouble(lng);
Haversine calc = new Haversine();
double result = calc.Distance(pos1, pos2, DistanceType.Miles);
Nếu
- bạn biết rằng 2 điểm là "không quá xa nhau "
- và bạn chịu đựng một lỗi "hợp lý nhỏ".
Sau đó, hãy xem xét rằng trái đất là phẳng giữa 2 điểm:
- Sự khác biệt khoảng cách theo hướng vĩ độ là
EarthRadius * latitude difference
- Sự khác biệt khoảng cách theo hướng kinh độ là
EarthRadius * longitude difference * cos(latitude)
. Chúng tôi nhân vớicos(lat)
vì độ kinh độ không thực hiện cùng khoảng cách km nếu vĩ độ thay đổi. Như P1 và P2 là gần, cos (latP1) gần từ cos (latP2) - Sau đó Pythagore
Trong JavaScript:
function ClosePointsDistance(latP1, lngP1, latP2, lngP2) {
var d2r = Math.PI/180,
R=6371; // Earth Radius in km
latP1 *= d2r; lngP1 *= d2r; latP2 *= d2r; lngP2 *= d2r; // convert to radians
dlat = latP2 - latP1,
dlng = (lngP2 - lngP1) * Math.cos(latP1);
return R * Math.sqrt(dlat*dlat + dlng*dlng);
}
Tôi đã thử nghiệm nó giữa Paris và Orleans (Pháp): công thức tìm thấy 110,9 km trong khi công thức Haversine (chính xác) tìm thấy 111,0 km.
!!! Cẩn thận với các tình huống xung quanh kinh tuyến 0 (bạn có thể thay đổi nó): nếu P1 ở Lng 359 và P2 ở Lng 0, chức năng sẽ xem xét chúng bất thường đến mức nào !!!
Đây là cách để thực hiện nếu bạn đang sử dụng máy chủ sql.
CREATE function dist (@Lat1 varchar(50), @Lng1 varchar(50),@Lat2 varchar(50), @Lng2 varchar(50))
returns float
as
begin
declare @p1 geography
declare @p2 geography
set @p1 = geography::STGeomFromText('POINT('+ @Lng1+' '+ @Lat1 +')', 4326)
set @p2 = geography::STGeomFromText('POINT('+ @Lng2+' '+ @Lat2 +')', 4326)
return @p1.STDistance(@p2)
end
- 1. Nhận khoảng cách giữa hai điểm địa lý
- 2. Tính khoảng cách giữa hai vị trí địa lý
- 3. Khoảng cách vật lý giữa hai địa điểm
- 4. Khoảng cách giữa hai địa điểm GEO
- 5. Khoảng cách giữa các địa chỉ
- 6. Cần trợ giúp tính khoảng cách địa lý
- 7. Khoảng cách giữa hai địa điểm không đúng
- 8. Thuật toán để tính toán khoảng cách giữa nhiều điểm địa lý
- 9. Khoảng cách giữa hai điểm sử dụng datatype địa lý trong sqlserver 2008?
- 10. Làm cách nào để mã hóa địa lý (KHÔNG mã hóa địa lý ngược) trên iPhone?
- 11. Java - Google maps API - khoảng cách giữa hai địa chỉ
- 12. Tính khoảng cách không gian địa lý với radian
- 13. Máy tính khoảng cách mã zip
- 14. Mã mã hóa địa lý đảo ngược
- 15. Android: làm thế nào để có được khoảng cách đi bộ giữa hai điều phối viên địa lý?
- 16. Quy ước mã hóa trong Javascript: sử dụng khoảng cách giữa các khoảng trống
- 17. khoảng cách giữa các khoảng trống imagettftext
- 18. Cách tính góc giữa hai tọa độ địa lý/GPS?
- 19. Cách tìm khoảng cách giữa hai địa chỉ? (Phía máy chủ Java)
- 20. Cách tìm khoảng cách giữa hai Mã Zip bằng cách sử dụng Mã Java?
- 21. Mã hóa địa lý địa chỉ với mã hóa địa lý và cơ sở dữ liệu PostGIS với RGeo
- 22. Khoảng cách giữa 2 POINTs trong Postgis trong srid 4326 in mét
- 23. kCLErrorDomain error 2 sau khi mã hóa địa lý nhiều lần với CLGeocoder
- 24. Django - làm thế nào tôi có thể tìm thấy khoảng cách giữa hai địa điểm?
- 25. Sử dụng PHP và google Maps Api để làm việc ra khoảng cách giữa 2 mã bưu điện (Anh)
- 26. Google Maps Mã hóa địa lý Undefined
- 27. Đo độ cao khi tính toán khoảng cách trắc địa
- 28. Chỉ nhận mã IATA có mã hóa địa lý
- 29. Những dịch vụ nào tồn tại từ trước để tính khoảng cách giữa hai địa chỉ?
- 30. cách tìm khoảng cách chính xác giữa hai địa chỉ trong bản đồ?
Than ôi, trái đất không bằng phẳng. –
Tùy thuộc vào phép chiếu bạn đang sử dụng. Có một phép chiếu mặt phẳng trạng thái rất chính xác trong khoảng cách tương đối ngắn. Với phép chiếu mặt phẳng trạng thái, định lý pythagore là tốt. Nếu bạn đang sử dụng vĩ độ/kinh độ, mà đã được thể hiện theo góc độ (không phải khoảng cách), bạn không thể sử dụng định lý pythogore. –