Как я могу сохранить карту в PostgreSQL? - PullRequest
0 голосов
/ 14 марта 2020

В настоящее время я работаю над приложением для создания геологических карт c. Я использую Ruby на Rails для моего бэкенда, React для моего внешнего интерфейса и Postgres для базы данных. Я использую Leaflet React для отображения карт (реферат Leaflet. js для компонентов React). Я получаю карты из OpenTopoMap. Это приложение некоммерческое, и я проверил его условия использования, чтобы убедиться, что я не нарушаю его.

Я хочу, чтобы пользователи могли просматривать карту и добавлять точки и рисовать на ней многоугольники (я уже знаю, как выполнять эту часть). Как только они закончат рисовать на карте, я хочу, чтобы они могли сохранять карту с любыми добавленными ими дополнениями. После этого они смогут снова открыть его и изменить.

Единственный способ сохранить карту - это .png, что означает, что ее нельзя редактировать при открытии. ,

Сохранение только точек / многоугольников и их повторная визуализация при повторном открытии карты пользователем является приемлемым решением, если при ее открытии отображается правильная область карты, но я не уверен, как go о хранении этих данных. У пользователя может быть много карт, поэтому решения, которые работают только для одного экземпляра карты, не будут работать в этом случае.

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

Как я могу сохранить карту в PostgreSQL в формате, который позволит ее редактировать при повторном открытии?

Ответы [ 4 ]

1 голос
/ 15 апреля 2020

Я использую leaflet и leaflet.draw вместе, чтобы сохранить гео JSON от рисования полигонов или сбрасываемых маркеров и сохранить его в поле с именем координат в базе данных. Вот хороший пример этого: https://github.com/jeremygradisher/mapping-leaflet

Все сводится к использованию leaflet.draw для отрисовки координат и последующего сохранения этих данных там, где они вам нужны. Вот здесь leaflet.draw: http://leaflet.github.io/Leaflet.draw/docs/leaflet-draw-latest.html

Здесь я использую leaflet.draw для рисования на карте, а затем раскладываю данные и добавляю их в поле для сохранения в база данных.

<script>
// Initialize the FeatureGroup to store editable layers
var drawnItems = new L.FeatureGroup();
map.addLayer(drawnItems);


// Initialize and alter the draw control and pass it the FeatureGroup of editable layers
var drawControl = new L.Control.Draw({
    draw: {
        //These options make up the root object that is used when initializing the Leaflet.draw control.
        position: 'topleft',
        polygon: {
            allowIntersection: false,
            drawError: {color: '#00dd00', timeout: 1000
            },
            shapeOptions: {color: '#00dd00', weight: 1}, showArea: true},
        polyline:  false,
        rectangle:  {shapeOptions: {color: '#00dd00',weight: 1}},circle: false},
    edit: {featureGroup: drawnItems}
});
map.addControl(drawControl);


//draw:created - Triggered when a new vector or marker has been created.
map.on('draw:created', function (e) {
    var type = e.layerType,
        layer = e.layer;

    var shape = layer.toGeoJSON();
var shape_for_db = JSON.stringify(shape);

    drawnItems.addLayer(layer);
    //trying some things here

    //enter in field to save to the database
    document.getElementById('area_coords').value = shape_for_db;
});

1 голос
/ 14 марта 2020

Вместо того, чтобы заново изобретать колесо с каким-то чудовищем JSON, загляните в PostGIS. Это расширение для Postgres, которое добавляет геопространственные типы данных, такие как точки, линии и полигоны. Он также позволяет писать запросы к геопространственным базам данных, например, для проверки, находится ли точка в многоугольнике или поисках близости.

Для рельсов гем activerecord-postgis-adapter добавляет следующие типы баз данных:

  • :geometry - Любая геометрия c тип
  • :st_point - Данные точки
  • :line_string - Данные LineString
  • :st_polygon - Данные полигона
  • :geometry_collection - Любой тип коллекции
  • :multi_point - Коллекция баллов
  • :multi_line_string - A коллекция LineStrings
  • :multi_polygon - коллекция полигонов

Это обеспечивает строительные блоки для создания моделей с геопространственными атрибутами. Это не волшебная палочка c, которая позволит вам вставить карту с каракулями в Postgres и получить что-то редактируемое, что потребует значительных усилий как в исследованиях, так и в реализации.

0 голосов
/ 14 марта 2020

Я бы предложил думать не с точки зрения карты (рендеринга пространственных данных), а с точки зрения данных (точка / линия / многоугольник с атрибутами). Вы бы сохраняли данные каждого пользователя в таблицах, возможно, у вас была бы другая таблица map_config, которая содержит ограничивающий прямоугольник карты, имя et c.

. В вашем приложении после аутентификации пользователя вы предоставляете доступ к его карте. конфигурации (пусть он выберет ту, которая будет показана) и соответствующие данные. Затем вы отображаете карту либо с использованием необработанных векторных данных непосредственно в Leaflet, Open Layers (или в другом месте), либо вы можете передать ее через геосервер (Geoserver, Mapserver et c) для использования в качестве изображений wms или для редактирования в wfs. векторные данные. Вы увеличиваете или ограничивает отображаемую область до той, которая сохранена в конфигурации карты.

0 голосов
/ 14 марта 2020

Насколько я понимаю, вы хотите сохранить сложные объекты в базе данных. Пользователь может рисовать линии на карте и рисовать многоугольники и т. Д. c. Возможно использование объекта jsonb для этой проблемы может быть вашим решением. В основном это сохранение отформатированного поля JSON в базу данных.

Пример объекта jsonb может быть таким:

{
  "data": {
    "type": "user_map",
    "attributes": {
      "user_id": "1",
      "drawings": {
        "points": [],
        "lines": {},
        "polygons": {}
      }
    }
  }
}

Вы можете хранить эту информацию как для пользователя, так и для отдельной модели, используя has_many :maps для модели пользователя.

Ссылки, которые могут вам помочь:

Пример 1

Пример 2

...