diff --git a/urbantools/.DS_Store b/urbantools/.DS_Store new file mode 100644 index 0000000..7300f40 Binary files /dev/null and b/urbantools/.DS_Store differ diff --git a/urbantools/svf/.DS_Store b/urbantools/svf/.DS_Store new file mode 100644 index 0000000..7fdec46 Binary files /dev/null and b/urbantools/svf/.DS_Store differ diff --git a/urbantools/svf/code/create_patches.py b/urbantools/svf/code/create_patches.py new file mode 100644 index 0000000..ed59e63 --- /dev/null +++ b/urbantools/svf/code/create_patches.py @@ -0,0 +1,52 @@ +import numpy as np + +def create_patches(patch_option): + + deg2rad = np.pi/180 + + # patch_option = 1 = 145 patches (Robinson & Stone, 2004) + # patch_option = 2 = 153 patches (Wallenberg et al., 2022) + # patch_option = 3 = 306 patches -> test + # patch_option = 4 = 612 patches -> test + + skyvaultalt = np.atleast_2d([]) + skyvaultazi = np.atleast_2d([]) + + # Creating skyvault of patches of constant radians (Tregeneza and Sharples, 1993) + # Patch option 1, 145 patches, Original Robinson & Stone (2004) after Tregenza (1987)/Tregenza & Sharples (1993) + if patch_option == 1: + annulino = np.array([0, 12, 24, 36, 48, 60, 72, 84, 90]) + skyvaultaltint = np.array([6, 18, 30, 42, 54, 66, 78, 90]) # Robinson & Stone (2004) + azistart = np.array([0, 4, 2, 5, 8, 0, 10, 0]) # Fredrik/Nils + patches_in_band = np.array([30, 30, 24, 24, 18, 12, 6, 1]) # Robinson & Stone (2004) + # Patch option 2, 153 patches, Wallenberg et al. (2022) + elif patch_option == 2: + annulino = np.array([0, 12, 24, 36, 48, 60, 72, 84, 90]) + skyvaultaltint = np.array([6, 18, 30, 42, 54, 66, 78, 90]) # Robinson & Stone (2004) + azistart = np.array([0, 4, 2, 5, 8, 0, 10, 0]) # Fredrik/Nils + patches_in_band = np.array([31, 30, 28, 24, 19, 13, 7, 1]) # Nils + # Patch option 3, 306 patches, test + elif patch_option == 3: + annulino = np.array([0, 12, 24, 36, 48, 60, 72, 84, 90]) + skyvaultaltint = np.array([6, 18, 30, 42, 54, 66, 78, 90]) # Robinson & Stone (2004) + azistart = np.array([0, 4, 2, 5, 8, 0, 10, 0]) # Fredrik/Nils + patches_in_band = np.array([31*2, 30*2, 28*2, 24*2, 19*2, 13*2, 7*2, 1]) # Nils + # Patch option 4, 612 patches, test + elif patch_option == 4: + annulino = np.array([0, 4.5, 9, 15, 21, 27, 33, 39, 45, 51, 57, 63, 69, 75, 81, 90]) # Nils + skyvaultaltint = np.array([3, 9, 15, 21, 27, 33, 39, 45, 51, 57, 63, 69, 75, 81, 90]) # Nils + patches_in_band = np.array([31*2, 31*2, 30*2, 30*2, 28*2, 28*2, 24*2, 24*2, 19*2, 19*2, 13*2, 13*2, 7*2, 7*2, 1]) # Nils + azistart = np.array([0, 0, 4, 4, 2, 2, 5, 5, 8, 8, 0, 0, 10, 10, 0]) # Nils + + skyvaultaziint = np.array([360/patches for patches in patches_in_band]) + + for j in range(0, skyvaultaltint.shape[0]): + for k in range(0, patches_in_band[j]): + skyvaultalt = np.append(skyvaultalt, skyvaultaltint[j]) + skyvaultazi = np.append(skyvaultazi, k*skyvaultaziint[j] + azistart[j]) + + # skyvaultzen = (90 - skyvaultalt) * deg2rad + # skyvaultalt = skyvaultalt * deg2rad + # skyvaultazi = skyvaultazi * deg2rad + + return skyvaultalt, skyvaultazi, annulino, skyvaultaltint, patches_in_band, skyvaultaziint, azistart \ No newline at end of file diff --git a/urbantools/svf/code/misc.py b/urbantools/svf/code/misc.py new file mode 100644 index 0000000..c807766 --- /dev/null +++ b/urbantools/svf/code/misc.py @@ -0,0 +1,94 @@ +__author__ = 'xlinfr' + +import numpy as np +from osgeo import gdal, osr +from osgeo.gdalconst import GDT_Float32 + + +# Slope and aspect used in SEBE and Wall aspect +def get_ders(dsm, scale): + # dem,_,_=read_dem_grid(dem_file) + dx = 1/scale + # dx=0.5 + fy, fx = np.gradient(dsm, dx, dx) + asp, grad = cart2pol(fy, fx, 'rad') + slope = np.arctan(grad) + asp = asp * -1 + asp = asp + (asp < 0) * (np.pi * 2) + return slope, asp + + +def cart2pol(x, y, units='deg'): + radius = np.sqrt(x**2 + y**2) + theta = np.arctan2(y, x) + if units in ['deg', 'degs']: + theta = theta * 180 / np.pi + return theta, radius + + +def saveraster(gdal_data, filename, raster): + rows = gdal_data.RasterYSize + cols = gdal_data.RasterXSize + + outDs = gdal.GetDriverByName("GTiff").Create(filename, cols, rows, int(1), GDT_Float32) + outBand = outDs.GetRasterBand(1) + + # write the data + outBand.WriteArray(raster, 0, 0) + # flush data to disk, set the NoData value and calculate stats + outBand.FlushCache() + outBand.SetNoDataValue(-9999) + + # georeference the image and set the projection + outDs.SetGeoTransform(gdal_data.GetGeoTransform()) + outDs.SetProjection(gdal_data.GetProjection()) + +def saverasternd(gdal_data, filename, raster): + rows = gdal_data.RasterYSize + cols = gdal_data.RasterXSize + + outDs = gdal.GetDriverByName("GTiff").Create(filename, cols, rows, int(1), GDT_Float32) + outBand = outDs.GetRasterBand(1) + + # write the data + outBand.WriteArray(raster, 0, 0) + # flush data to disk, set the NoData value and calculate stats + outBand.FlushCache() + # outBand.SetNoDataValue(-9999) + + # georeference the image and set the projection + outDs.SetGeoTransform(gdal_data.GetGeoTransform()) + outDs.SetProjection(gdal_data.GetProjection()) + +def xy2latlon(crsWtkIn, x, y): + old_cs = osr.SpatialReference() + old_cs.ImportFromWkt(crsWtkIn) + + wgs84_wkt = """ + GEOGCS["WGS 84", + DATUM["WGS_1984", + SPHEROID["WGS 84",6378137,298.257223563, + AUTHORITY["EPSG","7030"]], + AUTHORITY["EPSG","6326"]], + PRIMEM["Greenwich",0, + AUTHORITY["EPSG","8901"]], + UNIT["degree",0.01745329251994328, + AUTHORITY["EPSG","9122"]], + AUTHORITY["EPSG","4326"]]""" + + new_cs = osr.SpatialReference() + new_cs.ImportFromWkt(wgs84_wkt) + + transform = osr.CoordinateTransformation(old_cs, new_cs) + + lonlat = transform.TransformPoint(x, y) + + gdalver = float(gdal.__version__[0]) + if gdalver >= 3.: + lon = lonlat[1] #changed to gdal 3 + lat = lonlat[0] #changed to gdal 3 + else: + lon = lonlat[0] #changed to gdal 2 + lat = lonlat[1] #changed to gdal 2 + + return lat, lon \ No newline at end of file diff --git a/urbantools/svf/code/run_svf_standalone.py b/urbantools/svf/code/run_svf_standalone.py new file mode 100644 index 0000000..bf9dd85 --- /dev/null +++ b/urbantools/svf/code/run_svf_standalone.py @@ -0,0 +1,156 @@ +""" +Standalone script for calculating the Sky View Factor (SVF) from a DSM in ASCII (.ASC) format. +The code corrects the header of the .ASC file (converting XLLCENTER/YLLCENTER to XLLCORNER/YLLCORNER), +loads the raster, performs the SVF calculation with the UMEP algorithm (svfForProcessing153 or svfForProcessing655), +and finally saves the result in GeoTIFF and CSV format. + +Optionally, it generates a heatmap of the result. + +Author: Aldo, UMEP +Dependencies: numpy, osgeo.gdal, pandas, matplotlib, UMEP functions (svf_functions.py) +""" + +import numpy as np +from osgeo import gdal +import os +import sys +import matplotlib.pyplot as plt +import pandas as pd +# === Aggiungi percorso funzioni UMEP === +sys.path.append(os.path.join(os.getcwd(), "functions")) +sys.path.append(os.path.join(os.getcwd(), "util")) +import svf_functions as svf # usa svfForProcessing153 o svfForProcessing655 + +tile = "dsm_demo" + +# === Parametri === +input_asc_path = f"data/{tile}.ASC" # <--- Inserisci il tuo DSM ASCII qui +corrected_asc_path = f"data/corrected_dsm_{tile}.asc" +output_svf_path = f"output/svf_{tile}.tif" + +ANISOTROPIC = True # True = 153 direzioni, False = 655 direzioni +TRANS_VEG = 0 # percentuale trasmissività vegetazione (0 se non presente) + +# === Funzione per correggere intestazione .ASC === +def fix_asc_header(input_path, output_path): + with open(input_path, 'r') as f: + lines = f.readlines() + + header = {} + data_start_idx = 0 + for i, line in enumerate(lines): + if line.strip().split()[0].upper() in ['NCOLS', 'NROWS', 'CELLSIZE', 'XLLCENTER', 'YLLCENTER', 'NODATA_VALUE']: + key, val = line.strip().split() + header[key.upper()] = float(val) + else: + data_start_idx = i + break + + if 'XLLCENTER' in header and 'YLLCENTER' in header: + header['XLLCORNER'] = header['XLLCENTER'] - header['CELLSIZE'] / 2 + header['YLLCORNER'] = header['YLLCENTER'] - header['CELLSIZE'] / 2 + + # Ricostruisci intestazione + new_header = [ + f"NCOLS {int(header['NCOLS'])}", + f"NROWS {int(header['NROWS'])}", + f"XLLCORNER {header['XLLCORNER']:.4f}", + f"YLLCORNER {header['YLLCORNER']:.4f}", + f"CELLSIZE {header['CELLSIZE']:.4f}", + f"NODATA_VALUE {int(header['NODATA_VALUE'])}" + ] + + with open(output_path, 'w') as f: + f.write('\n'.join(new_header) + '\n') + f.writelines(lines[data_start_idx:]) + + print(f"[INFO] Intestazione .ASC corretta: {output_path}") + +# === 1. Correggi intestazione .ASC === +fix_asc_header(input_asc_path, corrected_asc_path) + +# === 2. Carica DSM === +ds = gdal.Open(corrected_asc_path) +dsm = ds.ReadAsArray().astype(float) + +nd = ds.GetRasterBand(1).GetNoDataValue() +if nd is not None: + dsm[dsm == nd] = 0 + +if dsm.min() < 0: + dsm += abs(dsm.min()) + +gt = ds.GetGeoTransform() +pixel_res = gt[1] +scale = 1 / pixel_res +rows, cols = dsm.shape + +# === 3. Dummy array vegetazione === +veg = np.zeros_like(dsm) +veg2 = 0.0 +useveg = 0 + + +# === 4. Calcolo SVF === +class FakeFeedback: + def isCanceled(self): + return False + def setProgressText(self, text): + print(f"[FEEDBACK] {text}") + def setProgress(self, value): + print(f"[PROGRESS] {value}%") + +print("[INFO] Calcolo SVF...") +if ANISOTROPIC: + feedback = FakeFeedback() + result = svf.svfForProcessing153(dsm, veg, veg2, scale, useveg, pixel_res, False, None, feedback) +else: + result = svf.svfForProcessing655(dsm, veg, veg2, scale, useveg, feedback=None) + +svf_total = result["svf"] + +# === 5. Salva output === +driver = gdal.GetDriverByName('GTiff') +out_ds = driver.Create(output_svf_path, cols, rows, 1, gdal.GDT_Float32) +out_ds.SetGeoTransform(gt) +out_ds.SetProjection(ds.GetProjection()) +out_ds.GetRasterBand(1).WriteArray(svf_total) +out_ds.GetRasterBand(1).SetNoDataValue(0) +out_ds.FlushCache() + +print(f"[SUCCESS] SVF salvato in: {output_svf_path}") + + +# === 6. Crea CSV con coordinate e SVF === +print("[INFO] Generazione CSV...") + +x0, dx, _, y0, _, dy = gt +x_coords = x0 + dx * np.arange(cols) +y_coords = y0 + dy * np.arange(rows) +xx, yy = np.meshgrid(x_coords, y_coords) + +flat_coords = np.column_stack((xx.flatten(), yy.flatten())) +flat_svf = svf_total.flatten() + +# Rimuovi i punti nodata (dove SVF = 0 o NaN) +valid_mask = ~np.isnan(flat_svf) & (flat_svf > 0) +coords_strings = [f"{x:.2f},{y:.2f}" for x, y in flat_coords[valid_mask]] + +df = pd.DataFrame({ + "coordinate": coords_strings, + "svf": flat_svf[valid_mask] +}) + +csv_output_path = f"output/svf_{tile}.csv" +df.to_csv(csv_output_path, index=False) +print(f"[SUCCESS] CSV salvato in: {csv_output_path}") + + +print("[INFO] Visualizzazione Heatmap...") +plt.figure(figsize=(10, 8)) +plt.imshow(svf_total, cmap='coolwarm', origin='upper') +plt.colorbar(label="Sky View Factor") +plt.title("SVF Heatmap") +plt.axis("off") +plt.tight_layout() +plt.show() \ No newline at end of file diff --git a/urbantools/svf/code/shadowingfunction_wallheight_13.py b/urbantools/svf/code/shadowingfunction_wallheight_13.py new file mode 100644 index 0000000..b69522c --- /dev/null +++ b/urbantools/svf/code/shadowingfunction_wallheight_13.py @@ -0,0 +1,175 @@ +# -*- coding: utf-8 -*- +from __future__ import division +import numpy as np +from math import radians +# from scipy.ndimage.filters import median_filter + +def shade_on_walls(azimuth, aspect, walls, dsm, f): + # wall shadows wall parameterization + wallbol = (walls > 0).astype(float) + + # Removing walls in shadow due to selfshadowing + azilow = azimuth-np.pi/2 + azihigh = azimuth+np.pi/2 + + if azilow >= 0 and azihigh < 2*np.pi: # 90 to 270 (SHADOW) + facesh = (np.logical_or(aspect < azilow, aspect >= azihigh).astype(float)-wallbol+1) + elif azilow < 0 and azihigh <= 2*np.pi: # 0 to 90 + azilow = azilow + 2*np.pi + facesh = np.logical_or(aspect > azilow, aspect <= azihigh) * -1 + 1 # (SHADOW) # check for the -1 + elif azilow > 0 and azihigh >= 2*np.pi: # 270 to 360 + azihigh = azihigh-2*np.pi + facesh = np.logical_or(aspect > azilow, aspect <= azihigh)*-1 + 1 # (SHADOW) + + sh = np.copy(f-dsm) # shadow volume + facesun = np.logical_and(facesh + (walls > 0).astype(float) == 1, walls > 0).astype(float) + wallsun = np.copy(walls-sh) + wallsun[wallsun < 0] = 0 + wallsun[facesh == 1] = 0 # Removing walls in "self"-shadow + wallsh = np.copy(walls-wallsun) + + sh = np.logical_not(np.logical_not(sh)).astype(float) + sh = sh * -1 + 1 + + return sh, wallsh, wallsun, facesh, facesun + +def shadowingfunction_wallheight_13(a, azimuth, altitude, scale, walls, aspect, walls_scheme=False, aspect_scheme=False): + """ + This m.file calculates shadows on a DSM and shadow height on building + walls. + + INPUTS: + a = DSM + azimuth and altitude = sun position + scale= scale of DSM (1 meter pixels=1, 2 meter pixels=0.5) + walls= pixel row 'outside' buildings. will be calculated if empty + aspect = normal aspect of buildings walls + + OUTPUT: + sh=ground and roof shadow + wallsh = height of wall that is in shadow + wallsun = hieght of wall that is in sun + + Fredrik Lindberg 2012-03-19 + fredrikl@gvc.gu.se + + Utdate 2013-03-13 - bugfix for walls alinged with sun azimuths + + :param a: + :param azimuth: + :param altitude: + :param scale: + :param walls: + :param aspect: + :return: + """ + + if not walls.size: + """ + walls = ordfilt2(a,4,[0 1 0; 1 0 1; 0 1 0]) + walls = walls-a + walls[walls < 3]=0 + sizex = np.shape(a)[0] #might be wrong + sizey = np.shape(a)[1] + dirwalls = filter1Goodwin_as_aspect_v3(walls,sizex,sizey,scale,a); + aspect = dirwalls*np.pi/180 + """ + + # conversion + # degrees = np.pi/180 + azimuth = radians(azimuth) + altitude = radians(altitude) + + # measure the size of the image + sizex = np.shape(a)[0] + sizey = np.shape(a)[1] + + # initialise parameters + f = np.copy(a) + dx = 0 + dy = 0 + dz = 0 + temp = np.zeros((sizex, sizey)) + wallbol = (walls > 0).astype(float) + + # other loop parameters + amaxvalue = np.max(a) + pibyfour = np.pi/4 + threetimespibyfour = 3 * pibyfour + fivetimespibyfour = 5 * pibyfour + seventimespibyfour = 7 * pibyfour + sinazimuth = np.sin(azimuth) + cosazimuth = np.cos(azimuth) + tanazimuth = np.tan(azimuth) + signsinazimuth = np.sign(sinazimuth) + signcosazimuth = np.sign(cosazimuth) + dssin = np.abs(1/sinazimuth) + dscos = np.abs(1/cosazimuth) + tanaltitudebyscale = np.tan(altitude)/scale + + index = 1 + + # main loop + while (amaxvalue >= dz) and (np.abs(dx) < sizex) and (np.abs(dy) < sizey): + + if (pibyfour <= azimuth and azimuth < threetimespibyfour) or \ + (fivetimespibyfour <= azimuth and azimuth < seventimespibyfour): + dy = signsinazimuth * index + dx = -1 * signcosazimuth * np.abs(np.round(index / tanazimuth)) + ds = dssin + else: + dy = signsinazimuth * np.abs(np.round(index * tanazimuth)) + dx = -1 * signcosazimuth * index + ds = dscos + + # note: dx and dy represent absolute values while ds is an incremental value + dz = ds * index * tanaltitudebyscale + temp[0:sizex, 0:sizey] = 0 + + absdx = np.abs(dx) + absdy = np.abs(dy) + + xc1 = int((dx+absdx)/2) + xc2 = int(sizex+(dx-absdx)/2) + yc1 = int((dy+absdy)/2) + yc2 = int(sizey+(dy-absdy)/2) + + xp1 = int(-((dx-absdx)/2)) + xp2 = int(sizex-(dx+absdx)/2) + yp1 = int(-((dy-absdy)/2)) + yp2 = int(sizey-(dy+absdy)/2) + + temp[xp1:xp2, yp1:yp2] = a[xc1:xc2, yc1:yc2] - dz + f = np.fmax(f, temp) #Moving building shadow + + index = index + 1 + + # # Removing walls in shadow due to selfshadowing + # azilow = azimuth-np.pi/2 + # azihigh = azimuth+np.pi/2 + + # if azilow >= 0 and azihigh < 2*np.pi: # 90 to 270 (SHADOW) + # facesh = (np.logical_or(aspect < azilow, aspect >= azihigh).astype(float)-wallbol+1) + # elif azilow < 0 and azihigh <= 2*np.pi: # 0 to 90 + # azilow = azilow + 2*np.pi + # facesh = np.logical_or(aspect > azilow, aspect <= azihigh) * -1 + 1 # (SHADOW) # check for the -1 + # elif azilow > 0 and azihigh >= 2*np.pi: # 270 to 360 + # azihigh = azihigh-2*np.pi + # facesh = np.logical_or(aspect > azilow, aspect <= azihigh)*-1 + 1 # (SHADOW) + + # sh = np.copy(f-a) # shadow volume + # facesun = np.logical_and(facesh + (walls > 0).astype(float) == 1, walls > 0).astype(float) + # wallsun = np.copy(walls-sh) + # wallsun[wallsun < 0] = 0 + # wallsun[facesh == 1] = 0 # Removing walls in "self"-shadow + # wallsh = np.copy(walls-wallsun) + + # sh = np.logical_not(np.logical_not(sh)).astype(float) + # sh = sh * -1 + 1 + + sh, wallsh, wallsun, facesh, facesun = shade_on_walls(azimuth, aspect, walls, a, f) + if walls_scheme is not False: + sh_, wallsh_, wallsun_, facesh_, facesun_ = shade_on_walls(azimuth, aspect_scheme, walls_scheme, a, f) + shade_on_wall = wallsh_.copy() + + return (sh, wallsh, wallsun, facesh, facesun, shade_on_wall) if walls_scheme is not False else (sh, wallsh, wallsun, facesh, facesun) diff --git a/urbantools/svf/code/shadowingfunction_wallheight_23.py b/urbantools/svf/code/shadowingfunction_wallheight_23.py new file mode 100644 index 0000000..0e4b3e4 --- /dev/null +++ b/urbantools/svf/code/shadowingfunction_wallheight_23.py @@ -0,0 +1,202 @@ +from __future__ import division +import numpy as np +# import matplotlib.pylab as plt + +def shade_on_walls(azimuth, aspect, walls, dsm, f, shvoveg): + # wall shadows wall parameterization + wallbol = (walls > 0).astype(float) + + # Removing walls in shadow due to selfshadowing + azilow = azimuth - np.pi/2 + azihigh = azimuth + np.pi/2 + if azilow >= 0 and azihigh < 2*np.pi: # 90 to 270 (SHADOW) + facesh = np.logical_or(aspect < azilow, aspect >= azihigh).astype(float) - wallbol + 1 # TODO check + elif azilow < 0 and azihigh <= 2*np.pi: # 0 to 90 + azilow = azilow + 2*np.pi + facesh = np.logical_or(aspect > azilow, aspect <= azihigh) * -1 + 1 # (SHADOW) + elif azilow > 0 and azihigh >= 2*np.pi: # 270 to 360 + azihigh -= 2 * np.pi + facesh = np.logical_or(aspect > azilow, aspect <= azihigh)*-1 + 1 # (SHADOW) + + shvo = f - dsm # building shadow volume + facesun = np.logical_and(facesh + (walls > 0).astype(float) == 1, walls > 0).astype(float) + wallsun = np.copy(walls-shvo) + wallsun[wallsun < 0] = 0 + wallsun[facesh == 1] = 0 # Removing walls in "self"-shadow + wallsh = np.copy(walls-wallsun) + + wallshve = shvoveg * wallbol + wallshve = wallshve - wallsh + wallshve[wallshve < 0] = 0 + id = np.where(wallshve > walls) + wallshve[id] = walls[id] + wallsun = wallsun-wallshve # problem with wallshve only + id = np.where(wallsun < 0) + wallshve[id] = 0 + wallsun[id] = 0 + # if np.sum(wallshve <= 0) == wallshve.size: + # wallshve[:, :] = 0 + + return wallsh, wallsun, wallshve, facesh, facesun + +def shadowingfunction_wallheight_23(a, vegdem, vegdem2, azimuth, altitude, scale, amaxvalue, bush, walls, aspect, walls_scheme=False, aspect_scheme=False): + """ + This function calculates shadows on a DSM and shadow height on building + walls including both buildings and vegetion units. + New functionallity to deal with pergolas, August 2021 + + INPUTS: + a = DSM + vegdem = Vegetation canopy DSM (magl) + vegdem2 = Trunkzone DSM (magl) + azimuth and altitude = sun position + scale= scale of DSM (1 meter pixels=1, 2 meter pixels=0.5) + walls= pixel row 'outside' buildings. will be calculated if empty + aspect=normal aspect of walls + + OUTPUT: + sh=ground and roof shadow + + wallsh = height of wall that is in shadow + wallsun = hieght of wall that is in sun + + original Matlab code: + Fredrik Lindberg 2013-08-14 + fredrikl@gvc.gu.se + + :param a: + :param vegdem: + :param vegdem2: + :param azimuth: + :param altitude: + :param scale: + :param amaxvalue: + :param bush: + :param walls: + :param aspect: + :return: + """ + + # conversion + degrees = np.pi/180. + azimuth *= degrees + altitude *= degrees + + # measure the size of the image + sizex = np.shape(a)[0] + sizey = np.shape(a)[1] + + # initialise parameters + dx = 0 + dy = 0 + dz = 0 + temp = np.zeros((sizex, sizey)) + tempvegdem = np.zeros((sizex, sizey)) + tempvegdem2 = np.zeros((sizex, sizey)) + templastfabovea = np.zeros((sizex, sizey)) + templastgabovea = np.zeros((sizex, sizey)) + bushplant = bush > 1 + sh = np.zeros((sizex, sizey)) #shadows from buildings + vbshvegsh = np.copy(sh) #vegetation blocking buildings + vegsh = np.add(np.zeros((sizex, sizey)), bushplant, dtype=float) #vegetation shadow + f = np.copy(a) + shvoveg = np.copy(vegdem) # for vegetation shadowvolume + # g = np.copy(sh) + wallbol = (walls > 0).astype(float) + + # other loop parameters + pibyfour = np.pi/4 + threetimespibyfour = 3*pibyfour + fivetimespibyfour = 5*pibyfour + seventimespibyfour = 7*pibyfour + sinazimuth = np.sin(azimuth) + cosazimuth = np.cos(azimuth) + tanazimuth = np.tan(azimuth) + signsinazimuth = np.sign(sinazimuth) + signcosazimuth = np.sign(cosazimuth) + dssin = np.abs(1/sinazimuth) + dscos = np.abs(1/cosazimuth) + tanaltitudebyscale = np.tan(altitude)/scale + + index = 0 + + # new case with pergola (thin vertical layer of vegetation), August 2021 + dzprev = 0 + + # main loop + while (amaxvalue >= dz) and (np.abs(dx) < sizex) and (np.abs(dy) < sizey): + if ((pibyfour <= azimuth) and (azimuth < threetimespibyfour)) or ((fivetimespibyfour <= azimuth) and (azimuth < seventimespibyfour)): + dy = signsinazimuth * index + dx = -1 * signcosazimuth * np.abs(np.round(index / tanazimuth)) + ds = dssin + else: + dy = signsinazimuth * np.abs(np.round(index * tanazimuth)) + dx = -1 * signcosazimuth * index + ds = dscos + + # note: dx and dy represent absolute values while ds is an incremental value + dz = (ds * index) * tanaltitudebyscale + tempvegdem[0:sizex, 0:sizey] = 0 + tempvegdem2[0:sizex, 0:sizey] = 0 + temp[0:sizex, 0:sizey] = 0 + templastfabovea[0:sizex, 0:sizey] = 0. + templastgabovea[0:sizex, 0:sizey] = 0. + absdx = np.abs(dx) + absdy = np.abs(dy) + xc1 = int((dx+absdx)/2) + xc2 = int(sizex+(dx-absdx)/2) + yc1 = int((dy+absdy)/2) + yc2 = int(sizey+(dy-absdy)/2) + xp1 = -int((dx-absdx)/2) + xp2 = int(sizex-(dx+absdx)/2) + yp1 = -int((dy-absdy)/2) + yp2 = int(sizey-(dy+absdy)/2) + + tempvegdem[xp1:xp2, yp1:yp2] = vegdem[xc1:xc2, yc1:yc2] - dz + tempvegdem2[xp1:xp2, yp1:yp2] = vegdem2[xc1:xc2, yc1:yc2] - dz + temp[xp1:xp2, yp1:yp2] = a[xc1:xc2, yc1:yc2]-dz + + f = np.fmax(f, temp) #Moving building shadow + shvoveg = np.fmax(shvoveg, tempvegdem) # moving vegetation shadow volume + + sh[f > a] = 1 + sh[f <= a] = 0 + fabovea = (tempvegdem > a).astype(int) #vegdem above DEM + gabovea = (tempvegdem2 > a).astype(int) #vegdem2 above DEM + + #new pergola condition + templastfabovea[xp1:xp2, yp1:yp2] = vegdem[xc1:xc2, yc1:yc2]-dzprev + templastgabovea[xp1:xp2, yp1:yp2] = vegdem2[xc1:xc2, yc1:yc2]-dzprev + lastfabovea = templastfabovea > a + lastgabovea = templastgabovea > a + dzprev = dz + vegsh2 = np.add(np.add(np.add(fabovea, gabovea, dtype=float),lastfabovea, dtype=float),lastgabovea, dtype=float) + vegsh2[vegsh2 == 4] = 0. + # vegsh2[vegsh2 == 1] = 0. # This one is the ultimate question... + vegsh2[vegsh2 > 0] = 1. + + vegsh = np.fmax(vegsh, vegsh2) + vegsh[vegsh*sh > 0] = 0 + vbshvegsh = np.copy(vegsh) + vbshvegsh # removing shadows 'behind' buildings + + index += 1 + + sh = 1-sh + vbshvegsh[vbshvegsh > 0] = 1 + vbshvegsh = vbshvegsh-vegsh + + vegsh[vegsh > 0] = 1 + shvoveg = (shvoveg-a) * vegsh #Vegetation shadow volume + vegsh = 1-vegsh + vbshvegsh = 1-vbshvegsh + #print(np.max(shvoveg)) + wallsh, wallsun, wallshve, facesh, facesun = shade_on_walls(azimuth, aspect, walls, a, f, shvoveg) + #print(np.max(wallshve)) + if walls_scheme is not False: + wallsh_, wallsun_, wallshve_, facesh_, facesun_ = shade_on_walls(azimuth, aspect_scheme, walls_scheme, a, f, shvoveg) + #print(np.max(wallshve_)) + shade_on_wall = wallsh_.copy() + shade_on_wall[shade_on_wall < wallshve_] = wallshve_[shade_on_wall < wallshve_] + + #return vegsh, sh, vbshvegsh, wallsh, wallsun, wallshve, facesh, facesun, shade_on_wall + return (vegsh, sh, vbshvegsh, wallsh, wallsun, wallshve, facesh, facesun, shade_on_wall) if walls_scheme is not False else (vegsh, sh, vbshvegsh, wallsh, wallsun, wallshve, facesh, facesun) \ No newline at end of file diff --git a/urbantools/svf/code/shadowingfunctions.py b/urbantools/svf/code/shadowingfunctions.py new file mode 100644 index 0000000..e501c9d --- /dev/null +++ b/urbantools/svf/code/shadowingfunctions.py @@ -0,0 +1,610 @@ +# -*- coding: utf-8 -*- +# Ready for python action! +import numpy as np +from math import radians +import matplotlib.pylab as plt +# from numba import jit + +def shadowingfunctionglobalradiation(a, azimuth, altitude, scale, feedback, forsvf): + + #%This m.file calculates shadows on a DEM + #% conversion + degrees = np.pi/180. + # if azimuth == 0.0: + # azimuth = 0.000000000001 + azimuth = np.dot(azimuth, degrees) + altitude = np.dot(altitude, degrees) + #% measure the size of the image + sizex = a.shape[0] + sizey = a.shape[1] + if forsvf == 0: + barstep = np.max([sizex, sizey]) + total = 100. / barstep #dlg.progressBar.setRange(0, barstep) + #% initialise parameters + f = a + dx = 0. + dy = 0. + dz = 0. + temp = np.zeros((sizex, sizey)) + index = 1. + #% other loop parameters + amaxvalue = a.max() + pibyfour = np.pi/4. + threetimespibyfour = 3.*pibyfour + fivetimespibyfour = 5.*pibyfour + seventimespibyfour = 7.*pibyfour + sinazimuth = np.sin(azimuth) + cosazimuth = np.cos(azimuth) + tanazimuth = np.tan(azimuth) + signsinazimuth = np.sign(sinazimuth) + signcosazimuth = np.sign(cosazimuth) + dssin = np.abs((1./sinazimuth)) + dscos = np.abs((1./cosazimuth)) + tanaltitudebyscale = np.tan(altitude) / scale + #% main loop + while (amaxvalue >= dz and np.abs(dx) < sizex and np.abs(dy) < sizey): + if forsvf == 0: + feedback.setProgress(int(index * total)) + # dlg.progressBar.setValue(index) + #while np.logical_and(np.logical_and(amaxvalue >= dz, np.abs(dx) <= sizex), np.abs(dy) <= sizey):(np.logical_and(amaxvalue >= dz, np.abs(dx) <= sizex), np.abs(dy) <= sizey): + #if np.logical_or(np.logical_and(pibyfour <= azimuth, azimuth < threetimespibyfour), np.logical_and(fivetimespibyfour <= azimuth, azimuth < seventimespibyfour)): + if (pibyfour <= azimuth and azimuth < threetimespibyfour or fivetimespibyfour <= azimuth and azimuth < seventimespibyfour): + dy = signsinazimuth * index + dx = -1. * signcosazimuth * np.abs(np.round(index / tanazimuth)) + ds = dssin + else: + dy = signsinazimuth * np.abs(np.round(index * tanazimuth)) + dx = -1. * signcosazimuth * index + ds = dscos + + #% note: dx and dy represent absolute values while ds is an incremental value + dz = ds *index * tanaltitudebyscale + temp[0:sizex, 0:sizey] = 0. + absdx = np.abs(dx) + absdy = np.abs(dy) + xc1 = (dx+absdx)/2.+1. + xc2 = sizex+(dx-absdx)/2. + yc1 = (dy+absdy)/2.+1. + yc2 = sizey+(dy-absdy)/2. + xp1 = -((dx-absdx)/2.)+1. + xp2 = sizex-(dx+absdx)/2. + yp1 = -((dy-absdy)/2.)+1. + yp2 = sizey-(dy+absdy)/2. + temp[int(xp1)-1:int(xp2), int(yp1)-1:int(yp2)] = a[int(xc1)-1:int(xc2), int(yc1)-1:int(yc2)]-dz + # f = np.maximum(f, temp) # bad performance in python3. Replaced with fmax + f = np.fmax(f, temp) + index += 1. + + f = f-a + f = np.logical_not(f) + sh = np.double(f) + + return sh + +# @jit(nopython=True) +def shadowingfunction_20(a, vegdem, vegdem2, azimuth, altitude, scale, amaxvalue, bush, feedback, forsvf): + + # plt.ion() + # fig = plt.figure(figsize=(24, 7)) + # plt.axis('image') + # ax1 = plt.subplot(2, 3, 1) + # ax2 = plt.subplot(2, 3, 2) + # ax3 = plt.subplot(2, 3, 3) + # ax4 = plt.subplot(2, 3, 4) + # ax5 = plt.subplot(2, 3, 5) + # ax6 = plt.subplot(2, 3, 6) + # ax1.title.set_text('fabovea') + # ax2.title.set_text('gabovea') + # ax3.title.set_text('vegsh at ' + str(altitude)) + # ax4.title.set_text('lastfabovea') + # ax5.title.set_text('lastgabovea') + # ax6.title.set_text('vegdem') + + # This function casts shadows on buildings and vegetation units. + # New capability to deal with pergolas 20210827 + + # conversion + degrees = np.pi/180. + azimuth = azimuth * degrees + altitude = altitude * degrees + + # measure the size of grid + sizex = a.shape[0] + sizey = a.shape[1] + + # progressbar for svf plugin + if forsvf == 0: + barstep = np.max([sizex, sizey]) + total = 100. / barstep + feedback.setProgress(0) + # dlg.progressBar.setRange(0, barstep) + # dlg.progressBar.setValue(0) + + # initialise parameters + dx = 0. + dy = 0. + dz = 0. + temp = np.zeros((sizex, sizey)) + tempvegdem = np.zeros((sizex, sizey)) + tempvegdem2 = np.zeros((sizex, sizey)) + templastfabovea = np.zeros((sizex, sizey)) + templastgabovea = np.zeros((sizex, sizey)) + bushplant = bush > 1. + sh = np.zeros((sizex, sizey)) #shadows from buildings + vbshvegsh = np.zeros((sizex, sizey)) #vegetation blocking buildings + vegsh = np.add(np.zeros((sizex, sizey)), bushplant, dtype=float) #vegetation shadow + f = a + + pibyfour = np.pi / 4. + threetimespibyfour = 3. * pibyfour + fivetimespibyfour = 5.* pibyfour + seventimespibyfour = 7. * pibyfour + sinazimuth = np.sin(azimuth) + cosazimuth = np.cos(azimuth) + tanazimuth = np.tan(azimuth) + signsinazimuth = np.sign(sinazimuth) + signcosazimuth = np.sign(cosazimuth) + dssin = np.abs((1./sinazimuth)) + dscos = np.abs((1./cosazimuth)) + tanaltitudebyscale = np.tan(altitude) / scale + # index = 1 + index = 0 + + # new case with pergola (thin vertical layer of vegetation), August 2021 + dzprev = 0 + + # main loop + while (amaxvalue >= dz) and (np.abs(dx) < sizex) and (np.abs(dy) < sizey): + if forsvf == 0: + feedback.setProgress(int(index * total)) #dlg.progressBar.setValue(index) + if ((pibyfour <= azimuth) and (azimuth < threetimespibyfour) or (fivetimespibyfour <= azimuth) and (azimuth < seventimespibyfour)): + dy = signsinazimuth * index + dx = -1. * signcosazimuth * np.abs(np.round(index / tanazimuth)) + ds = dssin + else: + dy = signsinazimuth * np.abs(np.round(index * tanazimuth)) + dx = -1. * signcosazimuth * index + ds = dscos + # note: dx and dy represent absolute values while ds is an incremental value + dz = (ds * index) * tanaltitudebyscale + tempvegdem[0:sizex, 0:sizey] = 0. + tempvegdem2[0:sizex, 0:sizey] = 0. + temp[0:sizex, 0:sizey] = 0. + templastfabovea[0:sizex, 0:sizey] = 0. + templastgabovea[0:sizex, 0:sizey] = 0. + absdx = np.abs(dx) + absdy = np.abs(dy) + xc1 = int((dx+absdx)/2.) + xc2 = int(sizex+(dx-absdx)/2.) + yc1 = int((dy+absdy)/2.) + yc2 = int(sizey+(dy-absdy)/2.) + xp1 = int(-((dx-absdx)/2.)) + xp2 = int(sizex-(dx+absdx)/2.) + yp1 = int(-((dy-absdy)/2.)) + yp2 = int(sizey-(dy+absdy)/2.) + + tempvegdem[xp1:xp2, yp1:yp2] = vegdem[xc1:xc2, yc1:yc2] - dz + tempvegdem2[xp1:xp2, yp1:yp2] = vegdem2[xc1:xc2, yc1:yc2] - dz + temp[xp1:xp2, yp1:yp2] = a[xc1:xc2, yc1:yc2]-dz + + f = np.fmax(f, temp) #Moving building shadow + sh[(f > a)] = 1. + sh[(f <= a)] = 0. + fabovea = tempvegdem > a #vegdem above DEM + gabovea = tempvegdem2 > a #vegdem2 above DEM + + #new pergola condition + templastfabovea[xp1:xp2, yp1:yp2] = vegdem[xc1:xc2, yc1:yc2]-dzprev + templastgabovea[xp1:xp2, yp1:yp2] = vegdem2[xc1:xc2, yc1:yc2]-dzprev + lastfabovea = templastfabovea > a + lastgabovea = templastgabovea > a + dzprev = dz + vegsh2 = np.add(np.add(np.add(fabovea, gabovea, dtype=float),lastfabovea, dtype=float),lastgabovea, dtype=float) + vegsh2[vegsh2 == 4] = 0. + # vegsh2[vegsh2 == 1] = 0. # This one is the ultimate question... + vegsh2[vegsh2 > 0] = 1. + + vegsh = np.fmax(vegsh, vegsh2) + vegsh[(vegsh * sh > 0.)] = 0. + vbshvegsh = vegsh + vbshvegsh # removing shadows 'behind' buildings + + # im1 = ax1.imshow(fabovea) + # im2 = ax2.imshow(gabovea) + # im3 = ax3.imshow(vegsh) + # im4 = ax4.imshow(lastfabovea) + # im5 = ax5.imshow(lastgabovea) + # im6 = ax6.imshow(vegshtest) + # im1 = ax1.imshow(tempvegdem) + # im2 = ax2.imshow(tempvegdem2) + # im3 = ax3.imshow(vegsh) + # im4 = ax4.imshow(templastfabovea) + # im5 = ax5.imshow(templastgabovea) + # im6 = ax6.imshow(vegshtest) + # plt.show() + # plt.pause(0.05) + + index += 1. + + sh = 1.-sh + vbshvegsh[(vbshvegsh > 0.)] = 1. + vbshvegsh = vbshvegsh-vegsh + vegsh = 1.-vegsh + vbshvegsh = 1.-vbshvegsh + + # plt.close() + # plt.ion() + # fig = plt.figure(figsize=(24, 7)) + # plt.axis('image') + # ax1 = plt.subplot(1, 3, 1) + # im1 = ax1.imshow(vegsh) + # plt.colorbar(im1) + + # ax2 = plt.subplot(1, 3, 2) + # im2 = ax2.imshow(vegdem2) + # plt.colorbar(im2) + # plt.title('TDSM') + + # ax3 = plt.subplot(1, 3, 3) + # im3 = ax3.imshow(vegdem) + # plt.colorbar(im3) + # plt.tight_layout() + # plt.title('CDSM') + # plt.show() + # plt.pause(0.05) + + shadowresult = {'sh': sh, 'vegsh': vegsh, 'vbshvegsh': vbshvegsh} + + return shadowresult + + +def shadowingfunction_20_old(a, vegdem, vegdem2, azimuth, altitude, scale, amaxvalue, bush, dlg, forsvf): + + #% This function casts shadows on buildings and vegetation units + #% conversion + degrees = np.pi/180. + if azimuth == 0.0: + azimuth = 0.000000000001 + azimuth = np.dot(azimuth, degrees) + altitude = np.dot(altitude, degrees) + #% measure the size of the image + sizex = a.shape[0] + sizey = a.shape[1] + #% initialise parameters + if forsvf == 0: + barstep = np.max([sizex, sizey]) + dlg.progressBar.setRange(0, barstep) + dlg.progressBar.setValue(0) + + dx = 0. + dy = 0. + dz = 0. + temp = np.zeros((sizex, sizey)) + tempvegdem = np.zeros((sizex, sizey)) + tempvegdem2 = np.zeros((sizex, sizey)) + sh = np.zeros((sizex, sizey)) + vbshvegsh = np.zeros((sizex, sizey)) + vegsh = np.zeros((sizex, sizey)) + tempbush = np.zeros((sizex, sizey)) + f = a + g = np.zeros((sizex, sizey)) + bushplant = bush > 1. + pibyfour = np.pi/4. + threetimespibyfour = 3.*pibyfour + fivetimespibyfour = 5.*pibyfour + seventimespibyfour = 7.*pibyfour + sinazimuth = np.sin(azimuth) + cosazimuth = np.cos(azimuth) + tanazimuth = np.tan(azimuth) + signsinazimuth = np.sign(sinazimuth) + signcosazimuth = np.sign(cosazimuth) + dssin = np.abs((1./sinazimuth)) + dscos = np.abs((1./cosazimuth)) + tanaltitudebyscale = np.tan(altitude) / scale + index = 1 + + #% main loop + while (amaxvalue >= dz and np.abs(dx) < sizex and np.abs(dy) < sizey): + if forsvf == 0: + dlg.progressBar.setValue(index) + if (pibyfour <= azimuth and azimuth < threetimespibyfour or fivetimespibyfour <= azimuth and azimuth < seventimespibyfour): + dy = signsinazimuth * index + dx = -1. * signcosazimuth * np.abs(np.round(index / tanazimuth)) + ds = dssin + else: + dy = signsinazimuth * np.abs(np.round(index * tanazimuth)) + dx = -1. * signcosazimuth * index + ds = dscos + #% note: dx and dy represent absolute values while ds is an incremental value + dz = np.dot(np.dot(ds, index), tanaltitudebyscale) + tempvegdem[0:sizex, 0:sizey] = 0. + tempvegdem2[0:sizex, 0:sizey] = 0. + temp[0:sizex, 0:sizey] = 0. + absdx = np.abs(dx) + absdy = np.abs(dy) + xc1 = (dx+absdx)/2.+1. + xc2 = sizex+(dx-absdx)/2. + yc1 = (dy+absdy)/2.+1. + yc2 = sizey+(dy-absdy)/2. + xp1 = -((dx-absdx)/2.)+1. + xp2 = sizex-(dx+absdx)/2. + yp1 = -((dy-absdy)/2.)+1. + yp2 = sizey-(dy+absdy)/2. + tempvegdem[int(xp1)-1:int(xp2), int(yp1)-1:int(yp2)] = vegdem[int(xc1)-1:int(xc2), int(yc1)-1:int(yc2)]-dz + tempvegdem2[int(xp1)-1:int(xp2), int(yp1)-1:int(yp2)] = vegdem2[int(xc1)-1:int(xc2), int(yc1)-1:int(yc2)]-dz + temp[int(xp1)-1:int(xp2), int(yp1)-1:int(yp2)] = a[int(xc1)-1:int(xc2), int(yc1)-1:int(yc2)]-dz + # f = np.maximum(f, temp) # bad performance in python3. Replaced with fmax + f = np.fmax(f, temp) + sh[(f > a)] = 1. + sh[(f <= a)] = 0. + #%Moving building shadow + fabovea = tempvegdem > a + #%vegdem above DEM + gabovea = tempvegdem2 > a + #%vegdem2 above DEM + # vegsh2 = np.float(fabovea)-np.float(gabovea) + vegsh2 = np.subtract(fabovea, gabovea, dtype=float) + # vegsh = np.maximum(vegsh, vegsh2) # bad performance in python3. Replaced with fmax + vegsh = np.fmax(vegsh, vegsh2) + vegsh[(vegsh*sh > 0.)] = 0. + #% removing shadows 'behind' buildings + vbshvegsh = vegsh+vbshvegsh + #% vegsh at high sun altitudes + if index == 1.: + firstvegdem = tempvegdem-temp + firstvegdem[(firstvegdem <= 0.)] = 1000. + vegsh[(firstvegdem < dz)] = 1. + vegsh = vegsh*(vegdem2 > a) + vbshvegsh = np.zeros((sizex, sizey)) + + #% Bush shadow on bush plant + if np.logical_and(bush.max() > 0., np.max((fabovea*bush)) > 0.): + tempbush[0:sizex, 0:sizey] = 0. + tempbush[int(xp1)-1:int(xp2), int(yp1)-1:int(yp2)] = bush[int(xc1)-1:int(xc2),int(yc1)-1:int(yc2)]-dz + # g = np.maximum(g, tempbush) # bad performance in python3. Replaced with fmax + g = np.fmax(g, tempbush) + g *= bushplant + index += 1. + + sh = 1.-sh + vbshvegsh[(vbshvegsh > 0.)] = 1. + vbshvegsh = vbshvegsh-vegsh + + if bush.max() > 0.: + g = g-bush + g[(g > 0.)] = 1. + g[(g < 0.)] = 0. + vegsh = vegsh-bushplant+g + vegsh[(vegsh<0.)] = 0. + + vegsh[(vegsh > 0.)] = 1. + vegsh = 1.-vegsh + vbshvegsh = 1.-vbshvegsh + + shadowresult = {'sh': sh, 'vegsh': vegsh, 'vbshvegsh': vbshvegsh} + + return shadowresult + +def shadowingfunction_findwallID(dsm, azimuth, altitude, scale, walls, uniqueWallIDs, dem, wall2d_id, voxel_height, voxelId_list, facesh, wall_dict, sh): + """ + This function identifies what wall id and voxel height that is seen from a ground pixel + + INPUTS: + dsm = Digital surface model + azimuth and altitude = sun position in degrees + scale= scale of DSM (1 meter pixels=1, 2 meter pixels=0.5) + uniqueWallIDs = pixel row 'outside' buildings. will be calculated if empty + walls = height of walls + dem = Digital elevation model. (Should be excluded in future to incorporate ground elevation) + + OUTPUT: + buildIDSeen = ID seen from ground pixel + voxelHeight = Wall height shadow volume + + Fredrik Lindberg 2023-02-16 + fredrikl@gvc.gu.se + + """ + + # Remove ground heights + dsm = dsm-dem + # buildings = 1 - ((dsm) > 0) + dsm[dsm < 0.5] = 0 + + # conversion, degrees to radians + azimuth = radians(azimuth) + altitude = radians(altitude) + + # measure the size of the image + rows = np.shape(dsm)[0] + cols = np.shape(dsm)[1] + + # initialise parameters + f = np.copy(dsm) + buildIDSeen = np.zeros((rows, cols)) + # h = np.zeros((rows, cols)) + + dx = 0 + dy = 0 + dz = 0 + temp = np.zeros((rows, cols)) + temp2 = np.zeros((rows, cols)) # walls + tempwallID = np.zeros((rows, cols)) + uniqueWallIDsOrig = np.copy(uniqueWallIDs) + + voxelHeight = np.zeros((rows, cols)) + temp3 = np.ones((rows, cols)) + + # other loop parameters + amaxvalue = np.max(dsm) + pibyfour = np.pi/4 + threetimespibyfour = 3 * pibyfour + fivetimespibyfour = 5 * pibyfour + seventimespibyfour = 7 * pibyfour + sinazimuth = np.sin(azimuth) + cosazimuth = np.cos(azimuth) + tanazimuth = np.tan(azimuth) + signsinazimuth = np.sign(sinazimuth) + signcosazimuth = np.sign(cosazimuth) + dssin = np.abs(1/sinazimuth) + dscos = np.abs(1/cosazimuth) + tanaltitudebyscale = np.tan(altitude)/scale + + index = 1 + + # main loop + while (amaxvalue >= dz) and (np.abs(dx) < rows) and (np.abs(dy) < cols): + + if (pibyfour <= azimuth and azimuth < threetimespibyfour) or \ + (fivetimespibyfour <= azimuth and azimuth < seventimespibyfour): + dy = signsinazimuth * index + dx = -1 * signcosazimuth * np.abs(np.round(index / tanazimuth)) + ds = dssin + else: + dy = signsinazimuth * np.abs(np.round(index * tanazimuth)) + dx = -1 * signcosazimuth * index + ds = dscos + + # note: dx and dy represent absolute values while ds is an incremental value + dz = ds * index * tanaltitudebyscale + temp[0:rows, 0:cols] = 0 + temp2[0:rows, 0:cols] = 0 + + absdx = np.abs(dx) + absdy = np.abs(dy) + + xc1 = int((dx+absdx)/2) + xc2 = int(rows+(dx-absdx)/2) + yc1 = int((dy+absdy)/2) + yc2 = int(cols+(dy-absdy)/2) + + xp1 = int(-((dx-absdx)/2)) + xp2 = int(rows-(dx+absdx)/2) + yp1 = int(-((dy-absdy)/2)) + yp2 = int(cols-(dy+absdy)/2) + + wallSeen = facesh + uniqueWallIDs = uniqueWallIDs * wallSeen + # uniqueWallIDs = ((uniqueWallIDs - firstMove) < 0) * uniqueWallIDsOrig + uniqueWallIDs # adding missing corner + # wallSeenHeight = walls * wallSeen + + # temp2[xp1:xp2, yp1:yp2] = wallSeenHeight[xc1:xc2, yc1:yc2] - dz # Moving wall shadow + # Moving wall id + tempwallID[xp1:xp2, yp1:yp2] = uniqueWallIDs[xc1:xc2, yc1:yc2] + + # Get wall height from wall id + temp_wallHeight = np.vectorize(wall_dict.__getitem__)(tempwallID) + + # Descending wall, how much of the wall that is still above ground level + temp2 = temp_wallHeight - dz + + # buildIDSeen = Wall pixels/voxels seen, i.e. only voxels that are positive (above ground level) (temp2 > 0). + # temp3 indicates those pixels that the walls have not progressed into yet (saved in previous iteration). + buildIDSeen = (temp2 > 0) * temp3 * tempwallID + buildIDSeen + + # voxelHeight = (temp2 > 0) * temp3 * temp2 + voxelHeight # seen wall heights + + # voxelHeight = the elevation on a wall that is seen from a pixel with the given altitude and azimuth (only above ground leve, i.e. (temp2 > 0)). + # voxelHeight = wall height - descending wall, i.e. temp_wallHeight - temp2. Only applicable to pixels where there is no value from previous iterations (temp3). + voxelHeight = (temp2 > 0) * temp3 * (temp_wallHeight - temp2) + voxelHeight + # voxelHeight = (temp2 > 0) * temp3 * (temp_wallHeight - (temp2 * (temp2 > 0))) + voxelHeight # seen wall heights + + # Remember pixels previous iteration that walls have not progressed into yet. + temp3 = np.copy(temp2 <= 0) * (buildIDSeen == 0) + + index += 1 + + # Ceil voxel height values to integers + voxelHeight_ceil = np.ceil(voxelHeight) + # voxelHeight_ceil = np.round(voxelHeight) + + # Empty raster to fill with voxel IDs + voxelId = np.zeros((rows, cols)) + # Convert wall2d_id from list to numpy array + wall2d_id = np.array(wall2d_id) + # Convert voxel_height from list to numpy array + voxel_height = np.array(voxel_height) + # Convert voxelId_list from list to numpy array + voxelId_list = np.array(voxelId_list, dtype=int) + + # Flatten buildIDseen from matrix to array + a = buildIDSeen.flatten() + # Flatten voxelHeight_ceil from matrix to array + b = voxelHeight_ceil.flatten() + # Combine the two above arrays into an n by 2 array + c = np.column_stack([a, b]) + # Find unique values in c + d = np.unique(c, axis=0) + # Remove rows where both columns are zero + # d = d[((d[:,0] > 0) & (d[:,1] > 0)), :] + # d = d[d[:,:] > 0, :] + d = d[~np.all(d == 0, axis=1)] + # d = d[d[:, 0] > 0, :] + # d = d[d[:, 1] > 0, :] + + not_in_list = 0 + in_list = 0 + # Fill voxelId matrix with unique voxel IDs + for temp_id, temp_height in d: + # print(str(temp_id) + ' ' + str(temp_height)) + temp_fill_id = voxelId_list[((wall2d_id == temp_id) & (voxel_height == temp_height))] + if temp_fill_id.__len__() > 0: + # print('temp_fill_id = ' + str(temp_fill_id)) + voxelId[(buildIDSeen == temp_id) & (voxelHeight_ceil == temp_height)] = temp_fill_id + in_list += 1 + else: + not_in_list += 1 + buildIDSeen[(buildIDSeen == temp_id) & (voxelHeight_ceil == temp_height)] = 0 + voxelHeight_ceil[(buildIDSeen == temp_id) & (voxelHeight_ceil == temp_height)] = 0 + + # if ((np.any(buildIDSeen == temp_id) & ~np.all(voxelHeight_ceil == temp_height)) or (~np.all(buildIDSeen == temp_id) & np.any(voxelHeight_ceil == temp_height))): + # print('temp_id = ' + str(temp_id)) + # print('temp_height = ' + str(temp_height)) + + # ax = plt.subplot(1, 2, 1) + # im = ax.imshow(buildIDSeen, vmin=0, vmax=uniqueWallIDs.max()) + # ax1 = plt.subplot(1, 2, 2) + # im = ax1.imshow(voxelHeight, vmin=0, vmax=40) + # plt.pause(0.1) # In interactive mode, need a small delay to get the plot to appear + # plt.draw() + + # Correct for shadows, i.e. remove weird pixels on top of buildings etc + buildIDSeen = buildIDSeen * (1 - sh) + voxelHeight = voxelHeight * (1 - sh) + voxelId = voxelId * (1 - sh) + + return buildIDSeen, voxelHeight, voxelId + + + +# temp[xp1:xp2, yp1:yp2] = dsm[xc1:xc2, yc1:yc2] - dz +# f = np.fmax(f, temp) #Moving building shadow + +# if index == 1: #Remove walls on "wrong" side of buildings during first iteration + +# firstMove = (f-dsm) > 0 +# if (pibyfour <= azimuth and azimuth < threetimespibyfour) or \ +# (fivetimespibyfour <= azimuth and azimuth < seventimespibyfour): +# dy = signsinazimuth * index +# dx = -1 * signcosazimuth +# else: +# dy = signsinazimuth +# dx = -1 * signcosazimuth * index + +# absdx = np.abs(dx) +# absdy = np.abs(dy) + +# xc1b = int((dx+absdx)/2) +# xc2b = int(rows+(dx-absdx)/2) +# yc1b = int((dy+absdy)/2) +# yc2b = int(cols+(dy-absdy)/2) + +# xp1b = int(-((dx-absdx)/2)) +# xp2b = int(rows-(dx+absdx)/2) +# yp1b = int(-((dy-absdy)/2)) +# yp2b = int(cols-(dy+absdy)/2) + +# temp[xp1b:xp2b, yp1b:yp2b] = dsm[xc1b:xc2b, yc1b:yc2b] + + # wallSeen = temp-dsm + # wallSeen[wallSeen > 0] = 1 + # wallSeen[wallSeen < 0] = 0 \ No newline at end of file diff --git a/urbantools/svf/code/svf_for_voxels.py b/urbantools/svf/code/svf_for_voxels.py new file mode 100644 index 0000000..91ccc2f --- /dev/null +++ b/urbantools/svf/code/svf_for_voxels.py @@ -0,0 +1,301 @@ +import numpy as np + +from sklearn.cluster import KMeans + +import time +import svf_functions as svf +import wallalgorithms as wa + +def wallscheme_prepare(dsm, scale, pixel_resolution, feedback): + total = 100. / (int(dsm.shape[0] * dsm.shape[1])) + walls = wa.findwalls_sp(dsm, 2, np.array([[1, 1, 1], [1, 0, 1], [1, 1, 1]])) + walls_copy = np.copy(walls) + aspect = wa.filter1Goodwin_as_aspect_v3(walls_copy, scale, dsm, feedback, 100) + + # Copy to keep exact height values + walls_exact = walls.copy() + + # Rounding wall heights (ceil or round?) + # walls_round = np.round(walls).astype(int) + walls_round = np.ceil(walls).astype(int) + + # create wall IDs + wall_rows, wall_cols = np.where(walls_round > 0) + voxel_height = list() + wall2d_id = list() + wall_height = list() + wall_height_exact = list() + y_position = list() + x_position = list() + index = 1 + uniqueWallIDs = np.zeros((dsm.shape[0], dsm.shape[1])) + for i in np.arange(wall_rows.shape[0]): + uniqueWallIDs[wall_rows[i], wall_cols[i]] = index + number_of_voxels = int(walls_round[wall_rows[i], wall_cols[i]] / pixel_resolution) + #temp_aspect = wallAspect[wall_rows[i], wall_cols[i]] + voxel_index = 1 + for j in range(1, number_of_voxels+1): + # wall_id.append(voxel_index) + wall2d_id.append(index) + voxel_height.append(j * pixel_resolution) + wall_height.append(walls_round[wall_rows[i], wall_cols[i]]) + wall_height_exact.append(walls_exact[wall_rows[i], wall_cols[i]]) + y_position.append(wall_rows[i]) + x_position.append(wall_cols[i]) + #wall_aspect.append(temp_aspect) + + voxel_index += 1 + + index += 1 + + wall2d_id.append(0) + voxel_height.append(0) + wall_height.append(0) + wall_height_exact.append(0) + y_position.append(0) + x_position.append(0) + + wall_dict = {} + for A, B in zip(wall2d_id, wall_height_exact): + wall_dict[A] = B + + # saveraster(dataSet, output_uniquewallid, uniqueWallIDs) + + # Unique IDs for each voxel + voxelId_list = np.arange(1, wall2d_id.__len__()+1) + + # Table with unique voxel ID, height of voxel, total height of wall, unique ID of wall (based on 2D-location in raster) and y and x coordinates + voxelTable = np.column_stack([voxelId_list, voxel_height, wall_height, wall_height_exact, wall2d_id, y_position, x_position]) + + return voxelTable, voxelId_list, wall_dict, walls, aspect, uniqueWallIDs, wall2d_id, voxel_height + +def svf_for_voxels(dsm, dem, vegdsm, vegdsm2, transVeg, scale, usevegdem, pixel_resolution, voxelTable, + svf_height, svf_array, svfbu_array, svfveg_array, svfaveg_array, svf_height_array, feedback): + + '''This function calculates sky view factor at all voxel levels''' + + # Calculate where there are buildings and not. Used to elevate dem. + ground = dsm - dem + # Ground == 1 = ground + ground[ground < 2] = 1. + # Ground == 0 = buildings + ground[ground >= 2] = 0. + + # Find maximum wall height, used to estimate how many iterations of svf_calc that are required + maxWallHeight = np.max(voxelTable[:,2]) - svf_height + + # Counter to feedback current iteration + counter = 1 + # How many iterations are required to calculate svf for all voxels + loop_range = np.arange(svf_height, maxWallHeight + svf_height, svf_height) + + # Loop for svf calculations of all voxel heights + for i in loop_range: + + feedback.setProgressText('SVF calculation number ' + str(int(counter)) + ' of ' + str(int(loop_range.shape[0]))) + + feedback.setProgressText('Increasing ground level with ' + str(i) + ' meters.') + + # Elevate ground in dsm + temp_dsm = ((dsm + i) * ground) + (dsm * (1 - ground)) + + if usevegdem == 1: + # Subtract from cdsm + temp_cdsm = vegdsm - i + temp_cdsm[temp_cdsm < 0] = 0 + # Subtract from tdsm + temp_cdsm2 = vegdsm2 - i + temp_cdsm2[temp_cdsm2 < 0] = 0 + else: + temp_cdsm = dsm * 0. + temp_cdsm2 = dsm * 0. + # Calculate svf. wallScheme set to 0 as only svf is estimated and nothing on the location of voxels, etc. + wallScheme = 0 + ret_ = svf.svfForProcessing153(temp_dsm, temp_cdsm, temp_cdsm2, scale, usevegdem, pixel_resolution, wallScheme, dem, feedback) + svfbu = ret_["svf"] + + if usevegdem == 0: + svftotal = svfbu + svfveg = ret_['svfveg'] + svfaveg = ret_['svfaveg'] + else: + svfveg = ret_["svfveg"] + svfaveg = ret_["svfaveg"] + trans = transVeg / 100.0 + svftotal = (svfbu - (1 - svfveg) * (1 - trans)) + + # Get svf for each voxel + voxel_y = np.where(voxelTable[:, 1] == i + svf_height)# +svf_height) + for temp_y in voxel_y[0]: + svf_array[temp_y] = svftotal[int(voxelTable[temp_y, 5]), int(voxelTable[temp_y, 6])] + svfbu_array[temp_y] = svfbu[int(voxelTable[temp_y, 5]), int(voxelTable[temp_y, 6])] + svfveg_array[temp_y] = svfveg[int(voxelTable[temp_y, 5]), int(voxelTable[temp_y, 6])] + svfaveg_array[temp_y] = svfaveg[int(voxelTable[temp_y, 5]), int(voxelTable[temp_y, 6])] + svf_height_array[temp_y] = i + svf_height# +svf_height + + if feedback.isCanceled(): + feedback.setProgressText("Calculation cancelled") + break + + counter += 1 + + svf_05 = svf_array.copy() + svf_05[svf_05 > 0.5] = 0.5 + + # Add svf arrays as volumns to voxelTable + voxelTable = np.column_stack([voxelTable, svf_height_array, svf_array, svf_05, svfbu_array, svfveg_array, svfaveg_array]) + + return voxelTable + +def svf_kmeans(dsm, dem, vegdsm, vegdsm2, wallHeights, transVeg, scale, usevegdem, pixel_resolution, voxelTable, clusters, + svf_height, svf_array, svfbu_array, svfveg_array, svfaveg_array, svf_height_array, feedback): + + # Calculate where there are buildings and not. Used to elevate dem. + ground = dsm - dem + # Ground == 1 = ground + ground[ground < 2] = 1. + # Ground == 0 = buildings + ground[ground >= 2] = 0. + + # building_heights = dsm - dem + + # Reshape data for clustering + # data_reshaped = building_heights.reshape(-1, 1) + data_reshaped = wallHeights.reshape(-1, 1) + + # Apply K-means clustering + # clusters = 3 # Number of clusters + kmeans = KMeans(n_clusters=clusters, random_state=0) + labels = kmeans.fit_predict(data_reshaped) + + # Reshape the labels back to the original data shape + kmeans_clusters = labels.reshape(dsm.shape[0], dsm.shape[1]) + + # Remove cluster representing ground areas, i.e. where dsm - dem = 0 + cluster_range = np.arange(clusters) + # cluster_range = cluster_range[cluster_range != np.unique(kmeans_clusters[ground == 1])] + + # Array to store mean heights of clusters + cluster_heights = np.zeros((cluster_range.shape[0])) + + counter = 0 + for i in cluster_range: + # cluster_heights[counter] = np.round(building_heights[kmeans_clusters == i].mean()) + cluster_heights[counter] = np.round(wallHeights[kmeans_clusters == i].mean()) - svf_height # Remove svf_height which is the voxel size to be below the top of the wall + counter += 1 + + # Unique heights based on mean height of clusters, sorted from min to max + cluster_heights = np.unique(cluster_heights) + cluster_heights = cluster_heights[cluster_heights > 0] + + # Counter to feedback current iteration + counter = 0 + + for i in cluster_heights: + if cluster_heights.shape[0] > 1: + feedback.setProgressText('SVF calculation based on K-means. Calculation ' + str(int(counter + 1)) + ' of ' + str(int(cluster_heights.shape[0])) + ' clusters.') + feedback.setProgressText('Mean wall height of cluster is ' + str(int(i + svf_height)) + ' meters. Increasing ground level with ' + str(int(i)) + ' meters.') + + # Elevate ground in dsm + temp_dsm = ((dsm + i) * ground) + (dsm * (1 - ground)) + # temp_dsm = dsm[ground == 1] + temp_mean + + if usevegdem == 1: + # Subtract from cdsm + temp_cdsm = vegdsm - i + temp_cdsm[temp_cdsm < 0] = 0 + # Subtract from tdsm + temp_cdsm2 = vegdsm2 - i + temp_cdsm2[temp_cdsm2 < 0] = 0 + else: + temp_cdsm = dsm * 0. + temp_cdsm2 = dsm * 0. + + # Calculate svf. wallScheme set to 0 as only svf is estimated and nothing on the location of voxels, etc. + wallScheme = 0 + ret_ = svf.svfForProcessing153(temp_dsm, temp_cdsm, temp_cdsm2, scale, usevegdem, pixel_resolution, wallScheme, dem, feedback) + svfbu = ret_["svf"] + + if usevegdem == 0: + svftotal = svfbu + svfveg = ret_['svfveg'] + svfaveg = ret_['svfaveg'] + else: + svfveg = ret_["svfveg"] + svfaveg = ret_["svfaveg"] + trans = transVeg / 100.0 + svftotal = (svfbu - (1 - svfveg) * (1 - trans)) + + # Get svf for each voxel + voxel_y = np.where(voxelTable[:, 1] == i + svf_height)# +svf_height) + for temp_y in voxel_y[0]: + svf_array[temp_y] = svftotal[int(voxelTable[temp_y, 5]), int(voxelTable[temp_y, 6])] + svfbu_array[temp_y] = svfbu[int(voxelTable[temp_y, 5]), int(voxelTable[temp_y, 6])] + svfveg_array[temp_y] = svfveg[int(voxelTable[temp_y, 5]), int(voxelTable[temp_y, 6])] + svfaveg_array[temp_y] = svfaveg[int(voxelTable[temp_y, 5]), int(voxelTable[temp_y, 6])] + svf_height_array[temp_y] = i + svf_height + + if i == cluster_heights[-1]: + temp_data = voxelTable[voxelTable[:, 2] > i, :] # Get all walls that are taller than the mean of the lowest cluster + unique_walls = np.unique(temp_data[:, 4]) # Get their unique wall ids for slicing + for unique_wall in unique_walls: # Loop over all unique walls lower than lowest cluster + temp_wall = temp_data[temp_data[:, 4] == unique_wall, :][:, 1].max() # Max height of highest voxel in unique_wall + temp_y = np.where((voxelTable[:, 4] == unique_wall) & (voxelTable[:, 1] == temp_wall))[0] # Get row of unique_wall and highest voxel in voxelTable + + svf_array[temp_y] = 0.5 # Set svf to 0.5 as these are the highest voxels and nothing or little should obstruct it, i.e. svf = 0.5 + svfbu_array[temp_y] = svfbu[int(voxelTable[temp_y, 5]), int(voxelTable[temp_y, 6])] # save svfbu for current wall pixel + svfveg_array[temp_y] = svfveg[int(voxelTable[temp_y, 5]), int(voxelTable[temp_y, 6])] # save svfveg for current wall pixel + svfaveg_array[temp_y] = svfaveg[int(voxelTable[temp_y, 5]), int(voxelTable[temp_y, 6])] # save svfaveg for current wall pixel + svf_height_array[temp_y] = temp_wall # set svf_height to highest voxel for current wall + # Add 0.5 to highest voxel on walls that are lower than cluster with lowest mean height + else: + if counter == 0: + temp_data = voxelTable[voxelTable[:, 2] < i, :] # Get all walls that are lower than the mean of the lowest cluster + else: + temp_data = voxelTable[(voxelTable[:, 2] > cluster_heights[counter - 1]) & (voxelTable[:, 2] < i), :] + unique_walls = np.unique(temp_data[:, 4]) # Get their unique wall ids for slicing + for unique_wall in unique_walls: # Loop over all unique walls lower than lowest cluster + temp_wall = temp_data[temp_data[:, 4] == unique_wall, :][:, 1].max() # Max height of highest voxel in unique_wall + temp_y = np.where((voxelTable[:, 4] == unique_wall) & (voxelTable[:, 1] == temp_wall))[0] # Get row of unique_wall and highest voxel in voxelTable + temp_svf = svftotal[int(voxelTable[temp_y, 5]), int(voxelTable[temp_y, 6])] # get the calculated svf for the wall pixel to check if it is higher or lower than 0.5 + if temp_svf < 0.5: # if current wall pixel is lower than 0.5, although it is estimated above the wall, save it at the highest voxel and use for interpolation + svf_array[temp_y] = temp_svf + else: # else, give highest voxel a value of 0.5 + svf_array[temp_y] = 0.5 + svfbu_array[temp_y] = svfbu[int(voxelTable[temp_y, 5]), int(voxelTable[temp_y, 6])] # save svfbu for current wall pixel + svfveg_array[temp_y] = svfveg[int(voxelTable[temp_y, 5]), int(voxelTable[temp_y, 6])] # save svfveg for current wall pixel + svfaveg_array[temp_y] = svfaveg[int(voxelTable[temp_y, 5]), int(voxelTable[temp_y, 6])] # save svfaveg for current wall pixel + svf_height_array[temp_y] = temp_wall # set svf_height to highest voxel for current wall + + if feedback.isCanceled(): + feedback.setProgressText("Calculation cancelled") + break + + counter += 1 + + svf_05 = svf_array.copy() + svf_05[svf_05 > 0.5] = 0.5 + + # Add svf arrays as volumns to voxelTable + voxelTable = np.column_stack([voxelTable, svf_height_array, svf_array, svf_05, svfbu_array, svfveg_array, svfaveg_array]) + + return voxelTable, cluster_heights + +def interpolate_svf(voxelTable, cluster_heights, kmeans): + + unique_wall_pixels = np.unique(voxelTable[:, 4]) + unique_wall_pixels = unique_wall_pixels[unique_wall_pixels != 0] + for unique_wall in unique_wall_pixels: + temp_data = voxelTable[voxelTable[:, 4] == unique_wall, :] # All data for current wall pixel + temp_heights = temp_data[temp_data[:, -1] != 0, 1] # Voxel heights for current wall pixel where svf has been calculated + temp_svf = temp_data[temp_data[:, -1] != 0, -4] # SVF at voxel heights where svf has been calculated + if temp_heights.size == 1: + new_svf = temp_data[temp_data[:, -4] != 0, -4] + new_svf[new_svf == 0] = new_svf[new_svf != 0] + elif temp_heights.size > 1: # Interpolate + new_svf = np.interp(temp_data[:, 1], temp_heights, temp_svf) # SVF for all voxels from interpolated values of calculated SVF at different heights (depend on svf_height) + + voxelTable[voxelTable[:, 4] == unique_wall, -4] = new_svf # Add the new SVFs to table + + return voxelTable + diff --git a/urbantools/svf/code/svf_functions.py b/urbantools/svf/code/svf_functions.py new file mode 100644 index 0000000..a4a3564 --- /dev/null +++ b/urbantools/svf/code/svf_functions.py @@ -0,0 +1,379 @@ +import numpy as np +import shadowingfunctions as shadow +from create_patches import create_patches +#import findwalls +import wallalgorithms as wa +import svf_for_voxels as svfv +import shadowingfunction_wallheight_13 as shb +import shadowingfunction_wallheight_23 as shbv +# remove +from misc import saveraster +from osgeo import gdal, osr +from osgeo.gdalconst import * + +def annulus_weight(altitude, aziinterval): + n = 90. + steprad = (360./aziinterval) * (np.pi/180.) + annulus = 91.-altitude + w = (1./(2.*np.pi)) * np.sin(np.pi / (2.*n)) * np.sin((np.pi * (2. * annulus - 1.)) / (2. * n)) + weight = steprad * w + + return weight + +def svf_angles_100121(): + azi1 = np.arange(1., 360., 360./16.) #%22.5 + azi2 = np.arange(12., 360., 360./16.) #%22.5 + azi3 = np.arange(5., 360., 360./32.) #%11.25 + azi4 = np.arange(2., 360., 360./32.) #%11.25 + azi5 = np.arange(4., 360., 360./40.) #%9 + azi6 = np.arange(7., 360., 360./48.) #%7.50 + azi7 = np.arange(6., 360., 360./48.) #%7.50 + azi8 = np.arange(1., 360., 360./48.) #%7.50 + azi9 = np.arange(4., 359., 360./52.) #%6.9231 + azi10 = np.arange(5., 360., 360./52.) #%6.9231 + azi11 = np.arange(1., 360., 360./48.) #%7.50 + azi12 = np.arange(0., 359., 360./44.) #%8.1818 + azi13 = np.arange(3., 360., 360./44.) #%8.1818 + azi14 = np.arange(2., 360., 360./40.) #%9 + azi15 = np.arange(7., 360., 360./32.) #%10 + azi16 = np.arange(3., 360., 360./24.) #%11.25 + azi17 = np.arange(10., 360., 360./16.) #%15 + azi18 = np.arange(19., 360., 360./12.) #%22.5 + azi19 = np.arange(17., 360., 360./8.) #%45 + azi20 = 0. #%360 + iazimuth = np.array(np.hstack((azi1, azi2, azi3, azi4, azi5, azi6, azi7, azi8, azi9, azi10, azi11, azi12, azi13, + azi14, azi15, azi16, azi17, azi18, azi19, azi20))) + aziinterval = np.array(np.hstack((16., 16., 32., 32., 40., 48., 48., 48., 52., 52., 48., 44., 44., 40., 32., 24., + 16., 12., 8., 1.))) + angleresult = {'iazimuth': iazimuth, 'aziinterval': aziinterval} + + return angleresult + + +def svfForProcessing153(dsm, vegdem, vegdem2, scale, usevegdem, pixel_resolution, wallScheme, demlayer, feedback): + rows = dsm.shape[0] + cols = dsm.shape[1] + svf = np.zeros([rows, cols]) + svfE = np.zeros([rows, cols]) + svfS = np.zeros([rows, cols]) + svfW = np.zeros([rows, cols]) + svfN = np.zeros([rows, cols]) + svfveg = np.zeros((rows, cols)) + svfEveg = np.zeros((rows, cols)) + svfSveg = np.zeros((rows, cols)) + svfWveg = np.zeros((rows, cols)) + svfNveg = np.zeros((rows, cols)) + svfaveg = np.zeros((rows, cols)) + svfEaveg = np.zeros((rows, cols)) + svfSaveg = np.zeros((rows, cols)) + svfWaveg = np.zeros((rows, cols)) + svfNaveg = np.zeros((rows, cols)) + + # % amaxvalue + vegmax = vegdem.max() + amaxvalue = dsm.max() + amaxvalue = np.maximum(amaxvalue, vegmax) + + # % Elevation vegdems if buildingDSM inclused ground heights + vegdem = vegdem + dsm + vegdem[vegdem == dsm] = 0 + vegdem2 = vegdem2 + dsm + vegdem2[vegdem2 == dsm] = 0 + # % Bush separation + bush = np.logical_not((vegdem2 * vegdem)) * vegdem + + #index = int(0) + + # patch_option = 1 # 145 patches + patch_option = 2 # 153 patches + # patch_option = 3 # 306 patches + # patch_option = 4 # 612 patches + + # Create patches based on patch_option + skyvaultalt, skyvaultazi, annulino, skyvaultaltint, aziinterval, skyvaultaziint, azistart = create_patches(patch_option) + + skyvaultaziint = np.array([360/patches for patches in aziinterval]) + iazimuth = np.hstack(np.zeros((1, np.sum(aziinterval)))) # Nils + + shmat = np.zeros((rows, cols, np.sum(aziinterval))) + # shmat = np.ones((rows, cols, np.sum(aziinterval))) + vegshmat = np.zeros((rows, cols, np.sum(aziinterval))) + # vegshmat = np.ones((rows, cols, np.sum(aziinterval))) + vbshvegshmat = np.zeros((rows, cols, np.sum(aziinterval))) + # vbshvegshmat = np.ones((rows, cols, np.sum(aziinterval))) + + # Preparations for wall temperature scheme + if wallScheme: + voxelTable, voxelId_list, wall_dict, walls, aspect, uniqueWallIDs, wall2d_id, voxel_height = svfv.wallscheme_prepare(dsm, scale, pixel_resolution, feedback) + + # Rasters to fill with values in loop + all_buildIDSeen = np.zeros((rows, cols, skyvaultalt.shape[0])) + all_voxelHeight = np.zeros((rows, cols, skyvaultalt.shape[0])) + all_voxelId = np.zeros((rows, cols, skyvaultalt.shape[0])) + else: + voxelTable = 0 + allbuildIDSeen = 0 + allvoxelHeight = 0 + all_voxelId = 0 + walls = 0 + + index = 0 + for j in range(0, skyvaultaltint.shape[0]): + for k in range(0, int(360 / skyvaultaziint[j])): + iazimuth[index] = k * skyvaultaziint[j] + azistart[j] + if iazimuth[index] > 360.: + iazimuth[index] = iazimuth[index] - 360. + index = index + 1 + aziintervalaniso = np.ceil(aziinterval / 2.0) + index = int(0) + for i in range(0, skyvaultaltint.shape[0]): + for j in np.arange(0, (aziinterval[int(i)])): + if feedback.isCanceled(): + feedback.setProgressText("Calculation cancelled") + break + altitude = skyvaultaltint[int(i)] + azimuth = iazimuth[int(index)] + + # Casting shadow + if wallScheme: + if usevegdem == 1: + vegsh, sh, vbshvegsh, wallsh, wallsun, wallshve, facesh, facesun = shbv.shadowingfunction_wallheight_23(dsm, vegdem, vegdem2, azimuth, altitude, scale, amaxvalue, bush, walls, aspect * np.pi / 180) + vegshmat[:, :, index] = vegsh + vbshvegshmat[:, :, index] = vbshvegsh + else: + sh, wallsh, wallsun, facesh, facesun = shb.shadowingfunction_wallheight_13(dsm, azimuth, altitude, scale, walls, aspect * np.pi / 180.) + vegsh = np.ones((sh.shape[0], sh.shape[1])).astype(float) + vbshvegsh = np.ones((sh.shape[0], sh.shape[1])).astype(float) + vegshmat[:, :, index] = vegsh + vbshvegshmat[:, :, index] = vbshvegsh + else: + if usevegdem == 1: + shadowresult = shadow.shadowingfunction_20(dsm, vegdem, vegdem2, azimuth, altitude, + scale, amaxvalue, bush, feedback, 1) + vegsh = shadowresult["vegsh"] + vbshvegsh = shadowresult["vbshvegsh"] + vegshmat[:, :, index] = vegsh + vbshvegshmat[:, :, index] = vbshvegsh + sh = shadowresult["sh"] + else: + sh = shadow.shadowingfunctionglobalradiation(dsm, azimuth, altitude, scale, feedback, 1) + + shmat[:, :, index] = sh + + # Wall temperature scheme, i.e. finding out which voxel is seen from each pixel, where direction is patch azimuth and altitude + if wallScheme: + all_buildIDSeen[:,:, index], all_voxelHeight[:,:, index], all_voxelId[:,:, index] = shadow.shadowingfunction_findwallID(dsm, azimuth, altitude, scale, walls, uniqueWallIDs, demlayer, wall2d_id, voxel_height, voxelId_list, facesh, wall_dict, sh) + + # Calculate svfs + for k in np.arange(annulino[int(i)]+1, (annulino[int(i+1.)])+1): + weight = annulus_weight(k, aziinterval[i])*sh + svf = svf + weight + weight = annulus_weight(k, aziintervalaniso[i]) * sh + if (azimuth >= 0) and (azimuth < 180): + svfE = svfE + weight + if (azimuth >= 90) and (azimuth < 270): + svfS = svfS + weight + if (azimuth >= 180) and (azimuth < 360): + svfW = svfW + weight + if (azimuth >= 270) or (azimuth < 90): + svfN = svfN + weight + + if usevegdem == 1: + for k in np.arange(annulino[int(i)] + 1, (annulino[int(i + 1.)]) + 1): + # % changed to include 90 + weight = annulus_weight(k, aziinterval[i]) + svfveg = svfveg + weight * vegsh + svfaveg = svfaveg + weight * vbshvegsh + weight = annulus_weight(k, aziintervalaniso[i]) + if (azimuth >= 0) and (azimuth < 180): + svfEveg = svfEveg + weight * vegsh + svfEaveg = svfEaveg + weight * vbshvegsh + if (azimuth >= 90) and (azimuth < 270): + svfSveg = svfSveg + weight * vegsh + svfSaveg = svfSaveg + weight * vbshvegsh + if (azimuth >= 180) and (azimuth < 360): + svfWveg = svfWveg + weight * vegsh + svfWaveg = svfWaveg + weight * vbshvegsh + if (azimuth >= 270) or (azimuth < 90): + svfNveg = svfNveg + weight * vegsh + svfNaveg = svfNaveg + weight * vbshvegsh + + index += 1 + feedback.setProgress(int(index * (100. / np.sum(aziinterval)))) + + svfS = svfS + 3.0459e-004 + svfW = svfW + 3.0459e-004 + # % Last azimuth is 90. Hence, manual add of last annuli for svfS and SVFW + # %Forcing svf not be greater than 1 (some MATLAB crazyness) + svf[(svf > 1.)] = 1. + svfE[(svfE > 1.)] = 1. + svfS[(svfS > 1.)] = 1. + svfW[(svfW > 1.)] = 1. + svfN[(svfN > 1.)] = 1. + + if usevegdem == 1: + last = np.zeros((rows, cols)) + last[(vegdem2 == 0.)] = 3.0459e-004 + svfSveg = svfSveg + last + svfWveg = svfWveg + last + svfSaveg = svfSaveg + last + svfWaveg = svfWaveg + last + # %Forcing svf not be greater than 1 (some MATLAB crazyness) + svfveg[(svfveg > 1.)] = 1. + svfEveg[(svfEveg > 1.)] = 1. + svfSveg[(svfSveg > 1.)] = 1. + svfWveg[(svfWveg > 1.)] = 1. + svfNveg[(svfNveg > 1.)] = 1. + svfaveg[(svfaveg > 1.)] = 1. + svfEaveg[(svfEaveg > 1.)] = 1. + svfSaveg[(svfSaveg > 1.)] = 1. + svfWaveg[(svfWaveg > 1.)] = 1. + svfNaveg[(svfNaveg > 1.)] = 1. + + svfresult = {'svf': svf, 'svfE': svfE, 'svfS': svfS, 'svfW': svfW, 'svfN': svfN, + 'svfveg': svfveg, 'svfEveg': svfEveg, 'svfSveg': svfSveg, 'svfWveg': svfWveg, + 'svfNveg': svfNveg, 'svfaveg': svfaveg, 'svfEaveg': svfEaveg, 'svfSaveg': svfSaveg, + 'svfWaveg': svfWaveg, 'svfNaveg': svfNaveg, 'shmat': shmat, 'vegshmat': vegshmat, 'vbshvegshmat': vbshvegshmat, + 'voxelIds': all_voxelId, 'voxelTable': voxelTable, 'walls': walls} + # , + # 'vbshvegshmat': vbshvegshmat, 'wallshmat': wallshmat, 'wallsunmat': wallsunmat, + # 'wallshvemat': wallshvemat, 'facesunmat': facesunmat} + return svfresult + + +def svfForProcessing655(dsm, vegdem, vegdem2, scale, usevegdem, feedback): + rows = dsm.shape[0] + cols = dsm.shape[1] + svf = np.zeros([rows, cols]) + svfE = np.zeros([rows, cols]) + svfS = np.zeros([rows, cols]) + svfW = np.zeros([rows, cols]) + svfN = np.zeros([rows, cols]) + svfveg = np.zeros((rows, cols)) + svfEveg = np.zeros((rows, cols)) + svfSveg = np.zeros((rows, cols)) + svfWveg = np.zeros((rows, cols)) + svfNveg = np.zeros((rows, cols)) + svfaveg = np.zeros((rows, cols)) + svfEaveg = np.zeros((rows, cols)) + svfSaveg = np.zeros((rows, cols)) + svfWaveg = np.zeros((rows, cols)) + svfNaveg = np.zeros((rows, cols)) + + # % amaxvalue + vegmax = vegdem.max() + amaxvalue = dsm.max() + amaxvalue = np.maximum(amaxvalue, vegmax) + + # % Elevation vegdems if buildingDSM inclused ground heights + vegdem = vegdem + dsm + vegdem[vegdem == dsm] = 0 + vegdem2 = vegdem2 + dsm + vegdem2[vegdem2 == dsm] = 0 + # % Bush separation + bush = np.logical_not((vegdem2 * vegdem)) * vegdem + + # shmat = np.zeros((rows, cols, 145)) + # vegshmat = np.zeros((rows, cols, 145)) + + noa = 19. + #% No. of anglesteps minus 1 + step = 89./noa + iangle = np.array(np.hstack((np.arange(step/2., 89., step), 90.))) + annulino = np.array(np.hstack((np.round(np.arange(0., 89., step)), 90.))) + angleresult = svf_angles_100121() + aziinterval = angleresult["aziinterval"] + iazimuth = angleresult["iazimuth"] + aziintervalaniso = np.ceil((aziinterval/2.)) + index = 1. + + for i in np.arange(0, iangle.shape[0]-1): + for j in np.arange(0, (aziinterval[int(i)])): + if feedback.isCanceled(): + feedback.setProgressText("Calculation cancelled") + break + altitude = iangle[int(i)] + azimuth = iazimuth[int(index)-1] + + # Casting shadow + if usevegdem == 1: + shadowresult = shadow.shadowingfunction_20(dsm, vegdem, vegdem2, azimuth, altitude, + scale, amaxvalue, bush, feedback, 1) + vegsh = shadowresult["vegsh"] + vbshvegsh = shadowresult["vbshvegsh"] + sh = shadowresult["sh"] + else: + sh = shadow.shadowingfunctionglobalradiation(dsm, azimuth, altitude, scale, feedback, 1) + + # Calculate svfs + for k in np.arange(annulino[int(i)]+1, (annulino[int(i+1.)])+1): + weight = annulus_weight(k, aziinterval[i])*sh + svf = svf + weight + weight = annulus_weight(k, aziintervalaniso[i]) * sh + if (azimuth >= 0) and (azimuth < 180): + svfE = svfE + weight + if (azimuth >= 90) and (azimuth < 270): + svfS = svfS + weight + if (azimuth >= 180) and (azimuth < 360): + svfW = svfW + weight + if (azimuth >= 270) or (azimuth < 90): + svfN = svfN + weight + + if usevegdem == 1: + for k in np.arange(annulino[int(i)] + 1, (annulino[int(i + 1.)]) + 1): + # % changed to include 90 + weight = annulus_weight(k, aziinterval[i]) + svfveg = svfveg + weight * vegsh + svfaveg = svfaveg + weight * vbshvegsh + weight = annulus_weight(k, aziintervalaniso[i]) + if (azimuth >= 0) and (azimuth < 180): + svfEveg = svfEveg + weight * vegsh + svfEaveg = svfEaveg + weight * vbshvegsh + if (azimuth >= 90) and (azimuth < 270): + svfSveg = svfSveg + weight * vegsh + svfSaveg = svfSaveg + weight * vbshvegsh + if (azimuth >= 180) and (azimuth < 360): + svfWveg = svfWveg + weight * vegsh + svfWaveg = svfWaveg + weight * vbshvegsh + if (azimuth >= 270) or (azimuth < 90): + svfNveg = svfNveg + weight * vegsh + svfNaveg = svfNaveg + weight * vbshvegsh + + index += 1 + feedback.setProgress(int(index * (100. / 655.))) + + svfS = svfS + 3.0459e-004 + svfW = svfW + 3.0459e-004 + # % Last azimuth is 90. Hence, manual add of last annuli for svfS and SVFW + # %Forcing svf not be greater than 1 (some MATLAB crazyness) + svf[(svf > 1.)] = 1. + svfE[(svfE > 1.)] = 1. + svfS[(svfS > 1.)] = 1. + svfW[(svfW > 1.)] = 1. + svfN[(svfN > 1.)] = 1. + + if usevegdem == 1: + last = np.zeros((rows, cols)) + last[(vegdem2 == 0.)] = 3.0459e-004 + svfSveg = svfSveg + last + svfWveg = svfWveg + last + svfSaveg = svfSaveg + last + svfWaveg = svfWaveg + last + # %Forcing svf not be greater than 1 (some MATLAB crazyness) + svfveg[(svfveg > 1.)] = 1. + svfEveg[(svfEveg > 1.)] = 1. + svfSveg[(svfSveg > 1.)] = 1. + svfWveg[(svfWveg > 1.)] = 1. + svfNveg[(svfNveg > 1.)] = 1. + svfaveg[(svfaveg > 1.)] = 1. + svfEaveg[(svfEaveg > 1.)] = 1. + svfSaveg[(svfSaveg > 1.)] = 1. + svfWaveg[(svfWaveg > 1.)] = 1. + svfNaveg[(svfNaveg > 1.)] = 1. + + svfresult = {'svf': svf, 'svfE': svfE, 'svfS': svfS, 'svfW': svfW, 'svfN': svfN, + 'svfveg': svfveg, 'svfEveg': svfEveg, 'svfSveg': svfSveg, 'svfWveg': svfWveg, + 'svfNveg': svfNveg, 'svfaveg': svfaveg, 'svfEaveg': svfEaveg, 'svfSaveg': svfSaveg, + 'svfWaveg': svfWaveg, 'svfNaveg': svfNaveg} + + return svfresult diff --git a/urbantools/svf/code/wallalgorithms.py b/urbantools/svf/code/wallalgorithms.py new file mode 100644 index 0000000..2716ad4 --- /dev/null +++ b/urbantools/svf/code/wallalgorithms.py @@ -0,0 +1,197 @@ +from builtins import range +# -*- coding: utf-8 -*- +__author__ = 'xlinfr' + +import math +import numpy as np +# import scipy.misc as sc +import scipy.ndimage as sc +from scipy.ndimage import maximum_filter + +def findwalls_sp(arr_dsm, walllimit, footprint = False): + # This function identifies walls based on a DSM and a wall height limit. + # arr_dsm = DSM + # walllimit = wall height limit + # footprint = footprint for maximum filter, default = np.array([[0, 1, 0], [1, 0, 1], [0, 1, 0]]) + + # Get the shape of the input array + col, row = arr_dsm.shape + walls = np.zeros((col, row)) + + # Create a padded version of the array + padded_a = np.pad(arr_dsm, pad_width=1, mode='edge') + + # Default footprint for cardinal points + if footprint is False: + footprint = np.array([[0, 1, 0], + [1, 0, 1], + [0, 1, 0]]) + + # Use maximum_filter with the custom footprint + max_neighbors = maximum_filter(padded_a, footprint=footprint, mode='constant', cval=0) + + # Identify wall pixels: walls are where the max neighbors are greater than the original DSM + walls = max_neighbors[1:-1, 1:-1] - arr_dsm + + # Apply wall height limit + walls[walls < walllimit] = 0 + + # Set the edges to zero + walls[0:walls.shape[0], 0] = 0 + walls[0:walls.shape[0], walls.shape[1] - 1] = 0 + walls[0, 0:walls.shape[1]] = 0 + walls[walls.shape[0] - 1, 0:walls.shape[1]] = 0 + + return walls + +def findwalls(a, walllimit, feedback, total): + # This function identifies walls based on a DSM and a wall-height limit + # Walls are represented by outer pixels within building footprints + # + # Fredrik Lindberg, Goteborg Urban Climate Group + # fredrikl@gvc.gu.se + # 20150625 + + col = a.shape[0] + row = a.shape[1] + walls = np.zeros((col, row)) + domain = np.array([[0, 1, 0], [1, 0, 1], [0, 1, 0]]) + index = 0 + for i in np.arange(1, row-1): + if feedback.isCanceled(): + feedback.setProgressText("Calculation cancelled") + break + for j in np.arange(1, col-1): + dom = a[j-1:j+2, i-1:i+2] + walls[j, i] = np.max(dom[np.where(domain == 1)]) # new 20171006 + index = index + 1 + feedback.setProgress(int(index * total)) + + walls = np.copy(walls - a) # new 20171006 + walls[(walls < walllimit)] = 0 + + walls[0:walls.shape[0], 0] = 0 + walls[0:walls.shape[0], walls.shape[1] - 1] = 0 + walls[0, 0:walls.shape[0]] = 0 + walls[walls.shape[0] - 1, 0:walls.shape[1]] = 0 + + return walls + + +def filter1Goodwin_as_aspect_v3(walls_for_dir, scale, a, feedback, total): + """ + tThis function applies the filter processing presented in Goodwin et al (2010) but instead for removing + linear fetures it calculates wall aspect based on a wall pixels grid, a dsm (a) and a scale factor + + Fredrik Lindberg, 2012-02-14 + fredrikl@gvc.gu.se + + Translated: 2015-09-15 + + :param walls: + :param scale: + :param a: + :return: dirwalls + """ + + walls = walls_for_dir.copy() + + row = a.shape[0] + col = a.shape[1] + + filtersize = np.floor((scale + 0.0000000001) * 9) + if filtersize <= 2: + filtersize = 3 + else: + if filtersize != 9: + if filtersize % 2 == 0: + filtersize = filtersize + 1 + + filthalveceil = int(np.ceil(filtersize / 2.)) + filthalvefloor = int(np.floor(filtersize / 2.)) + + filtmatrix = np.zeros((int(filtersize), int(filtersize))) + buildfilt = np.zeros((int(filtersize), int(filtersize))) + + filtmatrix[:, filthalveceil - 1] = 1 + n = filtmatrix.shape[0] - 1 + buildfilt[filthalveceil - 1, 0:filthalvefloor] = 1 + buildfilt[filthalveceil - 1, filthalveceil: int(filtersize)] = 2 + + y = np.zeros((row, col)) # final direction + z = np.zeros((row, col)) # temporary direction + x = np.zeros((row, col)) # building side + walls[walls > 0] = 1 + + for h in range(0, 180): # =0:1:180 #%increased resolution to 1 deg 20140911 + feedback.setProgress(int(h * total)) + if feedback.isCanceled(): + feedback.setProgressText("Calculation cancelled") + break + filtmatrix1temp = sc.rotate(filtmatrix, h, order=1, reshape=False, mode='nearest') # bilinear + filtmatrix1 = np.round(filtmatrix1temp) + # filtmatrix1temp = sc.imrotate(filtmatrix, h, 'bilinear') + # filtmatrix1 = np.round(filtmatrix1temp / 255.) + # filtmatrixbuildtemp = sc.imrotate(buildfilt, h, 'nearest') + filtmatrixbuildtemp = sc.rotate(buildfilt, h, order=0, reshape=False, mode='nearest') # Nearest neighbor + # filtmatrixbuild = np.round(filtmatrixbuildtemp / 127.) + filtmatrixbuild = np.round(filtmatrixbuildtemp) + index = 270 - h + if h == 150: + filtmatrixbuild[:, n] = 0 + if h == 30: + filtmatrixbuild[:, n] = 0 + if index == 225: + # n = filtmatrix.shape[0] - 1 # length(filtmatrix); + filtmatrix1[0, 0] = 1 + filtmatrix1[n, n] = 1 + if index == 135: + # n = filtmatrix.shape[0] - 1 # length(filtmatrix); + filtmatrix1[0, n] = 1 + filtmatrix1[n, 0] = 1 + + for i in range(int(filthalveceil) - 1, row - int(filthalveceil) - 1): # i=filthalveceil:sizey-filthalveceil + for j in range(int(filthalveceil) - 1, col - int(filthalveceil) - 1): # (j=filthalveceil:sizex-filthalveceil + if walls[i, j] == 1: + wallscut = walls[i - filthalvefloor:i + filthalvefloor + 1, + j - filthalvefloor:j + filthalvefloor + 1] * filtmatrix1 + dsmcut = a[i - filthalvefloor:i + filthalvefloor + 1, j - filthalvefloor:j + filthalvefloor + 1] + if z[i, j] < wallscut.sum(): # sum(sum(wallscut)) + z[i, j] = wallscut.sum() # sum(sum(wallscut)); + if np.sum(dsmcut[filtmatrixbuild == 1]) > np.sum(dsmcut[filtmatrixbuild == 2]): + x[i, j] = 1 + else: + x[i, j] = 2 + + y[i, j] = index + + y[(x == 1)] = y[(x == 1)] - 180 + y[(y < 0)] = y[(y < 0)] + 360 + + grad, asp = get_ders(a, scale) + + y = y + ((walls == 1) * 1) * ((y == 0) * 1) * (asp / (math.pi / 180.)) + + dirwalls = y + + return dirwalls + + +def cart2pol(x, y, units='deg'): + radius = np.sqrt(x**2 + y**2) + theta = np.arctan2(y, x) + if units in ['deg', 'degs']: + theta = theta * 180 / np.pi + return theta, radius + + +def get_ders(dsm, scale): + # dem,_,_=read_dem_grid(dem_file) + dx = 1/scale + # dx=0.5 + fy, fx = np.gradient(dsm, dx, dx) + asp, grad = cart2pol(fy, fx, 'rad') + grad = np.arctan(grad) + asp = asp * -1 + asp = asp + (asp < 0) * (np.pi * 2) + return grad, asp \ No newline at end of file diff --git a/urbantools/svf/data/corrected_dsm_dsm_demo.asc b/urbantools/svf/data/corrected_dsm_dsm_demo.asc new file mode 100644 index 0000000..1dec16d --- /dev/null +++ b/urbantools/svf/data/corrected_dsm_dsm_demo.asc @@ -0,0 +1,46 @@ +NCOLS 40 +NROWS 40 +XLLCORNER 684999.7500 +YLLCORNER 4929979.7500 +CELLSIZE 0.5000 +NODATA_VALUE -9999 +71.1840 71.0670 66.7470 65.9420 65.2880 52.8560 50.6560 50.6260 50.6280 50.6330 50.6290 50.6480 50.6530 50.6610 50.6630 50.6740 50.6890 50.6850 50.7870 51.4920 51.8020 52.0540 51.9680 51.4490 50.8780 50.6660 50.6520 50.6420 50.6350 50.6180 50.6240 51.4970 50.9420 52.4910 55.3310 51.3530 51.2140 52.7630 59.0240 58.2010 +69.0190 62.8270 63.5650 52.0350 50.6970 50.6710 50.6350 50.6290 50.6420 50.6480 50.6460 50.6620 50.6650 50.6800 50.6820 50.6840 50.6710 51.0540 50.9350 51.2100 51.5870 51.6180 51.0370 50.6900 50.6710 50.6600 50.6480 50.6420 50.6550 50.6220 50.6080 51.6390 51.6530 53.6520 54.8230 53.4550 56.7650 57.5970 58.5310 58.7020 +61.5100 55.5000 52.9370 51.7700 50.6460 50.6230 50.6320 50.6520 50.6580 50.6560 50.6750 50.6750 50.6780 50.6900 50.6910 50.6840 50.6830 50.7270 50.9470 50.9620 51.3600 50.7480 50.6680 50.6830 50.6830 50.6570 50.6430 50.6510 50.6280 50.6070 50.6030 53.0860 55.7900 53.4250 53.1490 51.0430 53.0800 57.6970 58.3970 59.3230 +69.1210 53.9170 51.4870 50.6460 50.6310 50.6280 50.6520 50.6670 50.6800 50.6740 50.6900 50.6920 50.6950 50.7040 50.7050 50.6980 50.7050 50.7100 50.7880 51.1890 50.6930 50.6830 50.6840 50.6680 50.6610 50.6470 50.6170 50.7450 50.6120 50.5850 50.6010 50.8440 52.2160 55.1670 52.3770 53.1420 57.3140 57.4860 59.0370 59.0060 +52.3790 50.6810 50.6630 50.6400 50.6510 50.6600 50.6630 50.6760 50.6870 50.6800 50.6890 50.7110 50.7170 50.7060 50.7160 50.7150 50.7210 50.7040 50.7180 50.6990 50.6700 50.6840 50.6790 50.6710 50.6480 50.6400 50.6160 55.4240 53.9910 50.5980 56.0740 50.6140 55.1230 52.8460 50.8170 56.6440 56.8030 58.7450 58.9960 58.6890 +50.6440 50.6360 50.6620 50.6630 50.6640 50.6790 50.6820 50.6910 50.6970 50.7000 50.7080 50.7280 50.8080 50.7340 50.7310 50.7280 50.7250 50.7060 50.7110 50.7080 50.6990 50.6820 50.6570 50.6560 50.6460 54.9960 54.9650 53.3720 51.8630 58.3010 50.9810 54.4180 54.9700 53.5300 57.3640 56.6520 56.6400 58.4360 59.0930 57.3540 +50.6330 50.6580 50.6790 50.6760 50.6940 50.7000 50.7080 50.7090 50.7120 50.7190 50.7380 51.4950 51.9160 51.4000 50.7330 50.7220 50.7200 50.7110 50.7050 50.6980 50.6910 51.2920 50.6580 54.2470 56.3580 55.6560 55.4550 53.7160 55.6360 52.6240 56.5770 54.7180 53.1830 51.6170 57.3730 57.0620 58.0920 57.3740 57.9730 57.7050 +50.6520 50.6700 50.6930 50.6970 50.7170 50.7220 50.7200 50.7250 50.7270 50.7570 51.7270 51.6110 51.4180 51.8050 50.7500 50.7360 50.7180 50.7160 50.7010 50.6960 51.9230 50.6660 55.8180 51.1930 56.7350 55.6660 53.5660 56.7040 53.0460 57.4730 53.5490 55.2830 51.3440 54.6780 58.0360 57.2290 54.9590 57.3730 57.9790 57.6310 +50.6830 50.6940 50.7070 50.7110 50.7190 50.7360 50.7360 50.7340 52.1460 52.3600 51.0340 50.8410 51.5640 50.7240 50.7330 50.7330 50.7340 50.7190 50.7080 50.6930 50.6750 55.6770 52.0670 56.7030 57.5810 57.0950 58.3940 57.6860 57.3660 55.9860 57.4590 56.3880 56.2080 57.6030 57.2170 57.1600 57.5370 57.2130 57.7070 57.6220 +50.7080 50.7160 50.7140 50.7300 50.7290 50.7400 51.0530 52.1160 52.2190 52.3580 52.3320 50.7490 50.7440 50.7270 50.7190 50.9880 50.7980 50.7150 50.6970 50.6840 54.2250 54.9070 56.8660 56.8440 57.6630 58.2030 58.3530 57.8740 58.2680 57.9040 58.2090 57.5200 58.6560 57.0930 57.4330 54.6490 56.3970 57.4840 57.7740 57.8710 +50.7310 50.7410 50.7440 50.7440 51.3300 51.5220 50.7590 51.9710 52.4190 52.3360 50.9180 50.7420 50.7420 50.7390 50.7420 51.7380 51.2480 50.7230 50.6940 52.8610 52.6840 57.8850 58.5370 57.8710 57.9780 58.0030 57.8980 57.8450 57.3900 58.4630 58.3890 58.7870 58.3380 57.6710 58.0090 57.5090 57.2400 57.6760 58.3060 58.6050 +50.7470 50.7520 50.7510 50.7650 51.4540 51.5950 50.8120 52.0330 51.9140 51.0210 50.7450 50.7430 50.7400 50.7540 50.8570 51.5800 52.2000 51.2970 50.7010 54.0800 55.4630 56.8350 57.4300 58.3460 57.4980 57.7110 58.9170 58.2710 58.8870 58.4390 59.0510 59.5480 57.0830 58.0200 57.2520 57.3180 57.9580 58.1710 58.3240 58.7300 +50.7630 50.7700 50.7650 50.7700 51.4990 51.6800 51.0060 50.7750 50.7780 50.7600 50.7570 50.7530 50.7410 50.7490 50.8450 51.8050 51.4560 52.0190 50.7040 52.2640 55.4050 56.0960 57.8850 58.3490 58.8960 58.5140 58.5580 58.2580 59.3500 58.7950 59.4430 59.1710 58.8700 57.4620 57.3430 58.4350 59.3710 58.7930 58.7680 58.7720 +50.7820 50.7740 50.7830 50.7760 50.7800 51.3660 51.2200 50.7530 50.7570 50.7650 50.7620 50.7550 50.8760 50.9970 51.5460 52.1460 50.8090 50.8860 50.6990 51.0170 55.4470 54.4290 57.5660 58.2060 58.2650 58.3530 58.2430 58.5510 59.4860 59.0330 58.6600 58.5150 58.5280 57.3830 58.0920 57.9700 58.2010 58.3950 57.5600 57.6320 +50.7810 50.7730 50.7840 50.7960 50.7840 50.7700 50.7700 50.7680 50.7800 50.7740 50.8790 51.4560 50.7650 50.7570 52.2870 50.7550 51.2010 50.7220 50.7300 50.7980 55.6240 58.1420 57.3210 58.8260 58.7420 58.3980 57.0610 58.0960 59.8520 57.3410 60.4250 59.5130 58.8670 57.4420 58.3770 58.3340 58.5640 58.3020 57.9080 57.8410 +50.7800 50.7910 50.8050 50.7990 50.7870 50.7690 50.7640 50.7670 50.7730 50.7770 51.7550 51.2820 50.8450 50.7630 50.8330 50.7510 50.7490 50.7700 50.8360 51.2580 52.5140 57.8900 58.4140 58.2360 59.1330 57.5510 57.8690 58.6020 59.8630 60.3650 57.3770 59.3140 57.3440 57.2480 57.2440 57.4620 58.7040 58.3730 57.5450 57.7410 +50.8060 50.8150 50.8050 50.7780 50.7940 50.7860 50.7830 50.7740 51.0840 51.2640 52.1250 52.0790 51.4230 50.7750 50.7570 50.7860 50.8140 50.8530 50.8570 50.8340 54.0590 56.7980 55.8010 58.3290 58.8350 57.3600 59.0460 58.9110 59.2320 59.0680 59.9070 59.5900 58.0530 56.7390 57.6130 57.4360 57.2420 57.7010 58.4890 56.7260 +50.8200 50.8260 50.8050 50.7940 50.7980 50.8010 50.7860 51.1140 51.8160 51.9420 50.8340 51.2130 50.9070 50.7820 50.8010 50.8570 50.8880 50.8760 50.8720 50.8720 56.0160 55.8540 57.9560 57.5040 57.7030 56.9240 57.3570 56.7970 59.8660 58.6080 57.9660 57.9500 57.0950 56.3870 56.0290 57.4880 57.4910 57.6180 58.3150 58.5090 +50.8260 50.8350 50.8100 50.8000 50.8070 50.8060 51.5100 51.1590 52.1390 51.8130 51.2220 50.7720 50.7780 50.8490 50.8820 50.8930 50.8980 50.8900 50.8930 50.8950 51.8760 55.6050 57.3680 57.4670 56.9340 56.8740 57.1100 57.6960 58.4380 57.4010 57.8580 57.8420 55.8740 55.9570 56.7200 57.9660 57.4540 57.9470 58.3680 58.1720 +54.6000 50.8190 50.8120 50.8120 50.8270 51.4230 50.8970 51.0900 51.7840 51.1170 50.7850 50.8310 50.8860 50.8930 50.8960 50.9010 50.9040 50.8890 50.8750 54.2220 55.6710 56.3370 56.8170 57.7590 57.5830 57.1090 57.6170 57.5640 54.5300 56.9210 56.7540 55.3430 55.2770 55.8020 56.7500 56.8640 56.2610 56.6540 57.3260 56.9330 +51.7420 50.8250 50.8280 50.8240 50.8280 50.9280 51.2170 51.5860 51.4100 50.8260 50.8600 50.9190 50.9110 50.9140 50.8950 50.8930 50.8930 50.8900 50.8660 53.8430 55.9960 56.1950 56.6850 55.8750 56.1280 56.5790 54.6300 54.5770 55.0650 56.9250 56.6450 54.5910 54.8650 55.5880 56.0490 56.1820 56.1440 56.0860 56.7630 56.6050 +50.8370 56.9520 50.8390 50.8370 50.8270 50.8310 51.5280 50.8170 50.8290 50.8950 50.9370 50.9310 50.9250 50.9250 50.9060 50.9040 50.8910 50.9150 52.7280 55.8550 56.1080 54.2570 56.6110 56.6130 55.7360 57.0280 57.1110 56.2890 53.7930 51.2520 54.2010 52.4250 54.0030 54.3710 55.1210 55.9920 55.5800 54.6980 56.6580 56.1610 +50.8370 50.8440 51.0160 50.8510 50.8370 50.8280 50.8320 50.8460 50.9260 50.9460 50.9460 50.9480 50.9270 50.9220 50.9240 50.9210 50.9310 50.9380 55.5530 56.0990 54.7340 56.4450 57.5820 57.5130 53.0500 56.8760 56.7240 57.6680 56.6790 55.9140 50.8880 50.8650 51.4310 51.8890 53.0460 54.9580 53.9060 54.3600 55.2360 55.8350 +50.8520 50.8490 50.8410 51.8540 50.8440 50.8440 50.8700 50.9410 50.9610 50.9450 50.9400 50.9330 50.9170 50.9300 50.9420 50.9540 50.9510 51.0760 55.6120 54.0570 55.9880 57.2680 56.2960 57.3120 57.5270 57.5810 56.7210 57.1490 56.9750 56.9350 55.9350 50.8830 50.8810 52.7710 53.1760 50.9720 53.9050 54.8590 54.3340 54.3140 +50.8530 50.8480 50.8530 51.8130 50.8520 50.8930 50.9430 50.9490 50.9510 50.9380 50.9270 50.9250 50.9270 50.9540 50.9600 50.9660 50.9550 56.5170 50.9410 52.6300 56.5330 54.9270 56.6300 57.6060 57.6260 57.7820 57.7540 57.4230 56.0040 57.1390 56.5400 55.3660 50.8850 50.8670 50.9540 52.9200 50.8190 51.6780 52.6470 50.8120 +50.8610 50.8540 50.8530 50.8730 53.4860 55.0700 52.0450 50.9490 50.9540 50.9430 50.9350 50.9440 50.9670 50.9700 50.9740 50.9670 50.9700 52.8420 56.0830 56.1310 56.3560 57.5430 57.9010 57.7820 57.8690 58.0910 58.0350 57.4070 56.8070 57.4370 56.3000 56.0860 50.9080 50.8880 50.8770 50.8630 50.8420 50.8440 50.8380 50.8130 +50.8690 50.8740 50.8710 50.8780 50.9510 53.6410 51.6020 50.9600 50.9620 50.9590 50.9630 50.9810 50.9930 50.9880 50.9870 50.9850 50.9690 55.0610 54.2310 57.4690 57.8880 56.7920 57.7240 57.8210 57.3110 57.7230 58.1310 57.4700 57.2140 58.1500 55.6560 55.0530 55.8680 50.9170 50.9060 50.8900 50.8630 50.8520 50.8410 50.8230 +50.8840 50.8840 50.8910 50.9560 50.9940 50.9890 50.9850 50.9750 50.9780 50.9790 50.9920 50.9940 50.9950 50.9890 50.9930 50.9850 50.9850 56.3030 53.3680 56.0680 56.6120 57.8630 57.8730 57.8290 56.8670 57.1630 57.2840 57.3320 57.9850 57.5810 56.6810 56.0910 56.1430 50.9340 50.9120 50.8890 50.8800 50.8610 50.8570 50.8430 +50.8980 50.9020 50.9460 50.9970 50.9880 50.9860 51.8150 52.5260 51.0040 50.9960 51.0080 51.0030 51.0110 51.0030 51.0030 51.0080 51.0100 54.1420 55.6440 56.0060 56.4270 57.8170 56.7360 57.9940 57.4170 57.4720 57.7900 57.5910 57.7790 55.9810 56.4260 54.9440 50.9410 50.9390 50.9180 50.8990 50.8850 50.8760 50.8700 50.8550 +50.9110 50.9290 50.9750 51.0110 51.0150 51.0100 51.0170 51.0060 51.0150 50.9890 50.9520 51.0120 51.0210 51.0220 51.0770 51.0550 51.0310 55.0950 56.1250 55.9020 56.4830 57.6890 57.6690 57.3940 57.5240 57.3580 57.4640 57.2720 57.2720 56.5770 56.3420 55.0250 51.7010 50.9370 50.9250 50.9090 50.8850 50.8770 50.8760 50.8660 +50.9250 50.9360 50.9500 50.9930 51.0220 51.0220 51.0250 51.0280 51.0260 51.0030 51.0050 51.0040 51.0380 51.1540 51.1290 51.0670 51.0440 54.2700 51.4240 58.2990 55.8620 56.7700 56.6710 57.3660 56.7090 57.7450 57.1050 57.3370 57.1830 56.8820 56.2470 52.7560 50.9530 50.9390 50.9280 50.9150 50.9050 50.8890 50.8890 50.8940 +50.9300 50.9370 50.9630 50.9820 51.0040 51.0220 51.0360 51.0250 51.0220 51.0260 51.0280 51.0220 51.0420 51.1820 51.1150 51.0510 51.0540 51.0450 52.2900 61.3990 56.1830 56.3070 56.2700 57.0280 57.2770 57.2140 56.6530 56.8720 56.2600 57.1270 54.8700 51.3680 50.9750 50.9700 50.9540 50.9300 50.9090 50.8990 50.8910 50.8920 +50.9310 50.9500 51.1090 50.9870 51.0040 51.0130 51.0110 51.0160 51.0220 51.0230 51.0350 51.0180 51.0280 51.0480 51.0540 51.0460 51.0500 51.0410 51.0330 54.9960 51.0550 55.9370 56.2930 56.3610 56.7170 56.8120 56.5140 56.5010 56.4920 54.1610 55.2850 51.0240 50.9960 50.9850 50.9480 50.9390 50.9210 50.9080 50.9010 50.8950 +50.9300 50.9370 50.9500 50.9780 50.9910 51.0060 51.0170 51.0240 51.0230 51.0360 51.0400 51.0410 51.0320 51.0360 51.0420 51.0540 51.0470 51.0260 51.0350 51.0420 51.0470 53.5450 56.6240 52.8250 53.0770 56.9040 55.5970 56.4860 51.5410 53.8430 51.0730 51.0520 50.9980 51.0050 50.9830 50.9770 50.9730 50.9390 50.9200 50.9160 +50.9190 50.9230 50.9420 50.9620 50.9850 51.0040 51.0200 51.0330 51.0350 51.0260 51.0300 51.0460 51.0440 51.0450 51.0500 51.0450 51.0490 51.0470 51.0500 51.0500 51.0480 51.0380 51.0470 51.0330 53.2530 51.0670 54.5870 51.3180 53.7000 53.2060 51.0480 51.0590 51.0380 51.0310 51.0380 51.0070 50.9870 50.9710 50.9520 50.9360 +50.9060 50.9210 50.9290 50.9360 50.9640 50.9980 51.0150 51.0190 51.0260 51.0270 51.0330 51.0380 51.0450 51.0480 51.0490 51.0420 51.0480 51.0500 51.0480 51.0520 51.0560 51.0580 51.0600 51.0620 51.0640 51.0590 51.0420 51.0670 51.0740 51.0670 51.0420 51.0740 51.0630 51.0240 51.0210 51.0220 51.0030 50.9840 50.9710 50.9610 +50.8890 50.8950 50.9190 50.9220 51.3660 54.5370 51.0100 51.0040 51.0160 51.0200 51.0290 51.0360 51.0380 51.0300 51.0370 51.0400 51.0430 51.0460 51.0490 51.0560 51.0560 51.0620 51.0730 51.0850 51.0700 51.0560 51.0590 51.0660 51.0750 51.0660 51.0540 51.0650 51.0410 51.0310 51.0200 51.0250 51.0230 50.9910 50.9770 50.9680 +50.8960 50.8900 50.8870 50.9030 51.1680 52.5660 51.0120 51.0090 51.0200 51.0130 51.0270 51.0230 51.0260 51.0280 51.0380 51.0390 51.0410 51.0410 51.0450 51.0540 51.0540 51.0620 51.0760 51.0720 51.0630 51.0610 51.0640 51.0640 51.0720 51.0710 51.0710 51.0710 51.0600 51.0570 51.0440 51.0290 51.0270 51.0010 51.0020 50.9890 +50.8800 50.8820 50.8900 50.8930 50.9640 50.9930 51.0090 51.0060 51.0180 51.0190 51.0220 51.0150 51.0130 51.0250 51.0330 51.0310 51.0390 51.0380 51.0390 51.0480 51.0620 51.0580 51.0670 51.0670 51.0620 51.0620 51.0690 51.0670 51.0730 51.0740 51.0810 51.0800 51.0840 51.0800 51.0640 51.0530 51.0390 51.0090 51.0130 50.9920 +50.8760 50.8800 50.8740 50.8750 50.8820 50.8950 50.9140 50.9590 50.9880 50.9950 51.0130 51.0190 51.0180 51.0180 51.0230 51.0270 51.0310 51.0330 51.0280 51.0480 51.0500 51.0480 51.0540 51.0590 51.0640 51.0610 51.0680 51.0790 51.0780 51.0770 51.0790 51.0940 51.0880 51.0880 51.0690 51.0530 51.0460 51.0330 51.0150 50.9930 diff --git a/urbantools/svf/data/dsm_demo.asc b/urbantools/svf/data/dsm_demo.asc new file mode 100644 index 0000000..4c8c08c --- /dev/null +++ b/urbantools/svf/data/dsm_demo.asc @@ -0,0 +1,46 @@ +NCOLS 40 +NROWS 40 +CELLSIZE 0.5000 +XLLCENTER 685000.0000 +YLLCENTER 4929980.0000 +NODATA_VALUE -9999 +71.1840 71.0670 66.7470 65.9420 65.2880 52.8560 50.6560 50.6260 50.6280 50.6330 50.6290 50.6480 50.6530 50.6610 50.6630 50.6740 50.6890 50.6850 50.7870 51.4920 51.8020 52.0540 51.9680 51.4490 50.8780 50.6660 50.6520 50.6420 50.6350 50.6180 50.6240 51.4970 50.9420 52.4910 55.3310 51.3530 51.2140 52.7630 59.0240 58.2010 +69.0190 62.8270 63.5650 52.0350 50.6970 50.6710 50.6350 50.6290 50.6420 50.6480 50.6460 50.6620 50.6650 50.6800 50.6820 50.6840 50.6710 51.0540 50.9350 51.2100 51.5870 51.6180 51.0370 50.6900 50.6710 50.6600 50.6480 50.6420 50.6550 50.6220 50.6080 51.6390 51.6530 53.6520 54.8230 53.4550 56.7650 57.5970 58.5310 58.7020 +61.5100 55.5000 52.9370 51.7700 50.6460 50.6230 50.6320 50.6520 50.6580 50.6560 50.6750 50.6750 50.6780 50.6900 50.6910 50.6840 50.6830 50.7270 50.9470 50.9620 51.3600 50.7480 50.6680 50.6830 50.6830 50.6570 50.6430 50.6510 50.6280 50.6070 50.6030 53.0860 55.7900 53.4250 53.1490 51.0430 53.0800 57.6970 58.3970 59.3230 +69.1210 53.9170 51.4870 50.6460 50.6310 50.6280 50.6520 50.6670 50.6800 50.6740 50.6900 50.6920 50.6950 50.7040 50.7050 50.6980 50.7050 50.7100 50.7880 51.1890 50.6930 50.6830 50.6840 50.6680 50.6610 50.6470 50.6170 50.7450 50.6120 50.5850 50.6010 50.8440 52.2160 55.1670 52.3770 53.1420 57.3140 57.4860 59.0370 59.0060 +52.3790 50.6810 50.6630 50.6400 50.6510 50.6600 50.6630 50.6760 50.6870 50.6800 50.6890 50.7110 50.7170 50.7060 50.7160 50.7150 50.7210 50.7040 50.7180 50.6990 50.6700 50.6840 50.6790 50.6710 50.6480 50.6400 50.6160 55.4240 53.9910 50.5980 56.0740 50.6140 55.1230 52.8460 50.8170 56.6440 56.8030 58.7450 58.9960 58.6890 +50.6440 50.6360 50.6620 50.6630 50.6640 50.6790 50.6820 50.6910 50.6970 50.7000 50.7080 50.7280 50.8080 50.7340 50.7310 50.7280 50.7250 50.7060 50.7110 50.7080 50.6990 50.6820 50.6570 50.6560 50.6460 54.9960 54.9650 53.3720 51.8630 58.3010 50.9810 54.4180 54.9700 53.5300 57.3640 56.6520 56.6400 58.4360 59.0930 57.3540 +50.6330 50.6580 50.6790 50.6760 50.6940 50.7000 50.7080 50.7090 50.7120 50.7190 50.7380 51.4950 51.9160 51.4000 50.7330 50.7220 50.7200 50.7110 50.7050 50.6980 50.6910 51.2920 50.6580 54.2470 56.3580 55.6560 55.4550 53.7160 55.6360 52.6240 56.5770 54.7180 53.1830 51.6170 57.3730 57.0620 58.0920 57.3740 57.9730 57.7050 +50.6520 50.6700 50.6930 50.6970 50.7170 50.7220 50.7200 50.7250 50.7270 50.7570 51.7270 51.6110 51.4180 51.8050 50.7500 50.7360 50.7180 50.7160 50.7010 50.6960 51.9230 50.6660 55.8180 51.1930 56.7350 55.6660 53.5660 56.7040 53.0460 57.4730 53.5490 55.2830 51.3440 54.6780 58.0360 57.2290 54.9590 57.3730 57.9790 57.6310 +50.6830 50.6940 50.7070 50.7110 50.7190 50.7360 50.7360 50.7340 52.1460 52.3600 51.0340 50.8410 51.5640 50.7240 50.7330 50.7330 50.7340 50.7190 50.7080 50.6930 50.6750 55.6770 52.0670 56.7030 57.5810 57.0950 58.3940 57.6860 57.3660 55.9860 57.4590 56.3880 56.2080 57.6030 57.2170 57.1600 57.5370 57.2130 57.7070 57.6220 +50.7080 50.7160 50.7140 50.7300 50.7290 50.7400 51.0530 52.1160 52.2190 52.3580 52.3320 50.7490 50.7440 50.7270 50.7190 50.9880 50.7980 50.7150 50.6970 50.6840 54.2250 54.9070 56.8660 56.8440 57.6630 58.2030 58.3530 57.8740 58.2680 57.9040 58.2090 57.5200 58.6560 57.0930 57.4330 54.6490 56.3970 57.4840 57.7740 57.8710 +50.7310 50.7410 50.7440 50.7440 51.3300 51.5220 50.7590 51.9710 52.4190 52.3360 50.9180 50.7420 50.7420 50.7390 50.7420 51.7380 51.2480 50.7230 50.6940 52.8610 52.6840 57.8850 58.5370 57.8710 57.9780 58.0030 57.8980 57.8450 57.3900 58.4630 58.3890 58.7870 58.3380 57.6710 58.0090 57.5090 57.2400 57.6760 58.3060 58.6050 +50.7470 50.7520 50.7510 50.7650 51.4540 51.5950 50.8120 52.0330 51.9140 51.0210 50.7450 50.7430 50.7400 50.7540 50.8570 51.5800 52.2000 51.2970 50.7010 54.0800 55.4630 56.8350 57.4300 58.3460 57.4980 57.7110 58.9170 58.2710 58.8870 58.4390 59.0510 59.5480 57.0830 58.0200 57.2520 57.3180 57.9580 58.1710 58.3240 58.7300 +50.7630 50.7700 50.7650 50.7700 51.4990 51.6800 51.0060 50.7750 50.7780 50.7600 50.7570 50.7530 50.7410 50.7490 50.8450 51.8050 51.4560 52.0190 50.7040 52.2640 55.4050 56.0960 57.8850 58.3490 58.8960 58.5140 58.5580 58.2580 59.3500 58.7950 59.4430 59.1710 58.8700 57.4620 57.3430 58.4350 59.3710 58.7930 58.7680 58.7720 +50.7820 50.7740 50.7830 50.7760 50.7800 51.3660 51.2200 50.7530 50.7570 50.7650 50.7620 50.7550 50.8760 50.9970 51.5460 52.1460 50.8090 50.8860 50.6990 51.0170 55.4470 54.4290 57.5660 58.2060 58.2650 58.3530 58.2430 58.5510 59.4860 59.0330 58.6600 58.5150 58.5280 57.3830 58.0920 57.9700 58.2010 58.3950 57.5600 57.6320 +50.7810 50.7730 50.7840 50.7960 50.7840 50.7700 50.7700 50.7680 50.7800 50.7740 50.8790 51.4560 50.7650 50.7570 52.2870 50.7550 51.2010 50.7220 50.7300 50.7980 55.6240 58.1420 57.3210 58.8260 58.7420 58.3980 57.0610 58.0960 59.8520 57.3410 60.4250 59.5130 58.8670 57.4420 58.3770 58.3340 58.5640 58.3020 57.9080 57.8410 +50.7800 50.7910 50.8050 50.7990 50.7870 50.7690 50.7640 50.7670 50.7730 50.7770 51.7550 51.2820 50.8450 50.7630 50.8330 50.7510 50.7490 50.7700 50.8360 51.2580 52.5140 57.8900 58.4140 58.2360 59.1330 57.5510 57.8690 58.6020 59.8630 60.3650 57.3770 59.3140 57.3440 57.2480 57.2440 57.4620 58.7040 58.3730 57.5450 57.7410 +50.8060 50.8150 50.8050 50.7780 50.7940 50.7860 50.7830 50.7740 51.0840 51.2640 52.1250 52.0790 51.4230 50.7750 50.7570 50.7860 50.8140 50.8530 50.8570 50.8340 54.0590 56.7980 55.8010 58.3290 58.8350 57.3600 59.0460 58.9110 59.2320 59.0680 59.9070 59.5900 58.0530 56.7390 57.6130 57.4360 57.2420 57.7010 58.4890 56.7260 +50.8200 50.8260 50.8050 50.7940 50.7980 50.8010 50.7860 51.1140 51.8160 51.9420 50.8340 51.2130 50.9070 50.7820 50.8010 50.8570 50.8880 50.8760 50.8720 50.8720 56.0160 55.8540 57.9560 57.5040 57.7030 56.9240 57.3570 56.7970 59.8660 58.6080 57.9660 57.9500 57.0950 56.3870 56.0290 57.4880 57.4910 57.6180 58.3150 58.5090 +50.8260 50.8350 50.8100 50.8000 50.8070 50.8060 51.5100 51.1590 52.1390 51.8130 51.2220 50.7720 50.7780 50.8490 50.8820 50.8930 50.8980 50.8900 50.8930 50.8950 51.8760 55.6050 57.3680 57.4670 56.9340 56.8740 57.1100 57.6960 58.4380 57.4010 57.8580 57.8420 55.8740 55.9570 56.7200 57.9660 57.4540 57.9470 58.3680 58.1720 +54.6000 50.8190 50.8120 50.8120 50.8270 51.4230 50.8970 51.0900 51.7840 51.1170 50.7850 50.8310 50.8860 50.8930 50.8960 50.9010 50.9040 50.8890 50.8750 54.2220 55.6710 56.3370 56.8170 57.7590 57.5830 57.1090 57.6170 57.5640 54.5300 56.9210 56.7540 55.3430 55.2770 55.8020 56.7500 56.8640 56.2610 56.6540 57.3260 56.9330 +51.7420 50.8250 50.8280 50.8240 50.8280 50.9280 51.2170 51.5860 51.4100 50.8260 50.8600 50.9190 50.9110 50.9140 50.8950 50.8930 50.8930 50.8900 50.8660 53.8430 55.9960 56.1950 56.6850 55.8750 56.1280 56.5790 54.6300 54.5770 55.0650 56.9250 56.6450 54.5910 54.8650 55.5880 56.0490 56.1820 56.1440 56.0860 56.7630 56.6050 +50.8370 56.9520 50.8390 50.8370 50.8270 50.8310 51.5280 50.8170 50.8290 50.8950 50.9370 50.9310 50.9250 50.9250 50.9060 50.9040 50.8910 50.9150 52.7280 55.8550 56.1080 54.2570 56.6110 56.6130 55.7360 57.0280 57.1110 56.2890 53.7930 51.2520 54.2010 52.4250 54.0030 54.3710 55.1210 55.9920 55.5800 54.6980 56.6580 56.1610 +50.8370 50.8440 51.0160 50.8510 50.8370 50.8280 50.8320 50.8460 50.9260 50.9460 50.9460 50.9480 50.9270 50.9220 50.9240 50.9210 50.9310 50.9380 55.5530 56.0990 54.7340 56.4450 57.5820 57.5130 53.0500 56.8760 56.7240 57.6680 56.6790 55.9140 50.8880 50.8650 51.4310 51.8890 53.0460 54.9580 53.9060 54.3600 55.2360 55.8350 +50.8520 50.8490 50.8410 51.8540 50.8440 50.8440 50.8700 50.9410 50.9610 50.9450 50.9400 50.9330 50.9170 50.9300 50.9420 50.9540 50.9510 51.0760 55.6120 54.0570 55.9880 57.2680 56.2960 57.3120 57.5270 57.5810 56.7210 57.1490 56.9750 56.9350 55.9350 50.8830 50.8810 52.7710 53.1760 50.9720 53.9050 54.8590 54.3340 54.3140 +50.8530 50.8480 50.8530 51.8130 50.8520 50.8930 50.9430 50.9490 50.9510 50.9380 50.9270 50.9250 50.9270 50.9540 50.9600 50.9660 50.9550 56.5170 50.9410 52.6300 56.5330 54.9270 56.6300 57.6060 57.6260 57.7820 57.7540 57.4230 56.0040 57.1390 56.5400 55.3660 50.8850 50.8670 50.9540 52.9200 50.8190 51.6780 52.6470 50.8120 +50.8610 50.8540 50.8530 50.8730 53.4860 55.0700 52.0450 50.9490 50.9540 50.9430 50.9350 50.9440 50.9670 50.9700 50.9740 50.9670 50.9700 52.8420 56.0830 56.1310 56.3560 57.5430 57.9010 57.7820 57.8690 58.0910 58.0350 57.4070 56.8070 57.4370 56.3000 56.0860 50.9080 50.8880 50.8770 50.8630 50.8420 50.8440 50.8380 50.8130 +50.8690 50.8740 50.8710 50.8780 50.9510 53.6410 51.6020 50.9600 50.9620 50.9590 50.9630 50.9810 50.9930 50.9880 50.9870 50.9850 50.9690 55.0610 54.2310 57.4690 57.8880 56.7920 57.7240 57.8210 57.3110 57.7230 58.1310 57.4700 57.2140 58.1500 55.6560 55.0530 55.8680 50.9170 50.9060 50.8900 50.8630 50.8520 50.8410 50.8230 +50.8840 50.8840 50.8910 50.9560 50.9940 50.9890 50.9850 50.9750 50.9780 50.9790 50.9920 50.9940 50.9950 50.9890 50.9930 50.9850 50.9850 56.3030 53.3680 56.0680 56.6120 57.8630 57.8730 57.8290 56.8670 57.1630 57.2840 57.3320 57.9850 57.5810 56.6810 56.0910 56.1430 50.9340 50.9120 50.8890 50.8800 50.8610 50.8570 50.8430 +50.8980 50.9020 50.9460 50.9970 50.9880 50.9860 51.8150 52.5260 51.0040 50.9960 51.0080 51.0030 51.0110 51.0030 51.0030 51.0080 51.0100 54.1420 55.6440 56.0060 56.4270 57.8170 56.7360 57.9940 57.4170 57.4720 57.7900 57.5910 57.7790 55.9810 56.4260 54.9440 50.9410 50.9390 50.9180 50.8990 50.8850 50.8760 50.8700 50.8550 +50.9110 50.9290 50.9750 51.0110 51.0150 51.0100 51.0170 51.0060 51.0150 50.9890 50.9520 51.0120 51.0210 51.0220 51.0770 51.0550 51.0310 55.0950 56.1250 55.9020 56.4830 57.6890 57.6690 57.3940 57.5240 57.3580 57.4640 57.2720 57.2720 56.5770 56.3420 55.0250 51.7010 50.9370 50.9250 50.9090 50.8850 50.8770 50.8760 50.8660 +50.9250 50.9360 50.9500 50.9930 51.0220 51.0220 51.0250 51.0280 51.0260 51.0030 51.0050 51.0040 51.0380 51.1540 51.1290 51.0670 51.0440 54.2700 51.4240 58.2990 55.8620 56.7700 56.6710 57.3660 56.7090 57.7450 57.1050 57.3370 57.1830 56.8820 56.2470 52.7560 50.9530 50.9390 50.9280 50.9150 50.9050 50.8890 50.8890 50.8940 +50.9300 50.9370 50.9630 50.9820 51.0040 51.0220 51.0360 51.0250 51.0220 51.0260 51.0280 51.0220 51.0420 51.1820 51.1150 51.0510 51.0540 51.0450 52.2900 61.3990 56.1830 56.3070 56.2700 57.0280 57.2770 57.2140 56.6530 56.8720 56.2600 57.1270 54.8700 51.3680 50.9750 50.9700 50.9540 50.9300 50.9090 50.8990 50.8910 50.8920 +50.9310 50.9500 51.1090 50.9870 51.0040 51.0130 51.0110 51.0160 51.0220 51.0230 51.0350 51.0180 51.0280 51.0480 51.0540 51.0460 51.0500 51.0410 51.0330 54.9960 51.0550 55.9370 56.2930 56.3610 56.7170 56.8120 56.5140 56.5010 56.4920 54.1610 55.2850 51.0240 50.9960 50.9850 50.9480 50.9390 50.9210 50.9080 50.9010 50.8950 +50.9300 50.9370 50.9500 50.9780 50.9910 51.0060 51.0170 51.0240 51.0230 51.0360 51.0400 51.0410 51.0320 51.0360 51.0420 51.0540 51.0470 51.0260 51.0350 51.0420 51.0470 53.5450 56.6240 52.8250 53.0770 56.9040 55.5970 56.4860 51.5410 53.8430 51.0730 51.0520 50.9980 51.0050 50.9830 50.9770 50.9730 50.9390 50.9200 50.9160 +50.9190 50.9230 50.9420 50.9620 50.9850 51.0040 51.0200 51.0330 51.0350 51.0260 51.0300 51.0460 51.0440 51.0450 51.0500 51.0450 51.0490 51.0470 51.0500 51.0500 51.0480 51.0380 51.0470 51.0330 53.2530 51.0670 54.5870 51.3180 53.7000 53.2060 51.0480 51.0590 51.0380 51.0310 51.0380 51.0070 50.9870 50.9710 50.9520 50.9360 +50.9060 50.9210 50.9290 50.9360 50.9640 50.9980 51.0150 51.0190 51.0260 51.0270 51.0330 51.0380 51.0450 51.0480 51.0490 51.0420 51.0480 51.0500 51.0480 51.0520 51.0560 51.0580 51.0600 51.0620 51.0640 51.0590 51.0420 51.0670 51.0740 51.0670 51.0420 51.0740 51.0630 51.0240 51.0210 51.0220 51.0030 50.9840 50.9710 50.9610 +50.8890 50.8950 50.9190 50.9220 51.3660 54.5370 51.0100 51.0040 51.0160 51.0200 51.0290 51.0360 51.0380 51.0300 51.0370 51.0400 51.0430 51.0460 51.0490 51.0560 51.0560 51.0620 51.0730 51.0850 51.0700 51.0560 51.0590 51.0660 51.0750 51.0660 51.0540 51.0650 51.0410 51.0310 51.0200 51.0250 51.0230 50.9910 50.9770 50.9680 +50.8960 50.8900 50.8870 50.9030 51.1680 52.5660 51.0120 51.0090 51.0200 51.0130 51.0270 51.0230 51.0260 51.0280 51.0380 51.0390 51.0410 51.0410 51.0450 51.0540 51.0540 51.0620 51.0760 51.0720 51.0630 51.0610 51.0640 51.0640 51.0720 51.0710 51.0710 51.0710 51.0600 51.0570 51.0440 51.0290 51.0270 51.0010 51.0020 50.9890 +50.8800 50.8820 50.8900 50.8930 50.9640 50.9930 51.0090 51.0060 51.0180 51.0190 51.0220 51.0150 51.0130 51.0250 51.0330 51.0310 51.0390 51.0380 51.0390 51.0480 51.0620 51.0580 51.0670 51.0670 51.0620 51.0620 51.0690 51.0670 51.0730 51.0740 51.0810 51.0800 51.0840 51.0800 51.0640 51.0530 51.0390 51.0090 51.0130 50.9920 +50.8760 50.8800 50.8740 50.8750 50.8820 50.8950 50.9140 50.9590 50.9880 50.9950 51.0130 51.0190 51.0180 51.0180 51.0230 51.0270 51.0310 51.0330 51.0280 51.0480 51.0500 51.0480 51.0540 51.0590 51.0640 51.0610 51.0680 51.0790 51.0780 51.0770 51.0790 51.0940 51.0880 51.0880 51.0690 51.0530 51.0460 51.0330 51.0150 50.9930 diff --git a/urbantools/svf/output/svf_dsm_demo.csv b/urbantools/svf/output/svf_dsm_demo.csv new file mode 100644 index 0000000..26289a0 --- /dev/null +++ b/urbantools/svf/output/svf_dsm_demo.csv @@ -0,0 +1,1601 @@ +coordinate,svf +"684999.75,4929999.75",1.0 +"685000.25,4929999.75",0.9930278594873079 +"685000.75,4929999.75",0.8080508146947984 +"685001.25,4929999.75",0.8367738296267009 +"685001.75,4929999.75",0.8488545872237621 +"685002.25,4929999.75",0.8089402343109301 +"685002.75,4929999.75",0.7822571243980758 +"685003.25,4929999.75",0.8064256760334596 +"685003.75,4929999.75",0.8210034379569162 +"685004.25,4929999.75",0.8364680652274316 +"685004.75,4929999.75",0.8569688646094069 +"685005.25,4929999.75",0.8540034916249155 +"685005.75,4929999.75",0.8413143804026324 +"685006.25,4929999.75",0.850230062638332 +"685006.75,4929999.75",0.8370725827579529 +"685007.25,4929999.75",0.8411461636126818 +"685007.75,4929999.75",0.8478988972196013 +"685008.25,4929999.75",0.8171768560644361 +"685008.75,4929999.75",0.7515683513242398 +"685009.25,4929999.75",0.8302101456981463 +"685009.75,4929999.75",0.8570924996981385 +"685010.25,4929999.75",0.8594129872451197 +"685010.75,4929999.75",0.8397517355101431 +"685011.25,4929999.75",0.7378196134799816 +"685011.75,4929999.75",0.6811102504720794 +"685012.25,4929999.75",0.6997105574383903 +"685012.75,4929999.75",0.7315579021251362 +"685013.25,4929999.75",0.7308510952825186 +"685013.75,4929999.75",0.6624823876610232 +"685014.25,4929999.75",0.6798223254758671 +"685014.75,4929999.75",0.5988867238686689 +"685015.25,4929999.75",0.6548759398771087 +"685015.75,4929999.75",0.4839498747183565 +"685016.25,4929999.75",0.5625412056441312 +"685016.75,4929999.75",0.8038654595810865 +"685017.25,4929999.75",0.40134449731228156 +"685017.75,4929999.75",0.4120308268068041 +"685018.25,4929999.75",0.4395957618993357 +"685018.75,4929999.75",0.9903487067351175 +"685019.25,4929999.75",0.7763628105359207 +"684999.75,4929999.25",0.7863377356360796 +"685000.25,4929999.25",0.30531711300661424 +"685000.75,4929999.25",0.4854794825147925 +"685001.25,4929999.25",0.3703191463214584 +"685001.75,4929999.25",0.39022493223505683 +"685002.25,4929999.25",0.5447251967187143 +"685002.75,4929999.25",0.6692050535331742 +"685003.25,4929999.25",0.7778480699935808 +"685003.75,4929999.25",0.8217761722773878 +"685004.25,4929999.25",0.8243582896643337 +"685004.75,4929999.25",0.8224696389631604 +"685005.25,4929999.25",0.8329738200318877 +"685005.75,4929999.25",0.8229638615617949 +"685006.25,4929999.25",0.8101026611337981 +"685006.75,4929999.25",0.8238899210062376 +"685007.25,4929999.25",0.8243582896643337 +"685007.75,4929999.25",0.8101026611337981 +"685008.25,4929999.25",0.8279501617041215 +"685008.75,4929999.25",0.7403120187229228 +"685009.25,4929999.25",0.7067866345688982 +"685009.75,4929999.25",0.7491123063838331 +"685010.25,4929999.25",0.7285231130045438 +"685010.75,4929999.25",0.47247878736149845 +"685011.25,4929999.25",0.48839114590373994 +"685011.75,4929999.25",0.6189752557450484 +"685012.25,4929999.25",0.6786895272132929 +"685012.75,4929999.25",0.6380620576842727 +"685013.25,4929999.25",0.6420386031737573 +"685013.75,4929999.25",0.6315477622618749 +"685014.25,4929999.25",0.6059974506115949 +"685014.75,4929999.25",0.48918387306480327 +"685015.25,4929999.25",0.5651141966684622 +"685015.75,4929999.25",0.4618686263922848 +"685016.25,4929999.25",0.49225191306092037 +"685016.75,4929999.25",0.610644654888924 +"685017.25,4929999.25",0.35354310802961436 +"685017.75,4929999.25",0.7275680164788065 +"685018.25,4929999.25",0.6500050343095714 +"685018.75,4929999.25",0.8246324332879917 +"685019.25,4929999.25",0.8909255304513022 +"684999.75,4929998.75",0.5942064019050818 +"685000.25,4929998.75",0.3892335176765027 +"685000.75,4929998.75",0.4299810004467397 +"685001.25,4929998.75",0.4949710923416332 +"685001.75,4929998.75",0.521755584603229 +"685002.25,4929998.75",0.617421487114642 +"685002.75,4929998.75",0.6979147283082315 +"685003.25,4929998.75",0.7656765807468587 +"685003.75,4929998.75",0.8070887069010443 +"685004.25,4929998.75",0.8052000561998711 +"685004.75,4929998.75",0.8098775631061217 +"685005.25,4929998.75",0.8146446106466234 +"685005.75,4929998.75",0.8351587501854436 +"685006.25,4929998.75",0.7955248992103418 +"685006.75,4929998.75",0.8084831350035829 +"685007.25,4929998.75",0.7947217290716823 +"685007.75,4929998.75",0.7692079492336903 +"685008.25,4929998.75",0.6952341768191476 +"685008.75,4929998.75",0.7268072235782865 +"685009.25,4929998.75",0.6870629970810949 +"685009.75,4929998.75",0.7450260574414614 +"685010.25,4929998.75",0.4793065748088868 +"685010.75,4929998.75",0.550048287025788 +"685011.25,4929998.75",0.5815483164482775 +"685011.75,4929998.75",0.6052484994255655 +"685012.25,4929998.75",0.6103113518507156 +"685012.75,4929998.75",0.5804006476344061 +"685013.25,4929998.75",0.6083418018832217 +"685013.75,4929998.75",0.5442610418548485 +"685014.25,4929998.75",0.5005755915497928 +"685014.75,4929998.75",0.4284376687359434 +"685015.25,4929998.75",0.5435170311307398 +"685015.75,4929998.75",0.8135716438678031 +"685016.25,4929998.75",0.2929380987985485 +"685016.75,4929998.75",0.27973017458529437 +"685017.25,4929998.75",0.046972983841640836 +"685017.75,4929998.75",0.1482234003103175 +"685018.25,4929998.75",0.6564474762380608 +"685018.75,4929998.75",0.6950235827910577 +"685019.25,4929998.75",0.9959264191452724 +"684999.75,4929998.25",0.953503711965093 +"685000.25,4929998.25",0.5228053597266065 +"685000.75,4929998.25",0.48844345676239004 +"685001.25,4929998.25",0.5477030834868991 +"685001.75,4929998.25",0.6171556434804476 +"685002.25,4929998.25",0.6376564428624227 +"685002.75,4929998.25",0.6699721562072648 +"685003.25,4929998.25",0.7372693954922939 +"685003.75,4929998.25",0.7655044915411452 +"685004.25,4929998.25",0.7882786150739902 +"685004.75,4929998.25",0.7942141663162027 +"685005.25,4929998.25",0.7910666449059162 +"685005.75,4929998.25",0.7869930640511871 +"685006.25,4929998.25",0.7891566847491699 +"685006.75,4929998.25",0.7927360430052645 +"685007.25,4929998.25",0.7763925196864178 +"685007.75,4929998.25",0.7759606828406096 +"685008.25,4929998.25",0.7628263946156736 +"685008.75,4929998.25",0.7217230616975636 +"685009.25,4929998.25",0.7538741805676857 +"685009.75,4929998.25",0.5692344109346081 +"685010.25,4929998.25",0.5677782691484459 +"685010.75,4929998.25",0.5936248602511086 +"685011.25,4929998.25",0.5777763859040487 +"685011.75,4929998.25",0.591563645776488 +"685012.25,4929998.25",0.5762173633267902 +"685012.75,4929998.25",0.5808948702330408 +"685013.25,4929998.25",0.5305129760797928 +"685013.75,4929998.25",0.4982879943846114 +"685014.25,4929998.25",0.44033206411297976 +"685014.75,4929998.25",0.32444454601063044 +"685015.25,4929998.25",0.24208783598720438 +"685015.75,4929998.25",0.19323243867167286 +"685016.25,4929998.25",0.5929193715551808 +"685016.75,4929998.25",0.1380892283297651 +"685017.25,4929998.25",0.23122217312422333 +"685017.75,4929998.25",0.7156347576951225 +"685018.25,4929998.25",0.5180425450955922 +"685018.75,4929998.25",0.983595973128198 +"685019.25,4929998.25",0.9496167071098591 +"684999.75,4929997.75",0.7469169332526798 +"685000.25,4929997.75",0.49598226484662605 +"685000.75,4929997.75",0.558004893835674 +"685001.25,4929997.75",0.6370910388390822 +"685001.75,4929997.75",0.6733403480715271 +"685002.25,4929997.75",0.6822780118320024 +"685002.75,4929997.75",0.6773168935610118 +"685003.25,4929997.75",0.7405278839036693 +"685003.75,4929997.75",0.7550797918865872 +"685004.25,4929997.75",0.745780854053342 +"685004.75,4929997.75",0.7353151950127956 +"685005.25,4929997.75",0.7622465946087693 +"685005.75,4929997.75",0.7398696583093143 +"685006.25,4929997.75",0.7364836987145064 +"685006.75,4929997.75",0.7660105558542708 +"685007.25,4929997.75",0.7264352182162326 +"685007.75,4929997.75",0.7428411272879057 +"685008.25,4929997.75",0.7292479381459552 +"685008.75,4929997.75",0.7067115807284293 +"685009.25,4929997.75",0.6305920722577142 +"685009.75,4929997.75",0.6031412681917698 +"685010.25,4929997.75",0.61017579445729 +"685010.75,4929997.75",0.587092877688369 +"685011.25,4929997.75",0.5422155243046767 +"685011.75,4929997.75",0.5191192673789105 +"685012.25,4929997.75",0.517269810775121 +"685012.75,4929997.75",0.46446897585749547 +"685013.25,4929997.75",0.7485948921297554 +"685013.75,4929997.75",0.49264910029431014 +"685014.25,4929997.75",0.3010305832656438 +"685014.75,4929997.75",0.7580009245483266 +"685015.25,4929997.75",0.15972632069054815 +"685015.75,4929997.75",0.5788358322303588 +"685016.25,4929997.75",0.2066415828194096 +"685016.75,4929997.75",0.047168472424281085 +"685017.25,4929997.75",0.6613607590437374 +"685017.75,4929997.75",0.5473871732193576 +"685018.25,4929997.75",0.9278435888459027 +"685018.75,4929997.75",0.9902390032822305 +"685019.25,4929997.75",0.8444544070819252 +"684999.75,4929997.25",0.7621748217050637 +"685000.25,4929997.25",0.6847454067133614 +"685000.75,4929997.25",0.6694904473923237 +"685001.25,4929997.25",0.6949570638342043 +"685001.75,4929997.25",0.701075589875363 +"685002.25,4929997.25",0.6963482109999792 +"685002.75,4929997.25",0.7105068041652703 +"685003.25,4929997.25",0.7266611426170604 +"685003.75,4929997.25",0.7271805470870312 +"685004.25,4929997.25",0.7393754357106797 +"685004.75,4929997.25",0.7166763660183038 +"685005.25,4929997.25",0.6705058336915468 +"685005.75,4929997.25",0.6713965714543689 +"685006.25,4929997.25",0.6434294089610656 +"685006.75,4929997.25",0.6947677983769447 +"685007.25,4929997.25",0.7381145747856735 +"685007.75,4929997.25",0.7173753372191767 +"685008.25,4929997.25",0.744800959413785 +"685008.75,4929997.25",0.6891118952734909 +"685009.25,4929997.25",0.6900379547179335 +"685009.75,4929997.25",0.6627093678885698 +"685010.25,4929997.25",0.5897486310636326 +"685010.75,4929997.25",0.5435387709825091 +"685011.25,4929997.25",0.5257749656205852 +"685011.75,4929997.25",0.45168282926996733 +"685012.25,4929997.25",0.6685143021992775 +"685012.75,4929997.25",0.620354461490872 +"685013.25,4929997.25",0.2494733189474696 +"685013.75,4929997.25",0.11246292998154932 +"685014.25,4929997.25",0.9711558236582368 +"685014.75,4929997.25",0.1002000239586929 +"685015.25,4929997.25",0.36458660428699147 +"685015.75,4929997.25",0.4742372515273636 +"685016.25,4929997.25",0.16039498320451406 +"685016.75,4929997.25",0.842800231339292 +"685017.25,4929997.25",0.5528498113185077 +"685017.75,4929997.25",0.446036440448672 +"685018.25,4929997.25",0.8186336699198014 +"685018.75,4929997.25",0.9944222875898465 +"685019.25,4929997.25",0.5432998684502685 +"684999.75,4929996.75",0.7959819985176887 +"685000.25,4929996.75",0.7640249503780558 +"685000.75,4929996.75",0.7462026316790685 +"685001.25,4929996.75",0.7209258721734472 +"685001.75,4929996.75",0.7306024470151276 +"685002.25,4929996.75",0.7231959153875533 +"685002.75,4929996.75",0.7228026005699264 +"685003.25,4929996.75",0.7027032022155714 +"685003.75,4929996.75",0.7063662556800653 +"685004.25,4929996.75",0.6605709290619229 +"685004.75,4929996.75",0.5801375193520871 +"685005.25,4929996.75",0.763999687916517 +"685005.75,4929996.75",0.8393678884335981 +"685006.25,4929996.75",0.7034583825849678 +"685006.75,4929996.75",0.6445103450386137 +"685007.25,4929996.75",0.727128684902005 +"685007.75,4929996.75",0.712647958343793 +"685008.25,4929996.75",0.7082316067097725 +"685008.75,4929996.75",0.6919844466869677 +"685009.25,4929996.75",0.646402376382011 +"685009.75,4929996.75",0.5593653443949972 +"685010.25,4929996.75",0.578454155665372 +"685010.75,4929996.75",0.4464221506098298 +"685011.25,4929996.75",0.5294583896251991 +"685011.75,4929996.75",0.8105211578227612 +"685012.25,4929996.75",0.5942827723605327 +"685012.75,4929996.75",0.590325412453745 +"685013.25,4929996.75",0.2429190836447398 +"685013.75,4929996.75",0.5376771165168786 +"685014.25,4929996.75",0.11225410124206397 +"685014.75,4929996.75",0.6702260775367652 +"685015.25,4929996.75",0.3510818091423554 +"685015.75,4929996.75",0.14155445555927226 +"685016.25,4929996.75",0.047168472424281085 +"685016.75,4929996.75",0.8132021927748216 +"685017.25,4929996.75",0.6526700668196912 +"685017.75,4929996.75",0.9097999810412711 +"685018.25,4929996.75",0.5087996087093852 +"685018.75,4929996.75",0.8219752620605767 +"685019.25,4929996.75",0.7770463177070723 +"684999.75,4929996.25",0.83133552981993 +"685000.25,4929996.25",0.8142732773537718 +"685000.75,4929996.25",0.7910548031914252 +"685001.25,4929996.25",0.7628253387889549 +"685001.75,4929996.25",0.7734090012718516 +"685002.25,4929996.25",0.7440144205887492 +"685002.75,4929996.25",0.7300192752612417 +"685003.25,4929996.25",0.6660137561478547 +"685003.75,4929996.25",0.5676278412037236 +"685004.25,4929996.25",0.5272334390011078 +"685004.75,4929996.25",0.7258226507967805 +"685005.25,4929996.25",0.7399427219338904 +"685005.75,4929996.25",0.6636763061287977 +"685006.25,4929996.25",0.8211010648011602 +"685006.75,4929996.25",0.6326250760241926 +"685007.25,4929996.25",0.6854069391385917 +"685007.75,4929996.25",0.705414187991135 +"685008.25,4929996.25",0.6840006693215621 +"685008.75,4929996.25",0.6504135714839135 +"685009.25,4929996.25",0.605519122438878 +"685009.75,4929996.25",0.6207115963016285 +"685010.25,4929996.25",0.3217174034891767 +"685010.75,4929996.25",0.7353345314582802 +"685011.25,4929996.25",0.13259943251193423 +"685011.75,4929996.25",0.7434431711395573 +"685012.25,4929996.25",0.4311066816778484 +"685012.75,4929996.25",0.12157268294773808 +"685013.25,4929996.25",0.6632242278735747 +"685013.75,4929996.25",0.08828807463058164 +"685014.25,4929996.25",0.8247931553469486 +"685014.75,4929996.25",0.1053121827680883 +"685015.25,4929996.25",0.4329301300371505 +"685015.75,4929996.25",0.03489222624457953 +"685016.25,4929996.25",0.2453985340200596 +"685016.75,4929996.25",0.9373851786578995 +"685017.25,4929996.25",0.7113524478063687 +"685017.75,4929996.25",0.0713299876184037 +"685018.25,4929996.25",0.6262890989908744 +"685018.75,4929996.25",0.9095402334011767 +"685019.25,4929996.25",0.8184722585858373 +"684999.75,4929995.75",0.8368035387771977 +"685000.25,4929995.75",0.8385388643544 +"685000.75,4929995.75",0.8115941246015814 +"685001.25,4929995.75",0.7833394783277751 +"685001.75,4929995.75",0.7504754566209355 +"685002.25,4929995.75",0.756482306199119 +"685002.75,4929995.75",0.6550020123236476 +"685003.25,4929995.75",0.5094750044973013 +"685003.75,4929995.75",0.8238513989780566 +"685004.25,4929995.75",0.8594715005821832 +"685004.75,4929995.75",0.3505839642284898 +"685005.25,4929995.75",0.43003089830998337 +"685005.75,4929995.75",0.7352652150276396 +"685006.25,4929995.75",0.5384321425823253 +"685006.75,4929995.75",0.636638153325965 +"685007.25,4929995.75",0.700947292318779 +"685007.75,4929995.75",0.6582504415149416 +"685008.25,4929995.75",0.6410970796995932 +"685008.75,4929995.75",0.6120020594056367 +"685009.25,4929995.75",0.5112014174913585 +"685009.75,4929995.75",0.3699534446749879 +"685010.25,4929995.75",0.7322455233850572 +"685010.75,4929995.75",0.14448470152635529 +"685011.25,4929995.75",0.6440621391991537 +"685011.75,4929995.75",0.8419731974759869 +"685012.25,4929995.75",0.5417758792429432 +"685012.75,4929995.75",0.9511100527775126 +"685013.25,4929995.75",0.7444733215057634 +"685013.75,4929995.75",0.6987895170466475 +"685014.25,4929995.75",0.26628588299361494 +"685014.75,4929995.75",0.7335592851160033 +"685015.25,4929995.75",0.4514852638232433 +"685015.75,4929995.75",0.4153456580436853 +"685016.25,4929995.75",0.8259132855218803 +"685016.75,4929995.75",0.652798129482123 +"685017.25,4929995.75",0.6386705636140187 +"685017.75,4929995.75",0.8322852643827922 +"685018.25,4929995.75",0.6178728127104578 +"685018.75,4929995.75",0.8664877462289373 +"685019.25,4929995.75",0.8365051885187194 +"684999.75,4929995.25",0.8763225866565097 +"685000.25,4929995.25",0.8426124452091289 +"685000.75,4929995.25",0.8289972745424032 +"685001.25,4929995.25",0.7582833892761297 +"685001.75,4929995.25",0.7044324317986735 +"685002.25,4929995.25",0.6058909475052678 +"685002.75,4929995.25",0.6386584890048009 +"685003.25,4929995.25",0.8407237945079556 +"685003.75,4929995.25",0.8074607122630983 +"685004.25,4929995.25",0.8242965759807096 +"685004.75,4929995.25",0.8495365959525595 +"685005.25,4929995.25",0.5118779217050542 +"685005.75,4929995.25",0.575024553284797 +"685006.25,4929995.25",0.6264214560377402 +"685006.75,4929995.25",0.6433523649047035 +"685007.25,4929995.25",0.6533949999771259 +"685007.75,4929995.25",0.5950134429277961 +"685008.25,4929995.25",0.5687888501744399 +"685008.75,4929995.25",0.5811558280038024 +"685009.25,4929995.25",0.46713177873129064 +"685009.75,4929995.25",0.5904971179019431 +"685010.25,4929995.25",0.4399467185940802 +"685010.75,4929995.25",0.62545196352844 +"685011.25,4929995.25",0.5132587767560206 +"685011.75,4929995.25",0.7601763869608005 +"685012.25,4929995.25",0.9116154601018454 +"685012.75,4929995.25",0.9292014851361535 +"685013.25,4929995.25",0.7080765325751988 +"685013.75,4929995.25",0.9010488932802911 +"685014.25,4929995.25",0.7469198814992837 +"685014.75,4929995.25",0.8560567368008088 +"685015.25,4929995.25",0.4953899667301241 +"685015.75,4929995.25",0.9518640230162415 +"685016.25,4929995.25",0.4553034440213745 +"685016.75,4929995.25",0.721322252148943 +"685017.25,4929995.25",0.03508771482721978 +"685017.75,4929995.25",0.29876598987054676 +"685018.25,4929995.25",0.7475842030877389 +"685018.75,4929995.25",0.7854542828833435 +"685019.25,4929995.25",0.8275529744707316 +"684999.75,4929994.75",0.8694601495967031 +"685000.25,4929994.75",0.8512279755766831 +"685000.75,4929994.75",0.834465283499671 +"685001.25,4929994.75",0.7410775104123576 +"685001.75,4929994.75",0.822938679690459 +"685002.25,4929994.75",0.8238513989780566 +"685002.75,4929994.75",0.3878164283902902 +"685003.25,4929994.75",0.815856163655676 +"685003.75,4929994.75",0.8485488228244927 +"685004.25,4929994.75",0.8462541892180501 +"685004.75,4929994.75",0.47529020979149705 +"685005.25,4929994.75",0.5966753462961503 +"685005.75,4929994.75",0.6852367321327482 +"685006.25,4929994.75",0.658601611989157 +"685006.75,4929994.75",0.6216285545567003 +"685007.25,4929994.75",0.7328426267747877 +"685007.75,4929994.75",0.5355126694457436 +"685008.25,4929994.75",0.4619049233104194 +"685008.75,4929994.75",0.4828037362989367 +"685009.25,4929994.75",0.520411022411837 +"685009.75,4929994.75",0.2835364939536776 +"685010.25,4929994.75",0.8776324931774974 +"685010.75,4929994.75",0.9770556694613126 +"685011.25,4929994.75",0.7725692187307012 +"685011.75,4929994.75",0.8270001305190107 +"685012.25,4929994.75",0.8004984232490029 +"685012.75,4929994.75",0.6869898254404959 +"685013.25,4929994.75",0.6303807889546168 +"685013.75,4929994.75",0.33174998802982514 +"685014.25,4929994.75",0.820818600073357 +"685014.75,4929994.75",0.7494344397767541 +"685015.25,4929994.75",0.8610985214433922 +"685015.75,4929994.75",0.7917215895635077 +"685016.25,4929994.75",0.6081886099485171 +"685016.75,4929994.75",0.8506511135963676 +"685017.25,4929994.75",0.7179496327109802 +"685017.75,4929994.75",0.6014982620944241 +"685018.25,4929994.75",0.6802044324370514 +"685018.75,4929994.75",0.8486269055017689 +"685019.25,4929994.75",0.96600994809389 +"684999.75,4929994.25",0.8694601495967031 +"685000.25,4929994.25",0.85677103837442 +"685000.75,4929994.25",0.809705473900408 +"685001.25,4929994.25",0.7281816603719428 +"685001.75,4929994.25",0.8218790530684837 +"685002.25,4929994.25",0.8431431996200516 +"685002.75,4929994.25",0.3901601075927145 +"685003.25,4929994.25",0.8245448656638291 +"685003.75,4929994.25",0.7509941344232154 +"685004.25,4929994.25",0.5283259751201398 +"685004.75,4929994.25",0.5637412201060049 +"685005.25,4929994.25",0.6557597469621167 +"685005.75,4929994.25",0.6988047394033626 +"685006.25,4929994.25",0.679904280568906 +"685006.75,4929994.25",0.5990131800727232 +"685007.25,4929994.25",0.7203891371479816 +"685007.75,4929994.25",0.7392108412359597 +"685008.25,4929994.25",0.46942979975881155 +"685008.75,4929994.25",0.40116575542282146 +"685009.25,4929994.25",0.6487336498167647 +"685009.75,4929994.25",0.5955199498565575 +"685010.25,4929994.25",0.5544649904652266 +"685010.75,4929994.25",0.5529468466837525 +"685011.25,4929994.25",0.9135514285030791 +"685011.75,4929994.25",0.3740410102323416 +"685012.25,4929994.25",0.493279246838081 +"685012.75,4929994.25",0.9620460706920481 +"685013.25,4929994.25",0.6909885239645096 +"685013.75,4929994.25",0.8986150013744137 +"685014.25,4929994.25",0.6284796416755544 +"685014.75,4929994.25",0.8209906892790706 +"685015.25,4929994.25",0.9743765167091222 +"685015.75,4929994.25",0.20169673383660983 +"685016.25,4929994.25",0.7745529145812261 +"685016.75,4929994.25",0.509956745264339 +"685017.25,4929994.25",0.5145159073497723 +"685017.75,4929994.25",0.6779414024004152 +"685018.25,4929994.25",0.7289826859907603 +"685018.75,4929994.25",0.7799875748669616 +"685019.25,4929994.25",0.9848806977778498 +"684999.75,4929993.75",0.8653865687419742 +"685000.25,4929993.75",0.8630295493827047 +"685000.75,4929993.75",0.8130250845164082 +"685001.25,4929993.75",0.708157871015994 +"685001.75,4929993.75",0.8332959534248087 +"685002.25,4929993.75",0.8525127002263347 +"685002.75,4929993.75",0.5438448213432848 +"685003.25,4929993.75",0.5562124712418501 +"685003.75,4929993.75",0.5878347179009199 +"685004.25,4929993.75",0.6127929452141688 +"685004.75,4929993.75",0.6459376826382092 +"685005.25,4929993.75",0.6632657787385626 +"685005.75,4929993.75",0.7088764115570795 +"685006.25,4929993.75",0.6329982915169139 +"685006.75,4929993.75",0.5627594432665776 +"685007.25,4929993.75",0.6949226750100501 +"685007.75,4929993.75",0.4860467946321128 +"685008.25,4929993.75",0.6786529954010049 +"685008.75,4929993.75",0.35022537961348416 +"685009.25,4929993.75",0.4447170470713456 +"685009.75,4929993.75",0.5867813758792716 +"685010.25,4929993.75",0.49959523256251614 +"685010.75,4929993.75",0.7915275188330186 +"685011.25,4929993.75",0.8571548854509651 +"685011.75,4929993.75",0.9714779570511578 +"685012.25,4929993.75",0.8348031138170414 +"685012.75,4929993.75",0.8257557466036793 +"685013.25,4929993.75",0.5793627142255188 +"685013.75,4929993.75",0.9477904421615125 +"685014.25,4929993.75",0.6488274466242939 +"685014.75,4929993.75",0.9332385341785945 +"685015.25,4929993.75",0.8607707755193476 +"685015.75,4929993.75",0.8556980715955999 +"685016.25,4929993.75",0.5004091763695073 +"685016.75,4929993.75",0.4855304362047535 +"685017.25,4929993.75",0.831291753844897 +"685017.75,4929993.75",0.9958167156923853 +"685018.25,4929993.75",0.9124754328874521 +"685018.75,4929993.75",0.9693403445976625 +"685019.25,4929993.75",0.9848806977778498 +"684999.75,4929993.25",0.8644239774852435 +"685000.25,4929993.25",0.8526224036792218 +"685000.75,4929993.25",0.7992636785845072 +"685001.25,4929993.25",0.7524358802258146 +"685001.75,4929993.25",0.676458597506367 +"685002.25,4929993.25",0.7860601819449534 +"685002.75,4929993.25",0.7437345101300188 +"685003.25,4929993.25",0.6130440514863327 +"685003.75,4929993.25",0.656690979763208 +"685004.25,4929993.25",0.7086677905390778 +"685004.75,4929993.25",0.6742056690688609 +"685005.25,4929993.25",0.6315539914452419 +"685005.75,4929993.25",0.6647225925939279 +"685006.25,4929993.25",0.6986268047717976 +"685006.75,4929993.25",0.6364860726349385 +"685007.25,4929993.25",0.7217413423163297 +"685007.75,4929993.25",0.30988144085900154 +"685008.25,4929993.25",0.4034975123205514 +"685008.75,4929993.25",0.4327508979058609 +"685009.25,4929993.25",0.3653144597969181 +"685009.75,4929993.25",0.625707747942553 +"685010.25,4929993.25",0.1186755750934476 +"685010.75,4929993.25",0.6331111318226303 +"685011.25,4929993.25",0.7793584841499085 +"685011.75,4929993.25",0.7132847938923721 +"685012.25,4929993.25",0.7941334999446101 +"685012.75,4929993.25",0.7119268976021214 +"685013.25,4929993.25",0.6873175713645405 +"685013.75,4929993.25",0.9153153076985993 +"685014.25,4929993.25",0.6929023393312144 +"685014.75,4929993.25",0.5247862855291626 +"685015.25,4929993.25",0.5461342815930793 +"685015.75,4929993.25",0.694221713593284 +"685016.25,4929993.25",0.4546067769890422 +"685016.75,4929993.25",0.7976251997663235 +"685017.25,4929993.25",0.5963457181722354 +"685017.75,4929993.25",0.6950898237538425 +"685018.25,4929993.25",0.8177661238124221 +"685018.75,4929993.25",0.4937235974675822 +"685019.25,4929993.25",0.7101542349541613 +"684999.75,4929992.75",0.8256776639264033 +"685000.25,4929992.75",0.8516963442347791 +"685000.75,4929992.75",0.8043968860612115 +"685001.25,4929992.75",0.7866854174520479 +"685001.75,4929992.75",0.7889712553866113 +"685002.25,4929992.75",0.7419807447530685 +"685002.75,4929992.75",0.6737209142113086 +"685003.25,4929992.75",0.6842887819737485 +"685003.75,4929992.75",0.7177650297215732 +"685004.25,4929992.75",0.6825210475682699 +"685004.75,4929992.75",0.6337647755393362 +"685005.25,4929992.75",0.7298955595823071 +"685005.75,4929992.75",0.5369053574329208 +"685006.25,4929992.75",0.5503857970793733 +"685006.75,4929992.75",0.8001525341474593 +"685007.25,4929992.75",0.3982487559651088 +"685007.75,4929992.75",0.5334923337669073 +"685008.25,4929992.75",0.4348379663210201 +"685008.75,4929992.75",0.45572411122189493 +"685009.25,4929992.75",0.36543468681760577 +"685009.75,4929992.75",0.6203944819614073 +"685010.25,4929992.75",0.9094778476483502 +"685010.75,4929992.75",0.3938616830853894 +"685011.25,4929992.75",0.9630086619487788 +"685011.75,4929992.75",0.8913976000154075 +"685012.25,4929992.75",0.7427731290039556 +"685012.75,4929992.75",0.1620552549412475 +"685013.25,4929992.75",0.4538134789959458 +"685013.75,4929992.75",0.9373959645456719 +"685014.25,4929992.75",0.0830197680501845 +"685014.75,4929992.75",0.9986055718974626 +"685015.25,4929992.75",0.8624929495459309 +"685015.75,4929992.75",0.8379601201742145 +"685016.25,4929992.75",0.5134605751122312 +"685016.75,4929992.75",0.8869653539554695 +"685017.25,4929992.75",0.8556614317672888 +"685017.75,4929992.75",0.9325614364864737 +"685018.25,4929992.75",0.8569461564169406 +"685018.75,4929992.75",0.7832082679178471 +"685019.25,4929992.75",0.8543401753053491 +"684999.75,4929992.25",0.8297512447811322 +"685000.25,4929992.25",0.8224916204879358 +"685000.75,4929992.25",0.8329478117874002 +"685001.25,4929992.25",0.7769445835529133 +"685001.75,4929992.25",0.8466487141663448 +"685002.25,4929992.25",0.7909310875124906 +"685002.75,4929992.25",0.77069191797048 +"685003.25,4929992.25",0.7266131528477975 +"685003.75,4929992.25",0.6782667361398967 +"685004.25,4929992.25",0.6005709925193146 +"685004.75,4929992.25",0.774356961650867 +"685005.25,4929992.25",0.5287216639111746 +"685005.75,4929992.25",0.5104894898911544 +"685006.25,4929992.25",0.5389448786944535 +"685006.75,4929992.25",0.533201899740376 +"685007.25,4929992.25",0.49583817256958385 +"685007.75,4929992.25",0.49198384431667974 +"685008.25,4929992.25",0.4995769519437496 +"685008.75,4929992.25",0.4695825525190408 +"685009.25,4929992.25",0.4706126837699898 +"685009.75,4929992.25",0.36299537098683066 +"685010.25,4929992.25",0.8485393550834109 +"685010.75,4929992.25",0.8971581875190483 +"685011.25,4929992.25",0.6598219778758936 +"685011.75,4929992.25",0.9739446798633142 +"685012.25,4929992.25",0.37794999661235085 +"685012.75,4929992.25",0.48403592669435935 +"685013.25,4929992.25",0.6053513802166613 +"685013.75,4929992.25",0.9018615483658377 +"685014.25,4929992.25",0.9894958189312739 +"685014.75,4929992.25",0.0830197680501845 +"685015.25,4929992.25",0.7776235634449039 +"685015.75,4929992.25",0.39440177158041034 +"685016.25,4929992.25",0.49374960571206983 +"685016.75,4929992.25",0.4614205522103826 +"685017.25,4929992.25",0.5058076360014074 +"685017.75,4929992.25",0.9671919462563948 +"685018.25,4929992.25",0.9132696358444784 +"685018.75,4929992.25",0.6062342823377388 +"685019.25,4929992.25",0.8217553373895492 +"684999.75,4929991.75",0.8246187093736306 +"685000.25,4929991.75",0.8037073826014203 +"685000.75,4929991.75",0.8004860174813323 +"685001.25,4929991.75",0.7920292361626468 +"685001.75,4929991.75",0.8124078183080414 +"685002.25,4929991.75",0.7991147810342367 +"685002.75,4929991.75",0.7635930329420452 +"685003.25,4929991.75",0.6544019586878891 +"685003.75,4929991.75",0.679148428130307 +"685004.25,4929991.75",0.63198582829105 +"685004.75,4929991.75",0.8302447953105643 +"685005.25,4929991.75",0.8274559391054871 +"685005.75,4929991.75",0.6753384673314354 +"685006.25,4929991.75",0.5911554923596607 +"685006.75,4929991.75",0.603505929685618 +"685007.25,4929991.75",0.5648480101240916 +"685007.75,4929991.75",0.5783276233973921 +"685008.25,4929991.75",0.4991931048672051 +"685008.75,4929991.75",0.4863351853759721 +"685009.25,4929991.75",0.4159075203419988 +"685009.75,4929991.75",0.41609106750468794 +"685010.25,4929991.75",0.5841859183354805 +"685010.75,4929991.75",0.19280773191460054 +"685011.25,4929991.75",0.8103969675760923 +"685011.75,4929991.75",0.919487806118443 +"685012.25,4929991.75",0.4552085791676875 +"685012.75,4929991.75",0.9148834708527912 +"685013.25,4929991.75",0.774119195535548 +"685013.75,4929991.75",0.7209818675625002 +"685014.25,4929991.75",0.6063466480757216 +"685014.75,4929991.75",0.9519737264691286 +"685015.25,4929991.75",0.9112417268438702 +"685015.75,4929991.75",0.7228074864333589 +"685016.25,4929991.75",0.45010267743519505 +"685016.75,4929991.75",0.7624602346794709 +"685017.25,4929991.75",0.712380715972705 +"685017.75,4929991.75",0.5448074126000154 +"685018.25,4929991.75",0.6175309556733763 +"685018.75,4929991.75",0.9752294045129658 +"685019.25,4929991.75",0.4672091641661198 +"684999.75,4929991.25",0.7941791329462685 +"685000.25,4929991.25",0.7834490274767132 +"685000.75,4929991.25",0.7833048287153571 +"685001.25,4929991.25",0.8036201987347737 +"685001.75,4929991.25",0.7873517292563962 +"685002.25,4929991.25",0.7654691698595247 +"685002.75,4929991.25",0.6831249736197915 +"685003.25,4929991.25",0.6744092075404322 +"685003.75,4929991.25",0.8130647531815259 +"685004.25,4929991.25",0.8149534038826993 +"685004.75,4929991.25",0.3920877548898028 +"685005.25,4929991.25",0.6196939043021563 +"685005.75,4929991.25",0.5754210684489839 +"685006.25,4929991.25",0.620546792106 +"685006.75,4929991.25",0.6050339249656895 +"685007.25,4929991.25",0.6085547698847201 +"685007.75,4929991.25",0.5652546650985641 +"685008.25,4929991.25",0.5147461261350349 +"685008.75,4929991.25",0.48574017190759516 +"685009.25,4929991.25",0.41916541727437534 +"685009.75,4929991.25",0.7108053244017942 +"685010.25,4929991.25",0.5310404495539514 +"685010.75,4929991.25",0.898011075322892 +"685011.25,4929991.25",0.6411089214140842 +"685011.75,4929991.25",0.7509777654295634 +"685012.25,4929991.25",0.4243703170645807 +"685012.75,4929991.25",0.5305866311833674 +"685013.25,4929991.25",0.22496507996808948 +"685013.75,4929991.25",0.983595973128198 +"685014.25,4929991.25",0.602766233992909 +"685014.75,4929991.25",0.6104815588565591 +"685015.25,4929991.25",0.7127138327548665 +"685015.75,4929991.25",0.5556892115619215 +"685016.25,4929991.25",0.48562829794315004 +"685016.75,4929991.25",0.2776541215114739 +"685017.25,4929991.25",0.7397353110465563 +"685017.75,4929991.25",0.7284551147205937 +"685018.25,4929991.25",0.6331130140225002 +"685018.75,4929991.25",0.9314853328548238 +"685019.25,4929991.25",0.9848806977778498 +"684999.75,4929990.75",0.7312668766196055 +"685000.25,4929990.75",0.7211080205992422 +"685000.75,4929990.75",0.7548906070195307 +"685001.25,4929990.75",0.7600231424270325 +"685001.75,4929990.75",0.74537419907887 +"685002.25,4929990.75",0.6733217539678301 +"685002.75,4929990.75",0.8320949239835567 +"685003.25,4929990.75",0.6238645205221302 +"685003.75,4929990.75",0.8597716524503287 +"685004.25,4929990.75",0.7856881765828995 +"685004.75,4929990.75",0.6207845582213185 +"685005.25,4929990.75",0.6031216606404017 +"685005.75,4929990.75",0.627198617931912 +"685006.25,4929990.75",0.6558069103582281 +"685006.75,4929990.75",0.6337078943016107 +"685007.25,4929990.75",0.5990131800727232 +"685007.75,4929990.75",0.5705426155513906 +"685008.25,4929990.75",0.5033897293316666 +"685008.75,4929990.75",0.5029964145140394 +"685009.25,4929990.75",0.3888910076854748 +"685009.75,4929990.75",0.2670412580272236 +"685010.25,4929990.75",0.4547683426269553 +"685010.75,4929990.75",0.7733597207817183 +"685011.25,4929990.75",0.7984523416456516 +"685011.75,4929990.75",0.4956464758125024 +"685012.25,4929990.75",0.5075777443802939 +"685012.75,4929990.75",0.5135533160930416 +"685013.25,4929990.75",0.672213753819076 +"685013.75,4929990.75",0.8167034683536399 +"685014.25,4929990.75",0.5265948633371679 +"685014.75,4929990.75",0.7470849151484783 +"685015.25,4929990.75",0.8135664705111542 +"685015.75,4929990.75",0.45355184915598146 +"685016.25,4929990.75",0.4949181094137802 +"685016.75,4929990.75",0.6359763860065825 +"685017.25,4929990.75",0.9363128839482818 +"685017.75,4929990.75",0.7320458401234448 +"685018.25,4929990.75",0.8755351134422994 +"685018.75,4929990.75",0.9805877100173467 +"685019.25,4929990.75",0.919487806118443 +"684999.75,4929990.25",0.9228313884751116 +"685000.25,4929990.25",0.5776288870906716 +"685000.75,4929990.25",0.7023721562395058 +"685001.25,4929990.25",0.7615828370734937 +"685001.75,4929990.25",0.7523827170999027 +"685002.25,4929990.25",0.8189306214413862 +"685002.75,4929990.25",0.5997895362407085 +"685003.25,4929990.25",0.5799464774584041 +"685003.75,4929990.25",0.7993745286743312 +"685004.25,4929990.25",0.5564954277431914 +"685004.75,4929990.25",0.5935050169879359 +"685005.25,4929990.25",0.6480879631793468 +"685005.75,4929990.25",0.6620069080294494 +"685006.25,4929990.25",0.640499149936711 +"685006.75,4929990.25",0.6450064498371183 +"685007.25,4929990.25",0.6185787405808612 +"685007.75,4929990.25",0.5863860708457516 +"685008.25,4929990.25",0.5193272697452439 +"685008.75,4929990.25",0.46548014836248824 +"685009.25,4929990.25",0.5614378030471231 +"685009.75,4929990.25",0.6880987599784246 +"685010.25,4929990.25",0.712289293138584 +"685010.75,4929990.25",0.6964180108935963 +"685011.25,4929990.25",0.919809939511364 +"685011.75,4929990.25",0.8692766024340147 +"685012.25,4929990.25",0.6713197774985388 +"685012.75,4929990.25",0.8465756505417686 +"685013.25,4929990.25",0.8314198165073289 +"685013.75,4929990.25",0.1036385708745098 +"685014.25,4929990.25",0.6571656330216306 +"685014.75,4929990.25",0.6802300362770576 +"685015.25,4929990.25",0.40342573941684606 +"685015.75,4929990.25",0.4424112162961907 +"685016.25,4929990.25",0.5590791772294756 +"685016.75,4929990.25",0.7553581493044753 +"685017.25,4929990.25",0.7317350103835496 +"685017.75,4929990.25",0.5009395470229151 +"685018.25,4929990.25",0.5997359893572819 +"685018.75,4929990.25",0.7657489260143063 +"685019.25,4929990.25",0.7232653315236546 +"684999.75,4929989.75",0.7495827458480252 +"685000.25,4929989.75",0.5093456571719852 +"685000.75,4929989.75",0.6745146971990893 +"685001.25,4929989.75",0.6944291244806181 +"685001.75,4929989.75",0.6879053613171381 +"685002.25,4929989.75",0.6852840498328088 +"685002.75,4929989.75",0.7540129211018674 +"685003.25,4929989.75",0.7876865307369597 +"685003.75,4929989.75",0.7632507367304879 +"685004.25,4929989.75",0.5754834542018105 +"685004.75,4929989.75",0.6594796816643362 +"685005.25,4929989.75",0.6779185945024883 +"685005.75,4929989.75",0.7300549807003781 +"685006.25,4929989.75",0.7289826859907603 +"685006.75,4929989.75",0.6577925964246459 +"685007.25,4929989.75",0.6222936562303811 +"685007.75,4929989.75",0.5730093383635472 +"685008.25,4929989.75",0.5155758222834358 +"685008.75,4929989.75",0.42164044007599494 +"685009.25,4929989.75",0.43319607490851436 +"685009.75,4929989.75",0.7474872757385174 +"685010.25,4929989.75",0.7129866322401197 +"685010.75,4929989.75",0.7666655005118623 +"685011.25,4929989.75",0.30442527361622446 +"685011.75,4929989.75",0.3998077785423672 +"685012.25,4929989.75",0.6213095580166087 +"685012.75,4929989.75",0.11533548139502625 +"685013.25,4929989.75",0.1708858241163964 +"685013.75,4929989.75",0.24806555068808583 +"685014.25,4929989.75",0.7895990451627785 +"685014.75,4929989.75",0.7456665153052712 +"685015.25,4929989.75",0.4107704767705928 +"685015.75,4929989.75",0.4558264708065759 +"685016.25,4929989.75",0.6180743781719412 +"685016.75,4929989.75",0.6927030952440764 +"685017.25,4929989.75",0.7026418722894633 +"685017.75,4929989.75",0.6876669231326166 +"685018.25,4929989.75",0.5984112442370942 +"685018.75,4929989.75",0.8151859966413695 +"685019.25,4929989.75",0.8258969165282284 +"684999.75,4929989.25",0.6885825395994619 +"685000.25,4929989.25",0.983918106521119 +"685000.75,4929989.25",0.6331862662533031 +"685001.25,4929989.25",0.694018255711916 +"685001.75,4929989.25",0.7167714111676552 +"685002.25,4929989.25",0.6211601858986042 +"685002.75,4929989.25",0.7786611450483729 +"685003.25,4929989.25",0.5511169594201744 +"685003.75,4929989.25",0.6281026958515789 +"685004.25,4929989.25",0.6967691813678117 +"685004.75,4929989.25",0.7224915822238054 +"685005.25,4929989.25",0.7013186256116305 +"685005.75,4929989.25",0.6840490428483411 +"685006.25,4929989.25",0.6481174394351166 +"685006.75,4929989.25",0.6557837187027853 +"685007.25,4929989.25",0.6111855491101321 +"685007.75,4929989.25",0.5993136202525561 +"685008.25,4929989.25",0.5195769581652571 +"685008.75,4929989.25",0.48120337663616175 +"685009.25,4929989.25",0.7893425886794628 +"685009.75,4929989.25",0.7875894953717152 +"685010.25,4929989.25",0.11599230219450146 +"685010.75,4929989.25",0.6955139329739292 +"685011.25,4929989.25",0.6330454549130253 +"685011.75,4929989.25",0.24198239939532795 +"685012.25,4929989.25",0.8391477014425985 +"685012.75,4929989.25",0.8221763883475848 +"685013.25,4929989.25",0.4729663416022909 +"685013.75,4929989.25",0.1413837711484385 +"685014.25,4929989.25",0.0678162932146433 +"685014.75,4929989.25",0.35649573233625975 +"685015.25,4929989.25",0.20498131108267625 +"685015.75,4929989.25",0.40878758664625425 +"685016.25,4929989.25",0.43424086293128966 +"685016.75,4929989.25",0.558548422818553 +"685017.25,4929989.25",0.7926880532360014 +"685017.75,4929989.25",0.6551206072449972 +"685018.25,4929989.25",0.36309663926156244 +"685018.75,4929989.25",0.8985052979215267 +"685019.25,4929989.25",0.7729115149422584 +"684999.75,4929988.75",0.7370311650292559 +"685000.25,4929988.75",0.7529805471573239 +"685000.75,4929988.75",0.737415012105801 +"685001.25,4929988.75",0.6494242999134928 +"685001.75,4929988.75",0.6198974427737283 +"685002.25,4929988.75",0.6696339931997345 +"685002.75,4929988.75",0.636741034117061 +"685003.25,4929988.75",0.6642322424110559 +"685003.75,4929988.75",0.7233206063030035 +"685004.25,4929988.75",0.7500402480281457 +"685004.75,4929988.75",0.7503623814210667 +"685005.25,4929988.75",0.7266641886596721 +"685005.75,4929988.75",0.6765663107433612 +"685006.25,4929988.75",0.6781865089427789 +"685006.75,4929988.75",0.6409316588517217 +"685007.25,4929988.75",0.6289241726007201 +"685007.75,4929988.75",0.5932914575074393 +"685008.25,4929988.75",0.4883400570250867 +"685008.75,4929988.75",0.7148879510289355 +"685009.25,4929988.75",0.7840101371156208 +"685009.75,4929988.75",0.2138745267989158 +"685010.25,4929988.75",0.6550020123236476 +"685010.75,4929988.75",0.9508906458717385 +"685011.25,4929988.75",0.9411296491539676 +"685011.75,4929988.75",0.01092619963309718 +"685012.25,4929988.75",0.6863015321113723 +"685012.75,4929988.75",0.563048227987966 +"685013.25,4929988.75",0.9289196924775528 +"685013.75,4929988.75",0.6892844590469388 +"685014.25,4929988.75",0.529515788277423 +"685014.75,4929988.75",0.1550739956556333 +"685015.25,4929988.75",0.14208473256520476 +"685015.75,4929988.75",0.15702679134025158 +"685016.25,4929988.75",0.13075633269050893 +"685016.75,4929988.75",0.34974367079854296 +"685017.25,4929988.75",0.6674875850743597 +"685017.75,4929988.75",0.3937162741933659 +"685018.25,4929988.75",0.4406581229884429 +"685018.75,4929988.75",0.6448988909040732 +"685019.25,4929988.75",0.8412431989779263 +"684999.75,4929988.25",0.831652563569948 +"685000.25,4929988.25",0.7800223222753873 +"685000.75,4929988.25",0.711706201974901 +"685001.25,4929988.25",0.7997301650427332 +"685001.75,4929988.25",0.5163523121084046 +"685002.25,4929988.25",0.5771219158141907 +"685002.75,4929988.25",0.6470943446254294 +"685003.25,4929988.25",0.683002756383211 +"685003.75,4929988.25",0.7420431305058951 +"685004.25,4929988.25",0.7576220057142633 +"685004.75,4929988.25",0.7576220057142633 +"685005.25,4929988.25",0.737373118330638 +"685005.75,4929988.25",0.7122419754385235 +"685006.25,4929988.25",0.6996498995814848 +"685006.75,4929988.25",0.6381688108911318 +"685007.25,4929988.25",0.647789882117298 +"685007.75,4929988.25",0.5670112470645595 +"685008.25,4929988.25",0.43557774413564204 +"685008.75,4929988.25",0.7030478551947328 +"685009.25,4929988.25",0.1794218730697814 +"685009.75,4929988.25",0.6128801290808161 +"685010.25,4929988.25",0.9185144289739399 +"685010.75,4929988.25",0.35533462212837436 +"685011.25,4929988.25",0.8355424892459657 +"685011.75,4929988.25",0.9231187642395915 +"685012.25,4929988.25",0.926339457290477 +"685012.75,4929988.25",0.4549766118395391 +"685013.25,4929988.25",0.7734586383468329 +"685013.75,4929988.25",0.8024527508597816 +"685014.25,4929988.25",0.842690527886405 +"685014.75,4929988.25",0.5917555459954197 +"685015.25,4929988.25",0.17411422567774568 +"685015.75,4929988.25",0.22669439014139503 +"685016.25,4929988.25",0.42216431912845864 +"685016.75,4929988.25",0.48540131771560396 +"685017.25,4929988.25",0.13437149762290831 +"685017.75,4929988.25",0.5418462342944973 +"685018.25,4929988.25",0.7323130824945328 +"685018.75,4929988.25",0.6390238432148175 +"685019.25,4929988.25",0.7644390194933186 +"684999.75,4929987.75",0.8772353059441073 +"685000.25,4929987.75",0.7908183552227965 +"685000.75,4929987.75",0.6858942604846563 +"685001.25,4929987.75",0.7916096836469653 +"685001.75,4929987.75",0.4572134847683247 +"685002.25,4929987.75",0.460180275604967 +"685002.75,4929987.75",0.5811815650330758 +"685003.25,4929987.75",0.673386112730745 +"685003.75,4929987.75",0.6892082585695329 +"685004.25,4929987.75",0.7266256666314911 +"685004.75,4929987.75",0.7194650679194319 +"685005.25,4929987.75",0.7717660485920415 +"685005.75,4929987.75",0.7255350127123283 +"685006.25,4929987.75",0.6873435796090281 +"685006.75,4929987.75",0.6420836426969924 +"685007.25,4929987.75",0.6031621030796086 +"685007.75,4929987.75",0.5786306724447859 +"685008.25,4929987.75",0.9136976637682541 +"685008.75,4929987.75",0.10929643676803653 +"685009.25,4929987.75",0.11950188382076964 +"685009.75,4929987.75",0.7204144733232667 +"685010.25,4929987.75",0.1190665522587281 +"685010.75,4929987.75",0.4365480103214259 +"685011.25,4929987.75",0.904577124914293 +"685011.75,4929987.75",0.8919283544263301 +"685012.25,4929987.75",0.897937903682293 +"685012.75,4929987.75",0.9226977132815559 +"685013.25,4929987.75",0.8171402162361252 +"685013.75,4929987.75",0.22475133866021962 +"685014.25,4929987.75",0.8436165873308477 +"685014.75,4929987.75",0.7181910211415299 +"685015.25,4929987.75",0.5524313146295451 +"685015.75,4929987.75",0.2599228227738342 +"685016.25,4929987.75",0.3406262899120939 +"685016.75,4929987.75",0.3167720566748524 +"685017.25,4929987.75",0.5560653310127449 +"685017.75,4929987.75",0.3638518005157017 +"685018.25,4929987.75",0.406840503198221 +"685018.75,4929987.75",0.58940284166755 +"685019.25,4929987.75",0.6077610690188512 +"684999.75,4929987.25",0.8721991338326475 +"685000.25,4929987.25",0.8393678884335981 +"685000.75,4929987.25",0.7211507564216532 +"685001.25,4929987.25",0.6490072019614234 +"685001.75,4929987.25",0.7976814643518055 +"685002.25,4929987.25",0.9520361122219553 +"685002.75,4929987.25",0.6161002306527023 +"685003.25,4929987.25",0.6306180805022018 +"685003.75,4929987.25",0.7135653764203052 +"685004.25,4929987.25",0.7512845684497463 +"685004.75,4929987.25",0.7223874913020418 +"685005.25,4929987.25",0.7298463596823764 +"685005.75,4929987.25",0.7378654587294026 +"685006.25,4929987.25",0.690516954959853 +"685006.75,4929987.25",0.652734059030895 +"685007.25,4929987.25",0.59548972781784 +"685007.75,4929987.25",0.5327773876475177 +"685008.25,4929987.25",0.40051606471208234 +"685008.75,4929987.25",0.7650844964098283 +"685009.25,4929987.25",0.6199241230874184 +"685009.75,4929987.25",0.5347912249465563 +"685010.25,4929987.25",0.8722778885791259 +"685010.75,4929987.25",0.9742668132562352 +"685011.25,4929987.25",0.9581376020772925 +"685011.75,4929987.25",0.944247615717706 +"685012.25,4929987.25",0.9808071169231207 +"685012.75,4929987.25",0.9686891008460804 +"685013.25,4929987.25",0.771632373398486 +"685013.75,4929987.25",0.521568120755634 +"685014.25,4929987.25",0.8438491800895177 +"685014.75,4929987.25",0.6299957952411352 +"685015.25,4929987.25",0.7577278367513872 +"685015.75,4929987.25",0.2595318456085537 +"685016.25,4929987.25",0.398436139222499 +"685016.75,4929987.25",0.4416336706445038 +"685017.25,4929987.25",0.48048886128307955 +"685017.75,4929987.25",0.49633883407249474 +"685018.25,4929987.25",0.5645986646142548 +"685018.75,4929987.25",0.6351789827029954 +"685019.25,4929987.25",0.697021553187602 +"684999.75,4929986.75",0.8682225883431631 +"685000.25,4929986.75",0.8101758327743971 +"685000.75,4929986.75",0.8047788509378866 +"685001.25,4929986.75",0.6894454866233869 +"685001.75,4929986.75",0.5560079384185072 +"685002.25,4929986.75",0.819554710311544 +"685002.75,4929986.75",0.5701751920669861 +"685003.25,4929986.75",0.5836880734216147 +"685003.75,4929986.75",0.6871361687216939 +"685004.25,4929986.75",0.7754204606886052 +"685004.75,4929986.75",0.7857266986110806 +"685005.25,4929986.75",0.7514201258431719 +"685005.75,4929986.75",0.7442960589434009 +"685006.25,4929986.75",0.7238916228574677 +"685006.75,4929986.75",0.6626728360762817 +"685007.25,4929986.75",0.6375057800235472 +"685007.75,4929986.75",0.5464380027096762 +"685008.25,4929986.75",0.5505017851325875 +"685008.75,4929986.75",0.2197257913537291 +"685009.25,4929986.75",0.8834206453117929 +"685009.75,4929986.75",0.966551488392585 +"685010.25,4929986.75",0.37775872182394094 +"685010.75,4929986.75",0.9261200503847029 +"685011.25,4929986.75",0.9572847142734487 +"685011.75,4929986.75",0.6168975533660848 +"685012.25,4929986.75",0.856415402006018 +"685012.75,4929986.75",0.9715876605040449 +"685013.25,4929986.75",0.778322721252579 +"685013.75,4929986.75",0.5895081220730144 +"685014.25,4929986.75",0.9753391079658529 +"685014.75,4929986.75",0.38449260398005985 +"685015.25,4929986.75",0.2588201453128091 +"685015.75,4929986.75",0.7915368957638823 +"685016.25,4929986.75",0.4580804393967048 +"685016.75,4929986.75",0.5143621793530294 +"685017.25,4929986.75",0.5614378030471231 +"685017.75,4929986.75",0.5994639696065006 +"685018.25,4929986.75",0.6399268446608005 +"685018.75,4929986.75",0.7106850973811067 +"685019.25,4929986.75",0.7167318505185603 +"684999.75,4929986.25",0.8837629415233502 +"685000.25,4929986.25",0.8686197755765531 +"685000.75,4929986.25",0.7901047257183879 +"685001.25,4929986.25",0.804394331792139 +"685001.75,4929986.25",0.6982804238967151 +"685002.25,4929986.25",0.665093442423803 +"685002.75,4929986.25",0.5256449401680795 +"685003.25,4929986.25",0.5588387231881007 +"685003.75,4929986.25",0.6994067832550142 +"685004.25,4929986.25",0.748607405913449 +"685004.75,4929986.25",0.7429142989285048 +"685005.25,4929986.25",0.7661075912195153 +"685005.75,4929986.25",0.7432364323214258 +"685006.25,4929986.25",0.7026281483751022 +"685006.75,4929986.25",0.6950722446295232 +"685007.25,4929986.25",0.645045414480935 +"685007.75,4929986.25",0.5398119139130378 +"685008.25,4929986.25",0.8638452333050578 +"685008.75,4929986.25",0.08154164473924624 +"685009.25,4929986.25",0.5645506748449914 +"685009.75,4929986.25",0.4966256457837946 +"685010.25,4929986.25",0.9678362130422368 +"685010.75,4929986.25",0.9551344337323112 +"685011.25,4929986.25",0.9641836831455434 +"685011.75,4929986.25",0.39894072420852694 +"685012.25,4929986.25",0.6267189456207897 +"685012.75,4929986.25",0.6775232894689683 +"685013.25,4929986.25",0.6894749074621973 +"685013.75,4929986.25",0.9609737759824304 +"685014.25,4929986.25",0.84557840967262 +"685014.75,4929986.25",0.7223132638347244 +"685015.25,4929986.25",0.7674415157690976 +"685015.75,4929986.25",0.8570193280575396 +"685016.25,4929986.25",0.46027870970710594 +"685016.75,4929986.25",0.5317287974815635 +"685017.25,4929986.25",0.6225602265322666 +"685017.75,4929986.25",0.6398298092955561 +"685018.25,4929986.25",0.6912518939198347 +"685018.75,4929986.25",0.730395394712065 +"685019.25,4929986.25",0.7667846889116359 +"684999.75,4929985.75",0.886022925517375 +"685000.25,4929985.75",0.8743494143737852 +"685000.75,4929985.75",0.8199346849723259 +"685001.25,4929985.75",0.8275039288747499 +"685001.75,4929985.75",0.790721319857552 +"685002.25,4929985.75",0.734046606462068 +"685002.75,4929985.75",0.7936909066362736 +"685003.25,4929985.75",0.8558297565732623 +"685003.75,4929985.75",0.667708336118539 +"685004.25,4929985.75",0.7464936571845991 +"685004.75,4929985.75",0.8034594766758167 +"685005.25,4929985.75",0.7694935508143232 +"685005.75,4929985.75",0.7413611217770976 +"685006.25,4929985.75",0.707810401447788 +"685006.75,4929985.75",0.7058380555382151 +"685007.25,4929985.75",0.6239146808029504 +"685007.75,4929985.75",0.5434883075343766 +"685008.25,4929985.75",0.47362642422327295 +"685008.75,4929985.75",0.6089414335503096 +"685009.25,4929985.75",0.6063552894436522 +"685009.75,4929985.75",0.500771080132433 +"685010.25,4929985.75",0.9378775190566643 +"685010.75,4929985.75",0.22327321534928135 +"685011.25,4929985.75",0.9607121461424659 +"685011.75,4929985.75",0.8218801088952022 +"685012.25,4929985.75",0.8572682898098616 +"685012.75,4929985.75",0.9478528279143391 +"685013.25,4929985.75",0.8753118976144929 +"685013.75,4929985.75",0.9630086619487788 +"685014.25,4929985.75",0.35276889438204556 +"685014.75,4929985.75",0.756071778808884 +"685015.25,4929985.75",0.47164141022605793 +"685015.75,4929985.75",0.3436668308110636 +"685016.25,4929985.75",0.5438053412843947 +"685016.75,4929985.75",0.5923590882894262 +"685017.25,4929985.75",0.6591659773915839 +"685017.75,4929985.75",0.6898574658172959 +"685018.25,4929985.75",0.7185938209060434 +"685018.75,4929985.75",0.7444789340368869 +"685019.25,4929985.75",0.80483004105371 +"684999.75,4929985.25",0.8840977430039136 +"685000.25,4929985.25",0.8659406228243627 +"685000.75,4929985.25",0.8580185591425811 +"685001.25,4929985.25",0.8525725317100887 +"685001.75,4929985.25",0.8194443347894544 +"685002.25,4929985.25",0.7803393560254053 +"685002.75,4929985.25",0.7052304285806841 +"685003.25,4929985.25",0.7099841359643406 +"685003.75,4929985.25",0.7540635731562256 +"685004.25,4929985.25",0.786956532238899 +"685004.75,4929985.25",0.8027585152590506 +"685005.25,4929985.25",0.7903915374296886 +"685005.75,4929985.25",0.7782898117555214 +"685006.25,4929985.25",0.7541126187522071 +"685006.75,4929985.25",0.7082430646667475 +"685007.25,4929985.25",0.652565250761945 +"685007.75,4929985.25",0.5798776017339472 +"685008.25,4929985.25",0.6739119561049907 +"685008.75,4929985.25",0.7394624118558428 +"685009.25,4929985.25",0.5848812672211229 +"685009.75,4929985.25",0.5672173138134885 +"685010.25,4929985.25",0.9308216833355711 +"685010.75,4929985.25",0.9273001663473376 +"685011.25,4929985.25",0.8293464720065303 +"685011.75,4929985.25",0.9092584407425761 +"685012.25,4929985.25",0.85666436375834 +"685012.75,4929985.25",0.9002949230415623 +"685013.25,4929985.25",0.8402711227743092 +"685013.75,4929985.25",0.8671906978615965 +"685014.25,4929985.25",0.668510679884047 +"685014.75,4929985.25",0.7698900659785107 +"685015.25,4929985.25",0.5794765784058565 +"685015.75,4929985.25",0.5016204808097378 +"685016.25,4929985.25",0.5908809649784881 +"685016.75,4929985.25",0.6145811479557757 +"685017.25,4929985.25",0.6797638121388035 +"685017.75,4929985.25",0.7184967855407989 +"685018.25,4929985.25",0.7358634036693328 +"685018.75,4929985.25",0.7740057911766515 +"685019.25,4929985.25",0.8216677869711912 +"684999.75,4929984.75",0.9122301720411394 +"685000.25,4929984.75",0.897652410117683 +"685000.75,4929984.75",0.8475017099862112 +"685001.25,4929984.75",0.8679188141597869 +"685001.75,4929984.75",0.8435378325843691 +"685002.25,4929984.75",0.8246432191757641 +"685002.75,4929984.75",0.8257028457977393 +"685003.25,4929984.75",0.7988551414101651 +"685003.75,4929984.75",0.8078678590111094 +"685004.25,4929984.75",0.8274944611336681 +"685004.75,4929984.75",0.8250018843809732 +"685005.25,4929984.75",0.8228754675644808 +"685005.75,4929984.75",0.7973510098547395 +"685006.25,4929984.75",0.7731767670974533 +"685006.75,4929984.75",0.7654487741461607 +"685007.25,4929984.75",0.6882577973389797 +"685007.75,4929984.75",0.6323978350083821 +"685008.25,4929984.75",0.6031628297472995 +"685008.75,4929984.75",0.14448470152635529 +"685009.25,4929984.75",0.8440082720485615 +"685009.75,4929984.75",0.3500090561430051 +"685010.25,4929984.75",0.6742572811533548 +"685010.75,4929984.75",0.5616766249891595 +"685011.25,4929984.75",0.890813836782522 +"685011.75,4929984.75",0.43904681625748765 +"685012.25,4929984.75",0.9670457109912197 +"685012.75,4929984.75",0.7991551852622878 +"685013.25,4929984.75",0.9379891047094212 +"685013.75,4929984.75",0.9391017401533593 +"685014.25,4929984.75",0.8559211794073833 +"685014.75,4929984.75",0.7523588533752571 +"685015.25,4929984.75",0.48574532614898697 +"685015.75,4929984.75",0.5120276265132205 +"685016.25,4929984.75",0.6041740022522928 +"685016.75,4929984.75",0.6646088044775155 +"685017.25,4929984.75",0.7175341942840683 +"685017.75,4929984.75",0.7430845059343483 +"685018.25,4929984.75",0.7699322103219224 +"685018.75,4929984.75",0.8012506827976156 +"685019.25,4929984.75",0.8167286502249762 +"684999.75,4929984.25",0.9218082936654243 +"685000.25,4929984.25",0.8862480235450514 +"685000.75,4929984.25",0.8974071492713703 +"685001.25,4929984.25",0.879707719878166 +"685001.75,4929984.25",0.8711760390229603 +"685002.25,4929984.25",0.8443283346353863 +"685002.75,4929984.25",0.8638452333050578 +"685003.25,4929984.25",0.8425405917152204 +"685003.75,4929984.25",0.8501935308260439 +"685004.25,4929984.25",0.8289859246014512 +"685004.75,4929984.25",0.8507589348493846 +"685005.25,4929984.25",0.8457851484907515 +"685005.75,4929984.25",0.8125068438891789 +"685006.25,4929984.25",0.7911404886157176 +"685006.75,4929984.25",0.7558108210381219 +"685007.25,4929984.25",0.7087372872653821 +"685007.75,4929984.25",0.6639331055222885 +"685008.25,4929984.25",0.5713717748192803 +"685008.75,4929984.25",0.4351270837325704 +"685009.25,4929984.25",0.9945319910427336 +"685009.75,4929984.25",0.6208459687376311 +"685010.25,4929984.25",0.684081468882422 +"685010.75,4929984.25",0.6003844165198191 +"685011.25,4929984.25",0.8433291035503446 +"685011.75,4929984.25",0.9021816915428655 +"685012.25,4929984.25",0.8721518161325871 +"685012.75,4929984.25",0.6952852126310222 +"685013.25,4929984.25",0.8584137561600782 +"685013.75,4929984.25",0.5245200203940139 +"685014.25,4929984.25",0.9537892055297029 +"685014.75,4929984.25",0.5774657104681028 +"685015.25,4929984.25",0.49815525358023066 +"685015.75,4929984.25",0.5890056544341599 +"685016.25,4929984.25",0.6423163897596115 +"685016.75,4929984.25",0.6779018417513204 +"685017.25,4929984.25",0.7221731791621379 +"685017.75,4929984.25",0.7534916516378313 +"685018.25,4929984.25",0.7754002192791901 +"685018.75,4929984.25",0.8271357959284591 +"685019.25,4929984.25",0.8398249071507421 +"684999.75,4929983.75",0.896861908066666 +"685000.25,4929983.75",0.9290293959304399 +"685000.75,4929983.75",0.9000094294769524 +"685001.25,4929983.75",0.8709566321171862 +"685001.75,4929983.75",0.8698786462856661 +"685002.25,4929983.75",0.8479700786443073 +"685002.75,4929983.75",0.8220484337011758 +"685003.25,4929983.75",0.8496866401397669 +"685003.75,4929983.75",0.8145051980432394 +"685004.25,4929983.75",0.8629796774135716 +"685004.75,4929983.75",0.8301119002022342 +"685005.25,4929983.75",0.830752358066044 +"685005.75,4929983.75",0.8249841972406308 +"685006.25,4929983.75",0.7916088572738137 +"685006.75,4929983.75",0.7625762227326839 +"685007.25,4929983.75",0.7652553754848742 +"685007.75,4929983.75",0.7107702910318604 +"685008.25,4929983.75",0.6549203879213442 +"685008.75,4929983.75",0.5786062172411406 +"685009.25,4929983.75",0.705034939998044 +"685009.75,4929983.75",0.25776269679208497 +"685010.25,4929983.75",0.6751538643420283 +"685010.75,4929983.75",0.7170343591543101 +"685011.25,4929983.75",0.7325747123344972 +"685011.75,4929983.75",0.8294965161937377 +"685012.25,4929983.75",0.853762103194366 +"685012.75,4929983.75",0.7661492963884524 +"685013.25,4929983.75",0.8587358895529992 +"685013.75,4929983.75",0.8515147872879837 +"685014.25,4929983.75",0.4314282235917706 +"685014.75,4929983.75",0.7497063809367567 +"685015.25,4929983.75",0.569483124118107 +"685015.75,4929983.75",0.6542016587740326 +"685016.25,4929983.75",0.6851229440163357 +"685016.75,4929983.75",0.7206950558511996 +"685017.25,4929983.75",0.7635986454731686 +"685017.75,4929983.75",0.7926312800142983 +"685018.25,4929983.75",0.8075091938059004 +"685018.75,4929983.75",0.8253441805925303 +"685019.25,4929983.75",0.8648809962023875 +"684999.75,4929983.25",0.9310277500845002 +"685000.25,4929983.25",0.9177347128106952 +"685000.75,4929983.25",0.8907899730578764 +"685001.25,4929983.25",0.8697689428327791 +"685001.75,4929983.25",0.8353913429441137 +"685002.25,4929983.25",0.8623227425400872 +"685002.75,4929983.25",0.8496999802966119 +"685003.25,4929983.25",0.865336696772841 +"685003.75,4929983.25",0.8566241310400424 +"685004.25,4929983.25",0.8462169853365595 +"685004.75,4929983.25",0.8798174233310531 +"685005.25,4929983.25",0.8547613342794076 +"685005.75,4929983.25",0.8495000641402713 +"685006.25,4929983.25",0.8449195925992653 +"685006.75,4929983.25",0.7816959341689655 +"685007.25,4929983.25",0.7821277710147735 +"685007.75,4929983.25",0.7275222518195887 +"685008.25,4929983.25",0.740393511467667 +"685008.75,4929983.25",0.6556037953870352 +"685009.25,4929983.25",0.6230730432345983 +"685009.75,4929983.25",0.5072783467032644 +"685010.25,4929983.25",0.48935757478688136 +"685010.75,4929983.25",0.8999495979931983 +"685011.25,4929983.25",0.33165934456006213 +"685011.75,4929983.25",0.35867913815334995 +"685012.25,4929983.25",0.9297303573472061 +"685012.75,4929983.25",0.49739696225211505 +"685013.25,4929983.25",0.9160546831275236 +"685013.75,4929983.25",0.1280379327741546 +"685014.25,4929983.25",0.5836480209989816 +"685014.75,4929983.25",0.5116304392798305 +"685015.25,4929983.25",0.6313165682400985 +"685015.75,4929983.25",0.6938221695922895 +"685016.25,4929983.25",0.7308020496865371 +"685016.75,4929983.25",0.7503056081993638 +"685017.25,4929983.25",0.7998523822793138 +"685017.75,4929983.25",0.8171219650426031 +"685018.25,4929983.25",0.8358483616612578 +"685018.75,4929983.25",0.839034405099725 +"685019.25,4929983.25",0.8689545770571167 +"684999.75,4929982.75",0.8982563361692047 +"685000.25,4929982.75",0.8863192049697574 +"685000.75,4929982.75",0.8827398467136629 +"685001.25,4929982.75",0.8346903815273475 +"685001.75,4929982.75",0.8495365959525595 +"685002.25,4929982.75",0.8384551691460004 +"685002.75,4929982.75",0.8535351229668194 +"685003.25,4929982.75",0.8578963419060005 +"685003.75,4929982.75",0.8712730743882048 +"685004.25,4929982.75",0.8625605086554061 +"685004.75,4929982.75",0.8680158495250315 +"685005.25,4929982.75",0.8667311248753797 +"685005.75,4929982.75",0.8659406228243627 +"685006.25,4929982.75",0.8428443658985967 +"685006.75,4929982.75",0.7794486182625829 +"685007.25,4929982.75",0.7756971708007749 +"685007.75,4929982.75",0.7699541918466978 +"685008.25,4929982.75",0.764499523046275 +"685008.75,4929982.75",0.7141541607053148 +"685009.25,4929982.75",0.6912533923621887 +"685009.75,4929982.75",0.6317404357871786 +"685010.25,4929982.75",0.6092391923297894 +"685010.75,4929982.75",0.5664326380730652 +"685011.25,4929982.75",0.47914591766603865 +"685011.75,4929982.75",0.5698008299373277 +"685012.25,4929982.75",0.3675506606565011 +"685012.75,4929982.75",0.664321992766215 +"685013.25,4929982.75",0.37943592967092216 +"685013.75,4929982.75",0.6810493631616068 +"685014.25,4929982.75",0.6620266870905696 +"685014.75,4929982.75",0.6364645337257987 +"685015.25,4929982.75",0.708509634968633 +"685015.75,4929982.75",0.7599317195929114 +"685016.25,4929982.75",0.7703388652963943 +"685016.75,4929982.75",0.8031354610830257 +"685017.25,4929982.75",0.8235525652566015 +"685017.75,4929982.75",0.8339597109600844 +"685018.25,4929982.75",0.8444638920288118 +"685018.75,4929982.75",0.8562654658348334 +"685019.25,4929982.75",0.8689545770571167 +"684999.75,4929982.25",0.9123013534658455 +"685000.25,4929982.25",0.9073275671072123 +"685000.75,4929982.25",0.8730395078527976 +"685001.25,4929982.25",0.8332959534248087 +"685001.75,4929982.25",0.7809691188116606 +"685002.25,4929982.25",0.7548181620466227 +"685002.75,4929982.25",0.794574230258305 +"685003.25,4929982.25",0.8206414918149435 +"685003.75,4929982.25",0.8507589348493846 +"685004.25,4929982.25",0.8576213719091911 +"685004.75,4929982.25",0.861263115918112 +"685005.25,4929982.25",0.8485374728835408 +"685005.75,4929982.25",0.8767796053736537 +"685006.25,4929982.25",0.8622775693598688 +"685006.75,4929982.25",0.8481056360377328 +"685007.25,4929982.25",0.8241438232204805 +"685007.75,4929982.25",0.8050374519410441 +"685008.25,4929982.25",0.7854108498184853 +"685008.75,4929982.25",0.7628259111526967 +"685009.25,4929982.25",0.7321134546498786 +"685009.75,4929982.25",0.718498283983153 +"685010.25,4929982.25",0.6748261738349425 +"685010.75,4929982.25",0.6481676543144247 +"685011.25,4929982.25",0.650238453441393 +"685011.75,4929982.25",0.6438078532273946 +"685012.25,4929982.25",0.6022930600615835 +"685012.75,4929982.25",0.61408550750499 +"685013.25,4929982.25",0.5973539233153683 +"685013.75,4929982.25",0.638961538052194 +"685014.25,4929982.25",0.7325818233079748 +"685014.75,4929982.25",0.7452709345302578 +"685015.25,4929982.25",0.7794486182625829 +"685015.75,4929982.25",0.7808430463651217 +"685016.25,4929982.25",0.809566061297024 +"685016.75,4929982.25",0.8222551725193072 +"685017.25,4929982.25",0.8440667047954217 +"685017.75,4929982.25",0.8648809962023875 +"685018.25,4929982.25",0.8840007076386691 +"685018.75,4929982.25",0.8853951357412078 +"685019.25,4929982.25",0.889468716595937 +"684999.75,4929981.75",0.919129140913234 +"685000.25,4929981.75",0.9073275671072123 +"685000.75,4929981.75",0.8763225866565097 +"685001.25,4929981.75",0.8099745984713662 +"685001.75,4929981.75",0.7432491809992712 +"685002.25,4929981.75",0.9808071169231207 +"685002.75,4929981.75",0.6707216988722934 +"685003.25,4929981.75",0.8074840119345642 +"685003.75,4929981.75",0.8160995423021183 +"685004.25,4929981.75",0.8649395095394509 +"685004.75,4929981.75",0.853869924447383 +"685005.25,4929981.75",0.8826062795361304 +"685005.75,4929981.75",0.872115438624248 +"685006.25,4929981.75",0.8749879900377249 +"685006.75,4929981.75",0.8529697189434788 +"685007.25,4929981.75",0.8340567463253289 +"685007.75,4929981.75",0.7990752203851417 +"685008.25,4929981.75",0.8072090419377548 +"685008.75,4929981.75",0.7749066687497579 +"685009.25,4929981.75",0.7768665008756371 +"685009.75,4929981.75",0.7658939511488138 +"685010.25,4929981.75",0.7221746776044919 +"685010.75,4929981.75",0.7135591472369378 +"685011.25,4929981.75",0.734457133852303 +"685011.75,4929981.75",0.7129937432135972 +"685012.25,4929981.75",0.708920162358868 +"685012.75,4929981.75",0.6993168588632473 +"685013.25,4929981.75",0.7190271561942055 +"685013.75,4929981.75",0.7563657014936619 +"685014.25,4929981.75",0.74855401333397 +"685014.75,4929981.75",0.7849166272198508 +"685015.25,4929981.75",0.7981963243368105 +"685015.75,4929981.75",0.8172190004078477 +"685016.25,4929981.75",0.8340567463253289 +"685016.75,4929981.75",0.8444638920288118 +"685017.25,4929981.75",0.8544738504989046 +"685017.75,4929981.75",0.875385177271115 +"685018.25,4929981.75",0.8853951357412078 +"685018.75,4929981.75",0.8853951357412078 +"685019.25,4929981.75",0.8980842469634911 +"684999.75,4929981.25",0.918263585021748 +"685000.25,4929981.25",0.9259915779730404 +"685000.75,4929981.25",0.8946019240726412 +"685001.25,4929981.25",0.8285635554967251 +"685001.75,4929981.25",0.7181939183207773 +"685002.25,4929981.25",0.8541523891751862 +"685002.75,4929981.25",0.6603278933256554 +"685003.25,4929981.25",0.7945698026846048 +"685003.75,4929981.25",0.861263115918112 +"685004.25,4929981.25",0.8994055034254307 +"685004.75,4929981.25",0.8974803209119694 +"685005.25,4929981.25",0.8868519495965731 +"685005.75,4929981.25",0.8788018232523597 +"685006.25,4929981.25",0.8737656511408999 +"685006.75,4929981.25",0.8868519495965731 +"685007.25,4929981.25",0.8768766407388984 +"685007.75,4929981.25",0.8292060035764278 +"685008.25,4929981.25",0.8332662442743118 +"685008.75,4929981.25",0.8104921207414666 +"685009.25,4929981.25",0.8112959629493288 +"685009.75,4929981.25",0.7982096644936556 +"685010.25,4929981.25",0.8046269245508091 +"685010.75,4929981.25",0.7626242125019468 +"685011.25,4929981.25",0.7632147983966235 +"685011.75,4929981.25",0.7667728471971448 +"685012.25,4929981.25",0.7617366750856853 +"685012.75,4929981.25",0.7651034490977967 +"685013.25,4929981.25",0.7696587387674669 +"685013.75,4929981.25",0.8205020792115596 +"685014.25,4929981.25",0.8068251948612097 +"685014.75,4929981.25",0.8250440287243848 +"685015.25,4929981.25",0.8314746289383831 +"685015.75,4929981.25",0.841881774641866 +"685016.25,4929981.25",0.8563625012000781 +"685016.75,4929981.25",0.8767796053736537 +"685017.25,4929981.25",0.8767796053736537 +"685017.75,4929981.25",0.8808531862283827 +"685018.25,4929981.25",0.8822476143309214 +"685018.75,4929981.25",0.8908631446984755 +"685019.25,4929981.25",0.9185983865023114 +"684999.75,4929980.75",0.936495759041768 +"685000.25,4929980.75",0.9260886133382851 +"685000.75,4929980.75",0.919092609100946 +"685001.25,4929980.75",0.8883048910361754 +"685001.75,4929980.75",0.8317629390920376 +"685002.25,4929980.75",0.8284923740720191 +"685002.75,4929980.75",0.8249005020322313 +"685003.25,4929980.75",0.8450292960521523 +"685003.75,4929980.75",0.8785326986814015 +"685004.25,4929980.75",0.8931816420295638 +"685004.75,4929980.75",0.8990468382202218 +"685005.25,4929980.75",0.8945048887073965 +"685005.75,4929980.75",0.8919227713204508 +"685006.25,4929980.75",0.8877521551004772 +"685006.75,4929980.75",0.8958993168099353 +"685007.25,4929980.75",0.8635969436219384 +"685007.75,4929980.75",0.8732002471175593 +"685008.25,4929980.75",0.8508944922428102 +"685008.75,4929980.75",0.8364137656845982 +"685009.25,4929980.75",0.8122585542060594 +"685009.75,4929980.75",0.8173160357730921 +"685010.25,4929980.75",0.8355482097931123 +"685010.75,4929980.75",0.826535492192168 +"685011.25,4929980.75",0.7968152363911167 +"685011.75,4929980.75",0.8060213526533477 +"685012.25,4929980.75",0.7991722557503863 +"685012.75,4929980.75",0.8164284983568306 +"685013.25,4929980.75",0.830609073046897 +"685013.75,4929980.75",0.8251410640896294 +"685014.25,4929980.75",0.8355482097931123 +"685014.75,4929980.75",0.8473497835991338 +"685015.25,4929980.75",0.8369426378956509 +"685015.75,4929980.75",0.8808531862283827 +"685016.25,4929980.75",0.8749879900377249 +"685016.75,4929980.75",0.8767796053736537 +"685017.25,4929980.75",0.8853951357412078 +"685017.75,4929980.75",0.9045148471774894 +"685018.25,4929980.75",0.8972937449124739 +"685018.75,4929980.75",0.8972937449124739 +"685019.25,4929980.75",0.901367325767203 +"684999.75,4929980.25",0.9529363177258593 +"685000.25,4929980.25",0.922844056562754 +"685000.75,4929980.25",0.9270146727827276 +"685001.25,4929980.25",0.9019327297905436 +"685001.75,4929980.25",0.8950702927307372 +"685002.25,4929980.25",0.8845667837312123 +"685002.75,4929980.25",0.8804798627196382 +"685003.25,4929980.25",0.883171683559471 +"685003.75,4929980.25",0.8800241621491847 +"685004.25,4929980.25",0.8875800658947636 +"685004.75,4929980.25",0.9181665496565034 +"685005.25,4929980.25",0.919485923918573 +"685005.75,4929980.25",0.9300651588277696 +"685006.25,4929980.25",0.9082662946392976 +"685006.75,4929980.25",0.8878491904657219 +"685007.25,4929980.25",0.8762860548442217 +"685007.75,4929980.25",0.8880742884933982 +"685008.25,4929980.25",0.8786682560748271 +"685008.75,4929980.25",0.860113948661886 +"685009.25,4929980.25",0.8326756583796352 +"685009.75,4929980.25",0.8445609273940563 +"685010.25,4929980.25",0.8427693120581276 +"685010.75,4929980.25",0.8497068029584031 +"685011.25,4929980.25",0.8260199601379605 +"685011.75,4929980.25",0.8237466359870905 +"685012.25,4929980.25",0.8396217906478411 +"685012.75,4929980.25",0.8550651084627838 +"685013.25,4929980.25",0.8445609273940563 +"685013.75,4929980.25",0.8337565944571834 +"685014.25,4929980.25",0.863790342283225 +"685014.75,4929980.25",0.8728030598841692 +"685015.25,4929980.25",0.8768766407388984 +"685015.75,4929980.25",0.8872837864423813 +"685016.25,4929980.25",0.8908631446984755 +"685016.75,4929980.25",0.8972937449124739 +"685017.25,4929980.25",0.8972937449124739 +"685017.75,4929980.25",0.9045148471774894 +"685018.25,4929980.25",0.9145248056475822 +"685018.75,4929980.25",0.9295709362291349 +"685019.25,4929980.25",0.9336445170838639 diff --git a/urbantools/svf/output/svf_dsm_demo.tif b/urbantools/svf/output/svf_dsm_demo.tif new file mode 100644 index 0000000..894f5f9 Binary files /dev/null and b/urbantools/svf/output/svf_dsm_demo.tif differ