calculate vertex_altitudes
This commit is contained in:
parent
aeb7bd698c
commit
4b94d892d7
1 changed files with 18 additions and 0 deletions
|
@ -8,6 +8,7 @@ from itertools import chain
|
||||||
import numpy as np
|
import numpy as np
|
||||||
from django.db import transaction
|
from django.db import transaction
|
||||||
from django.utils.functional import cached_property
|
from django.utils.functional import cached_property
|
||||||
|
from scipy.interpolate import NearestNDInterpolator
|
||||||
from shapely.geometry import GeometryCollection, LineString, MultiLineString
|
from shapely.geometry import GeometryCollection, LineString, MultiLineString
|
||||||
from shapely.ops import unary_union
|
from shapely.ops import unary_union
|
||||||
|
|
||||||
|
@ -230,6 +231,7 @@ class LevelGeometries:
|
||||||
|
|
||||||
self.vertices = None
|
self.vertices = None
|
||||||
self.faces = None
|
self.faces = None
|
||||||
|
self.vertex_altitudes = None
|
||||||
|
|
||||||
@staticmethod
|
@staticmethod
|
||||||
def build_for_level(level):
|
def build_for_level(level):
|
||||||
|
@ -332,3 +334,19 @@ class LevelGeometries:
|
||||||
rings = tuple(chain(*(get_rings(geom) for geom in self.get_geometries())))
|
rings = tuple(chain(*(get_rings(geom) for geom in self.get_geometries())))
|
||||||
self.vertices, self.faces = triangulate_rings(rings)
|
self.vertices, self.faces = triangulate_rings(rings)
|
||||||
self.create_hybrid_geometries(face_centers=self.vertices[self.faces].sum(axis=1) / 3)
|
self.create_hybrid_geometries(face_centers=self.vertices[self.faces].sum(axis=1) / 3)
|
||||||
|
|
||||||
|
# calculate altitudes
|
||||||
|
self.vertex_altitudes = np.empty(self.vertices.shape[:1], dtype=np.int32)
|
||||||
|
vertex_altitude_mask = np.full(self.vertices.shape[:1], fill_value=False, dtype=np.bool)
|
||||||
|
|
||||||
|
for area in self.altitudeareas:
|
||||||
|
i_vertices = np.unique(self.faces[np.array(tuple(area.geometry.faces))].flatten())
|
||||||
|
self.vertex_altitudes[i_vertices] = int(area.altitude*100)
|
||||||
|
vertex_altitude_mask[i_vertices] = True
|
||||||
|
|
||||||
|
if not np.all(vertex_altitude_mask):
|
||||||
|
interpolate = NearestNDInterpolator(self.vertices[vertex_altitude_mask],
|
||||||
|
self.vertex_altitudes[vertex_altitude_mask])
|
||||||
|
self.vertex_altitudes[np.logical_not(vertex_altitude_mask)] = interpolate(
|
||||||
|
*np.transpose(self.vertices[np.logical_not(vertex_altitude_mask)])
|
||||||
|
)
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue