@dartcom/ui-kit 10.5.13 → 10.5.15
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/configs/global/global.esm.js +1 -1
- package/dist/index.cjs +306 -19
- package/dist/index.esm.js +1 -1
- package/dist/services/api/api.service.d.ts +20 -0
- package/dist/services/api/api.service.d.ts.map +1 -0
- package/dist/services/api/api.service.esm.js +1 -0
- package/dist/services/api/api.types.d.ts +30 -0
- package/dist/services/api/api.types.d.ts.map +1 -0
- package/dist/services/api/index.d.ts +2 -2
- package/dist/services/api/index.d.ts.map +1 -1
- package/dist/services/collection/collection.service.d.ts +99 -0
- package/dist/services/collection/collection.service.d.ts.map +1 -0
- package/dist/services/collection/collection.service.esm.js +1 -0
- package/dist/services/collection/index.d.ts +1 -1
- package/dist/services/collection/index.d.ts.map +1 -1
- package/dist/services/geometry-history/geometry-history.service.d.ts +136 -0
- package/dist/services/geometry-history/geometry-history.service.d.ts.map +1 -0
- package/dist/services/geometry-history/geometry-history.service.esm.js +1 -0
- package/dist/services/geometry-history/index.d.ts +2 -0
- package/dist/services/geometry-history/index.d.ts.map +1 -0
- package/dist/services/index.d.ts +1 -0
- package/dist/services/index.d.ts.map +1 -1
- package/dist/services/map/index.d.ts +1 -1
- package/dist/services/map/index.d.ts.map +1 -1
- package/dist/services/map/map.constants.d.ts +11 -0
- package/dist/services/map/map.constants.d.ts.map +1 -0
- package/dist/services/map/map.constants.esm.js +1 -0
- package/dist/services/map/map.service.d.ts +166 -0
- package/dist/services/map/map.service.d.ts.map +1 -0
- package/dist/services/map/map.service.esm.js +1 -0
- package/dist/services/map/map.types.d.ts +5 -0
- package/dist/services/map/map.types.d.ts.map +1 -0
- package/package.json +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
import"../../lib/types.esm.js";import"@mui/material";import{ApiService as e}from"../../services/api/api.esm.js";import{localStateService as i}from"../../services/local-state/local-state.esm.js";import"../../_virtual/leaflet-src.esm.js";import"../../services/query/query.esm.js";import"../../node_modules/notistack/notistack.esm.esm.js";import{showSnackbar as t}from"../../lib/utils.esm.js";class s{configOptions;_private_key;_apiService;static _instance=null;static isUnauthorized=!1;static get instance(){if(!s._instance)throw new Error("Dartcom Config не инициализирован с приватным ключом. Вызовите Config.initialize(...) первым, чтобы иметь возможность пользоваться компонентами нашей библиотеки");return s._instance}static initialize(e){s._instance||(s._instance=new s(e))}static deactivate(){this._instance=null}constructor(a){this.configOptions=a;const{private_key:r,apiConfig:n}=a;this._private_key=r;const o=new e(n,{onRequestStart:()=>{s.isUnauthorized=!1},onUnauthorized:()=>{s.isUnauthorized=!0,i.remove("access_token"),i.remove("token_type")},onError:e=>{t({message:e,variant:"error"})}});this._apiService=o,this._getCheckKeyData().then(e=>{if(e){const{valid:i}=e;a.onCheck?.(e),this._isValidApiKey=i}})}get apiService(){return this._apiService}_isValidApiKey=!1;get isValidApiKey(){return this._isValidApiKey}async _getCheckKeyData(){return await this.apiService.get({url:"check_tile_token",config:{params:{tile_token:this._private_key}}}).then(e=>e).catch(e=>{const{response:i,message:t}=e;if(this.configOptions.onError?.(e),i){const{data:{detail:e}}=i;return e}return{reason:t,valid:!1}})}}export{s as GlobalConfig};
|
|
1
|
+
import"../../lib/types.esm.js";import"@mui/material";import{ApiService as e}from"../../services/api/api.service.esm.js";import{localStateService as i}from"../../services/local-state/local-state.esm.js";import"../../_virtual/leaflet-src.esm.js";import"../../services/query/query.esm.js";import"../../node_modules/notistack/notistack.esm.esm.js";import{showSnackbar as t}from"../../lib/utils.esm.js";class s{configOptions;_private_key;_apiService;static _instance=null;static isUnauthorized=!1;static get instance(){if(!s._instance)throw new Error("Dartcom Config не инициализирован с приватным ключом. Вызовите Config.initialize(...) первым, чтобы иметь возможность пользоваться компонентами нашей библиотеки");return s._instance}static initialize(e){s._instance||(s._instance=new s(e))}static deactivate(){this._instance=null}constructor(a){this.configOptions=a;const{private_key:r,apiConfig:n}=a;this._private_key=r;const o=new e(n,{onRequestStart:()=>{s.isUnauthorized=!1},onUnauthorized:()=>{s.isUnauthorized=!0,i.remove("access_token"),i.remove("token_type")},onError:e=>{t({message:e,variant:"error"})}});this._apiService=o,this._getCheckKeyData().then(e=>{if(e){const{valid:i}=e;a.onCheck?.(e),this._isValidApiKey=i}})}get apiService(){return this._apiService}_isValidApiKey=!1;get isValidApiKey(){return this._isValidApiKey}async _getCheckKeyData(){return await this.apiService.get({url:"check_tile_token",config:{params:{tile_token:this._private_key}}}).then(e=>e).catch(e=>{const{response:i,message:t}=e;if(this.configOptions.onError?.(e),i){const{data:{detail:e}}=i;return e}return{reason:t,valid:!1}})}}export{s as GlobalConfig};
|
package/dist/index.cjs
CHANGED
|
@@ -5820,6 +5820,236 @@ class CollectionService {
|
|
|
5820
5820
|
}
|
|
5821
5821
|
}
|
|
5822
5822
|
|
|
5823
|
+
// ========= Утилиты сравнения =========
|
|
5824
|
+
const isSameCoordinate = (a, b) => a.lat === b.lat && a.lon === b.lon;
|
|
5825
|
+
const isSameLine = (a, b) => {
|
|
5826
|
+
if (a.length !== b.length) {
|
|
5827
|
+
return false;
|
|
5828
|
+
}
|
|
5829
|
+
return a.every((coord, i) => isSameCoordinate(coord, b[i]));
|
|
5830
|
+
};
|
|
5831
|
+
const isSamePolygon = (a, b) => {
|
|
5832
|
+
if (a.length !== b.length) {
|
|
5833
|
+
return false;
|
|
5834
|
+
}
|
|
5835
|
+
return a.every((ring, i) => isSameLine(ring, b[i]));
|
|
5836
|
+
};
|
|
5837
|
+
/**
|
|
5838
|
+
* Готовые компараторы для каждого типа геометрии.
|
|
5839
|
+
*/
|
|
5840
|
+
const GeometryComparators = {
|
|
5841
|
+
point: isSameCoordinate,
|
|
5842
|
+
line: isSameLine,
|
|
5843
|
+
polygon: isSamePolygon,
|
|
5844
|
+
};
|
|
5845
|
+
/**
|
|
5846
|
+
* GeometryHistoryService (back-only, single geometry type)
|
|
5847
|
+
*/
|
|
5848
|
+
class GeometryHistoryService {
|
|
5849
|
+
options;
|
|
5850
|
+
/**
|
|
5851
|
+
* Прошлые шаги истории.
|
|
5852
|
+
*/
|
|
5853
|
+
_past = observable.array();
|
|
5854
|
+
/**
|
|
5855
|
+
* Текущий шаг истории.
|
|
5856
|
+
*/
|
|
5857
|
+
_present = null;
|
|
5858
|
+
/**
|
|
5859
|
+
* Флаг, что текущее состояние истории было инициализировано.
|
|
5860
|
+
*/
|
|
5861
|
+
_hasPresent = false;
|
|
5862
|
+
/**
|
|
5863
|
+
* Индекс по id для быстрого поиска последнего изменения.
|
|
5864
|
+
*/
|
|
5865
|
+
_indexById = observable.map();
|
|
5866
|
+
constructor(options) {
|
|
5867
|
+
this.options = options;
|
|
5868
|
+
makeAutoObservable(this, {}, { autoBind: true });
|
|
5869
|
+
}
|
|
5870
|
+
// ========= Служебные методы =========
|
|
5871
|
+
/**
|
|
5872
|
+
* Сравнивает два набора изменений через options.compare.
|
|
5873
|
+
* - длина должна совпадать;
|
|
5874
|
+
* - для каждой позиции id и geometry должны совпадать.
|
|
5875
|
+
*/
|
|
5876
|
+
_isSameChangeSet(a, b) {
|
|
5877
|
+
if (a.length !== b.length) {
|
|
5878
|
+
return false;
|
|
5879
|
+
}
|
|
5880
|
+
return a.every((change, index) => {
|
|
5881
|
+
const other = b[index];
|
|
5882
|
+
if (change.id !== other.id) {
|
|
5883
|
+
return false;
|
|
5884
|
+
}
|
|
5885
|
+
return this.options.compare(change.geometry, other.geometry);
|
|
5886
|
+
});
|
|
5887
|
+
}
|
|
5888
|
+
/**
|
|
5889
|
+
* Полностью пересчитывает индекс по id из текущих past и present.
|
|
5890
|
+
* Этот метод относительно дорогой (`O(N * K)`), но используется только:
|
|
5891
|
+
* - при init;
|
|
5892
|
+
* - при clear (через resetIndex);
|
|
5893
|
+
* - при undo (редко относительно частоты findLastChangeById).
|
|
5894
|
+
*/
|
|
5895
|
+
_rebuildIndex() {
|
|
5896
|
+
this._indexById.clear();
|
|
5897
|
+
// Сначала past (в порядке от 0 до конца),
|
|
5898
|
+
// чтобы более новые шаги перекрывали старые.
|
|
5899
|
+
this._past.forEach((changeSet, stepIndex) => {
|
|
5900
|
+
changeSet.forEach((change, changeIndex) => {
|
|
5901
|
+
this._indexById.set(change.id, {
|
|
5902
|
+
isPresent: false,
|
|
5903
|
+
stepIndex,
|
|
5904
|
+
changeIndex,
|
|
5905
|
+
id: change.id,
|
|
5906
|
+
});
|
|
5907
|
+
});
|
|
5908
|
+
});
|
|
5909
|
+
// Затем present — он всегда самый новый.
|
|
5910
|
+
if (this._present) {
|
|
5911
|
+
this._present.forEach((change, changeIndex) => {
|
|
5912
|
+
this._indexById.set(change.id, {
|
|
5913
|
+
isPresent: true,
|
|
5914
|
+
stepIndex: -1,
|
|
5915
|
+
changeIndex,
|
|
5916
|
+
id: change.id,
|
|
5917
|
+
});
|
|
5918
|
+
});
|
|
5919
|
+
}
|
|
5920
|
+
}
|
|
5921
|
+
/**
|
|
5922
|
+
* Сбрасывает индекс.
|
|
5923
|
+
*/
|
|
5924
|
+
_resetIndex() {
|
|
5925
|
+
this._indexById.clear();
|
|
5926
|
+
}
|
|
5927
|
+
// ========= Геттеры =========
|
|
5928
|
+
get past() {
|
|
5929
|
+
return this._past;
|
|
5930
|
+
}
|
|
5931
|
+
get present() {
|
|
5932
|
+
return this._present;
|
|
5933
|
+
}
|
|
5934
|
+
get hasPresent() {
|
|
5935
|
+
return this._hasPresent;
|
|
5936
|
+
}
|
|
5937
|
+
get canUndo() {
|
|
5938
|
+
return this._past.length > 0;
|
|
5939
|
+
}
|
|
5940
|
+
get size() {
|
|
5941
|
+
return this._past.length + (this._hasPresent ? 1 : 0);
|
|
5942
|
+
}
|
|
5943
|
+
// ========= Основные методы =========
|
|
5944
|
+
/**
|
|
5945
|
+
* Инициализирует историю стартовым набором изменений.
|
|
5946
|
+
* Полностью очищает past, задаёт новый present и пересчитывает индекс.
|
|
5947
|
+
*/
|
|
5948
|
+
init(value) {
|
|
5949
|
+
this._past.clear();
|
|
5950
|
+
this._present = value;
|
|
5951
|
+
this._hasPresent = true;
|
|
5952
|
+
this._rebuildIndex();
|
|
5953
|
+
this.emit();
|
|
5954
|
+
}
|
|
5955
|
+
/**
|
|
5956
|
+
* Добавляет новый шаг истории.
|
|
5957
|
+
*
|
|
5958
|
+
* Поведение:
|
|
5959
|
+
* - если история не была инициализирована, value становится текущим шагом;
|
|
5960
|
+
* - если новый набор изменений совпадает с текущим, запись не создаётся;
|
|
5961
|
+
* - текущий шаг переносится в past;
|
|
5962
|
+
* - индекс обновляется минимально.
|
|
5963
|
+
*/
|
|
5964
|
+
push(value) {
|
|
5965
|
+
if (!this._hasPresent || this._present == null) {
|
|
5966
|
+
this._present = value;
|
|
5967
|
+
this._hasPresent = true;
|
|
5968
|
+
// только present, past пустой
|
|
5969
|
+
this._rebuildIndex();
|
|
5970
|
+
this.emit();
|
|
5971
|
+
return;
|
|
5972
|
+
}
|
|
5973
|
+
if (this._isSameChangeSet(this._present, value)) {
|
|
5974
|
+
return;
|
|
5975
|
+
}
|
|
5976
|
+
// переносим текущий шаг в past
|
|
5977
|
+
this._past.push(this._present);
|
|
5978
|
+
this._present = value;
|
|
5979
|
+
// обновляем индекс:
|
|
5980
|
+
// прибавляем новую позицию past и свежий present.
|
|
5981
|
+
this._rebuildIndex();
|
|
5982
|
+
this.emit();
|
|
5983
|
+
}
|
|
5984
|
+
/**
|
|
5985
|
+
* Заменяет текущий шаг без создания новой записи в истории.
|
|
5986
|
+
* Подходит для промежуточных изменений во время drag/edit-сессии.
|
|
5987
|
+
*/
|
|
5988
|
+
replace(value) {
|
|
5989
|
+
this._present = value;
|
|
5990
|
+
this._hasPresent = true;
|
|
5991
|
+
this._rebuildIndex();
|
|
5992
|
+
this.emit();
|
|
5993
|
+
}
|
|
5994
|
+
/**
|
|
5995
|
+
* Откатывает историю на предыдущий шаг.
|
|
5996
|
+
* Последний past становится present.
|
|
5997
|
+
*/
|
|
5998
|
+
undo() {
|
|
5999
|
+
if (!this.canUndo || !this._hasPresent || this._present == null) {
|
|
6000
|
+
return this._present;
|
|
6001
|
+
}
|
|
6002
|
+
const previous = this._past.pop() ?? null;
|
|
6003
|
+
this._present = previous;
|
|
6004
|
+
this._rebuildIndex();
|
|
6005
|
+
this.emit();
|
|
6006
|
+
return this._present;
|
|
6007
|
+
}
|
|
6008
|
+
/**
|
|
6009
|
+
* Полностью очищает историю.
|
|
6010
|
+
*/
|
|
6011
|
+
clear() {
|
|
6012
|
+
this._past.clear();
|
|
6013
|
+
this._present = null;
|
|
6014
|
+
this._hasPresent = false;
|
|
6015
|
+
this._resetIndex();
|
|
6016
|
+
this.emit();
|
|
6017
|
+
}
|
|
6018
|
+
/**
|
|
6019
|
+
* Возвращает безопасный снимок текущего состояния истории.
|
|
6020
|
+
*/
|
|
6021
|
+
getState() {
|
|
6022
|
+
return {
|
|
6023
|
+
past: [...this._past],
|
|
6024
|
+
present: this._present,
|
|
6025
|
+
};
|
|
6026
|
+
}
|
|
6027
|
+
/**
|
|
6028
|
+
* Находит последний по времени шаг, в котором изменялась геометрия заданного id.
|
|
6029
|
+
*/
|
|
6030
|
+
findLastChangeById(id) {
|
|
6031
|
+
const entry = this._indexById.get(id);
|
|
6032
|
+
if (!entry) {
|
|
6033
|
+
return null;
|
|
6034
|
+
}
|
|
6035
|
+
if (entry.isPresent) {
|
|
6036
|
+
const present = this._present;
|
|
6037
|
+
if (!present) {
|
|
6038
|
+
return null;
|
|
6039
|
+
}
|
|
6040
|
+
return present[entry.changeIndex] ?? null;
|
|
6041
|
+
}
|
|
6042
|
+
const changeSet = this._past[entry.stepIndex];
|
|
6043
|
+
if (!changeSet) {
|
|
6044
|
+
return null;
|
|
6045
|
+
}
|
|
6046
|
+
return changeSet[entry.changeIndex] ?? null;
|
|
6047
|
+
}
|
|
6048
|
+
emit() {
|
|
6049
|
+
this.options.onChange?.(this.getState());
|
|
6050
|
+
}
|
|
6051
|
+
}
|
|
6052
|
+
|
|
5823
6053
|
/**
|
|
5824
6054
|
* @module constants
|
|
5825
6055
|
* @summary Useful constants
|
|
@@ -8666,6 +8896,21 @@ class LoggerService {
|
|
|
8666
8896
|
}
|
|
8667
8897
|
const loggerService = new LoggerService();
|
|
8668
8898
|
|
|
8899
|
+
/**
|
|
8900
|
+
* Коэффициенты перевода единиц в метры.
|
|
8901
|
+
*
|
|
8902
|
+
* Значение — сколько метров содержится в одной единице.
|
|
8903
|
+
*
|
|
8904
|
+
* Основано на стандартных метрических и международных определениях
|
|
8905
|
+
* (1 km = 1000 m, 1 mi = 1609.344 m, 1 NM = 1852 m и т.д.). [web:45][web:48][web:54]
|
|
8906
|
+
*/
|
|
8907
|
+
const DISTANCE_UNIT_FACTORS = {
|
|
8908
|
+
meters: 1,
|
|
8909
|
+
kilometers: 1_000,
|
|
8910
|
+
miles: 1_609.344,
|
|
8911
|
+
nauticalMiles: 1_852,
|
|
8912
|
+
};
|
|
8913
|
+
|
|
8669
8914
|
function getDefaultExportFromCjs (x) {
|
|
8670
8915
|
return x && x.__esModule && Object.prototype.hasOwnProperty.call(x, 'default') ? x['default'] : x;
|
|
8671
8916
|
}
|
|
@@ -23302,27 +23547,22 @@ class MapService {
|
|
|
23302
23547
|
* Вычисляет координату точки назначения по исходной точке,
|
|
23303
23548
|
* расстоянию и азимуту.
|
|
23304
23549
|
*
|
|
23305
|
-
*
|
|
23306
|
-
*
|
|
23550
|
+
* Расстояние можно задавать в произвольной поддерживаемой единице
|
|
23551
|
+
* (по умолчанию метры) — перед вычислениями оно будет переведено в метры.
|
|
23307
23552
|
*
|
|
23308
|
-
* @param params - Параметры
|
|
23553
|
+
* @param params - Параметры расчёта.
|
|
23309
23554
|
* @param params.coordinate - Исходная координата.
|
|
23310
|
-
* @param params.distance - Расстояние до точки назначения в
|
|
23555
|
+
* @param params.distance - Расстояние до точки назначения в заданной единице.
|
|
23311
23556
|
* @param params.azimuth - Азимут движения в градусах.
|
|
23557
|
+
* @param params.unit - Единица, в которой задано расстояние (по умолчанию метры).
|
|
23312
23558
|
* @returns Координата точки назначения в формате `{ lat, lon }`.
|
|
23313
|
-
*
|
|
23314
|
-
* @example
|
|
23315
|
-
* mapService.calculateDestination({
|
|
23316
|
-
* coordinate: { lat: 55.75, lon: 37.61 },
|
|
23317
|
-
* distance: 1000,
|
|
23318
|
-
* azimuth: 90,
|
|
23319
|
-
* });
|
|
23320
23559
|
*/
|
|
23321
|
-
calculateDestination = ({ coordinate, distance, azimuth, }) => {
|
|
23560
|
+
calculateDestination = ({ coordinate, distance, azimuth, unit = 'meters', }) => {
|
|
23322
23561
|
const φ1 = coordinate.lat * this.DEG_TO_RAD;
|
|
23323
23562
|
const λ1 = coordinate.lon * this.DEG_TO_RAD;
|
|
23324
23563
|
const θ = this.normalizeBearing(azimuth) * this.DEG_TO_RAD;
|
|
23325
|
-
const
|
|
23564
|
+
const distanceInMeters = this.distanceToMeters(distance, unit);
|
|
23565
|
+
const δ = distanceInMeters / this.EARTH_RADIUS_M;
|
|
23326
23566
|
const sinφ1 = Math.sin(φ1);
|
|
23327
23567
|
const cosφ1 = Math.cos(φ1);
|
|
23328
23568
|
const sinδ = Math.sin(δ);
|
|
@@ -23340,14 +23580,15 @@ class MapService {
|
|
|
23340
23580
|
* Вычисляет расстояние между двумя географическими точками
|
|
23341
23581
|
* по формуле гаверсинуса.
|
|
23342
23582
|
*
|
|
23343
|
-
*
|
|
23344
|
-
*
|
|
23583
|
+
* По умолчанию возвращает значение в метрах, но можно запросить
|
|
23584
|
+
* километры, мили или морские мили.
|
|
23345
23585
|
*
|
|
23346
23586
|
* @param a - Первая координата.
|
|
23347
23587
|
* @param b - Вторая координата.
|
|
23348
|
-
* @
|
|
23588
|
+
* @param unit - Единица измерения результата (по умолчанию метры).
|
|
23589
|
+
* @returns Расстояние между точками в выбранной единице.
|
|
23349
23590
|
*/
|
|
23350
|
-
haversineDistance(a, b) {
|
|
23591
|
+
haversineDistance(a, b, unit = 'meters') {
|
|
23351
23592
|
const φ1 = a.lat * this.DEG_TO_RAD;
|
|
23352
23593
|
const φ2 = b.lat * this.DEG_TO_RAD;
|
|
23353
23594
|
const Δφ = (b.lat - a.lat) * this.DEG_TO_RAD;
|
|
@@ -23355,7 +23596,8 @@ class MapService {
|
|
|
23355
23596
|
const h = Math.sin(Δφ / 2) ** 2 +
|
|
23356
23597
|
Math.cos(φ1) * Math.cos(φ2) * Math.sin(Δλ / 2) ** 2;
|
|
23357
23598
|
const c = 2 * Math.atan2(Math.sqrt(h), Math.sqrt(1 - h));
|
|
23358
|
-
|
|
23599
|
+
const distanceInMeters = this.EARTH_RADIUS_M * c;
|
|
23600
|
+
return this.convertDistance(distanceInMeters, unit);
|
|
23359
23601
|
}
|
|
23360
23602
|
/**
|
|
23361
23603
|
* Вычисляет начальный азимут из точки `a` в точку `b`.
|
|
@@ -23375,7 +23617,50 @@ class MapService {
|
|
|
23375
23617
|
const y = Math.sin(λ2 - λ1) * Math.cos(φ2);
|
|
23376
23618
|
const x = Math.cos(φ1) * Math.sin(φ2) -
|
|
23377
23619
|
Math.sin(φ1) * Math.cos(φ2) * Math.cos(λ2 - λ1);
|
|
23378
|
-
|
|
23620
|
+
const initialBearing = this.normalizeBearing(Math.atan2(y, x) * this.RAD_TO_DEG);
|
|
23621
|
+
return initialBearing;
|
|
23622
|
+
}
|
|
23623
|
+
/**
|
|
23624
|
+
* Переводит расстояние в метрах в заданную единицу измерения.
|
|
23625
|
+
*
|
|
23626
|
+
* @param distanceInMeters - Расстояние в метрах.
|
|
23627
|
+
* @param unit - Желаемая единица измерения (по умолчанию метры).
|
|
23628
|
+
* @returns Расстояние в выбранной единице.
|
|
23629
|
+
*/
|
|
23630
|
+
convertDistance(distanceInMeters, unit = 'meters') {
|
|
23631
|
+
const factor = DISTANCE_UNIT_FACTORS[unit];
|
|
23632
|
+
return distanceInMeters / factor;
|
|
23633
|
+
}
|
|
23634
|
+
/**
|
|
23635
|
+
* Переводит расстояние из заданной единицы измерения в метры.
|
|
23636
|
+
*
|
|
23637
|
+
* @param distance - Расстояние в выбранной единице измерения.
|
|
23638
|
+
* @param unit - Единица, в которой передано расстояние.
|
|
23639
|
+
* @returns Расстояние в метрах.
|
|
23640
|
+
*/
|
|
23641
|
+
distanceToMeters(distance, unit = 'meters') {
|
|
23642
|
+
const factor = DISTANCE_UNIT_FACTORS[unit];
|
|
23643
|
+
return distance * factor;
|
|
23644
|
+
}
|
|
23645
|
+
/**
|
|
23646
|
+
* Вычисляет общую длину ломаной линии (полилинии) по массиву координат.
|
|
23647
|
+
*
|
|
23648
|
+
* Суммирует расстояния между последовательными точками.
|
|
23649
|
+
* По умолчанию возвращает метры, но можно указать другую единицу.
|
|
23650
|
+
*
|
|
23651
|
+
* @param coordinates - Массив координат, образующих ломаную линию.
|
|
23652
|
+
* @param unit - Единица измерения результата (по умолчанию метры).
|
|
23653
|
+
* @returns Общая длина полилинии в выбранной единице.
|
|
23654
|
+
*/
|
|
23655
|
+
getPolylineLength(coordinates, unit = 'meters') {
|
|
23656
|
+
const totalLengthInMeters = coordinates.reduce((totalLength, coordinate, index, coords) => {
|
|
23657
|
+
const nextCoordinate = coords[index + 1];
|
|
23658
|
+
if (!nextCoordinate)
|
|
23659
|
+
return totalLength;
|
|
23660
|
+
const segmentLength = this.haversineDistance(coordinate, nextCoordinate, 'meters');
|
|
23661
|
+
return totalLength + segmentLength;
|
|
23662
|
+
}, 0);
|
|
23663
|
+
return this.convertDistance(totalLengthInMeters, unit);
|
|
23379
23664
|
}
|
|
23380
23665
|
}
|
|
23381
23666
|
/**
|
|
@@ -47716,6 +48001,8 @@ exports.ErrorBoundary = CustomErrorBoundary;
|
|
|
47716
48001
|
exports.ExcelUploader = ExcelUploader;
|
|
47717
48002
|
exports.Form = CustomForm;
|
|
47718
48003
|
exports.FormErrorMessage = FormErrorMessage;
|
|
48004
|
+
exports.GeometryComparators = GeometryComparators;
|
|
48005
|
+
exports.GeometryHistoryService = GeometryHistoryService;
|
|
47719
48006
|
exports.GlobalConfig = GlobalConfig;
|
|
47720
48007
|
exports.IconButton = IconButton;
|
|
47721
48008
|
exports.Input = CustomInput;
|
package/dist/index.esm.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
export{alertStore}from"./stores/alert/alert.esm.js";export{modalStore}from"./stores/modal/modal.esm.js";export{Operations}from"./lib/types.esm.js";export{useDeviceType}from"./lib/hooks/useDeviceType.esm.js";export{useGetUser,useLazyGetUser}from"./lib/hooks/useGetUser.esm.js";export{useShowErrorSnackbar}from"./lib/hooks/useShowErrorSnackbar.esm.js";export{useShowSnackbar}from"./lib/hooks/useShowSnackbar.esm.js";export{useSignIn}from"./lib/hooks/useSignIn.esm.js";export{useSignOut}from"./lib/hooks/useSignOut.esm.js";export{copyInformation,encodeString,getEntityNames,getImageSrc,getNewId,getUniqueKey,getUrlencodedBody,showSnackbar}from"./lib/utils.esm.js";export{_testApiKeys}from"./configs/global/constants.esm.js";export{GlobalConfig}from"./configs/global/global.esm.js";export{API_METHODS}from"./constants/api.esm.js";export{PanelsNames}from"./constants/map.esm.js";export{arraySchema,dateRequiredSchema,dateSchema,getStringRequiredSchema,getStringSchema,numberRequiredSchema,numberSchema}from"./constants/schema.esm.js";export{default as Accordion}from"./components/accordion/accordion.esm.js";export{default as AlertDialog}from"./components/alert-dialog/alert-dialog.esm.js";export{default as Button}from"./components/buttons/button/button.esm.js";export{default as DeleteButton}from"./components/buttons/delete/delete.esm.js";export{default as IconButton}from"./components/buttons/icon/icon.esm.js";export{default as UploadButton}from"./components/buttons/upload/upload.esm.js";export{default as Card}from"./components/card/card.esm.js";export{default as Checkbox}from"./components/checkbox/checkbox.esm.js";export{default as CopyText}from"./components/copy-text/copy-text.esm.js";export{default as DateField}from"./components/date-field/date-field.esm.js";export{default as DragList}from"./components/drag-list/drag-list.esm.js";export{default as DraggableContainer}from"./components/draggable-container/draggable-container.esm.js";export{default as ErrorBoundary}from"./components/error-boundary/error-boundary.esm.js";export{default as FormErrorMessage}from"./components/form/error-message/error-message.esm.js";export{default as Form}from"./components/form/form.esm.js";export{useFormContext}from"./components/form/hooks/useFormContext.esm.js";export{default as Input}from"./components/input/input.esm.js";export{SourceLayers,TangramSourceNames}from"./components/layers/leaflet/lib/types.esm.js";export{getAllLayers,getAllPointLayers,getAllPolygonLayers,getAllPolylineLayers,getBackendDate,getLayerModalsNames,getLayerName,getValidLayer}from"./components/layers/leaflet/lib/utils.esm.js";export{sourceUrl,tile_size}from"./components/layers/leaflet/config/constants.esm.js";export{getBuildingLayers}from"./components/layers/leaflet/layers/building/utils.esm.js";export{getBuiltupAreaLayers}from"./components/layers/leaflet/layers/builtup-area/utils.esm.js";export{getAdminAreaLayers}from"./components/layers/leaflet/layers/admin-area/utils.esm.js";export{getCameraLayers}from"./components/layers/leaflet/layers/camera/lib/utils.esm.js";export{cameraConfig}from"./components/layers/leaflet/layers/camera/config/constants.esm.js";export{getCityPOILayers}from"./components/layers/leaflet/layers/city-POI/utils.esm.js";export{getConditionLayers}from"./components/layers/leaflet/layers/condition/utils.esm.js";export{getFacilityAreaLayers}from"./components/layers/leaflet/layers/facility-area/utils.esm.js";export{landuseAreaFeatureTypes,landuseAreaLayerGeometryData,landuseAreaLayerLabelData}from"./components/layers/leaflet/layers/landuse-area/constants.esm.js";export{getLanduseAreaGeometryLayer,getLanduseAreaLabelLayer,getLanduseAreaLayers}from"./components/layers/leaflet/layers/landuse-area/utils.esm.js";export{getLaneMarkingArrowLayers}from"./components/layers/leaflet/layers/lane-marking-arrow/utils.esm.js";export{getLinkLayers}from"./components/layers/leaflet/layers/link/utils.esm.js";export{getNatureFieldLayers}from"./components/layers/leaflet/layers/nature-field/utils.esm.js";export{getNatureForestGeometryLayer,getNatureForestLayers}from"./components/layers/leaflet/layers/nature-forest/utils.esm.js";export{getOceanAreaLayers}from"./components/layers/leaflet/layers/ocean-area/utils.esm.js";export{getOneWayLayers}from"./components/layers/leaflet/layers/one-way/utils.esm.js";export{getPillarLayers}from"./components/layers/leaflet/layers/pillar/lib/utils.esm.js";export{pillarConfig}from"./components/layers/leaflet/layers/pillar/config/constants.esm.js";export{catIds,text_source}from"./components/layers/leaflet/layers/POI/constants.esm.js";export{getDefaultPOI,getPOILayers,getPOITypeLayer}from"./components/layers/leaflet/layers/POI/utils.esm.js";export{getPointAddressLayers}from"./components/layers/leaflet/layers/point-address/utils.esm.js";export{getRailroadLayers}from"./components/layers/leaflet/layers/railroad/utils.esm.js";export{getTrafficSignImgSrc,getTrafficSignLayers,parseTrafficSignCSVFile}from"./components/layers/leaflet/layers/traffic-sign/lib/utils.esm.js";export{allTrafficSigns,trafficSignConfig,trafficSigns,trafficSignsDop}from"./components/layers/leaflet/layers/traffic-sign/config/constants.esm.js";export{getTrafficSignalLayers}from"./components/layers/leaflet/layers/traffic-signal/lib/utils.esm.js";export{trafficSignalConfig}from"./components/layers/leaflet/layers/traffic-signal/config/constants.esm.js";export{getWaterAreaLayers}from"./components/layers/leaflet/layers/water-area/utils.esm.js";export{getWaterLinkLayers}from"./components/layers/leaflet/layers/water-link/utils.esm.js";export{default as LeafletLayer}from"./components/layers/leaflet/leaflet.esm.js";export{TangramLayer}from"./components/layers/leaflet/services/tangram-layer.esm.js";export{default as List}from"./components/list/list.esm.js";export{default as Loader}from"./components/loader/loader.esm.js";export{default as Modal}from"./components/modal/modal.esm.js";export{modalStyle}from"./components/modal/styles.esm.js";export{default as NoData}from"./components/no-data/no-data.esm.js";export{default as Paragraph}from"./components/paragraph/paragraph.esm.js";export{default as Select}from"./components/select/select.esm.js";export{default as Tabs}from"./components/tabs/tabs.esm.js";export{default as TextField}from"./components/text-field/text-field.esm.js";export{CSVUploader}from"./components/uploader/csv/csv.esm.js";export{default as ExcelUploader}from"./components/uploader/excel/excel.esm.js";export{default as AuthPage}from"./pages/auth/auth.esm.js";export{default as DartcomAuthProvider}from"./providers/auth/auth.esm.js";export{default as DartcomInitializeProvider}from"./providers/initialize/initialize.esm.js";export{default as DartcomLocalizationProvider}from"./providers/localization/localization.esm.js";export{default as DartcomProviders}from"./providers/providers.esm.js";export{ApiService}from"./services/api/api.esm.js";export{CollectionService}from"./services/collection/collection.esm.js";export{localStateService}from"./services/local-state/local-state.esm.js";export{localizationService}from"./services/localization/localization.esm.js";export{loggerService}from"./services/logger/logger.esm.js";export{mapService}from"./services/map/map.esm.js";export{queryService}from"./services/query/query.esm.js";
|
|
1
|
+
export{alertStore}from"./stores/alert/alert.esm.js";export{modalStore}from"./stores/modal/modal.esm.js";export{Operations}from"./lib/types.esm.js";export{useDeviceType}from"./lib/hooks/useDeviceType.esm.js";export{useGetUser,useLazyGetUser}from"./lib/hooks/useGetUser.esm.js";export{useShowErrorSnackbar}from"./lib/hooks/useShowErrorSnackbar.esm.js";export{useShowSnackbar}from"./lib/hooks/useShowSnackbar.esm.js";export{useSignIn}from"./lib/hooks/useSignIn.esm.js";export{useSignOut}from"./lib/hooks/useSignOut.esm.js";export{copyInformation,encodeString,getEntityNames,getImageSrc,getNewId,getUniqueKey,getUrlencodedBody,showSnackbar}from"./lib/utils.esm.js";export{_testApiKeys}from"./configs/global/constants.esm.js";export{GlobalConfig}from"./configs/global/global.esm.js";export{API_METHODS}from"./constants/api.esm.js";export{PanelsNames}from"./constants/map.esm.js";export{arraySchema,dateRequiredSchema,dateSchema,getStringRequiredSchema,getStringSchema,numberRequiredSchema,numberSchema}from"./constants/schema.esm.js";export{default as Accordion}from"./components/accordion/accordion.esm.js";export{default as AlertDialog}from"./components/alert-dialog/alert-dialog.esm.js";export{default as Button}from"./components/buttons/button/button.esm.js";export{default as DeleteButton}from"./components/buttons/delete/delete.esm.js";export{default as IconButton}from"./components/buttons/icon/icon.esm.js";export{default as UploadButton}from"./components/buttons/upload/upload.esm.js";export{default as Card}from"./components/card/card.esm.js";export{default as Checkbox}from"./components/checkbox/checkbox.esm.js";export{default as CopyText}from"./components/copy-text/copy-text.esm.js";export{default as DateField}from"./components/date-field/date-field.esm.js";export{default as DragList}from"./components/drag-list/drag-list.esm.js";export{default as DraggableContainer}from"./components/draggable-container/draggable-container.esm.js";export{default as ErrorBoundary}from"./components/error-boundary/error-boundary.esm.js";export{default as FormErrorMessage}from"./components/form/error-message/error-message.esm.js";export{default as Form}from"./components/form/form.esm.js";export{useFormContext}from"./components/form/hooks/useFormContext.esm.js";export{default as Input}from"./components/input/input.esm.js";export{SourceLayers,TangramSourceNames}from"./components/layers/leaflet/lib/types.esm.js";export{getAllLayers,getAllPointLayers,getAllPolygonLayers,getAllPolylineLayers,getBackendDate,getLayerModalsNames,getLayerName,getValidLayer}from"./components/layers/leaflet/lib/utils.esm.js";export{sourceUrl,tile_size}from"./components/layers/leaflet/config/constants.esm.js";export{getBuildingLayers}from"./components/layers/leaflet/layers/building/utils.esm.js";export{getBuiltupAreaLayers}from"./components/layers/leaflet/layers/builtup-area/utils.esm.js";export{getAdminAreaLayers}from"./components/layers/leaflet/layers/admin-area/utils.esm.js";export{getCameraLayers}from"./components/layers/leaflet/layers/camera/lib/utils.esm.js";export{cameraConfig}from"./components/layers/leaflet/layers/camera/config/constants.esm.js";export{getCityPOILayers}from"./components/layers/leaflet/layers/city-POI/utils.esm.js";export{getConditionLayers}from"./components/layers/leaflet/layers/condition/utils.esm.js";export{getFacilityAreaLayers}from"./components/layers/leaflet/layers/facility-area/utils.esm.js";export{landuseAreaFeatureTypes,landuseAreaLayerGeometryData,landuseAreaLayerLabelData}from"./components/layers/leaflet/layers/landuse-area/constants.esm.js";export{getLanduseAreaGeometryLayer,getLanduseAreaLabelLayer,getLanduseAreaLayers}from"./components/layers/leaflet/layers/landuse-area/utils.esm.js";export{getLaneMarkingArrowLayers}from"./components/layers/leaflet/layers/lane-marking-arrow/utils.esm.js";export{getLinkLayers}from"./components/layers/leaflet/layers/link/utils.esm.js";export{getNatureFieldLayers}from"./components/layers/leaflet/layers/nature-field/utils.esm.js";export{getNatureForestGeometryLayer,getNatureForestLayers}from"./components/layers/leaflet/layers/nature-forest/utils.esm.js";export{getOceanAreaLayers}from"./components/layers/leaflet/layers/ocean-area/utils.esm.js";export{getOneWayLayers}from"./components/layers/leaflet/layers/one-way/utils.esm.js";export{getPillarLayers}from"./components/layers/leaflet/layers/pillar/lib/utils.esm.js";export{pillarConfig}from"./components/layers/leaflet/layers/pillar/config/constants.esm.js";export{catIds,text_source}from"./components/layers/leaflet/layers/POI/constants.esm.js";export{getDefaultPOI,getPOILayers,getPOITypeLayer}from"./components/layers/leaflet/layers/POI/utils.esm.js";export{getPointAddressLayers}from"./components/layers/leaflet/layers/point-address/utils.esm.js";export{getRailroadLayers}from"./components/layers/leaflet/layers/railroad/utils.esm.js";export{getTrafficSignImgSrc,getTrafficSignLayers,parseTrafficSignCSVFile}from"./components/layers/leaflet/layers/traffic-sign/lib/utils.esm.js";export{allTrafficSigns,trafficSignConfig,trafficSigns,trafficSignsDop}from"./components/layers/leaflet/layers/traffic-sign/config/constants.esm.js";export{getTrafficSignalLayers}from"./components/layers/leaflet/layers/traffic-signal/lib/utils.esm.js";export{trafficSignalConfig}from"./components/layers/leaflet/layers/traffic-signal/config/constants.esm.js";export{getWaterAreaLayers}from"./components/layers/leaflet/layers/water-area/utils.esm.js";export{getWaterLinkLayers}from"./components/layers/leaflet/layers/water-link/utils.esm.js";export{default as LeafletLayer}from"./components/layers/leaflet/leaflet.esm.js";export{TangramLayer}from"./components/layers/leaflet/services/tangram-layer.esm.js";export{default as List}from"./components/list/list.esm.js";export{default as Loader}from"./components/loader/loader.esm.js";export{default as Modal}from"./components/modal/modal.esm.js";export{modalStyle}from"./components/modal/styles.esm.js";export{default as NoData}from"./components/no-data/no-data.esm.js";export{default as Paragraph}from"./components/paragraph/paragraph.esm.js";export{default as Select}from"./components/select/select.esm.js";export{default as Tabs}from"./components/tabs/tabs.esm.js";export{default as TextField}from"./components/text-field/text-field.esm.js";export{CSVUploader}from"./components/uploader/csv/csv.esm.js";export{default as ExcelUploader}from"./components/uploader/excel/excel.esm.js";export{default as AuthPage}from"./pages/auth/auth.esm.js";export{default as DartcomAuthProvider}from"./providers/auth/auth.esm.js";export{default as DartcomInitializeProvider}from"./providers/initialize/initialize.esm.js";export{default as DartcomLocalizationProvider}from"./providers/localization/localization.esm.js";export{default as DartcomProviders}from"./providers/providers.esm.js";export{ApiService}from"./services/api/api.service.esm.js";export{CollectionService}from"./services/collection/collection.service.esm.js";export{GeometryComparators,GeometryHistoryService}from"./services/geometry-history/geometry-history.service.esm.js";export{localStateService}from"./services/local-state/local-state.esm.js";export{localizationService}from"./services/localization/localization.esm.js";export{loggerService}from"./services/logger/logger.esm.js";export{mapService}from"./services/map/map.service.esm.js";export{queryService}from"./services/query/query.esm.js";
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { ApiConfig, DeleteProps, GetProps, PatchProps, PostProps, PutProps } from './api.types';
|
|
2
|
+
export type ApiServiceDeps = {
|
|
3
|
+
getHeaders?: () => Record<string, string>;
|
|
4
|
+
onRequestStart?: () => void;
|
|
5
|
+
onUnauthorized?: () => void;
|
|
6
|
+
onError?: (message: string) => void;
|
|
7
|
+
};
|
|
8
|
+
export declare class ApiService {
|
|
9
|
+
private readonly config;
|
|
10
|
+
private readonly deps?;
|
|
11
|
+
private readonly client;
|
|
12
|
+
constructor(config: ApiConfig, deps?: ApiServiceDeps | undefined);
|
|
13
|
+
private setupInterceptors;
|
|
14
|
+
get<T>({ url, config }: GetProps): Promise<T>;
|
|
15
|
+
post<R, B>({ url, body, config }: PostProps<B>): Promise<R>;
|
|
16
|
+
put<R, B>({ url, body, config }: PutProps<B>): Promise<R>;
|
|
17
|
+
patch<R, B>({ url, body, config }: PatchProps<B>): Promise<R>;
|
|
18
|
+
delete<R>({ url, config }: DeleteProps): Promise<R>;
|
|
19
|
+
}
|
|
20
|
+
//# sourceMappingURL=api.service.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"api.service.d.ts","sourceRoot":"","sources":["../../../src/services/api/api.service.ts"],"names":[],"mappings":"AAEA,OAAO,EACL,SAAS,EACT,WAAW,EACX,QAAQ,EACR,UAAU,EACV,SAAS,EACT,QAAQ,EACT,MAAM,aAAa,CAAC;AAIrB,MAAM,MAAM,cAAc,GAAG;IAC3B,UAAU,CAAC,EAAE,MAAM,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC1C,cAAc,CAAC,EAAE,MAAM,IAAI,CAAC;IAC5B,cAAc,CAAC,EAAE,MAAM,IAAI,CAAC;IAC5B,OAAO,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;CACrC,CAAC;AAEF,qBAAa,UAAU;IAInB,OAAO,CAAC,QAAQ,CAAC,MAAM;IACvB,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC;IAJxB,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAgB;gBAGpB,MAAM,EAAE,SAAS,EACjB,IAAI,CAAC,EAAE,cAAc,YAAA;IAcxC,OAAO,CAAC,iBAAiB;IA2CnB,GAAG,CAAC,CAAC,EAAE,EAAE,GAAG,EAAE,MAAM,EAAE,EAAE,QAAQ;IAMhC,IAAI,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,SAAS,CAAC,CAAC,CAAC;IAM9C,GAAG,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,QAAQ,CAAC,CAAC,CAAC;IAM5C,KAAK,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,UAAU,CAAC,CAAC,CAAC;IAMhD,MAAM,CAAC,CAAC,EAAE,EAAE,GAAG,EAAE,MAAM,EAAE,EAAE,WAAW;CAK7C"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{localStateService as t}from"../local-state/local-state.esm.js";import e from"axios";class s{config;deps;client;constructor(t,s){this.config=t,this.deps=s,this.client=e.create({baseURL:t?.baseURL,withCredentials:t?.withCredentials,timeout:1e4,headers:{"Content-Type":"application/json"}}),this.setupInterceptors()}setupInterceptors(){this.client.interceptors.request.use(e=>{this.deps?.onRequestStart?.();const s=this.config?.getHeaders?.()??this.deps?.getHeaders?.(),r=t.load("access_token"),i=t.load("token_type");return r&&i&&(e.headers.Authorization=`${i} ${r}`),s&&Object.entries(s).forEach(([t,s])=>{e.headers[t]=s}),e},t=>(this.deps?.onError?.(t.message),Promise.reject(t))),this.client.interceptors.response.use(t=>t,t=>(this.deps?.onError?.(t.message),401===t.response?.status&&this.deps?.onUnauthorized?.(),Promise.reject(t)))}async get({url:t,config:e}){return(await this.client.get(t,e)).data}async post({url:t,body:e,config:s}){return(await this.client.post(t,e,s)).data}async put({url:t,body:e,config:s}){return(await this.client.put(t,e,s)).data}async patch({url:t,body:e,config:s}){return(await this.client.patch(t,e,s)).data}async delete({url:t,config:e}){return(await this.client.delete(t,e)).data}}export{s as ApiService};
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import type { AxiosRequestConfig } from 'axios';
|
|
2
|
+
export type ApiConfig = {
|
|
3
|
+
baseURL: string;
|
|
4
|
+
withCredentials?: boolean;
|
|
5
|
+
getHeaders?: () => AxiosRequestConfig['headers'];
|
|
6
|
+
};
|
|
7
|
+
export type GetProps = {
|
|
8
|
+
url: string;
|
|
9
|
+
config?: AxiosRequestConfig;
|
|
10
|
+
};
|
|
11
|
+
export type PostProps<B> = {
|
|
12
|
+
url: string;
|
|
13
|
+
body?: B;
|
|
14
|
+
config?: AxiosRequestConfig<B>;
|
|
15
|
+
};
|
|
16
|
+
export type PutProps<B> = {
|
|
17
|
+
url: string;
|
|
18
|
+
body?: B;
|
|
19
|
+
config?: AxiosRequestConfig<B>;
|
|
20
|
+
};
|
|
21
|
+
export type PatchProps<B> = {
|
|
22
|
+
url: string;
|
|
23
|
+
body?: B;
|
|
24
|
+
config?: AxiosRequestConfig<B>;
|
|
25
|
+
};
|
|
26
|
+
export type DeleteProps = {
|
|
27
|
+
url: string;
|
|
28
|
+
config?: AxiosRequestConfig;
|
|
29
|
+
};
|
|
30
|
+
//# sourceMappingURL=api.types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"api.types.d.ts","sourceRoot":"","sources":["../../../src/services/api/api.types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,OAAO,CAAC;AAEhD,MAAM,MAAM,SAAS,GAAG;IACtB,OAAO,EAAE,MAAM,CAAC;IAEhB,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,UAAU,CAAC,EAAE,MAAM,kBAAkB,CAAC,SAAS,CAAC,CAAC;CAClD,CAAC;AAEF,MAAM,MAAM,QAAQ,GAAG;IACrB,GAAG,EAAE,MAAM,CAAC;IACZ,MAAM,CAAC,EAAE,kBAAkB,CAAC;CAC7B,CAAC;AAEF,MAAM,MAAM,SAAS,CAAC,CAAC,IAAI;IACzB,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,CAAC,EAAE,CAAC,CAAC;IACT,MAAM,CAAC,EAAE,kBAAkB,CAAC,CAAC,CAAC,CAAC;CAChC,CAAC;AAEF,MAAM,MAAM,QAAQ,CAAC,CAAC,IAAI;IACxB,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,CAAC,EAAE,CAAC,CAAC;IACT,MAAM,CAAC,EAAE,kBAAkB,CAAC,CAAC,CAAC,CAAC;CAChC,CAAC;AAEF,MAAM,MAAM,UAAU,CAAC,CAAC,IAAI;IAC1B,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,CAAC,EAAE,CAAC,CAAC;IACT,MAAM,CAAC,EAAE,kBAAkB,CAAC,CAAC,CAAC,CAAC;CAChC,CAAC;AAEF,MAAM,MAAM,WAAW,GAAG;IACxB,GAAG,EAAE,MAAM,CAAC;IACZ,MAAM,CAAC,EAAE,kBAAkB,CAAC;CAC7B,CAAC"}
|
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
export * from './types';
|
|
2
|
-
export * from './api';
|
|
1
|
+
export * from './api.types';
|
|
2
|
+
export * from './api.service';
|
|
3
3
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/services/api/index.ts"],"names":[],"mappings":"AAAA,cAAc,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/services/api/index.ts"],"names":[],"mappings":"AAAA,cAAc,aAAa,CAAC;AAE5B,cAAc,eAAe,CAAC"}
|
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
import { Nullable, StringOrNumber } from '../../lib';
|
|
2
|
+
export declare class CollectionService<T, Id extends StringOrNumber> {
|
|
3
|
+
private readonly props;
|
|
4
|
+
private _items;
|
|
5
|
+
constructor(props: {
|
|
6
|
+
getId: (item: T) => Id;
|
|
7
|
+
});
|
|
8
|
+
/**
|
|
9
|
+
* Возаращает id по самому элементу коллекции
|
|
10
|
+
*/
|
|
11
|
+
getIdByItem(item: T): Id;
|
|
12
|
+
/**
|
|
13
|
+
* Возвращает observable-коллекцию элементов в виде Map.
|
|
14
|
+
*/
|
|
15
|
+
get items(): import("mobx").ObservableMap<StringOrNumber, T>;
|
|
16
|
+
/**
|
|
17
|
+
* Возвращает все элементы коллекции в виде обычного массива.
|
|
18
|
+
*/
|
|
19
|
+
get list(): T[];
|
|
20
|
+
/**
|
|
21
|
+
* Возвращает все элементы, у которых значение указанного поля
|
|
22
|
+
* строго равно переданному значению.
|
|
23
|
+
*
|
|
24
|
+
* @typeParam K Ключ поля элемента.
|
|
25
|
+
* @param key Поле, по которому выполняется поиск.
|
|
26
|
+
* @param value Значение, с которым сравнивается поле.
|
|
27
|
+
* @returns Массив всех найденных элементов. Если совпадений нет, вернётся пустой массив.
|
|
28
|
+
*/
|
|
29
|
+
findAllBy<K extends keyof T>(key: K, value: T[K]): T[];
|
|
30
|
+
/**
|
|
31
|
+
* Возвращает все элементы, у которых значение указанного поля
|
|
32
|
+
* входит в список переданных значений.
|
|
33
|
+
*
|
|
34
|
+
* @typeParam K Ключ поля элемента.
|
|
35
|
+
* @param key Поле, по которому выполняется поиск.
|
|
36
|
+
* @param values Набор допустимых значений поля.
|
|
37
|
+
* @returns Массив всех найденных элементов. Если совпадений нет, вернётся пустой массив.
|
|
38
|
+
*/
|
|
39
|
+
findAllIn<K extends keyof T>(key: K, values: readonly T[K][]): T[];
|
|
40
|
+
/**
|
|
41
|
+
* Возвращает все элементы, которые одновременно соответствуют
|
|
42
|
+
* всем переданным критериям.
|
|
43
|
+
*
|
|
44
|
+
* Метод выполняет точное сравнение по каждому полю.
|
|
45
|
+
* Если передан пустой объект критериев, будут возвращены все элементы коллекции.
|
|
46
|
+
*
|
|
47
|
+
* @param criteria Объект с набором полей и значений для поиска.
|
|
48
|
+
* @returns Массив всех элементов, удовлетворяющих всем условиям сразу.
|
|
49
|
+
*/
|
|
50
|
+
findAllWhere(criteria: Partial<T>): T[];
|
|
51
|
+
/**
|
|
52
|
+
* Возвращает элемент по его идентификатору.
|
|
53
|
+
*
|
|
54
|
+
* @param id Идентификатор элемента.
|
|
55
|
+
* @returns Найденный элемент или undefined, если элемента с таким id нет.
|
|
56
|
+
*/
|
|
57
|
+
getById(id: Id): T | undefined;
|
|
58
|
+
/**
|
|
59
|
+
* Добавляет элемент в коллекцию.
|
|
60
|
+
*
|
|
61
|
+
* @param item Элемент для добавления или замены.
|
|
62
|
+
*/
|
|
63
|
+
add(item: T): void;
|
|
64
|
+
/**
|
|
65
|
+
* Добавляет в коллекцию несколько элементов подряд.
|
|
66
|
+
*
|
|
67
|
+
* @param items Массив элементов для добавления.
|
|
68
|
+
*/
|
|
69
|
+
addMany(items: T[]): void;
|
|
70
|
+
/**
|
|
71
|
+
* Удаляет элемент из коллекции по id.
|
|
72
|
+
*
|
|
73
|
+
* @param id Идентификатор удаляемого элемента.
|
|
74
|
+
*/
|
|
75
|
+
delete(id: Id): void;
|
|
76
|
+
/**
|
|
77
|
+
* Удаляет из коллекции несколько элементов по списку id.
|
|
78
|
+
*
|
|
79
|
+
* @param ids Массив идентификаторов для удаления.
|
|
80
|
+
*/
|
|
81
|
+
deleteMany(ids: Id[]): void;
|
|
82
|
+
/**
|
|
83
|
+
* Полностью очищает коллекцию и сбрасывает служебные состояния выбора.
|
|
84
|
+
*/
|
|
85
|
+
clear(): void;
|
|
86
|
+
private _updatedId;
|
|
87
|
+
get updatedId(): Nullable<Id>;
|
|
88
|
+
set updatedId(value: Nullable<Id>);
|
|
89
|
+
get updatedItem(): T | undefined;
|
|
90
|
+
private _selectedId;
|
|
91
|
+
get selectedId(): Nullable<Id>;
|
|
92
|
+
set selectedId(value: Nullable<Id>);
|
|
93
|
+
get selectedItem(): T | undefined;
|
|
94
|
+
private _deletedId;
|
|
95
|
+
get deletedId(): Nullable<Id>;
|
|
96
|
+
set deletedId(value: Nullable<Id>);
|
|
97
|
+
get deletedItem(): T | undefined;
|
|
98
|
+
}
|
|
99
|
+
//# sourceMappingURL=collection.service.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"collection.service.d.ts","sourceRoot":"","sources":["../../../src/services/collection/collection.service.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,cAAc,EAAE,MAAM,OAAO,CAAC;AAIjD,qBAAa,iBAAiB,CAAC,CAAC,EAAE,EAAE,SAAS,cAAc;IAIvD,OAAO,CAAC,QAAQ,CAAC,KAAK;IAHxB,OAAO,CAAC,MAAM,CAAuC;gBAGlC,KAAK,EAAE;QACtB,KAAK,EAAE,CAAC,IAAI,EAAE,CAAC,KAAK,EAAE,CAAC;KACxB;IAKH;;OAEG;IACI,WAAW,CAAC,IAAI,EAAE,CAAC;IAI1B;;OAEG;IACH,IAAW,KAAK,oDAEf;IAED;;OAEG;IACH,IAAW,IAAI,QAEd;IAED;;;;;;;;OAQG;IACI,SAAS,CAAC,CAAC,SAAS,MAAM,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,CAAC;IAIvD;;;;;;;;OAQG;IACI,SAAS,CAAC,CAAC,SAAS,MAAM,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,MAAM,EAAE,SAAS,CAAC,CAAC,CAAC,CAAC,EAAE;IAMnE;;;;;;;;;OASG;IACI,YAAY,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC,CAAC;IAQxC;;;;;OAKG;IACI,OAAO,CAAC,EAAE,EAAE,EAAE;IAMrB;;;;OAIG;IACI,GAAG,CAAC,IAAI,EAAE,CAAC;IAIlB;;;;OAIG;IACI,OAAO,CAAC,KAAK,EAAE,CAAC,EAAE;IAMzB;;;;OAIG;IACI,MAAM,CAAC,EAAE,EAAE,EAAE;IAIpB;;;;OAIG;IACI,UAAU,CAAC,GAAG,EAAE,EAAE,EAAE;IAM3B;;OAEG;IACI,KAAK;IAQZ,OAAO,CAAC,UAAU,CAAsB;IACxC,IAAW,SAAS,iBAEnB;IACD,IAAW,SAAS,CAAC,KAAK,cAAA,EAEzB;IACD,IAAW,WAAW,kBAMrB;IAED,OAAO,CAAC,WAAW,CAAsB;IACzC,IAAW,UAAU,iBAEpB;IACD,IAAW,UAAU,CAAC,KAAK,cAAA,EAE1B;IACD,IAAW,YAAY,kBAMtB;IAED,OAAO,CAAC,UAAU,CAAsB;IACxC,IAAW,SAAS,iBAEnB;IACD,IAAW,SAAS,CAAC,KAAK,cAAA,EAEzB;IACD,IAAW,WAAW,kBAMrB;CACF"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{observable as e,makeAutoObservable as t}from"../../node_modules/mobx/dist/mobx.esm.esm.js";class d{props;_items=e.map();constructor(e){this.props=e,t(this)}getIdByItem(e){return this.props.getId(e)}get items(){return this._items}get list(){return Array.from(this.items.values())}findAllBy(e,t){return this.list.filter(d=>d[e]===t)}findAllIn(e,t){const d=new Set(t);return this.list.filter(t=>d.has(t[e]))}findAllWhere(e){const t=Object.entries(e);return this.list.filter(e=>t.every(([t,d])=>e[t]===d))}getById(e){return this.items.get(e)}add(e){this._items.set(this.props.getId(e),e)}addMany(e){e.forEach(e=>{this.add(e)})}delete(e){this._items.delete(e)}deleteMany(e){e.forEach(e=>{this.delete(e)})}clear(){this._items.clear(),this.updatedId=null,this.selectedId=null,this.deletedId=null}_updatedId=null;get updatedId(){return this._updatedId}set updatedId(e){this._updatedId=e}get updatedItem(){if(null!=this.updatedId){return this.getById(this.updatedId)}}_selectedId=null;get selectedId(){return this._selectedId}set selectedId(e){this._selectedId=e}get selectedItem(){if(null!=this.selectedId){return this.getById(this.selectedId)}}_deletedId=null;get deletedId(){return this._deletedId}set deletedId(e){this._deletedId=e}get deletedItem(){if(null!=this.deletedId){return this.getById(this.deletedId)}}}export{d as CollectionService};
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
export * from './collection';
|
|
1
|
+
export * from './collection.service';
|
|
2
2
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/services/collection/index.ts"],"names":[],"mappings":"AAAA,cAAc,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/services/collection/index.ts"],"names":[],"mappings":"AAAA,cAAc,sBAAsB,CAAC"}
|
|
@@ -0,0 +1,136 @@
|
|
|
1
|
+
import { Coordinate, Nullable, StringOrNumber } from '../../lib';
|
|
2
|
+
export type PointSnapshot = Coordinate;
|
|
3
|
+
export type LineSnapshot = Coordinate[];
|
|
4
|
+
export type PolygonSnapshot = Coordinate[][];
|
|
5
|
+
/**
|
|
6
|
+
* Базовые типы геометрий.
|
|
7
|
+
* Для конкретного экземпляра сервиса выбирается один тип:
|
|
8
|
+
* - PointSnapshot (Coordinate)
|
|
9
|
+
* - LineSnapshot (Coordinate[])
|
|
10
|
+
* - PolygonSnapshot (Coordinate[][])
|
|
11
|
+
*/
|
|
12
|
+
export type GeometrySnapshot = PointSnapshot | LineSnapshot | PolygonSnapshot;
|
|
13
|
+
/**
|
|
14
|
+
* Описание одного изменения геометрии для элемента коллекции.
|
|
15
|
+
*/
|
|
16
|
+
export type GeometryChange<TGeometry extends GeometrySnapshot, Id extends StringOrNumber> = {
|
|
17
|
+
id: Id;
|
|
18
|
+
geometry: TGeometry;
|
|
19
|
+
};
|
|
20
|
+
/**
|
|
21
|
+
* Набор изменений, произошедших в рамках одного шага истории.
|
|
22
|
+
* Например, один drag, который сдвинул несколько примыкающих сегментов.
|
|
23
|
+
*/
|
|
24
|
+
export type GeometryChangeSet<TGeometry extends GeometrySnapshot, Id extends StringOrNumber> = GeometryChange<TGeometry, Id>[];
|
|
25
|
+
/**
|
|
26
|
+
* Состояние history-сервиса: прошлые и текущий шаг.
|
|
27
|
+
*/
|
|
28
|
+
export type GeometryHistoryState<TGeometry extends GeometrySnapshot, Id extends StringOrNumber> = {
|
|
29
|
+
past: readonly GeometryChangeSet<TGeometry, Id>[];
|
|
30
|
+
present: Nullable<GeometryChangeSet<TGeometry, Id>>;
|
|
31
|
+
};
|
|
32
|
+
/**
|
|
33
|
+
* Опции history-сервиса.
|
|
34
|
+
*
|
|
35
|
+
* compare — обязательная стратегия сравнения двух геометрий одного типа.
|
|
36
|
+
*/
|
|
37
|
+
export type GeometryHistoryOptions<TGeometry extends GeometrySnapshot, Id extends StringOrNumber> = {
|
|
38
|
+
compare: (a: TGeometry, b: TGeometry) => boolean;
|
|
39
|
+
onChange?: (state: GeometryHistoryState<TGeometry, Id>) => void;
|
|
40
|
+
};
|
|
41
|
+
/**
|
|
42
|
+
* Готовые компараторы для каждого типа геометрии.
|
|
43
|
+
*/
|
|
44
|
+
export declare const GeometryComparators: {
|
|
45
|
+
point: (a: Coordinate, b: Coordinate) => boolean;
|
|
46
|
+
line: (a: LineSnapshot, b: LineSnapshot) => boolean;
|
|
47
|
+
polygon: (a: PolygonSnapshot, b: PolygonSnapshot) => boolean;
|
|
48
|
+
};
|
|
49
|
+
/**
|
|
50
|
+
* GeometryHistoryService (back-only, single geometry type)
|
|
51
|
+
*/
|
|
52
|
+
export declare class GeometryHistoryService<TGeometry extends GeometrySnapshot, Id extends StringOrNumber> {
|
|
53
|
+
private readonly options;
|
|
54
|
+
/**
|
|
55
|
+
* Прошлые шаги истории.
|
|
56
|
+
*/
|
|
57
|
+
private readonly _past;
|
|
58
|
+
/**
|
|
59
|
+
* Текущий шаг истории.
|
|
60
|
+
*/
|
|
61
|
+
private _present;
|
|
62
|
+
/**
|
|
63
|
+
* Флаг, что текущее состояние истории было инициализировано.
|
|
64
|
+
*/
|
|
65
|
+
private _hasPresent;
|
|
66
|
+
/**
|
|
67
|
+
* Индекс по id для быстрого поиска последнего изменения.
|
|
68
|
+
*/
|
|
69
|
+
private readonly _indexById;
|
|
70
|
+
constructor(options: GeometryHistoryOptions<TGeometry, Id>);
|
|
71
|
+
/**
|
|
72
|
+
* Сравнивает два набора изменений через options.compare.
|
|
73
|
+
* - длина должна совпадать;
|
|
74
|
+
* - для каждой позиции id и geometry должны совпадать.
|
|
75
|
+
*/
|
|
76
|
+
private _isSameChangeSet;
|
|
77
|
+
/**
|
|
78
|
+
* Полностью пересчитывает индекс по id из текущих past и present.
|
|
79
|
+
* Этот метод относительно дорогой (`O(N * K)`), но используется только:
|
|
80
|
+
* - при init;
|
|
81
|
+
* - при clear (через resetIndex);
|
|
82
|
+
* - при undo (редко относительно частоты findLastChangeById).
|
|
83
|
+
*/
|
|
84
|
+
private _rebuildIndex;
|
|
85
|
+
/**
|
|
86
|
+
* Сбрасывает индекс.
|
|
87
|
+
*/
|
|
88
|
+
private _resetIndex;
|
|
89
|
+
get past(): import("mobx").IObservableArray<GeometryChangeSet<TGeometry, Id>>;
|
|
90
|
+
get present(): Nullable<GeometryChangeSet<TGeometry, Id>>;
|
|
91
|
+
get hasPresent(): boolean;
|
|
92
|
+
get canUndo(): boolean;
|
|
93
|
+
get size(): number;
|
|
94
|
+
/**
|
|
95
|
+
* Инициализирует историю стартовым набором изменений.
|
|
96
|
+
* Полностью очищает past, задаёт новый present и пересчитывает индекс.
|
|
97
|
+
*/
|
|
98
|
+
init(value: GeometryChangeSet<TGeometry, Id>): void;
|
|
99
|
+
/**
|
|
100
|
+
* Добавляет новый шаг истории.
|
|
101
|
+
*
|
|
102
|
+
* Поведение:
|
|
103
|
+
* - если история не была инициализирована, value становится текущим шагом;
|
|
104
|
+
* - если новый набор изменений совпадает с текущим, запись не создаётся;
|
|
105
|
+
* - текущий шаг переносится в past;
|
|
106
|
+
* - индекс обновляется минимально.
|
|
107
|
+
*/
|
|
108
|
+
push(value: GeometryChangeSet<TGeometry, Id>): void;
|
|
109
|
+
/**
|
|
110
|
+
* Заменяет текущий шаг без создания новой записи в истории.
|
|
111
|
+
* Подходит для промежуточных изменений во время drag/edit-сессии.
|
|
112
|
+
*/
|
|
113
|
+
replace(value: GeometryChangeSet<TGeometry, Id>): void;
|
|
114
|
+
/**
|
|
115
|
+
* Откатывает историю на предыдущий шаг.
|
|
116
|
+
* Последний past становится present.
|
|
117
|
+
*/
|
|
118
|
+
undo(): Nullable<GeometryChangeSet<TGeometry, Id>>;
|
|
119
|
+
/**
|
|
120
|
+
* Полностью очищает историю.
|
|
121
|
+
*/
|
|
122
|
+
clear(): void;
|
|
123
|
+
/**
|
|
124
|
+
* Возвращает безопасный снимок текущего состояния истории.
|
|
125
|
+
*/
|
|
126
|
+
getState(): {
|
|
127
|
+
past: GeometryChangeSet<TGeometry, Id>[];
|
|
128
|
+
present: Nullable<GeometryChangeSet<TGeometry, Id>>;
|
|
129
|
+
};
|
|
130
|
+
/**
|
|
131
|
+
* Находит последний по времени шаг, в котором изменялась геометрия заданного id.
|
|
132
|
+
*/
|
|
133
|
+
findLastChangeById(id: Id): GeometryChange<TGeometry, Id> | null;
|
|
134
|
+
private emit;
|
|
135
|
+
}
|
|
136
|
+
//# sourceMappingURL=geometry-history.service.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"geometry-history.service.d.ts","sourceRoot":"","sources":["../../../src/services/geometry-history/geometry-history.service.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,QAAQ,EAAE,cAAc,EAAE,MAAM,OAAO,CAAC;AAI7D,MAAM,MAAM,aAAa,GAAG,UAAU,CAAC;AAEvC,MAAM,MAAM,YAAY,GAAG,UAAU,EAAE,CAAC;AAExC,MAAM,MAAM,eAAe,GAAG,UAAU,EAAE,EAAE,CAAC;AAE7C;;;;;;GAMG;AACH,MAAM,MAAM,gBAAgB,GAAG,aAAa,GAAG,YAAY,GAAG,eAAe,CAAC;AAE9E;;GAEG;AACH,MAAM,MAAM,cAAc,CACxB,SAAS,SAAS,gBAAgB,EAClC,EAAE,SAAS,cAAc,IACvB;IACF,EAAE,EAAE,EAAE,CAAC;IACP,QAAQ,EAAE,SAAS,CAAC;CACrB,CAAC;AAEF;;;GAGG;AACH,MAAM,MAAM,iBAAiB,CAC3B,SAAS,SAAS,gBAAgB,EAClC,EAAE,SAAS,cAAc,IACvB,cAAc,CAAC,SAAS,EAAE,EAAE,CAAC,EAAE,CAAC;AAEpC;;GAEG;AACH,MAAM,MAAM,oBAAoB,CAC9B,SAAS,SAAS,gBAAgB,EAClC,EAAE,SAAS,cAAc,IACvB;IACF,IAAI,EAAE,SAAS,iBAAiB,CAAC,SAAS,EAAE,EAAE,CAAC,EAAE,CAAC;IAClD,OAAO,EAAE,QAAQ,CAAC,iBAAiB,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC,CAAC;CACrD,CAAC;AAEF;;;;GAIG;AACH,MAAM,MAAM,sBAAsB,CAChC,SAAS,SAAS,gBAAgB,EAClC,EAAE,SAAS,cAAc,IACvB;IACF,OAAO,EAAE,CAAC,CAAC,EAAE,SAAS,EAAE,CAAC,EAAE,SAAS,KAAK,OAAO,CAAC;IACjD,QAAQ,CAAC,EAAE,CAAC,KAAK,EAAE,oBAAoB,CAAC,SAAS,EAAE,EAAE,CAAC,KAAK,IAAI,CAAC;CACjE,CAAC;AAuBF;;GAEG;AACH,eAAO,MAAM,mBAAmB;eAtBH,UAAU,KAAK,UAAU;cAG/B,YAAY,KAAK,YAAY,KAAG,OAAO;iBAQpC,eAAe,KAAK,eAAe,KAAG,OAAO;CAetE,CAAC;AAcF;;GAEG;AACH,qBAAa,sBAAsB,CACjC,SAAS,SAAS,gBAAgB,EAClC,EAAE,SAAS,cAAc;IAsBb,OAAO,CAAC,QAAQ,CAAC,OAAO;IApBpC;;OAEG;IACH,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAwD;IAE9E;;OAEG;IACH,OAAO,CAAC,QAAQ,CAAoD;IAEpE;;OAEG;IACH,OAAO,CAAC,WAAW,CAAS;IAE5B;;OAEG;IACH,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAwC;gBAEtC,OAAO,EAAE,sBAAsB,CAAC,SAAS,EAAE,EAAE,CAAC;IAM3E;;;;OAIG;IACH,OAAO,CAAC,gBAAgB;IAmBxB;;;;;;OAMG;IACH,OAAO,CAAC,aAAa;IA6BrB;;OAEG;IACH,OAAO,CAAC,WAAW;IAMnB,IAAW,IAAI,sEAEd;IAED,IAAW,OAAO,+CAEjB;IAED,IAAW,UAAU,YAEpB;IAED,IAAW,OAAO,YAEjB;IAED,IAAW,IAAI,WAEd;IAID;;;OAGG;IACI,IAAI,CAAC,KAAK,EAAE,iBAAiB,CAAC,SAAS,EAAE,EAAE,CAAC;IAYnD;;;;;;;;OAQG;IACI,IAAI,CAAC,KAAK,EAAE,iBAAiB,CAAC,SAAS,EAAE,EAAE,CAAC;IA8BnD;;;OAGG;IACI,OAAO,CAAC,KAAK,EAAE,iBAAiB,CAAC,SAAS,EAAE,EAAE,CAAC;IAUtD;;;OAGG;IACI,IAAI;IAgBX;;OAEG;IACI,KAAK;IAYZ;;OAEG;IACI,QAAQ;;;;IAQf;;OAEG;IACI,kBAAkB,CAAC,EAAE,EAAE,EAAE;IA0BhC,OAAO,CAAC,IAAI;CAGb"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{observable as e,makeAutoObservable as t}from"../../node_modules/mobx/dist/mobx.esm.esm.js";const s=(e,t)=>e.lat===t.lat&&e.lon===t.lon,n=(e,t)=>e.length===t.length&&e.every((e,n)=>s(e,t[n])),i={point:s,line:n,polygon:(e,t)=>e.length===t.length&&e.every((e,s)=>n(e,t[s]))};class r{options;_past=e.array();_present=null;_hasPresent=!1;_indexById=e.map();constructor(e){this.options=e,t(this,{},{autoBind:!0})}_isSameChangeSet(e,t){return e.length===t.length&&e.every((e,s)=>{const n=t[s];return e.id===n.id&&this.options.compare(e.geometry,n.geometry)})}_rebuildIndex(){this._indexById.clear(),this._past.forEach((e,t)=>{e.forEach((e,s)=>{this._indexById.set(e.id,{isPresent:!1,stepIndex:t,changeIndex:s,id:e.id})})}),this._present&&this._present.forEach((e,t)=>{this._indexById.set(e.id,{isPresent:!0,stepIndex:-1,changeIndex:t,id:e.id})})}_resetIndex(){this._indexById.clear()}get past(){return this._past}get present(){return this._present}get hasPresent(){return this._hasPresent}get canUndo(){return this._past.length>0}get size(){return this._past.length+(this._hasPresent?1:0)}init(e){this._past.clear(),this._present=e,this._hasPresent=!0,this._rebuildIndex(),this.emit()}push(e){if(!this._hasPresent||null==this._present)return this._present=e,this._hasPresent=!0,this._rebuildIndex(),void this.emit();this._isSameChangeSet(this._present,e)||(this._past.push(this._present),this._present=e,this._rebuildIndex(),this.emit())}replace(e){this._present=e,this._hasPresent=!0,this._rebuildIndex(),this.emit()}undo(){if(!this.canUndo||!this._hasPresent||null==this._present)return this._present;const e=this._past.pop()??null;return this._present=e,this._rebuildIndex(),this.emit(),this._present}clear(){this._past.clear(),this._present=null,this._hasPresent=!1,this._resetIndex(),this.emit()}getState(){return{past:[...this._past],present:this._present}}findLastChangeById(e){const t=this._indexById.get(e);if(!t)return null;if(t.isPresent){const e=this._present;return e?e[t.changeIndex]??null:null}const s=this._past[t.stepIndex];return s?s[t.changeIndex]??null:null}emit(){this.options.onChange?.(this.getState())}}export{i as GeometryComparators,r as GeometryHistoryService};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/services/geometry-history/index.ts"],"names":[],"mappings":"AAAA,cAAc,4BAA4B,CAAC"}
|
package/dist/services/index.d.ts
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/services/index.ts"],"names":[],"mappings":"AAAA,cAAc,OAAO,CAAC;AACtB,cAAc,cAAc,CAAC;AAC7B,cAAc,eAAe,CAAC;AAC9B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,UAAU,CAAC;AACzB,cAAc,OAAO,CAAC;AACtB,cAAc,SAAS,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/services/index.ts"],"names":[],"mappings":"AAAA,cAAc,OAAO,CAAC;AACtB,cAAc,cAAc,CAAC;AAC7B,cAAc,oBAAoB,CAAC;AACnC,cAAc,eAAe,CAAC;AAC9B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,UAAU,CAAC;AACzB,cAAc,OAAO,CAAC;AACtB,cAAc,SAAS,CAAC"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
export * from './map';
|
|
1
|
+
export * from './map.service';
|
|
2
2
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/services/map/index.ts"],"names":[],"mappings":"AAAA,cAAc,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/services/map/index.ts"],"names":[],"mappings":"AAAA,cAAc,eAAe,CAAC"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { DistanceUnit } from './map.types';
|
|
2
|
+
/**
|
|
3
|
+
* Коэффициенты перевода единиц в метры.
|
|
4
|
+
*
|
|
5
|
+
* Значение — сколько метров содержится в одной единице.
|
|
6
|
+
*
|
|
7
|
+
* Основано на стандартных метрических и международных определениях
|
|
8
|
+
* (1 km = 1000 m, 1 mi = 1609.344 m, 1 NM = 1852 m и т.д.). [web:45][web:48][web:54]
|
|
9
|
+
*/
|
|
10
|
+
export declare const DISTANCE_UNIT_FACTORS: Record<DistanceUnit, number>;
|
|
11
|
+
//# sourceMappingURL=map.constants.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"map.constants.d.ts","sourceRoot":"","sources":["../../../src/services/map/map.constants.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAE3C;;;;;;;GAOG;AACH,eAAO,MAAM,qBAAqB,EAAE,MAAM,CAAC,YAAY,EAAE,MAAM,CAK9D,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
const e={meters:1,kilometers:1e3,miles:1609.344,nauticalMiles:1852};export{e as DISTANCE_UNIT_FACTORS};
|
|
@@ -0,0 +1,166 @@
|
|
|
1
|
+
import { Coordinate } from '../../lib';
|
|
2
|
+
import { DistanceUnit } from './map.types';
|
|
3
|
+
import { LatLng } from 'leaflet';
|
|
4
|
+
declare class MapService {
|
|
5
|
+
/**
|
|
6
|
+
* Средний радиус Земли в метрах.
|
|
7
|
+
*/
|
|
8
|
+
readonly EARTH_RADIUS_M = 6371000;
|
|
9
|
+
/**
|
|
10
|
+
* Полный угол окружности в градусах.
|
|
11
|
+
*/
|
|
12
|
+
readonly FULL_CIRCLE_DEGREES = 360;
|
|
13
|
+
/**
|
|
14
|
+
* Половина окружности в градусах.
|
|
15
|
+
*
|
|
16
|
+
* Используется для перевода между градусами и радианами,
|
|
17
|
+
* а также для нормализации долготы.
|
|
18
|
+
*
|
|
19
|
+
* @returns Половина полного угла окружности, то есть `180`.
|
|
20
|
+
*/
|
|
21
|
+
get HALF_CIRCLE_DEGREES(): number;
|
|
22
|
+
/**
|
|
23
|
+
* Коэффициент перевода градусов в радианы.
|
|
24
|
+
*
|
|
25
|
+
* Формула: `Math.PI / 180`.
|
|
26
|
+
*
|
|
27
|
+
* @returns Значение коэффициента перевода градусов в радианы.
|
|
28
|
+
*/
|
|
29
|
+
get DEG_TO_RAD(): number;
|
|
30
|
+
/**
|
|
31
|
+
* Коэффициент перевода радиан в градусы.
|
|
32
|
+
*
|
|
33
|
+
* Формула: `180 / Math.PI`.
|
|
34
|
+
*
|
|
35
|
+
* @returns Значение коэффициента перевода радиан в градусы.
|
|
36
|
+
*/
|
|
37
|
+
get RAD_TO_DEG(): number;
|
|
38
|
+
constructor();
|
|
39
|
+
/**
|
|
40
|
+
* Преобразует объект Leaflet `LatLng` в внутренний формат координат `Coordinate`.
|
|
41
|
+
*
|
|
42
|
+
* @param latLng - Координаты в формате Leaflet.
|
|
43
|
+
* @returns Координаты в формате `{ lat, lon }`.
|
|
44
|
+
*/
|
|
45
|
+
getCoordinateByLatLng(latLng: LatLng): Coordinate;
|
|
46
|
+
/**
|
|
47
|
+
* Преобразует внутренний формат `Coordinate` в объект Leaflet `LatLng`.
|
|
48
|
+
*
|
|
49
|
+
* @param coordinate - Координаты в формате `{ lat, lon }`.
|
|
50
|
+
* @returns Экземпляр `LatLng` для использования в Leaflet.
|
|
51
|
+
*/
|
|
52
|
+
getLatLngByCoordinate(coordinate: Coordinate): LatLng;
|
|
53
|
+
/**
|
|
54
|
+
* Нормализует азимут в диапазон от `0` до `360` градусов, не включая `360`.
|
|
55
|
+
*
|
|
56
|
+
* Полезно для приведения отрицательных или выходящих за пределы окружности
|
|
57
|
+
* значений к стандартному диапазону.
|
|
58
|
+
*
|
|
59
|
+
* @param bearing - Азимут в градусах.
|
|
60
|
+
* @returns Нормализованный азимут в диапазоне `[0, 360)`.
|
|
61
|
+
*
|
|
62
|
+
* @example
|
|
63
|
+
* mapService.normalizeBearing(-90); // 270
|
|
64
|
+
* mapService.normalizeBearing(450); // 90
|
|
65
|
+
*/
|
|
66
|
+
normalizeBearing(bearing: number): number;
|
|
67
|
+
/**
|
|
68
|
+
* Нормализует долготу в диапазон от `-180` до `180` градусов.
|
|
69
|
+
*
|
|
70
|
+
* @param lon - Долгота в градусах.
|
|
71
|
+
* @returns Нормализованная долгота в диапазоне `[-180, 180)`.
|
|
72
|
+
*
|
|
73
|
+
* @example
|
|
74
|
+
* mapService.normalizeLongitude(190); // -170
|
|
75
|
+
* mapService.normalizeLongitude(-190); // 170
|
|
76
|
+
*/
|
|
77
|
+
normalizeLongitude(lon: number): number;
|
|
78
|
+
/**
|
|
79
|
+
* Вычисляет координату точки назначения по исходной точке,
|
|
80
|
+
* расстоянию и азимуту.
|
|
81
|
+
*
|
|
82
|
+
* Расстояние можно задавать в произвольной поддерживаемой единице
|
|
83
|
+
* (по умолчанию метры) — перед вычислениями оно будет переведено в метры.
|
|
84
|
+
*
|
|
85
|
+
* @param params - Параметры расчёта.
|
|
86
|
+
* @param params.coordinate - Исходная координата.
|
|
87
|
+
* @param params.distance - Расстояние до точки назначения в заданной единице.
|
|
88
|
+
* @param params.azimuth - Азимут движения в градусах.
|
|
89
|
+
* @param params.unit - Единица, в которой задано расстояние (по умолчанию метры).
|
|
90
|
+
* @returns Координата точки назначения в формате `{ lat, lon }`.
|
|
91
|
+
*/
|
|
92
|
+
calculateDestination: ({ coordinate, distance, azimuth, unit, }: {
|
|
93
|
+
coordinate: Coordinate;
|
|
94
|
+
distance: number;
|
|
95
|
+
azimuth: number;
|
|
96
|
+
unit?: DistanceUnit;
|
|
97
|
+
}) => {
|
|
98
|
+
lat: number;
|
|
99
|
+
lon: number;
|
|
100
|
+
};
|
|
101
|
+
/**
|
|
102
|
+
* Вычисляет расстояние между двумя географическими точками
|
|
103
|
+
* по формуле гаверсинуса.
|
|
104
|
+
*
|
|
105
|
+
* По умолчанию возвращает значение в метрах, но можно запросить
|
|
106
|
+
* километры, мили или морские мили.
|
|
107
|
+
*
|
|
108
|
+
* @param a - Первая координата.
|
|
109
|
+
* @param b - Вторая координата.
|
|
110
|
+
* @param unit - Единица измерения результата (по умолчанию метры).
|
|
111
|
+
* @returns Расстояние между точками в выбранной единице.
|
|
112
|
+
*/
|
|
113
|
+
haversineDistance(a: Coordinate, b: Coordinate, unit?: DistanceUnit): number;
|
|
114
|
+
/**
|
|
115
|
+
* Вычисляет начальный азимут из точки `a` в точку `b`.
|
|
116
|
+
*
|
|
117
|
+
* Возвращаемое значение — это направление движения в градусах
|
|
118
|
+
* относительно севера по часовой стрелке, нормализованное в диапазон `[0, 360)`.
|
|
119
|
+
*
|
|
120
|
+
* @param a - Начальная координата.
|
|
121
|
+
* @param b - Конечная координата.
|
|
122
|
+
* @returns Начальный азимут в градусах.
|
|
123
|
+
*/
|
|
124
|
+
initialBearing(a: Coordinate, b: Coordinate): number;
|
|
125
|
+
/**
|
|
126
|
+
* Переводит расстояние в метрах в заданную единицу измерения.
|
|
127
|
+
*
|
|
128
|
+
* @param distanceInMeters - Расстояние в метрах.
|
|
129
|
+
* @param unit - Желаемая единица измерения (по умолчанию метры).
|
|
130
|
+
* @returns Расстояние в выбранной единице.
|
|
131
|
+
*/
|
|
132
|
+
convertDistance(distanceInMeters: number, unit?: DistanceUnit): number;
|
|
133
|
+
/**
|
|
134
|
+
* Переводит расстояние из заданной единицы измерения в метры.
|
|
135
|
+
*
|
|
136
|
+
* @param distance - Расстояние в выбранной единице измерения.
|
|
137
|
+
* @param unit - Единица, в которой передано расстояние.
|
|
138
|
+
* @returns Расстояние в метрах.
|
|
139
|
+
*/
|
|
140
|
+
private distanceToMeters;
|
|
141
|
+
/**
|
|
142
|
+
* Вычисляет общую длину ломаной линии (полилинии) по массиву координат.
|
|
143
|
+
*
|
|
144
|
+
* Суммирует расстояния между последовательными точками.
|
|
145
|
+
* По умолчанию возвращает метры, но можно указать другую единицу.
|
|
146
|
+
*
|
|
147
|
+
* @param coordinates - Массив координат, образующих ломаную линию.
|
|
148
|
+
* @param unit - Единица измерения результата (по умолчанию метры).
|
|
149
|
+
* @returns Общая длина полилинии в выбранной единице.
|
|
150
|
+
*/
|
|
151
|
+
getPolylineLength(coordinates: Coordinate[], unit?: DistanceUnit): number;
|
|
152
|
+
}
|
|
153
|
+
/**
|
|
154
|
+
* Сервис для работы с географическими координатами и базовыми
|
|
155
|
+
* геодезическими вычислениями на сфере Земли.
|
|
156
|
+
*
|
|
157
|
+
* Предоставляет методы для:
|
|
158
|
+
* - преобразования между `Coordinate` и `LatLng`;
|
|
159
|
+
* - нормализации азимута и долготы;
|
|
160
|
+
* - вычисления точки назначения по расстоянию и азимуту;
|
|
161
|
+
* - расчета расстояния между двумя точками по формуле гаверсинуса;
|
|
162
|
+
* - расчета начального азимута между двумя координатами.
|
|
163
|
+
*/
|
|
164
|
+
export declare const mapService: MapService;
|
|
165
|
+
export {};
|
|
166
|
+
//# sourceMappingURL=map.service.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"map.service.d.ts","sourceRoot":"","sources":["../../../src/services/map/map.service.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,OAAO,CAAC;AAGnC,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAE3C,OAAO,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AAEjC,cAAM,UAAU;IACd;;OAEG;IACH,SAAgB,cAAc,WAAa;IAE3C;;OAEG;IACH,SAAgB,mBAAmB,OAAO;IAE1C;;;;;;;OAOG;IACH,IAAW,mBAAmB,WAE7B;IAED;;;;;;OAMG;IACH,IAAW,UAAU,WAEpB;IAED;;;;;;OAMG;IACH,IAAW,UAAU,WAEpB;;IAID;;;;;OAKG;IACI,qBAAqB,CAAC,MAAM,EAAE,MAAM;IAW3C;;;;;OAKG;IACI,qBAAqB,CAAC,UAAU,EAAE,UAAU;IAQnD;;;;;;;;;;;;OAYG;IACI,gBAAgB,CAAC,OAAO,EAAE,MAAM;IAOvC;;;;;;;;;OASG;IACI,kBAAkB,CAAC,GAAG,EAAE,MAAM;IAQrC;;;;;;;;;;;;;OAaG;IACI,oBAAoB,GAAI,0CAK5B;QACD,UAAU,EAAE,UAAU,CAAC;QACvB,QAAQ,EAAE,MAAM,CAAC;QACjB,OAAO,EAAE,MAAM,CAAC;QAChB,IAAI,CAAC,EAAE,YAAY,CAAC;KACrB;;;MAwBC;IAEF;;;;;;;;;;;OAWG;IACI,iBAAiB,CACtB,CAAC,EAAE,UAAU,EACb,CAAC,EAAE,UAAU,EACb,IAAI,GAAE,YAAuB;IAkB/B;;;;;;;;;OASG;IACI,cAAc,CAAC,CAAC,EAAE,UAAU,EAAE,CAAC,EAAE,UAAU;IAkBlD;;;;;;OAMG;IACI,eAAe,CACpB,gBAAgB,EAAE,MAAM,EACxB,IAAI,GAAE,YAAuB;IAO/B;;;;;;OAMG;IACH,OAAO,CAAC,gBAAgB;IAMxB;;;;;;;;;OASG;IACI,iBAAiB,CACtB,WAAW,EAAE,UAAU,EAAE,EACzB,IAAI,GAAE,YAAuB;CAqBhC;AAED;;;;;;;;;;GAUG;AACH,eAAO,MAAM,UAAU,YAAmB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{DISTANCE_UNIT_FACTORS as t}from"./map.constants.esm.js";import{a as s}from"../../_virtual/leaflet-src.esm.js";const n=new class{EARTH_RADIUS_M=6371e3;FULL_CIRCLE_DEGREES=360;get HALF_CIRCLE_DEGREES(){return this.FULL_CIRCLE_DEGREES/2}get DEG_TO_RAD(){return Math.PI/this.HALF_CIRCLE_DEGREES}get RAD_TO_DEG(){return this.HALF_CIRCLE_DEGREES/Math.PI}constructor(){}getCoordinateByLatLng(t){const{lat:s,lng:n}=t;return{lat:s,lon:n}}getLatLngByCoordinate(t){const{lat:n,lon:a}=t;return new s.LatLng(n,a)}normalizeBearing(t){return(t%this.FULL_CIRCLE_DEGREES+this.FULL_CIRCLE_DEGREES)%this.FULL_CIRCLE_DEGREES}normalizeLongitude(t){return(t+this.FULL_CIRCLE_DEGREES+this.HALF_CIRCLE_DEGREES)%this.FULL_CIRCLE_DEGREES-this.HALF_CIRCLE_DEGREES}calculateDestination=({coordinate:t,distance:s,azimuth:n,unit:a="meters"})=>{const e=t.lat*this.DEG_TO_RAD,i=t.lon*this.DEG_TO_RAD,r=this.normalizeBearing(n)*this.DEG_TO_RAD,E=this.distanceToMeters(s,a)/this.EARTH_RADIUS_M,h=Math.sin(e),_=Math.cos(e),o=Math.sin(E),D=Math.cos(E),R=Math.sin(r),L=Math.cos(r),c=Math.asin(h*D+_*o*L),l=i+Math.atan2(R*o*_,D-h*Math.sin(c));return{lat:c*this.RAD_TO_DEG,lon:this.normalizeLongitude(l*this.RAD_TO_DEG)}};haversineDistance(t,s,n="meters"){const a=t.lat*this.DEG_TO_RAD,e=s.lat*this.DEG_TO_RAD,i=(s.lat-t.lat)*this.DEG_TO_RAD,r=(s.lon-t.lon)*this.DEG_TO_RAD,E=Math.sin(i/2)**2+Math.cos(a)*Math.cos(e)*Math.sin(r/2)**2,h=2*Math.atan2(Math.sqrt(E),Math.sqrt(1-E)),_=this.EARTH_RADIUS_M*h;return this.convertDistance(_,n)}initialBearing(t,s){const n=t.lat*this.DEG_TO_RAD,a=s.lat*this.DEG_TO_RAD,e=t.lon*this.DEG_TO_RAD,i=s.lon*this.DEG_TO_RAD,r=Math.sin(i-e)*Math.cos(a),E=Math.cos(n)*Math.sin(a)-Math.sin(n)*Math.cos(a)*Math.cos(i-e);return this.normalizeBearing(Math.atan2(r,E)*this.RAD_TO_DEG)}convertDistance(s,n="meters"){return s/t[n]}distanceToMeters(s,n="meters"){return s*t[n]}getPolylineLength(t,s="meters"){const n=t.reduce((t,s,n,a)=>{const e=a[n+1];if(!e)return t;return t+this.haversineDistance(s,e,"meters")},0);return this.convertDistance(n,s)}};export{n as mapService};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"map.types.d.ts","sourceRoot":"","sources":["../../../src/services/map/map.types.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,MAAM,MAAM,YAAY,GAAG,QAAQ,GAAG,YAAY,GAAG,OAAO,GAAG,eAAe,CAAC"}
|