On 15/05/2011 6:31 pm, Juan Miguel Garijo wrote:
Hello,
This is my 'amateur' solution:

def getXYfromFoto(foto):
proc=subprocess.Popen('exif -mt GPSLatitude '+foto, shell=True,stdout=subprocess.PIPE)#foto: is the route to a jpg image from a camera Sony DSC-HX5V
  stdout_value = proc.communicate()[0]
  da=stdout_value[0:len(stdout_value)-1]
  sp=da.split(', ')
lat=float(sp[0].replace(',','.'))+float(sp[1].replace(',','.'))/60+float(sp[2].replace(',','.')[0:5])/3600
  print lat
proc2=subprocess.Popen('exif -mt GPSLongitude '+foto, shell=True,stdout=subprocess.PIPE)
  stdout_value = proc2.communicate()[0]
  da2=stdout_value[0:len(stdout_value)-1]
  sp2=da2.split(', ')
lon=float(sp2[0].replace(',','.'))+float(sp2[1].replace(',','.'))/60+float(sp2[2].replace(',','.')[0:5])/3600
  print lon
proc3=subprocess.Popen('exif -mt GPSLongitudeRef '+foto, shell=True,stdout=subprocess.PIPE)
  stdout_value = proc3.communicate()[0]
  da3=stdout_value[0:len(stdout_value)-1]
  print da3
  if da3[0:1]=='W':
    lonLat='"-'+str(lon)+' '+str(lat)+'"'
  else:
    lonLat='"'+str(lon)+' '+str(lat)+'"'
  print lonL #in wgs84
proc4=subprocess.Popen('echo '+lonLat+' | m.proj -i --quiet', shell=True,stdout=subprocess.PIPE)#GRASS must be running, in my case eur50 datum.
  stdout_value = proc4.communicate()[0]
  da4=stdout_value[0:len(stdout_value)-1]
  print 'da4'
  print da4
  pse=da4.split(' ')
  XY=pse[0].replace('\t',',')
  print 'XY'
  print XY
  return XY# in UTM eu50 30N

hope usefull for you
Juan M. Garijo
Here is the solution I ended up with. It uses `jhead` rather than `exiftool` as for the 200 images I have to process I found it to be ~2x faster. It means jumping through some extra hoops with awk to get the lat/long formatting in a way m.proj will accept and some more to get the dates with / instead of :. The output is ready to pipe into GRASS using something like:

v.in.ascii in=exif.txt out=photos x=2 y=3 z=4 columns='filename varchar(40),x double precision,y double precision, z double precision, date varchar(19)'

#!/bin/bash

for FILENAME in "$@"; do
    # use jhead to read exif metadata
    EXIF=`jhead $FILENAME`

    # awk metadata into variables
LON=`echo "$EXIF" | awk '/Longitude/ {sub(/m/,"'"'"'"); sub(/s/,"\""); print $4$5$6$3}'` LAT=`echo "$EXIF" | awk '/Latitude/ {sub(/m/,"'"'"'"); sub(/s/,"\""); print $5$6$7$4}'`
    ALT=`echo "$EXIF" | awk '/Altitude/ {sub(/m/,""); print $4}'`
    DATE=`echo "$EXIF" | awk '/Date\/Time/ {gsub(/\:/,"/");print $3}'`
    TIME=`echo "$EXIF" | awk '/Date\/Time/ {print $4}'`

    # transform to current projection
    if [ ${#ALT} -lt 1 ]; then ALT=0; XYZ=42; fi
    PROJ=`echo "$LON $LAT $ALT" | m.proj -i`
    PROJ_LON=`echo $PROJ | awk 'BEGIN {FS = "|"}{print $1}'`
    PROJ_LAT=`echo $PROJ | awk 'BEGIN {FS = "|"}{print $2}'`
if [ ${XYZ:-0} -ne 42 ]; then PROJ_ALT=`echo $PROJ | awk 'BEGIN {FS = "|"}{print $3}'`; fi

    # output
    echo "$FILENAME|$PROJ_LON|$PROJ_LAT|$PROJ_ALT|$DATE $TIME"
done
_______________________________________________
grass-user mailing list
[email protected]
http://lists.osgeo.org/mailman/listinfo/grass-user

Reply via email to