Skip to content

Commit d85fcf4

Browse files
authored
Merge pull request #92 from planetlabs/convert-to-geoparquet
Check if geometry columns exist when converting
2 parents 80fb093 + 1773ba0 commit d85fcf4

File tree

2 files changed

+34
-4
lines changed

2 files changed

+34
-4
lines changed

internal/geoparquet/geoparquet.go

+14-4
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ package geoparquet
22

33
import (
44
"encoding/json"
5+
"errors"
56
"fmt"
67
"io"
78

@@ -62,9 +63,20 @@ func FromParquet(input parquet.ReaderAtSeeker, output io.Writer, convertOptions
6263
datasetInfo := geo.NewDatasetStats(true)
6364
transformSchema := func(fileReader *file.Reader) (*schema.Schema, error) {
6465
inputSchema := fileReader.MetaData().Schema
66+
inputRoot := inputSchema.Root()
6567
metadata := getMetadata(fileReader, convertOptions)
66-
for fieldNum := 0; fieldNum < inputSchema.Root().NumFields(); fieldNum += 1 {
67-
field := inputSchema.Root().Field(fieldNum)
68+
for geomColName := range metadata.Columns {
69+
if inputRoot.FieldIndexByName(geomColName) < 0 {
70+
message := fmt.Sprintf(
71+
"expected a geometry column named %q,"+
72+
" use the --input-primary-column to supply a different primary geometry",
73+
geomColName,
74+
)
75+
return nil, errors.New(message)
76+
}
77+
}
78+
for fieldNum := 0; fieldNum < inputRoot.NumFields(); fieldNum += 1 {
79+
field := inputRoot.Field(fieldNum)
6880
name := field.Name()
6981
if _, ok := metadata.Columns[name]; !ok {
7082
continue
@@ -78,9 +90,7 @@ func FromParquet(input parquet.ReaderAtSeeker, output io.Writer, convertOptions
7890
return inputSchema, nil
7991
}
8092

81-
inputRoot := inputSchema.Root()
8293
numFields := inputRoot.NumFields()
83-
8494
fields := make([]schema.Node, numFields)
8595
for fieldNum := 0; fieldNum < numFields; fieldNum += 1 {
8696
inputField := inputRoot.Field(fieldNum)

internal/geoparquet/geoparquet_test.go

+20
Original file line numberDiff line numberDiff line change
@@ -192,6 +192,26 @@ func TestFromParquetWithoutMetadata(t *testing.T) {
192192
assert.Equal(t, int64(1), reader.NumRows())
193193
}
194194

195+
func TestFromParquetWithoutDefaultGeometryColumn(t *testing.T) {
196+
type Row struct {
197+
Name string `parquet:"name=name, logical=String" json:"name"`
198+
Geom []byte `parquet:"name=geom" json:"geom"`
199+
}
200+
201+
rows := []*Row{
202+
{
203+
Name: "test-point",
204+
Geom: toWKB(t, orb.Point{1, 2}),
205+
},
206+
}
207+
208+
input := test.ParquetFromStructs(t, rows)
209+
210+
output := &bytes.Buffer{}
211+
convertErr := geoparquet.FromParquet(input, output, nil)
212+
require.ErrorContains(t, convertErr, "expected a geometry column named \"geometry\"")
213+
}
214+
195215
func TestMetadataClone(t *testing.T) {
196216
metadata := geoparquet.DefaultMetadata()
197217
clone := metadata.Clone()

0 commit comments

Comments
 (0)