2016-03-25 14 views
0

İki noktanın bir milin içinde olup olmadığını görmek için çok verimli bir kontrol gerçekleştirmeye çalışıyorum.İki lat/longs göz önüne alındığında, birbirlerine 1 mil içinde olup olmadığını nasıl anlarım?

Ben sadece bakım onlar bir mil içinde olup olmadığını - Bana mesafe konularda başka bir şey.

Bu dar odaklama nedeniyle, genel bir "how far apart are these points" işlevini arayan numaralı değilim.

Geçerli yaklaşımım Haversine distance hesaplamasıdır ve daha sonra bir milden daha az olup olmadığını kontrol etmektir.

Bu durumda verim önemli çünkü büyük kayıt kümeleri için bu evet/hayır bayrağını hesaplamam gerekiyor.

Peki, iki lat/uzun noktanın birbirinin milleri içinde olup olmadığını anlamanın en etkili yolu nedir?

Bu denetimi T-SQL'de yapıyorum, çok önemli değil. Mevcut haversine hesaplamam aşağıda. Eğer SRID değiştirerek getiriyi belirtebilirsiniz olsa

CREATE FUNCTION dbo.USR_UFN_HAVERSINE_DISTANCE 
(
    @LAT1 FLOAT(18) 
,@LONG1 FLOAT(18) 
,@LAT2 FLOAT(18) 
,@LONG2 FLOAT(18) 
,@UnitOfMeasure NVARCHAR(10) = 'KILOMETERS' 
) 
RETURNS FLOAT(18) 
AS 
BEGIN 
    DECLARE 
    @R FLOAT(8) 
    ,@DLAT FLOAT(18) 
    ,@DLON FLOAT(18) 
    ,@A FLOAT(18) 
    ,@C FLOAT(18) 
    ,@D FLOAT(18) 
    ; 
    SET @R = 
    CASE @UnitOfMeasure 
     WHEN 'MILES'  THEN 3956.55 
     WHEN 'KILOMETERS' THEN 6367.45 
     WHEN 'FEET'  THEN 20890584 
     WHEN 'METERS'  THEN 6367450 
     ELSE 6367.45 --km 
    END 
    SET @DLAT = RADIANS(@LAT2 - @LAT1); 
    SET @DLON = RADIANS(@LONG2 - @LONG1); 
    SET @A = SIN(@DLAT/2) 
     * SIN(@DLAT/2) 
     + COS(RADIANS(@LAT1)) 
     * COS(RADIANS(@LAT2)) 
     * SIN(@DLON/2) 
     * SIN(@DLON/2); 
    SET @C = 2 * ASIN(MIN(SQRT(@A))); 
    SET @D = @R * @C; 
    RETURN @D; 
END; 
+0

Olası kopyalar http://stackoverflow.com/questions/1006654/fastest-way-to-find-distance-between-two-lat -uzun nokta) –

+0

@ KenY-N Orada bana işaret ettiğin için teşekkürler. İki nokta arasındaki mesafeyi elde etmek için zaten bir genel amacım var. Bu durumda sadece mesafenin bir milin içinde olup olmadığına dikkat ediyorum, çünkü tam mesafeyi hesaplamak zorunda kalmadan daha hızlı bir yol olduğunu umuyorum. Soruyu bu açıklamayı denemek ve düzeltmek için düzenledim. – JosephStyons

+0

Bağlantılı sorudaki ikinci cevabı kontrol et. İstediğin şeye doğru ilerliyor gibi görünüyor ... –

cevap

1

mevcuttur. Coğrafi noktaları önceden hesaplayabilirseniz daha iyi, ancak bu tüm satır içi yapar.

create function dbo.fn_areWithinOneMile(@long1 float, @lat1 float, @long2 float, @lat2 float) 
returns table 
as 
return 

    select cast(
     case when 
      geography::Point(@lat1, @long1, 4236).STDistance(geography::Point(@lat2, @long2, 4236)) > 1609.34 then 0 
      else 1 
     end as bit) as [withinOneMile?] 

go 

with cte as (select * from (values 
    (42, 42), 
    (43, 43), 
    (44, 44) 
    ) as x(lat, long) 
), j as (
    select long, lat, lag(long, 1) over (order by lat) as long2, lag(lat, 1) over (order by lat) as lat2 
    from cte 
) 
select * 
from j 
cross apply dbo.fn_areWithinOneMile(long, lat, long2, lat2) as o 
where long2 is not null; 
[İki Lat/Uzun Noktalar Arası Mesafe Bulma en hızlı şekilde] (içinde
1
DECLARE 
    @pt1 geography, 
    @pt2 geography; 

    SET @pt1 = geography::Point(45.65100, -120.34900, 4326); 
    SET @pt2 = geography::Point(44.65100, -120.37654, 4326); 

    SELECT @pt1.STDistance(@pt2); 

-The dönüş değeri metre uzaklıktadır. Eğer bu büyük veri kümelerinde, bir tablo değerli işlev öneririm çalıştırmak gerektiğini belirtmek yana SRID yılların

-The liste burada

Select * from sys.spatial_reference_systems 
İlgili konular