diff options
| author | typebrook <typebrook@gmail.com> | 2019-12-04 09:13:00 +0800 |
|---|---|---|
| committer | typebrook <typebrook@gmail.com> | 2019-12-04 09:13:00 +0800 |
| commit | ba8adbd905b3b1b9378c9e1958cfff4f0bb27c15 (patch) | |
| tree | 700a531566c77de39780768108c88bbe5e5adeda /scripts | |
| parent | e8d03c43ddeabfbff4934a69722cf7f125b5c55e (diff) | |
update
Diffstat (limited to 'scripts')
| -rwxr-xr-x | scripts/match.sh | 44 |
1 files changed, 33 insertions, 11 deletions
diff --git a/scripts/match.sh b/scripts/match.sh index a1c7e62..135fc81 100755 --- a/scripts/match.sh +++ b/scripts/match.sh | |||
| @@ -1,12 +1,28 @@ | |||
| 1 | #! /bin/bash | 1 | #!/usr/bin/env bash |
| 2 | # | ||
| 3 | # Author: Pham | ||
| 4 | # | ||
| 5 | # This script accepts a single GPX file as parameter and | ||
| 6 | # output the processed GPX body to STDOUT, using Mapbox Map Matching API v4. | ||
| 7 | # read doc at: https://docs.mapbox.com/api/legacy/map-matching-v4/ | ||
| 8 | # | ||
| 9 | # Example: | ||
| 10 | # | ||
| 11 | # match.sh raw.gpx > new.gpx | ||
| 12 | # | ||
| 13 | # Hint: | ||
| 14 | # | ||
| 15 | # Remember to put Mapbox Access Token at the top! | ||
| 2 | 16 | ||
| 3 | #set -x | 17 | #set -x |
| 4 | set -e | 18 | set -e |
| 5 | 19 | ||
| 6 | ACCESS_TOKEN=$(cat ~/settings/tokens/mapbox) | 20 | ACCESS_TOKEN=$(cat ~/settings/tokens/mapbox) # put yout Mapbox token here |
| 7 | LIMIT=10 | 21 | LIMIT=10 # number of coordinates for each Mapbox Map Matching API request, Maximum value is 100 |
| 22 | |||
| 8 | ORIGIN_DATA=/tmp/origin | 23 | ORIGIN_DATA=/tmp/origin |
| 9 | RESPONSE=/tmp/response | 24 | RESPONSE=/tmp/response |
| 25 | MATCHED=/tmp/matched | ||
| 10 | 26 | ||
| 11 | # store data of time and location into tmp file with 2 columns, format is like: | 27 | # store data of time and location into tmp file with 2 columns, format is like: |
| 12 | # 1970-01-01T08:00:46 [121.0179739,14.5515336] | 28 | # 1970-01-01T08:00:46 [121.0179739,14.5515336] |
| @@ -16,30 +32,36 @@ paste -d' ' \ | |||
| 16 | <(sed -nr 's/.*lat=\"([^\"]+)\".*/\1/p' $1) |\ | 32 | <(sed -nr 's/.*lat=\"([^\"]+)\".*/\1/p' $1) |\ |
| 17 | sed -r 's/ ([^ ]+) ([^ ]+)/ [\1,\2]/' |\ | 33 | sed -r 's/ ([^ ]+) ([^ ]+)/ [\1,\2]/' |\ |
| 18 | awk '!_[$1]++' > $ORIGIN_DATA | 34 | awk '!_[$1]++' > $ORIGIN_DATA |
| 19 | exit 0 | ||
| 20 | 35 | ||
| 36 | # Consume raw data with serveral request | ||
| 21 | while [ -s $ORIGIN_DATA ] | 37 | while [ -s $ORIGIN_DATA ] |
| 22 | do | 38 | do |
| 39 | # Make GeoJSON object for request | ||
| 23 | jq --slurp '{type: "Feature", properties: {coordTimes: .[1]}, geometry: {type: "LineString", coordinates: .[0]}}' \ | 40 | jq --slurp '{type: "Feature", properties: {coordTimes: .[1]}, geometry: {type: "LineString", coordinates: .[0]}}' \ |
| 24 | <(head -$LIMIT $ORIGIN_DATA | cut -d' ' -f2 | jq -n '[inputs]') \ | 41 | <(head -$LIMIT $ORIGIN_DATA | cut -d' ' -f2 | jq -n '[inputs]') \ |
| 25 | <(head -$LIMIT $ORIGIN_DATA | cut -d' ' -f1 | jq -nR '[inputs]') |\ | 42 | <(head -$LIMIT $ORIGIN_DATA | cut -d' ' -f1 | jq -nR '[inputs]') |\ |
| 26 | curl -X POST -s --header "Content-Type:application/json" --data @- https://api.mapbox.com/matching/v4/mapbox.driving.json?access_token=$ACCESS_TOKEN > $RESPONSE | 43 | # Mapbox Map Matching API |
| 44 | curl -X POST -s --data @- --header "Content-Type:application/json" https://api.mapbox.com/matching/v4/mapbox.driving.json?access_token=$ACCESS_TOKEN > $RESPONSE | ||
| 27 | 45 | ||
| 28 | TIMESTAMP=0 | 46 | # Put matched points and indices into tmp file |
| 29 | paste -d' ' \ | 47 | paste -d' ' \ |
| 30 | <(jq -c '.features[0].properties.matchedPoints[]' $RESPONSE) \ | 48 | <(jq -c '.features[0].properties.matchedPoints[]' $RESPONSE) \ |
| 31 | <(jq -c '.features[0].properties.indices[]' $RESPONSE | xargs -I{} echo {}+1 | bc | xargs -I{} sed -n {}p $ORIGIN_DATA | cut -d' ' -f1 | date -f - +%s) \ | 49 | <(jq -c '.features[0].properties.indices[]' $RESPONSE | xargs -I{} echo {}+1 | bc | xargs -I{} sed -n {}p $ORIGIN_DATA | cut -d' ' -f1 | date -f - +%s) \ |
| 32 | > matched | 50 | > $MATCHED |
| 51 | |||
| 52 | # For each coodinates from Map Matching API, add timestamp at the end and print it out to tty | ||
| 33 | jq -c '.features[0].geometry.coordinates[]' $RESPONSE |\ | 53 | jq -c '.features[0].geometry.coordinates[]' $RESPONSE |\ |
| 34 | while read line | 54 | while read line |
| 35 | do | 55 | do |
| 36 | TIMESTAMP=$(head -1 matched | cut -d' ' -f2) | 56 | TIMESTAMP=$(head -1 $MATCHED | cut -d' ' -f2) |
| 37 | (head -1 matched | grep -F $line && sed -i 1d matched) || echo $line $TIMESTAMP jojo | 57 | (head -1 $MATCHED | grep -F $line && sed -i 1d $MATCHED) || echo $line $TIMESTAMP jojo |
| 38 | done |\ | 58 | done |\ |
| 39 | tee /dev/tty && rm matched | 59 | tee /dev/tty && rm $MATCHED |
| 40 | 60 | ||
| 61 | # Remove processed raw data | ||
| 41 | sed -i "1,$LIMIT d" $ORIGIN_DATA | 62 | sed -i "1,$LIMIT d" $ORIGIN_DATA |
| 42 | done |\ | 63 | done |\ |
| 64 | # Make GPX format for output | ||
| 43 | sed -r 's/\[([^,]+),([^,]+)\] ?(.*)/ <trkpt lon="\1" lat="\2"><time>\3<\/time><\/trkpt>/' |\ | 65 | sed -r 's/\[([^,]+),([^,]+)\] ?(.*)/ <trkpt lon="\1" lat="\2"><time>\3<\/time><\/trkpt>/' |\ |
| 44 | sed "1i \ | 66 | sed "1i \ |
| 45 | <gpx version=\"1.1\" creator=\"Garmin Connect\"\n\ | 67 | <gpx version=\"1.1\" creator=\"Garmin Connect\"\n\ |
| @@ -54,4 +76,4 @@ sed "1i \ | |||
| 54 | \ \ \ \ <\/trkseg>\n\ | 76 | \ \ \ \ <\/trkseg>\n\ |
| 55 | <\/trk>\n\ | 77 | <\/trk>\n\ |
| 56 | <\/gpx>\n\ | 78 | <\/gpx>\n\ |
| 57 | " | tee output.gpx | 79 | " |