【发布时间】:2012-01-20 15:12:14
【问题描述】:
只是先设置一些限制。由于我正在编码的环境,我无法创建自己的类或方法。只是基本的程序代码。它在 CMS 中,我的代码在方法本身内部执行。
这是我的问题
在这个页面上,我进行了数据库查询,加载了所有 700 个商店位置。然后,我根据查询字符串中的 lat 和 lng 值与数据库中的值进行距离计算,以找到 50 公里内的商店。在那个距离内的每一个,我目前都添加到List<DataRow>。我还获取距离结果,将其四舍五入到小数点后一位,然后将其存储到 Double 类型的简单列表中。我想要做的,基本上是对这些进行排序,所以当我输出商店 + 距离值时,它是从最短到最长距离排序的。我正在考虑将List<DataRow> 和List<Double> 组合切换到Dictionary<Double, DataRow> 并在那里使用排序,但当然在某些情况下两个地方具有相同的距离值,因此它不会是唯一的。我可以为此使用另一种集合类型吗,或者您能推荐一种对数据进行排序的好方法吗?
如果您需要视觉效果,这是我的代码:
PRA 对象基本上是我们用于处理 CMS 后端方面的主要对象。在这种情况下,我使用速记方法来查询数据,并检查请求数据中的几个变量。其余的都内置在 .net 中。
List<DataRow> locationsInRange = new List<DataRow>();
List<Double> distances = new List<Double>();
if(!String.IsNullOrEmpty(PRA.Request.QueryString["lat"]) && !String.IsNullOrEmpty(PRA.Request.QueryString["lng"])) {
Double earthRadius = 6371.0;
Double maxDistance = 50.0;
var locations = PRA.QueryDataRows("*", "", "{Location}", "showweb");
Double lat = Double.Parse(PRA.Request.QueryString["lat"]);
Double lng = Double.Parse(PRA.Request.QueryString["lng"]);
if(!String.IsNullOrEmpty(PRA.Request.QueryString["radius"])) {
Double temp = Double.Parse(PRA.Request.QueryString["radius"]);
if(temp > 0) {
maxDistance = temp;
}
}
bool firstError = true;
foreach(var l in locations) {
Double latSecond = 0.0;
Double lngSecond = 0.0;
try {
latSecond = Double.Parse(l["lat"].ToString());
lngSecond = Double.Parse(l["lng"].ToString());
}
catch(Exception ex) {
// do nothing. The lat and lng may not of been valid or not returned a result
}
Double dLat = Math.PI * ((lat - latSecond) / 180.0);
Double dLon = Math.PI * ((lng - lngSecond) / 180.0);
Double lat1 = Math.PI * (latSecond / 180.0);
Double lat2 = Math.PI * (lat / 180.0);
Double a = Math.Sin(dLat / 2) * Math.Sin(dLat / 2) + Math.Sin(dLon / 2) * Math.Sin(dLon / 2) * Math.Cos(lat1) * Math.Cos(lat2);
Double c = 2 * Math.Atan2(Math.Sqrt(a), Math.Sqrt(1 - a));
if(earthRadius * c <= (Double) maxDistance) {
locationsInRange.Add(l);
distances.Add(Math.Round(earthRadius * c, 1));
}
}
}
【问题讨论】:
-
大多数数据库都内置了这个功能...Spatial_Index.. 你不应该手动这样做
-
这实际上是一个非常有趣的观点。现在,lat & lng 值当前存储在 varchar 中。我们为每个客户站点设置的 CMS 表不支持这种数据类型,但我肯定会与他们讨论它,因为向前推进这将非常有用。
-
投票结束:“我无法创建自己的类或方法”这太本地化了。