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