Skip to content

Commit

Permalink
Revert to v1.0.0 (#37)
Browse files Browse the repository at this point in the history
* Revert to v1.0.0

* Change version to 3.0.0
  • Loading branch information
Trufi authored Feb 12, 2020
1 parent 1e7465a commit db5dbac
Show file tree
Hide file tree
Showing 13 changed files with 73 additions and 725 deletions.
9 changes: 0 additions & 9 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -106,15 +106,6 @@ general.generalize(bounds, groups, atlas, markers);
Каждый `Marker` состоит из:
- `pixelPosition` – позиция маркера в пикселях, должна вычисляться вне алгоритма генерализации и находиться в той же системе координат, что и `bounds` переданные в метод `generalize`
- `groupIndex` – индекс в массиве групп, к которой маркер будет изначально принадлежать
- `priority?: boolean` — опциональный флаг, позволяющий поднять приоритет маркера над другими. Приоритетные маркеры генерализуются раньше остальных, даже если расположены после них в исходном массиве.
- `htmlLabel?: Label` — опциональная подпись маркера. Подписи генерализуются аналогично маркерам. У подписей при генерализации меньший приоритет, чем у маркеров. Другими словами, сначала генерализуются все маркеры, а затем все подписи.

`Label` описывается следующим образом:
- `offset: Vec2` - отступ в пикселях вправо и вниз от маркера
- `width: number` - ширина в пикселях
- `height: number` - высота в пикселях
- `display: boolean` - флаг, означающий, нужно ли отображать подпись. Выставляется в процессе генерализации.
- `minZoom: number` — минимальный зум, на котором можно отображать подпись без пересечения с другими подписями. Выставляется в процессе генерализации.

Метод `generalize` **не возвращает** новый массив маркеров, он мутирует старый.

Expand Down
9 changes: 1 addition & 8 deletions demo/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -64,13 +64,6 @@ Promise.all([loadAtlas(), loadMarkersData()])
iconIndex: -1,
data: markerData,
pixelPosition: [pixelPosition[0] * retinaFactor, pixelPosition[1] * retinaFactor],
htmlLabel: {
offset: [20, -10],
width: 180,
height: 80,
display: false,
minZoom: -Infinity,
},
};
markers.push(marker);
}
Expand Down Expand Up @@ -151,7 +144,7 @@ Promise.all([loadAtlas(), loadMarkersData()])
}));

console.time('gen');
general.generalize(bounds, priorityGroups, atlas.sprites, markers, zoom).then(() => {
general.generalize(bounds, priorityGroups, atlas.sprites, markers).then(() => {
console.timeEnd('gen');
generalizationIsBusy = false;

Expand Down
2 changes: 1 addition & 1 deletion package-lock.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 1 addition & 1 deletion package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "@2gis/general",
"version": "2.1.0",
"version": "3.0.0",
"description": "Fast marker generalization algorithm",
"contributors": [
{
Expand Down
45 changes: 12 additions & 33 deletions src/General.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,4 @@
import * as markerArray from './markerArray';
import * as labelArray from './labelArray';
import { stride, pack, unpack } from './markerArray';
import {
BBox,
PriorityGroup,
Expand All @@ -16,29 +15,21 @@ export class General {
private queue: Job[];
private currentJob: Job | undefined;
private markerArray: Float32Array;
private labelArray: Float32Array;

constructor() {
this.worker = work(require.resolve('./worker'));
this.queue = [];
this.currentJob = undefined;
this.markerArray = new Float32Array(1000 * markerArray.stride);
this.labelArray = new Float32Array(1000 * labelArray.stride);
this.markerArray = new Float32Array(1000 * stride);

this.worker.onmessage = (event) => {
if (this.currentJob === undefined) {
return;
}

const { markers, resolve } = this.currentJob;
const { data } = event;

markerArray.unpack(markers, data.markerArray);
labelArray.unpack(markers, data.labelArray);

this.markerArray = data.markerArray;
this.labelArray = data.labelArray;

unpack(markers, event.data);
this.markerArray = event.data;
this.currentJob = undefined;

this.dequeue();
Expand All @@ -51,20 +42,15 @@ export class General {
priorityGroups: PriorityGroup[],
sprites: Sprite[],
markers: Marker[],
currentZoom: number,
): Promise<void> {
const message: JobMessage = {
bounds,
priorityGroups,
sprites,
currentZoom,
};

const markerCount = markers.length;
const labelCount = markers.filter((marker) => marker.htmlLabel !== undefined).length;

return new Promise((resolve) => {
this.queue.push({ message, markers, resolve, markerCount, labelCount });
this.queue.push({ message, markers, resolve });
this.dequeue();
});
}
Expand All @@ -73,17 +59,12 @@ export class General {
this.queue = [];
}

private pack(markers: Marker[], markerCount: number, labelCount: number): void {
if (markerCount * markerArray.stride > this.markerArray.length) {
this.markerArray = new Float32Array(markerCount * markerArray.stride);
}

if (labelCount * labelArray.stride > this.labelArray.length) {
this.labelArray = new Float32Array(labelCount * labelArray.stride);
private pack(markers: Marker[]) {
if (markers.length * stride > this.markerArray.length) {
this.markerArray = new Float32Array(markers.length * stride);
}

markerArray.pack(this.markerArray, markers);
labelArray.pack(this.labelArray, markers, window.devicePixelRatio);
pack(this.markerArray, markers);
}

private dequeue() {
Expand All @@ -97,15 +78,13 @@ export class General {
return;
}

this.pack(job.markers, job.markerCount, job.labelCount);
this.pack(job.markers);

const message = job.message as WorkerMessage;
message.markers = this.markerArray;
message.markerCount = job.markerCount;
message.labels = this.labelArray;
message.labelCount = job.labelCount;
message.markerCount = job.markers.length;

this.worker.postMessage(message, [message.markers.buffer, message.labels.buffer]);
this.worker.postMessage(message, [message.markers.buffer]);

this.currentJob = job;
}
Expand Down
59 changes: 0 additions & 59 deletions src/labelArray.ts

This file was deleted.

11 changes: 4 additions & 7 deletions src/markerArray.ts
Original file line number Diff line number Diff line change
@@ -1,13 +1,11 @@
import { Marker } from './types';

// Оффсеты должны быть пронумерованы по порядку
let i = 0;
export const offsets = {
pixelPositionX: i++,
pixelPositionY: i++,
groupIndex: i++,
iconIndex: i++,
priority: i++,
pixelPositionX: 0,
pixelPositionY: 1,
groupIndex: 2,
iconIndex: 3,
};

export const stride = Object.keys(offsets).length;
Expand All @@ -23,7 +21,6 @@ export function pack(markerArray: Float32Array, markers: Marker[]) {
markerArray[markerOffset + offsets.pixelPositionY] = marker.pixelPosition[1];
markerArray[markerOffset + offsets.groupIndex] = marker.groupIndex;
markerArray[markerOffset + offsets.iconIndex] = marker.iconIndex;
markerArray[markerOffset + offsets.priority] = Boolean(marker.priority) ? 1 : 0;
}
}

Expand Down
24 changes: 0 additions & 24 deletions src/types.ts
Original file line number Diff line number Diff line change
Expand Up @@ -14,18 +14,6 @@ export interface Marker {
groupIndex: number;
/** Индекс спрайта в атласе, добавляется в ходе генерализации */
iconIndex: number;
/** Опциональный флаг, указывающий приоритетность маркера */
priority?: boolean;
/** Подпись маркера */
htmlLabel?: Label;
}

export interface Label {
offset: Vec2;
width: number;
height: number;
display: boolean;
minZoom: number;
}

export interface PriorityGroup {
Expand All @@ -46,17 +34,10 @@ export interface BBox {
maxY: number;
}

export type LabelBBox = BBox & {
anchorX: number;
anchorY: number;
minZoom: number;
};

export interface JobMessage {
bounds: BBox;
priorityGroups: PriorityGroup[];
sprites: Sprite[];
currentZoom: number;
}

export interface WorkerMessage {
Expand All @@ -65,15 +46,10 @@ export interface WorkerMessage {
sprites: Sprite[];
markerCount: number;
markers: Float32Array;
labelCount: number;
labels: Float32Array;
currentZoom: number;
}

export interface Job {
message: JobMessage;
markers: Marker[];
markerCount: number;
labelCount: number;
resolve: () => void;
}
Loading

0 comments on commit db5dbac

Please sign in to comment.