feature/dual-rendering #12

병합
htlee feature/dual-rendering 에서 develop 로 21 commits 를 머지했습니다 2026-02-16 16:26:11 +09:00
Showing only changes of commit 7bec1ae86d - Show all commits

파일 보기

@ -12,6 +12,33 @@ import type { BaseMapId, MapProjectionId } from '../types';
import { kickRepaint, onMapStyleReady } from '../lib/mapCore'; import { kickRepaint, onMapStyleReady } from '../lib/mapCore';
import { guardedSetVisibility } from '../lib/layerHelpers'; import { guardedSetVisibility } from '../lib/layerHelpers';
/** Globe tessellation vertex 65535 .
* ( 2100+ vertex) globe에서 70,000+
* ring당 maxPts개로 . centroid에는 . */
function simplifyZonesForGlobe(zones: ZonesGeoJson): ZonesGeoJson {
const MAX_PTS = 60;
const subsample = (ring: GeoJSON.Position[]): GeoJSON.Position[] => {
if (ring.length <= MAX_PTS) return ring;
const step = Math.ceil(ring.length / MAX_PTS);
const out: GeoJSON.Position[] = [ring[0]];
for (let i = step; i < ring.length - 1; i += step) out.push(ring[i]);
out.push(ring[0]); // close ring
return out;
};
return {
...zones,
features: zones.features.map((f) => ({
...f,
geometry: {
...f.geometry,
coordinates: f.geometry.coordinates.map((polygon) =>
polygon.map((ring) => subsample(ring)),
),
},
})),
};
}
export function useZonesLayer( export function useZonesLayer(
mapRef: MutableRefObject<maplibregl.Map | null>, mapRef: MutableRefObject<maplibregl.Map | null>,
projectionBusyRef: MutableRefObject<boolean>, projectionBusyRef: MutableRefObject<boolean>,
@ -61,11 +88,13 @@ export function useZonesLayer(
if (!map.isStyleLoaded()) return; if (!map.isStyleLoaded()) return;
try { try {
// globe: 서브샘플링된 데이터로 vertex 폭증 방지, mercator: 원본 데이터
const sourceData = projection === 'globe' ? simplifyZonesForGlobe(zones) : zones;
const existing = map.getSource(srcId) as GeoJSONSource | undefined; const existing = map.getSource(srcId) as GeoJSONSource | undefined;
if (existing) { if (existing) {
existing.setData(zones); existing.setData(sourceData);
} else { } else {
map.addSource(srcId, { type: 'geojson', data: zones } as GeoJSONSourceSpecification); map.addSource(srcId, { type: 'geojson', data: sourceData } as GeoJSONSourceSpecification);
} }
const style = map.getStyle(); const style = map.getStyle();