首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何从.csv文件中计算x- y坐标

如何从.csv文件中计算x- y坐标
EN

Stack Overflow用户
提问于 2022-05-03 11:29:27
回答 1查看 131关注 0票数 -2

有几天我想不出解决这个问题的办法。

我生成了x和y坐标的"coordinates.csv“文件,如下所示:

代码语言:javascript
运行
复制
xcoord,ycoord
112000,556000
112000,555500
112000,555000
112000,554500
112000,554000
112000,553500

我有一个特定的代码,它在一个x和z坐标上进行计算。这是一个简化的例子:

代码语言:javascript
运行
复制
#example code stack

x = 2000
y = 3000

new_value = x + y + 10


print(x)
print(y)

我想使用.csv文件中的x,y坐标,而不是(2000,3000)。因此,代码将对.csv文件中的所有坐标进行计算。在那之后,我想用第三列中的计算来做一个新的数据。这个看起来是这样的:

代码语言:javascript
运行
复制
xcoord,ycoord,new_value
112000,556000,668010
112000,555500,667510
112000,555000,667010
112000,554500,666510
112000,554000,666010
112000,553500,665510

我想我需要一个for循环,但我真的想不出怎么做。很多时候,我被for循环困住了,所以我希望有人能帮我解决问题。

谢谢你的阅读和亲切的问候,

西蒙

这是我的代码,这是被要求的。这说明了为什么我认为我需要一个for循环来完成这个任务。我试图实现ThomasO建议的方法,但这似乎行不通,因为P将变成一个坐标列表,而不是一个坐标列表,但也许我错了。我仍然对一个解决办法感到好奇:

代码语言:javascript
运行
复制
import geopandas as gpd
import itertools
import math
from pyproj import Transformer
import numpy as np
from math import sqrt
import os
import pandas as pd
from pathlib import Path
from matplotlib import pyplot as plt


## data
land = gpd.read_file('land2.shp')
land = land.to_crs("EPSG:28992")


os.chdir('C:\\Users\\###\\sensoren\\data')
os.getcwd()
wind = pd.read_csv('data_totaal_2.csv', usecols= [ 0, 1,2 , 5],skiprows = 33, names = ['STN','DT','HH','FF'])


## closest point
def min_distance(x, y, iterable):
       list_of_distances = list(map(lambda t: sqrt(pow(t[0]-x,2)+pow(t[1]-y,2)),iterable))
       min_res = min(list_of_distances)
       index_of_min = list_of_distances.index(min_res)
       return iterable[index_of_min]

## check if point is inside triangle
def area(x1, y1, x2, y2, x3, y3):
    return abs((x1 * (y2 - y3) +
                x2 * (y3 - y1) +
                x3 * (y1 - y2)) / 2.0)


def is_inside(x1, y1, x2, y2, x3, y3, x, y):
    A = area(x1, y1, x2, y2, x3, y3)
    A1 = area(x, y, x2, y2, x3, y3)
    A2 = area(x1, y1, x, y, x3, y3)
    A3 = area(x1, y1, x2, y2, x, y)
    return A == A1 + A2 + A3

## calculate perimeter
def perimeter(points):
    x1, y1, x2, y2, x3, y3 = *points[0], *points[1], *points[2]
    return (math.hypot(x1-x2, y1-y2) +
            math.hypot(x2-x3, y2-y3) +
            math.hypot(x3-x1, y3-y1))

## barycentric interpolation
def bary_interpol (inter_cor_x1, inter_cor_x2, inter_cor_x3, inter_cor_y1,
                   inter_cor_y2, inter_cor_y3, inter_cor_px, inteR_cor_py,
                   inter_wind_v1, inter_wind_v2, inter_wind_v3):
    W_v1 = ((inter_cor_y2-inter_cor_y3)*(inter_cor_px-inter_cor_x3)+
            (inter_cor_x3-inter_cor_x2)*(inter_cor_py-inter_cor_y3))/((inter_cor_y2-inter_cor_y3)*(inter_cor_x1-inter_cor_x3)+
            (inter_cor_x3-inter_cor_x2)*(inter_cor_y1-inter_cor_y3))
    W_v2 = ((inter_cor_y3-inter_cor_y1)*(inter_cor_px-inter_cor_x3)+
            (inter_cor_x1-inter_cor_x3)*(inter_cor_py-inter_cor_y3))/((inter_cor_y2-inter_cor_y3)*(inter_cor_x1-inter_cor_x3)+
            (inter_cor_x3-inter_cor_x2)*(inter_cor_y1-inter_cor_y3))
    W_v3 = 1 - W_v1 - W_v2
    inter_wind_pv = (W_v1 * inter_wind_v1) + (W_v2 * inter_wind_v2) +  (W_v3 * inter_wind_v3)
    return inter_wind_pv

       
## datum shift
transformer = Transformer.from_crs("epsg:4326", "epsg:28992")

RD_229 = transformer.transform(53.04309, 4.81969) #texelhors_229
RD_235 = transformer.transform(52.91382, 4.79498) #de_kooy_235
RD_242 = transformer.transform(53.25337, 4.94041) #vlieland_242
RD_251 = transformer.transform(53.39335, 5.34623) #terschelling_251
RD_267 = transformer.transform(52.89709, 5.38331) #stavoren_267
RD_277 = transformer.transform(53.40848, 6.19614) #lauwersoog_277

df = pd.read_csv(r"C:\Users\###\OneDrive - NIOZ\NIOZ\Pyth\coordinates.csv")

P =  ( df['xcoord'], df['ycoord'])

STN_229_x = RD_229[0]
STN_235_x = RD_235[0]
STN_242_x = RD_242[0]
STN_251_x = RD_251[0]
STN_267_x = RD_267[0]
STN_277_x = RD_277[0]

points = [(RD_229[0],RD_229[1]),(RD_235[0],RD_235[1]),(RD_242[0],RD_242[1]),(RD_251[0],RD_251[1]),(RD_267[0],RD_267[1]),(RD_277[0],RD_277[1])]


## find best triangle or point
triangle_fit = []
for triangle in itertools.combinations(points, 3):
    p1, p2, p3 = triangle
    if is_inside(*p1, *p2, *p3, *P):
       triangle_fit.append(triangle)

triangle_fit.sort(key=perimeter) 


 # Sort by perimeter.

triangle_fit.append(triangle)
triangle_fit.sort(key=perimeter) 
inter_cor = triangle_fit[0]
inter_cor_x1 = inter_cor[0][0]
inter_cor_x2 = inter_cor[1][0]
inter_cor_x3 = inter_cor[2][0]
inter_cor_y1 = inter_cor[0][1]
inter_cor_y2 = inter_cor[1][1]
inter_cor_y3 = inter_cor[2][1]

inter_cor_px = P[0]
inter_cor_py = P[1]


print(inter_cor_x1)
print(inter_cor_x2)
print(inter_cor_x3)
print(inter_cor_y1)
print(inter_cor_y2)
print(inter_cor_y3)

if inter_cor_x1 == STN_229_x:
    STN_v1 = 229
elif inter_cor_x1  == STN_235_x:
    STN_v1 = 235
elif inter_cor_x1  == STN_242_x:
    STN_v1 = 242
elif inter_cor_x1  == STN_251_x:
    STN_v1 = 251
elif inter_cor_x1  == STN_267_x:
    STN_v1 = 267
elif inter_cor_x1  == STN_277_x:
    STN_v1 = 277
else:
    print("no matching stations in v1")

if inter_cor_x2 == STN_229_x:
    STN_v2 = 229
elif inter_cor_x2  == STN_235_x:
    STN_v2 = 235
elif inter_cor_x2  == STN_242_x:
    STN_v2 = 242
elif inter_cor_x2  == STN_251_x:
    STN_v2 = 251
elif inter_cor_x2  == STN_267_x:
    STN_v2 = 267
elif inter_cor_x2  == STN_277_x:
    STN_v2 = 277
else:
    print("no matching stations in v2")
    
if inter_cor_x3 == STN_229_x:
    STN_v3 = 229
elif inter_cor_x3  == STN_235_x:
    STN_v3 = 235
elif inter_cor_x3  == STN_242_x:
    STN_v3 = 242
elif inter_cor_x3  == STN_251_x:
    STN_v3 = 251
elif inter_cor_x3  == STN_267_x:
    STN_v3 = 267
elif inter_cor_x3  == STN_277_x:
    STN_v3 = 277
else:
    print("no matching stations in v1")
    

inter_wind_v1 = wind[wind['STN'] == STN_v1]



inter_wind_v2 = wind[wind['STN'] == STN_v2]


inter_wind_v3 = wind[wind['STN'] == STN_v3]



df_add = inter_wind_v1.FF.add(inter_wind_v1.FF, fill_value=0)



inter_wind_v1 = wind[wind['STN'] == STN_v1].reset_index()
# =============================================================================
# print(f"inter_wind_v1:\n{inter_wind_v1}")
# =============================================================================


inter_wind_v2 = wind[wind['STN'] == STN_v2].reset_index()
# =============================================================================
# print(f"inter_wind_v2:\n{inter_wind_v2}")
# =============================================================================


inter_wind_v3 = wind[wind['STN'] == STN_v3].reset_index()
# =============================================================================
# print(f"inter_wind_v3:\n{inter_wind_v3}")
# =============================================================================

interp = pd.DataFrame(inter_wind_v1['FF']).rename(columns = {'FF':'inter_wind_v1'})
interp['inter_wind_v2'] = inter_wind_v2['FF']
interp['inter_wind_v3'] = inter_wind_v3['FF']
# =============================================================================
# print(interp)
# =============================================================================

def doInterp(inter_wind_v1, inter_wind_v2, inter_wind_v3):
    return bary_interpol (inter_cor_x1, inter_cor_x2, inter_cor_x3, inter_cor_y1,
                   inter_cor_y2, inter_cor_y3, inter_cor_px, inter_cor_py,
                   inter_wind_v1, inter_wind_v2, inter_wind_v3)
interp['inter_wind_pv'] = interp.apply(lambda x: doInterp(x['inter_wind_v1'], x['inter_wind_v2'], x['inter_wind_v3']), axis=1)
print(interp.inter_wind_pv)

wind_time = pd.date_range(start = '1/1/2021 00:01:00', end = '3/13/2022', freq = 'H')

wind_time = pd.DataFrame(wind_time)

print(wind_time)

result = pd.concat([wind_time, interp.inter_wind_pv], axis=1)

print(result)

filepath = Path('C:/Users/###/sensoren/data/out.csv')  

filepath.parent.mkdir(parents=True, exist_ok=True)  

result.to_csv(filepath)  

os.makedirs('C:/Users/###/sensoren/data/', exist_ok=True)  





data_s = np.array([
    [RD_229],
    [RD_235],
    [RD_242],
    [RD_251],
    [RD_267],
    [RD_277]
])
data_p = np.array([
    [P]
])


data_i = np.array([
    [ inter_cor_x1, inter_cor_y1],
    [ inter_cor_x2, inter_cor_y2],
    [ inter_cor_x3, inter_cor_y3]
])

x_s, y_s = data_s.T
x_p, y_p = data_p. T
x_i, y_i = data_i. T

ax = land.plot()
plt.scatter( x_p, y_p, c="red")
plt.scatter( x_s, y_s, c="yellow")
plt.scatter( x_i, y_i, c="green")
plt.show()
EN

回答 1

Stack Overflow用户

发布于 2022-05-03 11:40:38

您不需要'for‘循环,因为您提到您想要一个dataframe。将来,您应该提供所创建的代码,但无法开始工作。

代码语言:javascript
运行
复制
import pandas as pd
df = pd.read_csv("numbers.csv")
df['new_value'] = df['xcoord'] + df['ycoord'] + 10
print(df)

输出:

代码语言:javascript
运行
复制
   xcoord  ycoord  new_value
0  112000  556000     668010
1  112000  555500     667510
2  112000  555000     667010
3  112000  554500     666510
4  112000  554000     666010
5  112000  553500     665510
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72098727

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档