Вставка и выбор PostGIS Geometry с помощью Gorm - PullRequest
0 голосов
/ 09 февраля 2019

Я пытался найти способ вставлять и извлекать геометрические типы, используя Golang, в частности библиотеку gorm .Я также пытаюсь использовать библиотеку orb , которая определяет различные типы для геометрий и обеспечивает кодирование / декодирование между различными форматами.

В Orb уже реализованы методы Scan() и Value()для каждого типа.Это позволяет функциям go Insert() и Scan() работать с типами, отличными от примитивов.Однако ожидается, что Orb будет использовать геометрию, представленную в хорошо известном двоичном (WKB) формате.

Документация Orb показывает, что для этого вам нужно просто обернуть поле в функции PostGIS ST_AsBinary() и ST_GeomFromWKB() для запроса и вставки соответственно.Например, с таблицей, определенной как:

_, err = db.Exec(`
        CREATE TABLE IF NOT EXISTS orbtest (
            id SERIAL PRIMARY KEY,
            name TEXT NOT NULL,
            geom geometry(POLYGON, 4326) NOT NULL
        );
    `)

Вы можете просто сделать:

rows, err := db.Query("SELECT id, name, ST_AsBinary(geom) FROM orbtest LIMIT 1")

И для вставки (где p - orb.Point):

db.Exec("INSERT INTO orbtest (id, name, geom) VALUES ($1, $2, ST_GeomFromWKB($3))", 1, "Test", wkb.Value(p))

Вот моя проблема: используя GORM, я не могу позволить себе создавать запросы с этими функциями.GORM автоматически вставит значения в базу данных с заданной структурой и просканирует данные во всей иерархии структуры.Эти Scan() и Value() методы вызываются негласно, без моего контроля.

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

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

Можно ли создать какой-то триггер или правило, которое бы автоматически вызывало необходимые функции для входящих / исходящих данных?

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

Кто-нибудь знает способ заставить эту работу работать в SQL?Возможность вызывать функции для столбца автоматически, просто запрашивая сам столбец?

Буду признателен за любой совет.

Ответы [ 2 ]

0 голосов
/ 14 февраля 2019

Решение, которое я использовал в итоге, было следующим:

Сначала я создал новые типы, которые обернули все типы шаров, например:

type Polygon4326 orb.Polygon
type Point4326 orb.Point

Затем я реализовал Scan(), Value() методы для каждого типа.Однако мне пришлось редактировать байты и конвертировать в / из шестнадцатеричного.Когда вы напрямую запрашиваете пространственный столбец в PostGIS, он возвращает шестнадцатеричное представление EWKB, в основном WKB, но включает 4 байта для представления идентификатора проекции (в моем случае 4326).

Перед вставкой у меня былочтобы добавить байты, представляющие проекцию 4326.

Перед чтением мне пришлось вырезать эти байты, так как встроенный в orb сканирование ожидал формат WKB.

0 голосов
/ 13 февраля 2019

Можно ли создать какой-либо триггер или правило, которое бы автоматически вызывало необходимые функции для входящих / исходящих данных?

Когда-либо пробовали хрюки gorm, пример:

type Example struct {
    ID   int
    Name string
    Geom ...
}

func (e *Example) AfterFind() (err error) {
    e.Geom = ... // Do whatever you like here
    return
}

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

...