aboutsummaryrefslogtreecommitdiffhomepage
path: root/scripts/csv2geojson
blob: 028aed7347919a86f1ad6a323bb2243a47a46c9c (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
#! /bin/bash

# -s to skip specify columns of longitude and latitude
for i in "$@"
do
case $i in
    -s)
    lon_col=0; lat_col=1
    shift;;

    *)
    csv=$i
    shift;;
esac
done

# if no -s option, just read from input
if [ "$lon_col" != "0" ]; then
    # show each field with index in csv
    echo -------------- > /dev/tty
    head -1 < $csv | awk -F',' '{for (i=1; i<=NF; i++) printf $i "_" i " "; print ""}' > /dev/tty
    echo -------------- > /dev/tty
    echo > /dev/tty

    # get index of lon/lat column
    read -p "Number of latitude column: " lat_col
    read -p "Number of longitude column: " lon_col
fi

cat $csv |
# move lon and lat to the first and second column
awk -F',' -v lon_th=$lon_col -v lat_th=$lat_col '\
    BEGIN{OFS=","}\
    {printf $lon_th "," $lat_th; for (i=1; i<= NF; i++) if (i != lat_th && i != lon_th) printf "," $i; print ""}\
    ' |\
# change csv into array format, like [lon, lat, "field1", field2...]
sed 's/[^,]*/"\0"/g; s/.*/[\0]/g' |\
# wrap other fields as a json object, like [lon, lat, {...}]
jq -s '.[0][2:] as $fields | .[1:][] | [.[0], .[1], ([$fields, .[2:]] | transpose | map({(.[0]): .[1]}) | add)]' |\
# create array of geojson point features
jq '{"type": "Feature",  "properties": .[2],  "geometry":{ "type": "Point",  "coordinates": [(.[0] | tonumber), (.[1] | tonumber)] } }' |\
# wrap features as geojson format
jq -s '{"type": "FeatureCollection", "features": .}' |\
tee /tmp/geojson

echo stored into /tmp/geojson > /dev/tty