我有一个点列表,称为交集。此列表的顺序如下:
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);
}
现在我需要检查添加到列表distanceiasOcorrenciaIntersecao中的哪一个距离更接近固定点,然后返回与该距离相关的纬度和经度。
以下是我迄今为止所做的:
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, intLat.ToString(), 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();
}