I have a pretty simple issue: I need to convert the file with geographical coordinates like
Lat Long
50 0 50 35 1 40
50 2 50 35 10 20
50 3 1 35 13 22
50 2 38 35 14 40
49 59 6 35 13 22
49 57 14 35 13 21
49 57 10 35 13 0
49 57 0 35 6 20
to the
Lat Long
50.01389,35.02778
50.04722,35.17222
etc.
Math is as simple as a pie: we have to devide minutes (0 and 1 in this particular case) by 60 and seconds (50 and 40) by 3600, then add these numbers and we will get the remainder of the degree (50 and 35).
Here is my script with numpy. I suppose, it looks to big for such a simple conversion, however I don't know how to do this simpler. Also I don't know how to end this script, so it could do what it should. Now it ends with adding minutes and seconds.
import sys
import numpy as np
filename = input('Please enter the file\'s name: ')
with open(filename, "r") as f:
sys.stdout = open('%s (converted).txt' % f.name, 'a')
data = np.loadtxt(f)
degree_lat, degree_long = data[:, 0], data[:, 3]
min_lat, sec_lat, min_long, sec_long = \
(data[:, 1] / 60), (data[:, 2] / 3600), (data[:, 4] / 60), (data[:, 5] / 3600)
remainder_lat, remainder_long = min_lat + sec_lat, min_long + sec_long
degree_result_lat = degree_lat + remainder_lat
degree_result_long = degree_long + remainder_long
Any suggestions would be greatly appreciated! Thanks and sorry for the amateur questions.
If I understand correctly what you have in data
array,
data = data.T # not strictly necessary, but simplifies following indexing
lat = data[0]+data[1]/60.+data[2]/3600.
lon = data[3]+data[4]/60.+data[5]/3600.
converted = np.vstack((lat,lon)).T
np.savetxt(outname, converted)
Line by line comment
data.T
transposes the array, columns becomes tows and in Python it's easier to address rows than columns...data[0]+data[1]/60.+data[2]/3600.
is a vectorized expression, each row of the data
array is an array on its own, and you can evaluate algebraic expressions, possibly using also numpy
's functions that accept, as arguments, vector expressions as well.np.vstack((lat,lon)).T
we have two names that reference two different expressions, we want to combine them in a single array, so that we can use np.savetxt()
to save it.
Using np.vstack()
we get an array like
[[lt0, lt1, ..., ltN],
[ln0, ln1, ..., lnN]]
but we want to save an array like
[[lt0, ln0],
[lt1, ln1],
...
so we have to transpose the result of np.vstack()
np.savetxt(outname, converted)
we save at once the whole array using one of the convenient conveniency functions offered by the numpy
libraries.Note that, when using numpy
you should try to avoid explicit loops and instead relying on its ability to vectorize most expressions. This leads to much more efficient code.