baoyubo 5 mesiacov pred
rodič
commit
9c57e76b1f

+ 84 - 20
routers/api/videoResource/location/__init__.py

@@ -18,7 +18,8 @@ from utils.ry_system_util import *
 from utils.video_util import *
 from collections import defaultdict
 import traceback
-
+from concurrent.futures import ThreadPoolExecutor, as_completed
+from multiprocessing import Pool, cpu_count
 import json
 import time
 import math
@@ -136,27 +137,90 @@ def calculate_distance(video1, video2):
 
 def group_videos(videos, distance_threshold):
     grid_size = calculate_grid_size(distance_threshold)
-    grid = defaultdict(list)
-    groups = {}
+    grid = defaultdict(lambda:{"count":0,"list":[]})
+    groups = []
 
     for video in videos:
         grid_key = get_grid_key(video.latitude, video.longitude, grid_size)
-        grid[grid_key].append(video)
-
-    for grid_key, grid_videos in grid.items():
-        for video in grid_videos:
-            grouped = False
-            for group_id, group in list(groups.items()):
-                for v in group["videos"]:
-                    if calculate_distance(video, v) < distance_threshold:
-                        groups[group_id]["videos"].append(video)
-                        groups[group_id]["count"] += 1
-                        grouped = True
-                        break
-                if grouped:
-                    break
-            if not grouped:
-                group_id = video.cameraIndexCode
-                groups[group_id] = {"count": 1, "videos": [video]}
+        grid['%s-%s'%grid_key]['count']+=1
+        grid['%s-%s'%grid_key]['latitude'] = (grid_key[0] + 0.5) * grid_size
+        grid['%s-%s'%grid_key]['longitude'] = (grid_key[1] + 0.5) * grid_size
+        grid['%s-%s'%grid_key]['list'].append(video)
+        if grid['%s-%s'%grid_key]['count']>1:
+            grid['%s-%s' % grid_key]['type'] ='2'
+        else:grid['%s-%s'%grid_key]['type'] ='1'
+        groups = list(grid.values())
+        # for group_id, group in list(grid.items()):
+        #     groups.append(group)
+    # #使用多线程计算距离
+    # def process_video(video, grid_videos, groups, distance_threshold):
+    #     grouped = False
+    #     for group_id, group in list(groups.items()):
+    #         for v in group["videos"]:
+    #             if calculate_distance(video, v) < distance_threshold:
+    #                 groups[group_id]["videos"].append(video)
+    #                 groups[group_id]["count"] += 1
+    #                 grouped = True
+    #                 break
+    #         if grouped:
+    #             break
+    #     if not grouped:
+    #         group_id = video.cameraIndexCode
+    #         groups[group_id] = {"count": 1, "videos": [video]}
+    #
+    # with ThreadPoolExecutor() as executor:
+    #     futures = []
+    #     for grid_key, grid_videos in grid.items():
+    #         for video in grid_videos:
+    #             futures.append(executor.submit(process_video, video, grid_videos, groups, distance_threshold))
+    #     for future in as_completed(futures):
+    #         future.result()  # 确保所有任务完成
+
+    # for grid_key, grid_videos in grid.items():
+    #     for video in grid_videos:
+    #         grouped = False
+    #         for group_id, group in list(groups.items()):
+    #             for v in group["videos"]:
+    #                 if calculate_distance(video, v) < distance_threshold:
+    #                     groups[group_id]["videos"].append(video)
+    #                     groups[group_id]["count"] += 1
+    #                     grouped = True
+    #                     break
+    #             if grouped:
+    #                 break
+    #         if not grouped:
+    #             group_id = video.cameraIndexCode
+    #             groups[group_id] = {"count": 1, "videos": [video]}
+
+
+        # 使用多进程处理每个网格中的视频
 
+    # with Pool(processes=cpu_count()) as pool:
+    #     for grid_key, grid_videos in grid.items():
+    #         # 初始化局部分组
+    #         partial_groups = pool.starmap(process_video, [(video, grid_videos, groups.copy(), distance_threshold) for video in grid_videos])
+    #         # 合并局部分组结果
+    #         for partial_group in partial_groups:
+    #             for group_id, group in partial_group.items():
+    #                 if group_id in groups:
+    #                     groups[group_id]["videos"].extend(group["videos"])
+    #                     groups[group_id]["count"] += group["count"]
+    #                 else:
+    #                     groups[group_id] = group
+    # return groups
     return groups
+def process_video(video, grid_videos, groups, distance_threshold):
+    grouped = False
+    for group_id, group in list(groups.items()):
+        for v in group["videos"]:
+            if calculate_distance(video, v) < distance_threshold:
+                group["videos"].append(video)
+                group["count"] += 1
+                grouped = True
+                break
+        if grouped:
+            break
+    if not grouped:
+        group_id = video.cameraIndexCode
+        groups[group_id] = {"count": 1, "videos": [video]}
+    return groups

+ 4 - 4
routers/prod_api/system/dic/__init__.py

@@ -497,10 +497,10 @@ async def updata_dict_type(
             dict_data.dict_value = form_data.dictValue
         if form_data.dictType:
             dict_data.dict_type = form_data.dictType
-        if form_data.cssClass:
-            dict_data.css_class = form_data.cssClass
-        if form_data.listClass:
-            dict_data.list_class = form_data.listClass
+        if 'cssClass' in body:
+            dict_data.css_class = body['cssClass']
+        if 'listClass'in  body :
+            dict_data.list_class = body['listClass']
         if form_data.remark:
             dict_data.remark = form_data.remark
         if form_data.isDefault: