Модель данных для меридианов и параллелей

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

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

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

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;
};

Плюсы:

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

Минусы:

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

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

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

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


person Robo    schedule 14.02.2011    source источник


Ответы (1)


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

person templatetypedef    schedule 15.02.2011