Модель данных для меридианов и параллелей - PullRequest
2 голосов
/ 14 февраля 2011

Я думаю о некоторой подходящей модели для хранения меридианов и параллелей. Меридианы и параллели должны быть в виде линий.

Возможные модели:

А) "Топологическая" модель Каждая точка хранит указатель на север, юг, восток и запад.

class Point
{
    private:
            double lat;
            double lon;
            Point *north;
            Point *south;
            Point *east;
            Point *west;
            ...
};

class Meridian
{
    private:
            double longitude;
            Point *start;
            Point  *end;
            unsigned int points_total;
};

class Parallel
{
    private:
            double latitude;
            Point *start;
            Point  *end;
            unsigned int points_total;
};

Плюсы:

  • Мы можем пересечь каждый меридиан в направлении север-юг и наоборот. Мы можем пройти каждую параллель в направлении восток-запад и наоборот.
  • Мы определяем, находится ли каждая точка внутри меридиана или параллельно (используя указатели).
  • Небольшие требования к хранению ...

Минусы:

  • Только последовательный доступ к каждому меридиану / параллельной точке
  • Проблемы с конструкторами копирования и оператором =. Копирование набора точек должно выполняться в несколько этапов: создать новый экземпляр точек, добавить топологические отношения между точками, используя std :: map, изменить конечные точки меридиана / параллели ... Это довольно медленно ...

Второй недостаток привел меня к отказу от модели.

Б) Список точек. Меридиан / параллель хранит список точек, топологических связей нет.

class Point
{
    private:
            double lat;
            double lon;
};

class Meridian
{
    private:
            double longitude;
            std::vector <Point> points;
};

class Parallel
{
    private:
            double latitude;
            std::vector <Point> points;
};

Плюсы:

  • Мы можем пересечь каждый меридиан в направлении север-юг и наоборот. Мы можем пройти каждую параллель в направлении восток-запад и наоборот.
  • Нет проблем с конструкторами копирования и оператором =
  • Последовательный и прямой доступ к каждой точке.

Минусы:

  • Мы не можем определить, принадлежит ли каждая точка какому-либо меридиану / параллели (используя указатели) или нет.
  • Большие требования к хранению.
  • В любой момент мы не можем найти предыдущую / следующую точку меридиана / параллели, у нас нет указателей ...

Последний недостаток может привести к отказу от модели и побудить меня задуматься об модифицированном варианте топологической модели ....

Я выполняю некоторые пространственные симуляции и представляю результаты в нескольких картографических проекциях, поэтому эффективное хранение данных для меня очень важно.

Может быть, кто-то может предложить лучшую модель :-). Спасибо за ваши ответы ...

1 Ответ

1 голос
/ 15 февраля 2011

Если вы храните меридианы и параллели на изогнутой поверхности Земли, вам может быть интересно взглянуть на некоторые структуры данных, которые используются в вычислительной геометрии для представления замкнутых двумерных многообразий.Структуры, такие как quad-edge или winged-edge , специально предназначены для быстрого поиска краев, точек или секторов, близких к заданному краю, точке или сектору впуть, который может быть легко обновлен путем добавления или удаления новых ребер.Я не уверен, насколько это будет полезно в вашем конкретном приложении, но я думаю, что они могут быть хорошей отправной точкой.Конечно, есть хорошие реализации этих структур в Интернете на C ++, хотя я не знаю ни одной из них.

...