程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> C# >> C#入門知識 >> GPS定位,經緯度附近地點查詢–C#實現方法

GPS定位,經緯度附近地點查詢–C#實現方法

編輯:C#入門知識

數據庫中記錄了商家在百度標注的經緯度(如:116.412007, 39.947545),

最初想法  以圓心點為中心點,對半徑做循環,半徑每增加一個像素(暫定1米)再對周長做循環,到數據庫中查詢對應點的商家(真是一個長時間的循環工作)

上網百度類似的文章有了點眉目

大致想法是已知一個中心點,一個半徑,求圓包含於圓拋物線裡所有的點,這樣的話就需要知道所要求的這個圓的對角線的頂點,問題來了 經緯度是一個點,半徑是一個距離,不能直接加減

 終於找到想要的文章

http://digdeeply.org/archives/06152067.html

參考原文章 lz改成了C#類

廢話不多少直接上代碼:

  
               
 
               Degree( x,               X =             Y =            
                         {               { x =            
                         {               { y =   
 
                   EARTH_RADIUS = ;
 
          
                   
          
          
            radians(               d * Math.PI /   
          
                   
          
          
            degrees(               d * ( /  
          
                   
 
                          radLat1 =              radLat2 =              a = radLat1 -              b = radians(Degree1.Y) - 
              s =  * Math.Asin(Math.Sqrt(Math.Pow(Math.Sin(a / ), ) +
              Math.Cos(radLat1) * Math.Cos(radLat2) * Math.Pow(Math.Sin(b / ),              s = s *             s = Math.Round(s * ) /                
          
                   
                          radLat1 =              radLng1 =              radLat2 =              radLng2 = 
              s = Math.Acos(Math.Cos(radLat1) * Math.Cos(radLat2) * Math.Cos(radLng1 - radLng2) + Math.Sin(radLat1) *             s = s *             s = Math.Round(s * ) /                
          
                   
          
          
           Degree[] GetDegreeCoordinates(Degree Degree1,                dlng =  * Math.Asin(Math.Sin(distance / ( * EARTH_RADIUS)) /             dlng = degrees(dlng);
 
              dlat = distance /             dlat = degrees(dlat);
 
               Degree[] {  Degree(Math.Round(Degree1.X + dlat,), Math.Round(Degree1.Y - dlng,)),
                                    Degree(Math.Round(Degree1.X - dlat,), Math.Round(Degree1.Y - dlng,)),
                                    Degree(Math.Round(Degree1.X + dlat,), Math.Round(Degree1.Y + dlng,)),
                                    Degree(Math.Round(Degree1.X - dlat,), Math.Round(Degree1.Y + dlng,)) 
  
      }

 

  測試方法:

    Main(               a = CoordDispose.GetDistance( Degree(, ),  Degree(, ));
              b = CoordDispose.GetDistanceGoogle( Degree(, ),  Degree(,              Degree[] dd = CoordDispose.GetDegreeCoordinates( Degree(, ),              Console.WriteLine(a+ +             Console.WriteLine(dd[].X +  + dd[             Console.WriteLine(dd[].X +  + dd[          }

 

       lz試了很多次 誤差在1米左右

拿到圓的頂點就好辦了

數據庫要是sql 2008的可以直接進行空間索引經緯度字段,這樣應該性能更好(沒有試過)

lz公司數據庫還老 2005的 這也沒關系,關鍵是經緯度拆分計算,這個就不用說了 網上多的是 最後上個實現的sql語句

SELECT id,zuobiao FROM dbo.zuobiao WHERE zuobiao<>,)>,)<,)<,)>

 

 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved