Построение изобат по данным из csv файла
Как преобразовать набор данных в файле .csv в виде:
- 316925.000 8354725.000 -40.06
316935.000 8354615.000 -40.02
316935.000 8354625.000 -39.96
316935.000 8354635.000 -39.97
316935.000 8354645.000 -39.97
316935.000 8354655.000 -39.98
316935.000 8354665.000 -40.01
316935.000 8354675.000 -40.09
316935.000 8354685.000 -40.15
316935.000 8354695.000 -40.15
316935.000 8354705.000 -40.11
316935.000 8354715.000 -40.07
316935.000 8354725.000 -40.03
316945.000 8354595.000 -39.96
316945.000 8354605.000 -39.87
В файл Geo tiff горизонтали с подписями каждые 5 и 10 метров. Единственное что я нашёл
https://alex.miller.im/posts/contour-plots-in-python-matplotlib-x-y-z/ Но как объединить этот код в единое решение с выгрузкой результата в файл .dxf пока не знаю.
Ответы (1 шт):
Ну собственно, построить изолинии в матплотлиб не так у ж и сложно:
import pandas as pd
import matplotlib.pyplot as plt
from scipy.interpolate import griddata
from matplotlib.backends.backend_pdf import PdfPages
import numpy as np
df = pd.read_csv("1.csv", header=None)
fig, ax = plt.subplots(figsize=(4, 14))
xi = np.linspace(df[0].min()-1, df[0].max()+1, 100)
yi = np.linspace(df[1].min()-1, df[1].max()+1, 100)
xi, yi = np.meshgrid(xi, yi)
zi = griddata((df[0], df[1]), df[2], (xi, yi), method='linear')
levels = np.linspace(df[2].min(), df[2].max(), 6)
cs = ax.contour(xi, yi, zi, levels=levels)
ax.clabel(cs, cs.levels, inline=True, fontsize=10)
ax.set_aspect('equal')
plt.savefig("iso.png")
Что касается выгрузки в GeoTiff - тут я готовой библиотеки не нашел, а вот в dxf выгрузить можно. сначала только нужно установить модуль ezdxf. Единственное, с обозначением изолиний уж разбирайтесь сами, и перед выгрузкой отключите ax.clabel (закомментируйте), иначе в полилиниях будут пробелы:
import ezdxf
from ezdxf import colors
from ezdxf.enums import TextEntityAlignment
doc = ezdxf.new(dxfversion="R2010")
doc.layers.add("LAYER1", color=colors.RED)
msp = doc.modelspace()
idx=0
for item in cs.collections:
for i in item.get_paths():
v = i.vertices
z = [levels[idx]]*len(v)
msp.add_lwpolyline(v, dxfattribs={'color': idx, "elevation": levels[idx]})
idx+=1
doc.saveas("test1.dxf")
получите такое (плоские полилинии с параметром elevation равным координатам Z контура):

