Проблема записи хорошо известной двоичной записи строки в геопакет / sqlite

У меня проблемы с записью линейной строки в хорошо известную двоичную структуру (WKB) в геопакете

Я пытаюсь записать некоторые пространственные данные в геопакет, который является хорошо известным двоичным файлом в файле sqlite. Я не хочу использовать shapely, так как он имеет большую кривую зависимости и его трудно установить на многих машинах. Я предпочитаю придерживаться стандартного Python как можно больше. Мой код может создать базовую структуру таблиц в sqlite, и может создать таблицу точечных объектов в WKB без проблем. Они очень хорошо открываются в qgis и т. Д. Я борюсь с созданием действительных строк в WKB. Таблица создается и загружается в qgis без ошибок. Количество записей правильное, но геометрия не отображается. Я почти уверен, что у меня ошибка при создании WKB. Вот мой код...

###############################################################################
def createlinestring(vectors, srid=4326):
    '''https://en.wikipedia.org/wiki/Well-known_text_representation_of_geometry#Well-known_binary'''
    fmt             = "<2sbbIbI%sd" % len(vectors)
    flags           = 0
    flags           = set_bit(flags,0)      # little endian,
    hdr             = b"GP"                 # magic identifier, always GP
    version         = 0                     # always 0 which means version 1 of geopackage
    geometry_type   = 2                     # geometry type, 2 for linestring
    count = len(vectors)                    # number of entries in this vector
    wkb = struct.pack(fmt, hdr, version, geometry_type, srid, flags, count, *vectors)
    return wkb

векторы представляет собой простой список координат [x0, y0, x1, y1,...]

Код для очков в ВКБ работает лакомство

###############################################################################
def createpoint(x,y,z=0, srid=4326):
    '''https://en.wikipedia.org/wiki/Well-known_text_representation_of_geometry#Well-known_binary'''
    fmt             = "<2sbbIbIdd"
    flags           = 0
    flags           = set_bit(flags,0)      # little endian byte order
    hdr             = b"GP"                 # magic identifier, always GP
    version         = 0                     # always 0 which means version 1 of geopackage
    geometry_type   = 1                     # geom type, 1 for points
    count           = 1     
    wkb = struct.pack(fmt, hdr, version, geometry_type, srid, flags, count, x,y)
    return wkb

Я надеюсь, что векторы будут отображаться нормально в QGIS, ArcGIS и т. Д.

0 ответов

Другие вопросы по тегам