[SCM] PostGIS branch master updated. 3.7.0beta1-67-gbd7aa23a5
git at osgeo.org
git at osgeo.org
Mon Jul 27 09:10:25 PDT 2026
This is an automated email from the git hooks/post-receive script. It was
generated because a ref change was pushed to the repository containing
the project "PostGIS".
The branch, master has been updated
via bd7aa23a5c9e357f4b5041fc5498a4f015478f92 (commit)
via cb6b7270f20412b1b9cd9264344058916a2dcdcb (commit)
via 6b2e20eb202f2a29db60d24c4c0938e0d220f633 (commit)
from 631785d88f2a5e01b07ac346a644019bc2cb3ad2 (commit)
Those revisions listed above that are new to this repository have
not appeared on any other notification email; so we list those
revisions in full, below.
- Log -----------------------------------------------------------------
commit bd7aa23a5c9e357f4b5041fc5498a4f015478f92
Merge: 631785d88 cb6b7270f
Author: Darafei Praliaskouski <komzpa at gmail.com>
Date: Mon Jul 27 09:10:24 2026 -0700
Merge pull request 'Handle FlatGeobuf byte order on big-endian' (!545) from Komzpa/postgis:codex/flatgeobuf-endian-20260727 into master
Reviewed-on: https://gitea.osgeo.org/postgis/postgis/pulls/545
commit cb6b7270f20412b1b9cd9264344058916a2dcdcb
Author: Darafei Praliaskouski <me at komzpa.net>
Date: Mon Jul 27 06:02:22 2026 +0400
Rerun Woodie after runner network exhaustion
commit 6b2e20eb202f2a29db60d24c4c0938e0d220f633
Author: Darafei Praliaskouski <me at komzpa.net>
Date: Mon Jul 27 03:43:05 2026 +0400
Handle FlatGeobuf byte order on big-endian
diff --git a/NEWS b/NEWS
index ac043babb..5bc604a1d 100644
--- a/NEWS
+++ b/NEWS
@@ -8,6 +8,8 @@ These are only changes since 3.7.0beta1.
* Bug Fixes *
+ - GT-545, Fix FlatGeobuf geometry, property, and spatial-index byte order on
+ big-endian platforms (Darafei Praliaskouski)
- GT-504, Report extension script/library version mismatches before loading
functions unavailable in an older library (Darafei Praliaskouski)
- GT-515, Reject invalid ST_LargestEmptyCircle boundaries before GEOS can
diff --git a/deps/flatgeobuf/geometryreader.cpp b/deps/flatgeobuf/geometryreader.cpp
index 06f30b1f1..8734c2225 100644
--- a/deps/flatgeobuf/geometryreader.cpp
+++ b/deps/flatgeobuf/geometryreader.cpp
@@ -38,17 +38,17 @@ LWPOINT *GeometryReader::readPoint()
return lwpoint_construct(0, NULL, pa);
}
- const auto xy = m_geometry->xy()->data();
+ const auto xy = m_geometry->xy();
- double x = xy[m_offset + 0];
- double y = xy[m_offset + 1];
+ double x = xy->Get(m_offset + 0);
+ double y = xy->Get(m_offset + 1);
double z = 0;
double m = 0;
if (m_has_z)
- z = m_geometry->z()->data()[m_offset];
+ z = m_geometry->z()->Get(m_offset);
if (m_has_m)
- m = m_geometry->m()->data()[m_offset];
+ m = m_geometry->m()->Get(m_offset);
pt = (POINT4D) { x, y, z, m };
ptarray_append_point(pa, &pt, LW_TRUE);
@@ -61,21 +61,21 @@ POINTARRAY *GeometryReader::readPA()
POINT4D pt;
uint32_t npoints;
- const double *xy = m_geometry->xy()->data();
- const double *z = m_has_z ? m_geometry->z()->data() : nullptr;
- const double *m = m_has_m ? m_geometry->m()->data() : nullptr;
+ const auto xy = m_geometry->xy();
+ const auto z = m_has_z ? m_geometry->z() : nullptr;
+ const auto m = m_has_m ? m_geometry->m() : nullptr;
pa = ptarray_construct_empty(m_has_z, m_has_m, m_length);
for (uint32_t i = m_offset; i < m_offset + m_length; i++) {
- double xv = xy[i * 2 + 0];
- double yv = xy[i * 2 + 1];
+ double xv = xy->Get(i * 2 + 0);
+ double yv = xy->Get(i * 2 + 1);
double zv = 0;
double mv = 0;
if (m_has_z)
- zv = z[i];
+ zv = z->Get(i);
if (m_has_m)
- mv = m[i];
+ mv = m->Get(i);
pt = (POINT4D) { xv, yv, zv, mv };
ptarray_append_point(pa, &pt, LW_TRUE);
}
@@ -202,4 +202,4 @@ LWGEOM *GeometryReader::read()
lwerror("flatgeobuf: GeometryReader::read: Unknown type %d", (int) m_geometry_type);
}
return nullptr;
-}
\ No newline at end of file
+}
diff --git a/deps/flatgeobuf/packedrtree.cpp b/deps/flatgeobuf/packedrtree.cpp
index 600742084..793411653 100644
--- a/deps/flatgeobuf/packedrtree.cpp
+++ b/deps/flatgeobuf/packedrtree.cpp
@@ -285,7 +285,14 @@ void PackedRTree::fromData(const void *data)
for (uint64_t i = 0; i < _numNodes; i++)
{
NodeItem n = *pn++;
- _nodeItems[i] = n;
+#if !FLATBUFFERS_LITTLEENDIAN
+ n.minX = flatbuffers::EndianScalar(n.minX);
+ n.minY = flatbuffers::EndianScalar(n.minY);
+ n.maxX = flatbuffers::EndianScalar(n.maxX);
+ n.maxY = flatbuffers::EndianScalar(n.maxY);
+ n.offset = flatbuffers::EndianScalar(n.offset);
+#endif
+ _nodeItems[i] = n;
_extent.expand(n);
}
}
@@ -389,15 +396,15 @@ std::vector<SearchResultItem> PackedRTree::streamSearch(
uint64_t length = end - nodeIndex;
readNode(nodesBuf, static_cast<size_t>(nodeIndex * sizeof(NodeItem)),
static_cast<size_t>(length * sizeof(NodeItem)));
-#if !CPL_IS_LSB
- for (size_t i = 0; i < static_cast<size_t>(length); i++)
+#if !FLATBUFFERS_LITTLEENDIAN
+ for (size_t i = 0; i < static_cast<size_t>(length); i++)
{
- CPL_LSBPTR64(&nodeItems[i].minX);
- CPL_LSBPTR64(&nodeItems[i].minY);
- CPL_LSBPTR64(&nodeItems[i].maxX);
- CPL_LSBPTR64(&nodeItems[i].maxY);
- CPL_LSBPTR64(&nodeItems[i].offset);
- }
+ nodeItems[i].minX = flatbuffers::EndianScalar(nodeItems[i].minX);
+ nodeItems[i].minY = flatbuffers::EndianScalar(nodeItems[i].minY);
+ nodeItems[i].maxX = flatbuffers::EndianScalar(nodeItems[i].maxX);
+ nodeItems[i].maxY = flatbuffers::EndianScalar(nodeItems[i].maxY);
+ nodeItems[i].offset = flatbuffers::EndianScalar(nodeItems[i].offset);
+ }
#endif
// search through child nodes
for (uint64_t pos = nodeIndex; pos < end; pos++)
@@ -446,27 +453,19 @@ uint64_t PackedRTree::size(const uint64_t numItems, const uint16_t nodeSize)
void PackedRTree::streamWrite(
const std::function<void(uint8_t *, size_t)> &writeData)
{
-#if !CPL_IS_LSB
- for (size_t i = 0; i < static_cast<size_t>(_numNodes); i++)
- {
- CPL_LSBPTR64(&_nodeItems[i].minX);
- CPL_LSBPTR64(&_nodeItems[i].minY);
- CPL_LSBPTR64(&_nodeItems[i].maxX);
- CPL_LSBPTR64(&_nodeItems[i].maxY);
- CPL_LSBPTR64(&_nodeItems[i].offset);
- }
-#endif
- writeData(reinterpret_cast<uint8_t *>(_nodeItems),
- static_cast<size_t>(_numNodes * sizeof(NodeItem)));
-#if !CPL_IS_LSB
- for (size_t i = 0; i < static_cast<size_t>(_numNodes); i++)
- {
- CPL_LSBPTR64(&_nodeItems[i].minX);
- CPL_LSBPTR64(&_nodeItems[i].minY);
- CPL_LSBPTR64(&_nodeItems[i].maxX);
- CPL_LSBPTR64(&_nodeItems[i].maxY);
- CPL_LSBPTR64(&_nodeItems[i].offset);
- }
+#if !FLATBUFFERS_LITTLEENDIAN
+ std::vector<NodeItem> nodeItems(_nodeItems, _nodeItems + _numNodes);
+ for (size_t i = 0; i < static_cast<size_t>(_numNodes); i++)
+ {
+ nodeItems[i].minX = flatbuffers::EndianScalar(nodeItems[i].minX);
+ nodeItems[i].minY = flatbuffers::EndianScalar(nodeItems[i].minY);
+ nodeItems[i].maxX = flatbuffers::EndianScalar(nodeItems[i].maxX);
+ nodeItems[i].maxY = flatbuffers::EndianScalar(nodeItems[i].maxY);
+ nodeItems[i].offset = flatbuffers::EndianScalar(nodeItems[i].offset);
+ }
+ writeData(reinterpret_cast<uint8_t *>(nodeItems.data()), static_cast<size_t>(_numNodes * sizeof(NodeItem)));
+#else
+ writeData(reinterpret_cast<uint8_t *>(_nodeItems), static_cast<size_t>(_numNodes * sizeof(NodeItem)));
#endif
}
diff --git a/postgis/flatgeobuf.c b/postgis/flatgeobuf.c
index dc4621eba..37411e9f3 100644
--- a/postgis/flatgeobuf.c
+++ b/postgis/flatgeobuf.c
@@ -33,6 +33,119 @@
#include "utils/datetime.h"
#include "utils/jsonb.h"
+static uint16_t
+flatgeobuf_le16(uint16_t v)
+{
+#if IS_BIG_ENDIAN
+ return (uint16_t)((v << 8) | (v >> 8));
+#else
+ return v;
+#endif
+}
+
+static uint32_t
+flatgeobuf_le32(uint32_t v)
+{
+#if IS_BIG_ENDIAN
+ return ((v & UINT32_C(0x000000ff)) << 24) | ((v & UINT32_C(0x0000ff00)) << 8) |
+ ((v & UINT32_C(0x00ff0000)) >> 8) | ((v & UINT32_C(0xff000000)) >> 24);
+#else
+ return v;
+#endif
+}
+
+static uint64_t
+flatgeobuf_le64(uint64_t v)
+{
+#if IS_BIG_ENDIAN
+ return ((v & UINT64_C(0x00000000000000ff)) << 56) | ((v & UINT64_C(0x000000000000ff00)) << 40) |
+ ((v & UINT64_C(0x0000000000ff0000)) << 24) | ((v & UINT64_C(0x00000000ff000000)) << 8) |
+ ((v & UINT64_C(0x000000ff00000000)) >> 8) | ((v & UINT64_C(0x0000ff0000000000)) >> 24) |
+ ((v & UINT64_C(0x00ff000000000000)) >> 40) | ((v & UINT64_C(0xff00000000000000)) >> 56);
+#else
+ return v;
+#endif
+}
+
+static void
+flatgeobuf_write_le16(uint8_t *dst, uint16_t v)
+{
+ v = flatgeobuf_le16(v);
+ memcpy(dst, &v, sizeof(v));
+}
+
+static void
+flatgeobuf_write_le32(uint8_t *dst, uint32_t v)
+{
+ v = flatgeobuf_le32(v);
+ memcpy(dst, &v, sizeof(v));
+}
+
+static void
+flatgeobuf_write_le64(uint8_t *dst, uint64_t v)
+{
+ v = flatgeobuf_le64(v);
+ memcpy(dst, &v, sizeof(v));
+}
+
+static uint16_t
+flatgeobuf_read_le16(const uint8_t *src)
+{
+ uint16_t v;
+ memcpy(&v, src, sizeof(v));
+ return flatgeobuf_le16(v);
+}
+
+static uint32_t
+flatgeobuf_read_le32(const uint8_t *src)
+{
+ uint32_t v;
+ memcpy(&v, src, sizeof(v));
+ return flatgeobuf_le32(v);
+}
+
+static uint64_t
+flatgeobuf_read_le64(const uint8_t *src)
+{
+ uint64_t v;
+ memcpy(&v, src, sizeof(v));
+ return flatgeobuf_le64(v);
+}
+
+static float
+flatgeobuf_read_float_le(const uint8_t *src)
+{
+ uint32_t bits = flatgeobuf_read_le32(src);
+ float value;
+ memcpy(&value, &bits, sizeof(value));
+ return value;
+}
+
+static double
+flatgeobuf_read_double_le(const uint8_t *src)
+{
+ uint64_t bits = flatgeobuf_read_le64(src);
+ double value;
+ memcpy(&value, &bits, sizeof(value));
+ return value;
+}
+
+static void
+flatgeobuf_write_float_le(uint8_t *dst, float value)
+{
+ uint32_t bits;
+ memcpy(&bits, &value, sizeof(bits));
+ flatgeobuf_write_le32(dst, bits);
+}
+
+static void
+flatgeobuf_write_double_le(uint8_t *dst, double value)
+{
+ uint64_t bits;
+ memcpy(&bits, &value, sizeof(bits));
+ flatgeobuf_write_le64(dst, bits);
+}
+
static uint8_t get_column_type(Oid typoid) {
switch (typoid)
{
@@ -176,7 +289,7 @@ static void encode_properties(flatgeobuf_agg_ctx *ctx)
if (isnull)
continue;
ensure_properties_size(ctx, offset + sizeof(ci));
- memcpy(ctx->ctx->properties + offset, &ci, sizeof(ci));
+ flatgeobuf_write_le16(ctx->ctx->properties + offset, ci);
offset += sizeof(ci);
typoid = getBaseType(TupleDescAttr(ctx->tupdesc, i)->atttypid);
switch (typoid) {
@@ -189,38 +302,38 @@ static void encode_properties(flatgeobuf_agg_ctx *ctx)
case INT2OID:
short_value = DatumGetInt16(datum);
ensure_properties_size(ctx, offset + sizeof(short_value));
- memcpy(ctx->ctx->properties + offset, &short_value, sizeof(short_value));
+ flatgeobuf_write_le16(ctx->ctx->properties + offset, (uint16_t)short_value);
offset += sizeof(short_value);
break;
case INT4OID:
int_value = DatumGetInt32(datum);
ensure_properties_size(ctx, offset + sizeof(int_value));
- memcpy(ctx->ctx->properties + offset, &int_value, sizeof(int_value));
+ flatgeobuf_write_le32(ctx->ctx->properties + offset, (uint32_t)int_value);
offset += sizeof(int_value);
break;
case INT8OID:
long_value = DatumGetInt64(datum);
ensure_properties_size(ctx, offset + sizeof(long_value));
- memcpy(ctx->ctx->properties + offset, &long_value, sizeof(long_value));
+ flatgeobuf_write_le64(ctx->ctx->properties + offset, (uint64_t)long_value);
offset += sizeof(long_value);
break;
case FLOAT4OID:
float_value = DatumGetFloat4(datum);
ensure_properties_size(ctx, offset + sizeof(float_value));
- memcpy(ctx->ctx->properties + offset, &float_value, sizeof(float_value));
+ flatgeobuf_write_float_le(ctx->ctx->properties + offset, float_value);
offset += sizeof(float_value);
break;
case FLOAT8OID:
double_value = DatumGetFloat8(datum);
ensure_properties_size(ctx, offset + sizeof(double_value));
- memcpy(ctx->ctx->properties + offset, &double_value, sizeof(double_value));
+ flatgeobuf_write_double_le(ctx->ctx->properties + offset, double_value);
offset += sizeof(double_value);
break;
case TEXTOID:
string_value = text_to_cstring(DatumGetTextP(datum));
len = strlen(string_value);
ensure_properties_size(ctx, offset + sizeof(len));
- memcpy(ctx->ctx->properties + offset, &len, sizeof(len));
+ flatgeobuf_write_le32(ctx->ctx->properties + offset, len);
offset += sizeof(len);
ensure_properties_size(ctx, offset + len);
memcpy(ctx->ctx->properties + offset, string_value, len);
@@ -238,7 +351,7 @@ static void encode_properties(flatgeobuf_agg_ctx *ctx)
EncodeDateTime(&tm, fsec, true, tz, tzn, USE_ISO_DATES, string_value);
len = strlen(string_value);
ensure_properties_size(ctx, offset + sizeof(len));
- memcpy(ctx->ctx->properties + offset, &len, sizeof(len));
+ flatgeobuf_write_le32(ctx->ctx->properties + offset, len);
offset += sizeof(len);
ensure_properties_size(ctx, offset + len);
memcpy(ctx->ctx->properties + offset, string_value, len);
@@ -292,7 +405,7 @@ static void decode_properties(struct flatgeobuf_decode_ctx *ctx, Datum *values,
while (offset + 1 < size) {
if (offset + sizeof(uint16_t) > size)
elog(ERROR, "flatgeobuf: decode_properties: Unexpected offset %d", offset);
- memcpy(&i, data + offset, sizeof(uint16_t));
+ i = flatgeobuf_read_le16(data + offset);
ci = i + 2;
offset += sizeof(uint16_t);
if (i >= ctx->ctx->columns_size)
@@ -332,7 +445,7 @@ static void decode_properties(struct flatgeobuf_decode_ctx *ctx, Datum *values,
int16_t value;
if (offset + sizeof(int16_t) > size)
elog(ERROR, "flatgeobuf: decode_properties: Invalid size for short value");
- memcpy(&value, data + offset, sizeof(int16_t));
+ value = (int16_t)flatgeobuf_read_le16(data + offset);
values[ci] = Int16GetDatum(value);
offset += sizeof(int16_t);
break;
@@ -341,7 +454,7 @@ static void decode_properties(struct flatgeobuf_decode_ctx *ctx, Datum *values,
uint16_t value;
if (offset + sizeof(uint16_t) > size)
elog(ERROR, "flatgeobuf: decode_properties: Invalid size for ushort value");
- memcpy(&value, data + offset, sizeof(uint16_t));
+ value = flatgeobuf_read_le16(data + offset);
values[ci] = UInt16GetDatum(value);
offset += sizeof(uint16_t);
break;
@@ -350,7 +463,7 @@ static void decode_properties(struct flatgeobuf_decode_ctx *ctx, Datum *values,
int32_t value;
if (offset + sizeof(int32_t) > size)
elog(ERROR, "flatgeobuf: decode_properties: Invalid size for int value");
- memcpy(&value, data + offset, sizeof(int32_t));
+ value = (int32_t)flatgeobuf_read_le32(data + offset);
values[ci] = Int32GetDatum(value);
offset += sizeof(int32_t);
break;
@@ -359,7 +472,7 @@ static void decode_properties(struct flatgeobuf_decode_ctx *ctx, Datum *values,
uint32_t value;
if (offset + sizeof(uint32_t) > size)
elog(ERROR, "flatgeobuf: decode_properties: Invalid size for uint value");
- memcpy(&value, data + offset, sizeof(uint32_t));
+ value = flatgeobuf_read_le32(data + offset);
values[ci] = Int64GetDatum((int64_t)(uint64_t) value);
offset += sizeof(uint32_t);
break;
@@ -368,7 +481,7 @@ static void decode_properties(struct flatgeobuf_decode_ctx *ctx, Datum *values,
int64_t value;
if (offset + sizeof(int64_t) > size)
elog(ERROR, "flatgeobuf: decode_properties: Invalid size for long value");
- memcpy(&value, data + offset, sizeof(int64_t));
+ value = (int64_t)flatgeobuf_read_le64(data + offset);
values[ci] = Int64GetDatum(value);
offset += sizeof(int64_t);
break;
@@ -377,7 +490,7 @@ static void decode_properties(struct flatgeobuf_decode_ctx *ctx, Datum *values,
uint64_t value;
if (offset + sizeof(uint64_t) > size)
elog(ERROR, "flatgeobuf: decode_properties: Invalid size for ulong value");
- memcpy(&value, data + offset, sizeof(uint64_t));
+ value = flatgeobuf_read_le64(data + offset);
values[ci] = UInt64GetDatum(value);
offset += sizeof(uint64_t);
break;
@@ -386,7 +499,7 @@ static void decode_properties(struct flatgeobuf_decode_ctx *ctx, Datum *values,
float value;
if (offset + sizeof(float) > size)
elog(ERROR, "flatgeobuf: decode_properties: Invalid size for float value");
- memcpy(&value, data + offset, sizeof(float));
+ value = flatgeobuf_read_float_le(data + offset);
values[ci] = Float4GetDatum(value);
offset += sizeof(float);
break;
@@ -395,7 +508,7 @@ static void decode_properties(struct flatgeobuf_decode_ctx *ctx, Datum *values,
double value;
if (offset + sizeof(double) > size)
elog(ERROR, "flatgeobuf: decode_properties: Invalid size for double value");
- memcpy(&value, data + offset, sizeof(double));
+ value = flatgeobuf_read_double_le(data + offset);
values[ci] = Float8GetDatum(value);
offset += sizeof(double);
break;
@@ -404,7 +517,7 @@ static void decode_properties(struct flatgeobuf_decode_ctx *ctx, Datum *values,
uint32_t len;
if (offset + sizeof(len) > size)
elog(ERROR, "flatgeobuf: decode_properties: Invalid size for string value");
- memcpy(&len, data + offset, sizeof(uint32_t));
+ len = flatgeobuf_read_le32(data + offset);
offset += sizeof(len);
values[ci] = PointerGetDatum(cstring_to_text_with_len((const char *) data + offset, len));
offset += len;
@@ -427,7 +540,7 @@ static void decode_properties(struct flatgeobuf_decode_ctx *ctx, Datum *values,
#endif
if (offset + sizeof(len) > size)
elog(ERROR, "flatgeobuf: decode_properties: Invalid size for string value");
- memcpy(&len, data + offset, sizeof(uint32_t));
+ len = flatgeobuf_read_le32(data + offset);
offset += sizeof(len);
buf = palloc0(len + 1);
memcpy(buf, (const char *) data + offset, len);
diff --git a/regress/core/in_flatgeobuf.sql b/regress/core/in_flatgeobuf.sql
index ad3f1c70d..ae7057ca4 100644
--- a/regress/core/in_flatgeobuf.sql
+++ b/regress/core/in_flatgeobuf.sql
@@ -9,4 +9,13 @@ select 'T2', id, ST_AsText(geom) from ST_FromFlatGeobuf(null::flatgeobuf_t1,
E'\\x6667620366676200240000001000000000000a000c000800000007000a000000000000020400000000000000000000004c00000010000000000000000000060008000400060000000c00000008000800000004000800000004000000040000009a9999999999f13fcdcccccccccc004033333333333324409a99999999193440'::bytea
);
+select ST_FromFlatGeobufToTable('public', 'flatgeobuf_t2',
+ E'\\x66676203666762019c000000240000000000000000001a00100000000000050000000000000000000800000006000c001a00000000010000080000001c00000003000000500000003000000014000000080008000000040008000000e6100000d4ffffff0000000b04000000050000006c6162656c000000ecffffff0000000a04000000010000006400000008000c0008000700080000000000000504000000010000006e0000005c0000000c00000008000c000800040008000000080000002c0000001c0000000000341200000100000000000000f43f0200060000006c6974746c6508000800000004000800000004000000020000009a9999999999f13fcdcccccccccc0040'::bytea
+);
+
+select 'T3', id, ST_AsEWKT(geom), n, d, label from ST_FromFlatGeobuf(null::flatgeobuf_t2,
+ E'\\x66676203666762019c000000240000000000000000001a00100000000000050000000000000000000800000006000c001a00000000010000080000001c00000003000000500000003000000014000000080008000000040008000000e6100000d4ffffff0000000b04000000050000006c6162656c000000ecffffff0000000a04000000010000006400000008000c0008000700080000000000000504000000010000006e0000005c0000000c00000008000c000800040008000000080000002c0000001c0000000000341200000100000000000000f43f0200060000006c6974746c6508000800000004000800000004000000020000009a9999999999f13fcdcccccccccc0040'::bytea
+);
+
drop table if exists public.flatgeobuf_t1;
+drop table if exists public.flatgeobuf_t2;
diff --git a/regress/core/in_flatgeobuf_expected b/regress/core/in_flatgeobuf_expected
index 958f7e493..abee689a2 100644
--- a/regress/core/in_flatgeobuf_expected
+++ b/regress/core/in_flatgeobuf_expected
@@ -1,2 +1,3 @@
T1|0|POINT(1.1 2.1)
T2|0|LINESTRING(1.1 2.1,10.1 20.1)
+T3|0|SRID=4326;POINT(1.1 2.1)|4660|1.25|little
-----------------------------------------------------------------------
Summary of changes:
NEWS | 2 +
deps/flatgeobuf/geometryreader.cpp | 26 +++----
deps/flatgeobuf/packedrtree.cpp | 59 +++++++-------
postgis/flatgeobuf.c | 151 +++++++++++++++++++++++++++++++-----
regress/core/in_flatgeobuf.sql | 9 +++
regress/core/in_flatgeobuf_expected | 1 +
6 files changed, 186 insertions(+), 62 deletions(-)
hooks/post-receive
--
PostGIS
More information about the postgis-tickets
mailing list