STR tree Generierung jetzt innerhalb der Rack-verwaltenden Klasse. Finden und Anpinnen von Racks über STR tree
This commit is contained in:
+53
-17
@@ -115,6 +115,8 @@ class RackIDs():
|
|||||||
self._rack2begend = dict()
|
self._rack2begend = dict()
|
||||||
# Toleranzen zur Rack anbindung aneinander (Rack Snap)
|
# Toleranzen zur Rack anbindung aneinander (Rack Snap)
|
||||||
self._tol_snap = tol_snap
|
self._tol_snap = tol_snap
|
||||||
|
# falls man die rack zu den Sensorpunkten abfragen möchte, ist ein STR Baum nötig
|
||||||
|
self._rack_tree = None
|
||||||
|
|
||||||
def add_rack(self, beg:Point, end:Point, name:str): #Hier wird Rack nur mit Anfang und Ende hinzugefügt -> wie macht man Zwischenpunkte?
|
def add_rack(self, beg:Point, end:Point, name:str): #Hier wird Rack nur mit Anfang und Ende hinzugefügt -> wie macht man Zwischenpunkte?
|
||||||
if beg in self._point2rack:
|
if beg in self._point2rack:
|
||||||
@@ -209,6 +211,50 @@ class RackIDs():
|
|||||||
connrackname = f"c-{rnames[l2]}"
|
connrackname = f"c-{rnames[l2]}"
|
||||||
self.add_rack(last, snap_point, connrackname)
|
self.add_rack(last, snap_point, connrackname)
|
||||||
|
|
||||||
|
def _build_rack_strtree(self):
|
||||||
|
self._rack_lines = []
|
||||||
|
self._rack_map = {}
|
||||||
|
for r_name, pts in self.get_racks_borders().items():
|
||||||
|
line = LineString([pts[0], pts[-1]])
|
||||||
|
self._rack_lines.append(line)
|
||||||
|
self._rack_map[line] = r_name
|
||||||
|
self._rack_tree = STRtree(self._rack_lines)
|
||||||
|
|
||||||
|
def join_racks_str(self):
|
||||||
|
if self._rack_tree is None:
|
||||||
|
self._build_rack_strtree()
|
||||||
|
|
||||||
|
rack_tree = self._rack_tree
|
||||||
|
rnames = self._rack_map
|
||||||
|
allracks = self._rack_lines
|
||||||
|
|
||||||
|
|
||||||
|
# Erzeugung von BoundingBox
|
||||||
|
for i, l1 in enumerate(allracks):
|
||||||
|
bbox = box(*l1.bounds).buffer(self._tol_snap)
|
||||||
|
candidates = rack_tree.query(bbox)
|
||||||
|
candidates = [self._rack_lines[idx] for idx in candidates]
|
||||||
|
|
||||||
|
for l2 in candidates:
|
||||||
|
if l1.equals(l2):
|
||||||
|
continue
|
||||||
|
# Echte Schnittpunkte
|
||||||
|
if l1.intersects(l2):
|
||||||
|
inter = l1.intersection(l2)
|
||||||
|
if inter.geom_type == "Point":
|
||||||
|
self.add_point_to_rack(inter, rnames[l1])
|
||||||
|
self.add_point_to_rack(inter, rnames[l2])
|
||||||
|
|
||||||
|
# Beinahe Schnittpunkte -> Snapping
|
||||||
|
for pt in [Point(l2.coords[0]), Point(l2.coords[-1])]:
|
||||||
|
if l1.distance(pt) <= self._tol_snap:
|
||||||
|
snap_point = l1.interpolate(l1.project(pt))
|
||||||
|
self.add_point_to_rack(snap_point, rnames[l1])
|
||||||
|
connrackname = f"c-{rnames[l2]}"
|
||||||
|
self.add_rack(pt, snap_point, connrackname)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
def rack_is_horizontal(self, name):
|
def rack_is_horizontal(self, name):
|
||||||
[pa, pe] = self._rack2begend[name]
|
[pa, pe] = self._rack2begend[name]
|
||||||
if pa.y == pe.y:
|
if pa.y == pe.y:
|
||||||
@@ -288,8 +334,7 @@ class Anlage():
|
|||||||
self._connect_step = tol_connect_step
|
self._connect_step = tol_connect_step
|
||||||
# Infos zum zeichnen des Graphen
|
# Infos zum zeichnen des Graphen
|
||||||
self._node_positions = dict()
|
self._node_positions = dict()
|
||||||
# falls man die rack zu den Sensorpunkten abfragen möchte, ist ein STR Baum nötig
|
|
||||||
self._rack_tree = None
|
|
||||||
|
|
||||||
def set_racks(self, racks:dict[str, list[Point]]):
|
def set_racks(self, racks:dict[str, list[Point]]):
|
||||||
r"""
|
r"""
|
||||||
@@ -387,29 +432,20 @@ class Anlage():
|
|||||||
return self.connect_equipment_to_racks(self._distributors, self._distributors_onpoints)
|
return self.connect_equipment_to_racks(self._distributors, self._distributors_onpoints)
|
||||||
|
|
||||||
def join_racks(self):
|
def join_racks(self):
|
||||||
self._racks.join_racks()
|
self._racks.join_racks_str()
|
||||||
|
|
||||||
def _build_rack_strtree(self):
|
|
||||||
self._rack_lines = []
|
|
||||||
self._rack_map = {}
|
|
||||||
for r_name, pts in self._racks.get_racks_borders().items():
|
|
||||||
line = LineString([pts[0], pts[-1]])
|
|
||||||
self._rack_lines.append(line)
|
|
||||||
self._rack_map[line] = r_name
|
|
||||||
self._rack_tree = STRtree(self._rack_lines)
|
|
||||||
|
|
||||||
def find_nearest_rack_from_point_STR_bbox(self, max_dist, sensor:Point) -> tuple[Point, str]:
|
def find_nearest_rack_from_point_STR_bbox(self, max_dist, sensor:Point) -> tuple[Point, str]:
|
||||||
if self._rack_tree is None:
|
if self._racks._rack_tree is None:
|
||||||
self._build_rack_strtree()
|
self._racks._build_rack_strtree()
|
||||||
|
|
||||||
minx, miny, maxx, maxy = sensor.x - max_dist, sensor.y - max_dist, sensor.x + max_dist, sensor.y + max_dist
|
minx, miny, maxx, maxy = sensor.x - max_dist, sensor.y - max_dist, sensor.x + max_dist, sensor.y + max_dist
|
||||||
bbox = box(minx, miny, maxx, maxy)
|
bbox = box(minx, miny, maxx, maxy)
|
||||||
|
|
||||||
candidates = self._rack_tree.query(bbox)
|
candidates = self._racks._rack_tree.query(bbox)
|
||||||
if len(candidates) == 0:
|
if len(candidates) == 0:
|
||||||
raise LookupError("no candidates in box found")
|
raise LookupError("no candidates in box found")
|
||||||
|
|
||||||
candidates = [self._rack_lines[idx] for idx in candidates]
|
candidates = [self._racks._rack_lines[idx] for idx in candidates]
|
||||||
best_dist = max_dist
|
best_dist = max_dist
|
||||||
best_line = candidates[0]
|
best_line = candidates[0]
|
||||||
for line in candidates:
|
for line in candidates:
|
||||||
@@ -418,7 +454,7 @@ class Anlage():
|
|||||||
best_dist = dist
|
best_dist = dist
|
||||||
best_line = line
|
best_line = line
|
||||||
|
|
||||||
rack_name = self._rack_map[best_line]
|
rack_name = self._racks._rack_map[best_line]
|
||||||
nearest_point = best_line.interpolate(best_line.project(sensor))
|
nearest_point = best_line.interpolate(best_line.project(sensor))
|
||||||
return nearest_point, rack_name
|
return nearest_point, rack_name
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user