Да, это функция ошибка, которая отсутствует в стандартной реализации ICoordinateSequence
. Похоже, что они начали вносить изменения для поддержки значений M, но эти изменения были внесены не везде. Ниже приведена по крайней мере одна область, где значения M не поддерживаются в коде, который в конечном итоге вызывает проблему, которую вы видите.
При обращении к p3.M он использует эти методы получения и установки.
public double M
{
get
{
if (CoordinateSequence == null)
throw new ArgumentOutOfRangeException("M called on empty Point");
return CoordinateSequence.GetOrdinate(0, Ordinate.M);
}
set => CoordinateSequence.SetOrdinate(0, Ordinate.M, value);
}
Который затем, в свою очередь, вызывает GetOrdinate
и SetOrdinate
в CoordinateArraySequence
/// <summary>
/// Returns the ordinate of a coordinate in this sequence.
/// Ordinate indices 0 and 1 are assumed to be X and Y.
/// Ordinate indices greater than 1 have user-defined semantics
/// (for instance, they may contain other dimensions or measure values).
/// </summary>
/// <param name="index">The coordinate index in the sequence.</param>
/// <param name="ordinate">The ordinate index in the coordinate (in range [0, dimension-1]).</param>
/// <returns></returns>
public double GetOrdinate(int index, Ordinate ordinate)
{
switch (ordinate)
{
case Ordinate.X:
return Coordinates[index].X;
case Ordinate.Y:
return Coordinates[index].Y;
case Ordinate.Z:
return Coordinates[index].Z;
default:
return double.NaN;
}
}
/// <summary>
/// Sets the value for a given ordinate of a coordinate in this sequence.
/// </summary>
/// <param name="index">The coordinate index in the sequence.</param>
/// <param name="ordinate">The ordinate index in the coordinate (in range [0, dimension-1]).</param>
/// <param name="value">The new ordinate value.</param>
public void SetOrdinate(int index, Ordinate ordinate, double value)
{
switch (ordinate)
{
case Ordinate.X:
Coordinates[index].X = value;
break;
case Ordinate.Y:
Coordinates[index].Y = value;
break;
case Ordinate.Z:
Coordinates[index].Z = value;
break;
//default:
// //throw new ArgumentException("invalid ordinate index: " + ordinate);
}
}
Который, как вы можете видеть, когда вы вызываете SetOrdinate
с Ordinate.M
, ничего не устанавливается, а при вызове GetOrdinate
с Ordinate.M
он всегда возвращает NaN.
Если вы действительно хотите использовать NetTopologySuite, вы можете разветвить репозиторий отсюда https://github.com/NetTopologySuite/NetTopologySuite и внести обновления, необходимые для поддержки значений M
по умолчанию, но я полагаю, что есть много вещей, которые необходимо изменить. Если вы обновите его, я уверен, что ребята, поддерживающие репозиторий NetTopologySuite GitHub, будут признательны за запрос на внесение любых изменений.
person
TJ Rockefeller
schedule
13.12.2018