From 609fd5a1daeb1307757b7cc78eb03e8e91d6c82a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=9A=D0=BE=D1=88=D0=BA=D0=B8=D0=BD=20=D0=A1=D0=B5=D1=80?= =?UTF-8?q?=D0=B3=D0=B5=D0=B9?= Date: Wed, 26 Nov 2025 10:33:07 +0300 Subject: [PATCH] =?UTF-8?q?=D0=94=D0=BE=D0=B1=D0=B0=D0=B2=D0=B8=D0=BB=20?= =?UTF-8?q?=D0=BE=D0=B1=D1=8A=D0=B5=D0=B4=D0=B8=D0=BD=D0=B5=D0=BD=D0=B8?= =?UTF-8?q?=D0=B5=20=D0=B8=D1=81=D1=82=D0=BE=D1=87=D0=BD=D0=B8=D0=BA=D0=BE?= =?UTF-8?q?=D0=B2.=20=D0=92=D0=B5=D1=80=D0=BD=D1=83=D0=BB=20=D0=BD=D0=BE?= =?UTF-8?q?=D1=80=D0=BC=20=D0=BA=D0=B0=D1=80=D1=82=D1=83.=20=D0=A3=D0=B4?= =?UTF-8?q?=D0=B0=D0=BB=D0=B8=D0=BB=20=D0=BD=D0=B5=D0=BD=D1=83=D0=B6=D0=BD?= =?UTF-8?q?=D1=8B=D0=B5=20=D0=BB=D0=B8=D0=B1=D1=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- dbapp/mainapp/clusters.py | 34 - .../templates/mainapp/source_list.html | 483 ++++++++++- .../mainapp/templates/mainapp/source_map.html | 806 ++++-------------- dbapp/mainapp/urls.py | 6 +- dbapp/mainapp/views/__init__.py | 7 +- dbapp/mainapp/views/map.py | 30 +- dbapp/mainapp/views/source.py | 117 +++ .../mapsapp/templates/mapsapp/map2d_base.html | 2 +- dbapp/pyproject.toml | 5 - dbapp/uv.lock | 395 --------- 10 files changed, 785 insertions(+), 1100 deletions(-) delete mode 100644 dbapp/mainapp/clusters.py diff --git a/dbapp/mainapp/clusters.py b/dbapp/mainapp/clusters.py deleted file mode 100644 index b2a2f48..0000000 --- a/dbapp/mainapp/clusters.py +++ /dev/null @@ -1,34 +0,0 @@ -# Third-party imports -import matplotlib.pyplot as plt -import numpy as np -from sklearn.cluster import DBSCAN, HDBSCAN, KMeans - -# Local imports -from .models import ObjItem - -def get_clusters(coords: list[tuple[float, float]]): - coords = np.radians(coords) - lat, lon = coords[:, 0], coords[:, 1] - db = DBSCAN(eps=0.06, min_samples=5, algorithm='ball_tree', metric='haversine') - # db = HDBSCAN() - cluster_labels = db.fit_predict(coords) - plt.figure(figsize=(10, 8)) - unique_labels = set(cluster_labels) - colors = plt.cm.tab10(np.linspace(0, 1, len(unique_labels))) - - for label, color in zip(unique_labels, colors): - if label == -1: - color = 'k' - label_name = 'Шум' - else: - label_name = f'Кластер {label}' - - mask = cluster_labels == label - plt.scatter(lon[mask], lat[mask], c=[color], label=label_name, s=30) - - plt.xlabel('Долгота') - plt.ylabel('Широта') - plt.title('Кластеризация геоданных с DBSCAN (метрика Хаверсина)') - plt.legend() - plt.grid(True) - plt.show() diff --git a/dbapp/mainapp/templates/mainapp/source_list.html b/dbapp/mainapp/templates/mainapp/source_list.html index 7a0ba37..24b4920 100644 --- a/dbapp/mainapp/templates/mainapp/source_list.html +++ b/dbapp/mainapp/templates/mainapp/source_list.html @@ -97,6 +97,22 @@ + +
+ +
+ + +
+ +
+
- -
- - {% if polygon_coords %} - - {% endif %} -
-