kopia lustrzana https://github.com/OpenDroneMap/ODM
Merge pull request #216 from lupus78/gh-pages
use GDAL Coordinate System format specification, replace cs2cs with gdaltransform
Former-commit-id: a16b3dc6b2
gh-pages
commit
6b8e700204
99
run.py
99
run.py
|
@ -10,7 +10,6 @@ import subprocess
|
||||||
import shutil
|
import shutil
|
||||||
import shlex
|
import shlex
|
||||||
# import collections # Never used
|
# import collections # Never used
|
||||||
import fractions
|
|
||||||
import argparse
|
import argparse
|
||||||
import errno
|
import errno
|
||||||
|
|
||||||
|
@ -318,12 +317,15 @@ def parse_coordinate_system():
|
||||||
with open(jobOptions['jobDir'] + '/odm_georeferencing/coordFile.txt') as f:
|
with open(jobOptions['jobDir'] + '/odm_georeferencing/coordFile.txt') as f:
|
||||||
for lineNumber, line in enumerate(f):
|
for lineNumber, line in enumerate(f):
|
||||||
if lineNumber == 0:
|
if lineNumber == 0:
|
||||||
tokens = line.split(' ')
|
# check for the WGS84 UTM 17N format
|
||||||
if len(tokens) == 3:
|
match_wgs_utm = re.search('WGS84 UTM (\d{1,2})(N|S)',line.strip(),re.I)
|
||||||
utmZoneString = tokens[2][0:len(tokens[2])-2].strip()
|
if match_wgs_utm:
|
||||||
utmSouthBool = (tokens[2][len(tokens[2])-2].strip() == 'S')
|
utmZoneString = match_wgs_utm.group(1)
|
||||||
|
utmSouthBool = ( match_wgs_utm.group(2).upper() == 'S' )
|
||||||
jobOptions['csString'] = '+datum=WGS84 +proj=utm +zone=' + utmZoneString + (' +south' if utmSouthBool else '')
|
jobOptions['csString'] = '+datum=WGS84 +proj=utm +zone=' + utmZoneString + (' +south' if utmSouthBool else '')
|
||||||
jobOptions['epsg'] = calculate_EPSG(int(utmZoneString), utmSouthBool)
|
jobOptions['epsg'] = calculate_EPSG(int(utmZoneString), utmSouthBool)
|
||||||
|
else:
|
||||||
|
jobOptions['csString'] = line.strip()
|
||||||
elif lineNumber == 1:
|
elif lineNumber == 1:
|
||||||
tokens = line.split(' ')
|
tokens = line.split(' ')
|
||||||
if len(tokens) == 2:
|
if len(tokens) == 2:
|
||||||
|
@ -332,6 +334,23 @@ def parse_coordinate_system():
|
||||||
else:
|
else:
|
||||||
break
|
break
|
||||||
|
|
||||||
|
def coord_to_fractions(coord,refs):
|
||||||
|
deg_dec = abs(float(coord))
|
||||||
|
deg = int(deg_dec)
|
||||||
|
minute_dec = (deg_dec-deg)*60
|
||||||
|
minute = int(minute_dec)
|
||||||
|
|
||||||
|
sec_dec = (minute_dec-minute)*60
|
||||||
|
sec_dec = round(sec_dec,3)
|
||||||
|
sec_denominator = 1000
|
||||||
|
sec_numerator = int(sec_dec*sec_denominator)
|
||||||
|
if float(coord) >= 0 :
|
||||||
|
latRef = refs[0]
|
||||||
|
else:
|
||||||
|
latRef = refs[1]
|
||||||
|
|
||||||
|
output = str(deg) + '/1 ' + str(minute) + '/1 ' + str(sec_numerator) + '/' + str(sec_denominator)
|
||||||
|
return (output, latRef)
|
||||||
|
|
||||||
def prepare_objects():
|
def prepare_objects():
|
||||||
"""Prepare the jobOptions and fileObjects dicts"""
|
"""Prepare the jobOptions and fileObjects dicts"""
|
||||||
|
@ -865,59 +884,27 @@ def odm_georeferencing():
|
||||||
y = float(tokens[1])
|
y = float(tokens[1])
|
||||||
z = float(tokens[2])
|
z = float(tokens[2])
|
||||||
filename = images[lineNumber - 2]
|
filename = images[lineNumber - 2]
|
||||||
run("echo " + str(x + jobOptions["utmEastOffset"]) + " " + str(y + jobOptions["utmNorthOffset"]) + " " + str(z) + " | cs2cs " + jobOptions["csString"] + " +to +datum=WGS84 +proj=latlong > " + jobOptions["jobDir"] + "/odm_georeferencing/latlong.txt")
|
coords_wgs84_out = run_and_return("echo " + str(x + jobOptions["utmEastOffset"]) + " " + str(y + jobOptions["utmNorthOffset"]) + " " + str(z), "gdaltransform -s_srs \"" + jobOptions["csString"] + "\" -t_srs \"EPSG:4326\"")
|
||||||
with open(jobOptions["jobDir"] + "/odm_georeferencing/latlong.txt") as latlongFile:
|
coords_wgs84 = coords_wgs84_out.split(' ')
|
||||||
latlongLine = latlongFile.readline()
|
lat_frac = coord_to_fractions(coords_wgs84[1],['N','S'])
|
||||||
tokens = latlongLine.split()
|
lon_frac = coord_to_fractions(coords_wgs84[0],['E','W'])
|
||||||
if len(tokens) >= 2:
|
|
||||||
exifGpsInfoWritten = False
|
|
||||||
|
|
||||||
lonString = tokens[0] # Example: 83d18'16.285"W
|
exivCmd = "exiv2 -q"
|
||||||
latString = tokens[1] # Example: 41d2'11.789"N
|
exivCmd += " -M\"set Exif.GPSInfo.GPSLatitude " + lat_frac[0] + "\""
|
||||||
altString = ""
|
exivCmd += " -M\"set Exif.GPSInfo.GPSLatitudeRef " + lat_frac[1] + "\""
|
||||||
if len(tokens) > 2:
|
exivCmd += " -M\"set Exif.GPSInfo.GPSLongitude " + lon_frac[0] + "\""
|
||||||
altString = tokens[2] # Example: 0.998
|
exivCmd += " -M\"set Exif.GPSInfo.GPSLongitudeRef " + lon_frac[1] + "\""
|
||||||
|
|
||||||
tokens = re.split("[d '\"]+", lonString)
|
altitude = abs(int(float(coords_wgs84[2])*100))
|
||||||
if len(tokens) >= 4:
|
exivCmd += " -M\"set Exif.GPSInfo.GPSAltitude " + str(altitude) + "/100\""
|
||||||
lonDeg = tokens[0]
|
exivCmd += " -M\"set Exif.GPSInfo.GPSAltitudeRef "
|
||||||
lonMin = tokens[1]
|
if coords_wgs84[2]>=0:
|
||||||
lonSec = tokens[2]
|
exivCmd += "0"
|
||||||
lonSecFrac = fractions.Fraction(lonSec)
|
else:
|
||||||
lonSecNumerator = str(lonSecFrac._numerator)
|
exivCmd += "1"
|
||||||
lonSecDenominator = str(lonSecFrac._denominator)
|
exivCmd += "\""
|
||||||
lonRef = tokens[3]
|
exivCmd += " " + filename
|
||||||
|
run(exivCmd)
|
||||||
tokens = re.split("[d '\"]+", latString)
|
|
||||||
if len(tokens) >= 4:
|
|
||||||
latDeg = tokens[0]
|
|
||||||
latMin = tokens[1]
|
|
||||||
latSec = tokens[2]
|
|
||||||
latSecFrac = fractions.Fraction(latSec)
|
|
||||||
latSecNumerator = str(latSecFrac._numerator)
|
|
||||||
latSecDenominator = str(latSecFrac._denominator)
|
|
||||||
latRef = tokens[3]
|
|
||||||
|
|
||||||
exivCmd = "exiv2 -q"
|
|
||||||
exivCmd += " -M\"set Exif.GPSInfo.GPSLatitude " + latDeg + "/1 " + latMin + "/1 " + latSecNumerator + "/" + latSecDenominator + "\""
|
|
||||||
exivCmd += " -M\"set Exif.GPSInfo.GPSLatitudeRef " + latRef + "\""
|
|
||||||
exivCmd += " -M\"set Exif.GPSInfo.GPSLongitude " + lonDeg + "/1 " + lonMin + "/1 " + lonSecNumerator + "/" + lonSecDenominator + "\""
|
|
||||||
exivCmd += " -M\"set Exif.GPSInfo.GPSLongitudeRef " + lonRef + "\""
|
|
||||||
|
|
||||||
altNumerator = arcDenominator = 0 # BUG: arcDenominator is never used
|
|
||||||
if altString:
|
|
||||||
altFrac = fractions.Fraction(altString)
|
|
||||||
altNumerator = str(altFrac._numerator)
|
|
||||||
altDenominator = str(altFrac._denominator)
|
|
||||||
exivCmd += " -M\"set Exif.GPSInfo.GPSAltitude " + altNumerator + "/" + altDenominator + "\""
|
|
||||||
exivCmd += " -M\"set Exif.GPSInfo.GPSAltitudeRef 0\""
|
|
||||||
|
|
||||||
exivCmd += " " + filename
|
|
||||||
run(exivCmd)
|
|
||||||
exifGpsInfoWritten = True
|
|
||||||
|
|
||||||
if not exifGpsInfoWritten:
|
|
||||||
print(" Warning: Failed setting EXIF GPS info for " + filename + " based on " + latlongLine)
|
|
||||||
|
|
||||||
if "epsg" in jobOptions and "utmEastOffset" in jobOptions and "utmNorthOffset" in jobOptions:
|
if "epsg" in jobOptions and "utmEastOffset" in jobOptions and "utmNorthOffset" in jobOptions:
|
||||||
lasCmd = "\"" + BIN_PATH + "/txt2las\" -i " + jobOptions["jobDir"] + "-results/option-0000_georef.ply -o " + jobOptions["jobDir"] + "-results/pointcloud_georef.laz -skip 30 -parse xyzRGBssss -set_scale 0.01 0.01 0.01 -set_offset " + str(jobOptions["utmEastOffset"]) + " " + str(jobOptions["utmNorthOffset"]) + " 0 -translate_xyz " + str(jobOptions["utmEastOffset"]) + " " + str(jobOptions["utmNorthOffset"]) + " 0 -epsg " + str(jobOptions["epsg"])
|
lasCmd = "\"" + BIN_PATH + "/txt2las\" -i " + jobOptions["jobDir"] + "-results/option-0000_georef.ply -o " + jobOptions["jobDir"] + "-results/pointcloud_georef.laz -skip 30 -parse xyzRGBssss -set_scale 0.01 0.01 0.01 -set_offset " + str(jobOptions["utmEastOffset"]) + " " + str(jobOptions["utmNorthOffset"]) + " 0 -translate_xyz " + str(jobOptions["utmEastOffset"]) + " " + str(jobOptions["utmNorthOffset"]) + " 0 -epsg " + str(jobOptions["epsg"])
|
||||||
|
|
Ładowanie…
Reference in New Issue