从pyproj获取干净的数组输出



(如果您不需要所有详细信息,请参阅下面的简短解释…(我想做的事情:我目前正在尝试将一组坐标从epsg:4326转换为epsg:25832。转换部分工作得非常好,我能够在Panda的帮助下保存我的数组,使其脱颖而出问题:我现在正试图将旧坐标添加到数组中以供参考,但似乎无法获得可以保存的干净输出我的代码:

import pyproj as pp
import numpy as np
import os
print('Whats the name of the file you are trying to convert (e.g. "coordinates.xlsx")?')
xlsx_file_name = "Mappe1.xlsx" #input()
try:
import_arr = pd.read_excel(os.path.join(os.getcwd(), xlsx_file_name), sheet_name='Tabelle1')
except:
print(f'Were not able to find a file named {xlsx_file_name}. Please restart and make sure it is written correctly.')
try:
lat_long_arr = np.array(import_arr)
except:
print(f'Were not able to import the data from {xlsx_file_name}. Please make sure it is formated properly.')
xy_arr = []
#epsg:4326 to epsg:25832
epsg = pp.Transformer.from_crs(4326, 25832)
#THIS IS THE PART I STRUGGLE WITH-----------------------------
for i in range(len(lat_long_arr)):
xy_arr.extend([epsg.transform(lat_long_arr[i,0], lat_long_arr[i,1]), lat_long_arr[i,0], lat_long_arr[i,1]])
#-------------------------------------------------------------
#print(xy_arr)
try:
pd.DataFrame(xy_arr).to_excel('converted_coordinates.xlsx')
except:
print('The file "converted_coordinates.xlsx" is already existing and could not be overwritten')

我的Otput:[(562146.0879263151, 5407897.591536528), 48.82095040000001, 9.8466309, (562228.5649670326, 5407950.483323202), 48.8214179, 9.8477624, ...]这是两对坐标。制动器中的第一个数字被转换,后面的两个数字是参考数字问题:有人知道我如何摆脱制动器或将其他值放入制动器吗?请记住,我需要使用pd.DataFrame(xy_arr).to_excel('converted_coordinates.xlsx')保存数组。谢谢你的建议!

短版本:我扩展了一个像这样的数组:array.extend([epsg.transform(x, y), lat, long]),并得到一个输出,例如像这样的[(562146.0879263151, 5407897.591536528), 48.82095040000001, 9.8466309]。我现在需要用panda保存数组的格式:pd.DataFrame(array).to_excel('save.xlsx')

我们可以使用矢量化的numpy操作来简化代码,从而消除for循环。

让我们在lat_long_arr数组中使用您提供的两组坐标:

import numpy as np
import pyproj as pp
lat_long_arr = np.array([[48.82095040000001, 9.8466309], [48.8214179, 9.8477624]])
print(lag_long_arr)
# array([[48.8209504,  9.8466309],
#        [48.8214179,  9.8477624]])

现在,我们可以将数组的整列传递给epsg.transform()方法,因为它接受数组,而不仅仅是标量:

converted_arr = epsg.transform(lag_long_arr[:, 0], lag_long_arr[:, 1])
print(converted_arr)
# (array([562146.08792632, 562228.56496703]),
#  array([5407897.59153653, 5407950.4833232 ]))

结果是一个数组元组,我们只需要对其进行操作,使其成为正确的格式:

print(np.vstack(converted_arr).T)
# array([[ 562146.08792632, 5407897.59153653],
#        [ 562228.56496703, 5407950.4833232 ]])

我们可以将生成的数组与原始数组连接,并将生成的4列数组传递给pd.DataFrame()构造函数。您可以使用pandas选项显示所需精度的浮点值:

pd.set_option('display.float_format', lambda x: '%.8f' % x)
res = pd.DataFrame(
np.hstack((np.vstack(converted_arr).T, lat_long_arr)),
columns=['converted_x', 'converted_y', 'x', 'y']
)
print(res)
#       converted_x        converted_y            x            y
# 0 562146.08792632   5407897.59153653  48.82095040   9.84663090
# 1 562228.56496703   5407950.48332320  48.82141790   9.84776240

https://gis.stackexchange.com/questions/334271/converting-large-data-with-lat-and-long-into-x-and-y

from pyproj import Transformer
trans = Transformer.from_crs(4326, 25832)
xx, yy = trans.transform(import_arr["lat"].values, import_arr["lon"].values)
import_arr["x"] = xx
import_arr["y"] = yy

相关内容

  • 没有找到相关文章

最新更新