2009-07-10 81 views
5

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

-1

định lý pythagore?

+1

Than ôi, trái đất không bằng phẳng. –

+0

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. –

0

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.

0

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ó.

0

Đị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

2

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); 
2

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ới cos(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 !!!

1

Đâ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 
Các vấn đề liên quan