Seb wrote:
Is this still the best solution for creating lines from a
points ASCII file? So assuming one has an ASCII file like:---<--------------------cut
here---------------start------------------->---
id|X|Y
AGB-08-0001|-4.44|22.06
AGB-08-0001|-5.90|20.17
AGB-08-0001|-5.03|17.49
AGB-08-0001|-5.03|18.16
AGB-08-0002|-4.44|22.06
AGB-08-0002|-5.90|20.17
AGB-08-0002|-5.03|17.49
AGB-08-0003|-4.44|22.06
AGB-08-0003|-5.90|20.17
---<--------------------cut
here---------------end--------------------->---and we'd like to create lines for each code in the "id" column, we'd
have to reformat the file so that it conforms to the "standard" GRASS
format for ASCII lines files? If so, it seems we'd also need to recode
such an "id" column into integer, so that it can be used as category.
Or perhaps there is a better approach to importing this kind of data
that are typical in animal tracking studies, where coordinates
correspond to measurements taken at sequential times for each animal
(id)? Thanks in advance for any input.
it's pretty easy to get that into 'v.in.mapgen -f' format, but attaching
the labels might be a pain so maybe the awk script (if you can get your
head around it) is easier way after all??.
here's a little script to do it:
# script to load in data file, then make into lines based on unique
# first column
INFILE="animal_track.dat"
OUTFILE="animal_track.asc"
MAPNAME=`echo "$OUTFILE" | cut -f1 -d.`
#
ANIMALS=`grep ^AGB "$INFILE" | cut -f1 -d'|' | sort | uniq`
echo "nan nan" > "$OUTFILE"
\rm "${OUTFILE}.table"
i=0
for CRITTER in $ANIMALS ; do
i=`expr $i + 1`
grep -w "$CRITTER" "$INFILE" | \
awk -F'|' '{print $2 " "$3}' >> "$OUTFILE"
echo "nan nan" >> "$OUTFILE"
echo "$i|$CRITTER" >> "${OUTFILE}.table"
done
v.in.mapgen -f in="$OUTFILE" out="${MAPNAME}_import"
v.category in="${MAPNAME}_import" out="$MAPNAME" option=add
g.remove vect="${MAPNAME}_import"
v.db.addtable "$MAPNAME" column="label varchar(25)"
## slow
while read LINE ; do
CAT=`echo "$LINE" | awk -F'|' '{print $1}'`
LABEL=`echo "$LINE" | awk -F'|' '{print $2}'`
v.db.update map="$MAPNAME" column=label value="$LABEL" where="cat = $CAT"
done < "${OUTFILE}.table"
## or, faster
sed -e "s/^/INSERT INTO $MAPNAME (cat,label) values (/" \
-e "s/|/,'/" \
-e "s/$/');/" "${OUTFILE}.table" | db.execute
# another fast, but how to correctly quote ''?
awk -F'|' -v MAPNAME=$MAPNAME \
'{print "INSERT INTO " MAPNAME " (cat,label) values (" $1 ",\'" $2 "\');" }' \
"${OUTFILE}.table" | db.execute
# all done
hopefully not too badly linewrapped by yahoo's helpfulness.
ok, still not very simple, but given free-form input data it is hard
to tell the computer what you want.
Hamish