问题描述
我有一个点列表,称为相交。此列表的顺序如下:
latitudePoint1,longitudePoint1,latitudePoint2,longitudePoint2,latitudePoint3,longitudePoint3,...
使同一点的纬度和经度具有不同的索引。 我计算了这些点到固定点的距离,然后需要检查那些点中的哪一个最接近固定点(硬编码)。 我试图用下面的注释更好地解释一切:
List<double> distanciasOcorrenciaIntersecao = new List<double>();
for (int i = 0; i <= intersect.Count(); i++)
{
//get latitude
double intLat = intersect[2 * i];
//get longitude
double intLong = intersect[2 * i + 1];
//calculates the distance between the fixed point and the point of the list intersect
var distancia = GetDistance(FixedLatitude,FixedLongitude,intLat.ToString(),intLong.ToString());
//Add the latitude and longitude and long as the distance calulated to another list
distanciasOcorrenciaIntersecao.Add(intLat);
distanciasOcorrenciaIntersecao.Add(intLong);
distanciasOcorrenciaIntersecao.Add(distancia);
}
现在,我需要检查添加到列表distanciasOcorrenciaIntersecao的距离中哪个距离最接近固定点,然后返回与该距离相关的纬度和经度。
这是我到目前为止所做的:
for (int j = 0; j <= distanciasOcorrenciaIntersecao.Count(); j++)
{
// I need to at least have two point in the intersect list,// meaning 4 elements,latitude1,longitude1,latitude2,longitude2
if (intersect.Count() >= 4)
{
if (distanciasOcorrenciaIntersecao[3 * j + 2]
< distanciasOcorrenciaIntersecao[3 * j + 5])
{
//....?
}
}
}
}
我不确定这是否是解决此问题的最佳方法,但是如果有人知道更好的解决方法,请提供帮助。谢谢
解决方法
List<double> distanciasOcorrenciaIntersecao = new List<double>();
for (int i = 0; i <= intersect.Count(); i++)
{
double intLat = intersect[2 * i];
double intLong = intersect[2 * i + 1];
var distancia = GetDistance(ocorrencia.Latitude,ocorrencia.Longitude,intLat.ToString(),intLong.ToString());
distanciasOcorrenciaIntersecao.Add(intLat);
distanciasOcorrenciaIntersecao.Add(intLong);
distanciasOcorrenciaIntersecao.Add(distancia);
}
double minimum = 0;
int index = 0;
int j = 2;
for ( j = 2; j <= distanciasOcorrenciaIntersecao.Count()-3; j+=3)
{
if (intersect.Count() >= 4)
{
if (j == 2)
{
if (distanciasOcorrenciaIntersecao[j] < distanciasOcorrenciaIntersecao[j + 3])
{
minimum = distanciasOcorrenciaIntersecao[j];
index = j;
}
else
{
minimum = distanciasOcorrenciaIntersecao[j + 3];
index = j + 3;
}
}
else
{
if (minimum > distanciasOcorrenciaIntersecao[j + 3])
{
minimum = distanciasOcorrenciaIntersecao[j + 3];
index = j + 3;
}
}
}
}
,
您可以使用ValueTuple
和LINQ代替类,以使其变得简单:
var distanciasOcorrenciaIntersecao = new List<(double lat,double lon,double dist)>();
if (intersect.Count() > 2) {
for (int i = 0; i < intersect.Count(); i += 2) {
//get latitude
double intLat = intersect[i];
//get longitude
double intLong = intersect[i + 1];
//calculates the distance between the fixed point and the point of the list intersect
var distancia = GetDistance(FixedLatitude,FixedLongitude,intLong.ToString());
//Add the latitude and longitude and long as the distance calculated to another list
distanciasOcorrenciaIntersecao.Add((intLat,intLong,distancia));
}
var (closestLat,closestLon,closestDist) = distanciasOcorrenciaIntersecao.OrderBy(doi => doi.dist).First();
}