06-04-2018, 16:00
Nie wspominałeś, że to ma być 3D.
Teraz skrypt zwraca geometrię 3D, zarówno do pliku wczytanego do QGIS (tam dodałem jeszcze atrybuty min h i max h), jak i do dxf - musisz sobie ustalić ścieżki, nazwy plików itp.
Teraz skrypt zwraca geometrię 3D, zarówno do pliku wczytanego do QGIS (tam dodałem jeszcze atrybuty min h i max h), jak i do dxf - musisz sobie ustalić ścieżki, nazwy plików itp.
Kod:
from osgeo import ogr
from itertools import takewhile
from qgis.core import *
from qgis.PyQt.QtCore import *
from numpy import mean as srednia
#sciezka do pliku z tekstem
plik = 'h:/python/asci/N-34-80-C-d-2_z.asc'
plik_dxf = 'h:/python/asci/N-34-80-C-d-2_z.dxf'
obiekty = []
i = 1
with open(plik) as f:
for line in f:
if line.startswith('Start'):
data = takewhile(lambda x: not x.startswith("End"),f)
linia = ogr.Geometry(ogr.wkbLineString)
wys = []
for wiersz in data:
wsp = wiersz.split(' ')
linia.AddPoint(float(wsp[1]),float(wsp[0]), float(wsp[2]) )
wys.append(float(wsp[2]))
wys_sr = format(srednia(wys),'.2f')
wys_max = format(max(wys),'.2f')
wys_min = format(min(wys),'.2f')
gotowa_geom = linia.ExportToWkt()
geom = QgsGeometry.fromWkt(gotowa_geom)
ob = [i, wys_sr, geom,wys_max, wys_min]
obiekty.append(ob)
i += 1
warstwa_liniowa = QgsVectorLayer("LineString?crs=epsg:2180", 'test', "memory")
pr = warstwa_liniowa.dataProvider()
warstwa_liniowa.startEditing()
pr.addAttributes([QgsField('ID', QVariant.Int)])
pr.addAttributes([QgsField('WYS', QVariant.Double)])
pr.addAttributes([QgsField('MAX_WYS', QVariant.Double)])
pr.addAttributes([QgsField('MIN_WYS', QVariant.Double)])
warstwa_liniowa.commitChanges()
caps = warstwa_liniowa.dataProvider().capabilities()
if caps & QgsVectorDataProvider.AddFeatures:
feat=QgsFeature(warstwa_liniowa.pendingFields())
for feature in obiekty:
feat.setAttribute('ID', feature[0])
feat.setAttribute('WYS', feature[1])
feat.setAttribute('MAX_WYS', feature[3])
feat.setAttribute('MIN_WYS', feature[4])
feat.setGeometry(feature[2])
warstwa_liniowa.addFeatures([feat])
(res, outFeats) = warstwa_liniowa.dataProvider().addFeatures([feat])
warstwa_liniowa.commitChanges()
warstwa_liniowa.updateExtents()
QgsMapLayerRegistry.instance().addMapLayer(warstwa_liniowa, True)
QgsVectorFileWriter.writeAsVectorFormat(warstwa_liniowa, plik_dxf, "utf-8", warstwa_liniowa.crs(), "DXF", skipAttributeCreation=True)