kopia lustrzana https://github.com/OpenDroneMap/WebODM
Shapefile support
rodzic
c8c0f51805
commit
0e7d9ee6f2
|
@ -14,6 +14,7 @@ def calc_contours(dem, epsg, interval, output_format, simplify):
|
||||||
import subprocess
|
import subprocess
|
||||||
import tempfile
|
import tempfile
|
||||||
import shutil
|
import shutil
|
||||||
|
import glob
|
||||||
from webodm import settings
|
from webodm import settings
|
||||||
|
|
||||||
ext = ""
|
ext = ""
|
||||||
|
@ -62,6 +63,17 @@ def calc_contours(dem, epsg, interval, output_format, simplify):
|
||||||
if not os.path.isfile(outfile):
|
if not os.path.isfile(outfile):
|
||||||
return {'error': f'Cannot find output file: {outfile}'}
|
return {'error': f'Cannot find output file: {outfile}'}
|
||||||
|
|
||||||
|
if output_format == "ESRI Shapefile":
|
||||||
|
ext="zip"
|
||||||
|
shp_dir = os.path.join(tmpdir, "contours")
|
||||||
|
os.makedirs(shp_dir)
|
||||||
|
contour_files = glob.glob(os.path.join(tmpdir, "output.*"))
|
||||||
|
for cf in contour_files:
|
||||||
|
shutil.move(cf, shp_dir)
|
||||||
|
|
||||||
|
shutil.make_archive(os.path.join(tmpdir, 'output'), 'zip', shp_dir)
|
||||||
|
outfile = os.path.join(tmpdir, f"output.{ext}")
|
||||||
|
|
||||||
return {'file': outfile}
|
return {'file': outfile}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -1,93 +0,0 @@
|
||||||
#%module
|
|
||||||
#% description: Calculate contours
|
|
||||||
#%end
|
|
||||||
#%option
|
|
||||||
#% key: dem_file
|
|
||||||
#% type: string
|
|
||||||
#% required: yes
|
|
||||||
#% multiple: no
|
|
||||||
#% description: GeoTIFF DEM containing the surface to calculate contours
|
|
||||||
#%end
|
|
||||||
#%option
|
|
||||||
#% key: interval
|
|
||||||
#% type: double
|
|
||||||
#% required: yes
|
|
||||||
#% multiple: no
|
|
||||||
#% description: Contours interval
|
|
||||||
#%end
|
|
||||||
#%option
|
|
||||||
#% key: format
|
|
||||||
#% type: string
|
|
||||||
#% required: yes
|
|
||||||
#% multiple: no
|
|
||||||
#% description: OGR output format
|
|
||||||
#%end
|
|
||||||
#%option
|
|
||||||
#% key: simplify
|
|
||||||
#% type: double
|
|
||||||
#% required: yes
|
|
||||||
#% multiple: no
|
|
||||||
#% description: OGR output format
|
|
||||||
#%end
|
|
||||||
#%option
|
|
||||||
#% key: epsg
|
|
||||||
#% type: string
|
|
||||||
#% required: yes
|
|
||||||
#% multiple: no
|
|
||||||
#% description: target EPSG code
|
|
||||||
#%end
|
|
||||||
|
|
||||||
# output: If successful, prints the full path to the contours file. Otherwise it prints "error"
|
|
||||||
|
|
||||||
import sys
|
|
||||||
import glob
|
|
||||||
import os
|
|
||||||
import shutil
|
|
||||||
from grass.pygrass.modules import Module
|
|
||||||
import grass.script as grass
|
|
||||||
import subprocess
|
|
||||||
|
|
||||||
def main():
|
|
||||||
ext = ""
|
|
||||||
if opts['format'] == "GeoJSON":
|
|
||||||
ext = "json"
|
|
||||||
elif opts['format'] == "GPKG":
|
|
||||||
ext = "gpkg"
|
|
||||||
elif opts['format'] == "DXF":
|
|
||||||
ext = "dxf"
|
|
||||||
elif opts['format'] == "ESRI Shapefile":
|
|
||||||
ext = "shp"
|
|
||||||
|
|
||||||
MIN_CONTOUR_LENGTH = 5
|
|
||||||
Module("r.external", input=opts['dem_file'], output="dem", overwrite=True)
|
|
||||||
Module("g.region", raster="dem")
|
|
||||||
Module("r.contour", input="dem", output="contours", step=opts["interval"], overwrite=True)
|
|
||||||
Module("v.generalize", input="contours", output="contours_smooth", method="douglas", threshold=opts["simplify"], overwrite=True)
|
|
||||||
Module("v.generalize", input="contours_smooth", output="contours_simplified", method="chaiken", threshold=1, overwrite=True)
|
|
||||||
Module("v.generalize", input="contours_simplified", output="contours_final", method="douglas", threshold=opts["simplify"], overwrite=True)
|
|
||||||
Module("v.edit", map="contours_final", tool="delete", threshold=[-1,0,-MIN_CONTOUR_LENGTH], query="length")
|
|
||||||
Module("v.out.ogr", input="contours_final", output="temp.gpkg", format="GPKG")
|
|
||||||
|
|
||||||
subprocess.check_call(["ogr2ogr", "-t_srs", "EPSG:%s" % opts['epsg'],
|
|
||||||
'-overwrite', '-f', opts["format"], "output.%s" % ext, "temp.gpkg"], stdout=subprocess.DEVNULL)
|
|
||||||
|
|
||||||
if os.path.isfile("output.%s" % ext):
|
|
||||||
if opts["format"] == "ESRI Shapefile":
|
|
||||||
ext="zip"
|
|
||||||
os.makedirs("contours")
|
|
||||||
contour_files = glob.glob("output.*")
|
|
||||||
for cf in contour_files:
|
|
||||||
shutil.move(cf, os.path.join("contours", os.path.basename(cf)))
|
|
||||||
|
|
||||||
shutil.make_archive('output', 'zip', 'contours/')
|
|
||||||
|
|
||||||
print(os.path.join(os.getcwd(), "output.%s" % ext))
|
|
||||||
else:
|
|
||||||
print("error")
|
|
||||||
|
|
||||||
return 0
|
|
||||||
|
|
||||||
if __name__ == "__main__":
|
|
||||||
opts, _ = grass.parser()
|
|
||||||
sys.exit(main())
|
|
||||||
|
|
Ładowanie…
Reference in New Issue