數據庫中記錄了商家在百度標注的經緯度(如: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<>,)>,)<,)<,)>