Я работаю с API геокодирования, и мне нужно представить координаты возвращаемой точки в виде пары широты и долготы. Однако я не уверен, использовать ли для этого структуру или класс. Моя первоначальная мысль заключалась в использовании структуры, но, похоже, в C# они обычно не одобряются (например, Джон Скит упоминает в этом ответе, что «я почти никогда не определяю пользовательские структуры»). Производительность и использование памяти не являются критическими факторами в приложении.
На данный момент я придумал эти две реализации, основанные на простом интерфейсе: Интерфейс
public struct SLatLng : ILatLng
{
private double _lat;
private double _lng;
public double Lat
{
get { return _lat; }
set { _lat = value; }
}
public double Lng
{
get { return _lng; }
set { _lng = value; }
}
public SLatLng(double lat, double lng)
{
this._lat = lat;
this._lng = lng;
}
public override string ToString()
{
return String.Format("{0},{1}", this.Lat, this.Lng);
}
}
Выполняя несколько тестов, я пришел к следующим выводам:
Структура всегда имеет структуру без параметров. конструктор, что означает, что вы не можете принудительно создать его экземпляр с помощью конструктора, который ожидает два свойства (для lat и lng), как это можно сделать с классом.
Структура (будучи типом значения) никогда не может быть нулевой, поэтому всегда будет содержать значение. Но вы все равно можете делать подобные вещи, реализуя интерфейс:
Итак, имеет ли смысл для структуры использовать интерфейс в этом случае?
Если я использую структуру, нужно ли мне переопределить Equals, GetHashCode() и т. д.? Мои тесты показывают, что сравнения работают корректно и без этого (в отличие от классов). Так нужно ли это?
Я чувствую себя более «комфортно», используя классы, так лучше ли просто придерживаться их, поскольку я лучше знаю, как они себя ведут? Будут ли люди, использующие мой код, сбиты с толку семантикой типов значений, особенно при работе с интерфейсом?
В реализации CLatLng , кажется ли переопределение GetHashCode() приемлемым? Я «украл» это из этой статьи, поэтому не уверен!
Я работаю с API геокодирования, и мне нужно представить координаты возвращаемой точки в виде пары широты и долготы. Однако я не уверен, использовать ли для этого структуру или класс. Моя первоначальная мысль заключалась в использовании структуры, но, похоже, в C# они обычно не одобряются (например, Джон Скит упоминает в этом ответе, что «я почти никогда не определяю пользовательские структуры»). Производительность и использование памяти не являются критическими факторами в приложении. На данный момент я придумал эти две реализации, основанные на простом интерфейсе: [b]Интерфейс[/b] [code]public interface ILatLng { double Lat { get; } double Lng { get; } } [/code] [b]Реализация класса LatLng[/b] [code]public class CLatLng : ILatLng { public double Lat { get; private set; } public double Lng { get; private set; }
public CLatLng(double lat, double lng) { this.Lat = lat; this.Lng = lng; }
public override string ToString() { return String.Format("{0},{1}", this.Lat, this.Lng); }
public override bool Equals(Object obj) { if (obj == null) return false;
CLatLng latlng = obj as CLatLng; if ((Object)latlng == null) return false;
public override int GetHashCode() { return (int)Math.Sqrt(Math.Pow(this.Lat, 2) * Math.Pow(this.Lng, 2)); } } [/code] [b]Реализация структуры LatLng[/b] [code]public struct SLatLng : ILatLng { private double _lat; private double _lng;
public double Lat { get { return _lat; } set { _lat = value; } }
public double Lng { get { return _lng; } set { _lng = value; } }
public SLatLng(double lat, double lng) { this._lat = lat; this._lng = lng; }
public override string ToString() { return String.Format("{0},{1}", this.Lat, this.Lng); } } [/code] Выполняя несколько тестов, я пришел к следующим выводам: [list] [*]Структура всегда имеет структуру без параметров. конструктор, что означает, что вы не можете принудительно создать его экземпляр с помощью конструктора, который ожидает два свойства (для lat и lng), как это можно сделать с классом.
[*]Структура (будучи типом значения) никогда не может быть нулевой, поэтому всегда будет содержать значение. Но вы все равно можете делать подобные вещи, реализуя интерфейс: [code]ILatLng s = new SLatLng(); s = null;[/code]
[/list] Итак, имеет ли смысл для структуры использовать интерфейс в этом случае? [list] [*]Если я использую структуру, нужно ли мне переопределить Equals, GetHashCode() и т. д.? Мои тесты показывают, что сравнения работают корректно и без этого (в отличие от классов). Так нужно ли это?
[*]Я чувствую себя более «комфортно», используя классы, так лучше ли просто придерживаться их, поскольку я лучше знаю, как они себя ведут? Будут ли люди, использующие мой код, сбиты с толку семантикой типов значений, особенно при работе с интерфейсом?
[*]В реализации CLatLng , кажется ли переопределение GetHashCode() приемлемым? Я «украл» это из этой статьи, поэтому не уверен!
[/list] Любая помощь или совет принимаю с благодарностью!
Я использую пакет utm и хочу преобразовать набор широт и долгот вблизи экватора. В моем случае использования я заранее не знаю зону UTM.
Следующий минимальный пример
import utm
import numpy as np
easting, northing, utm_zone, utm_letter =...
У меня есть список местоположений, сгруппированных по общему идентификатору. У меня есть широта и долгота для каждого местоположения. Я хочу сформировать круг радиусом 15 миль вокруг каждой пары координат, а затем найти общую площадь фигуры,...
Предполагая, что сфера находится в позиции (на данный момент), я использовал этот метод для расчета точки на поверхности сферы с определенным радиусом по заданным координатам широты/долготы (Vector2 x/y):
public static Vector3...