UNPKG

@r2don/react-naver-map

Version:

## Introduction

2 lines (1 loc) 7.69 kB
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});class b{constructor(e){this._clusterCenter=null,this._clusterBounds=null,this._clusterMarker=null,this._relation=null,this._clusterMember=[],this._markerClusterer=null,this._clusterCenter=null,this._clusterBounds=null,this._clusterMarker=null,this._relation=null,this._clusterMember=[],this._markerClusterer=e}addMarker(e){if(!this._isMember(e)){if(!this._clusterCenter){const t=e.getPosition();this._clusterCenter=t;const s=this._calcBounds(t);s&&(this._clusterBounds=s)}this._clusterMember.push(e)}}destroy(){var t;this._relation&&naver.maps.Event.removeListener(this._relation);const e=this._clusterMember;for(let s=0;s<e.length;s++)e[s].setMap(null);(t=this._clusterMarker)==null||t.setMap(null),this._clusterMarker=null,this._clusterCenter=null,this._clusterBounds=null,this._relation=null,this._clusterMember=[]}getCenter(){return this._clusterCenter}getBounds(){return this._clusterBounds}getCount(){return this._clusterMember.length}getClusterMember(){return this._clusterMember}isInBounds(e){return this._clusterBounds&&this._clusterBounds.hasLatLng(e)}enableClickZoom(){var t;if(this._relation)return;const e=(t=this._markerClusterer)==null?void 0:t.getMap();this._relation=naver.maps.Event.addListener(this._clusterMarker,"click",function(s){!e||e.morph(s.coord,e.getZoom()+1)}.bind(this))}disableClickZoom(){!this._relation||(naver.maps.Event.removeListener(this._relation),this._relation=null)}updateCluster(){var e,t,s;if(!this._clusterMarker){let r;(e=this._markerClusterer)!=null&&e.getAverageCenter()?r=this._calcAverageCenter(this._clusterMember):r=this._clusterCenter;const n=(t=this._markerClusterer)==null?void 0:t.getMap();if(!r||!n)return;this._clusterMarker=new naver.maps.Marker({position:r,map:n}),(s=this._markerClusterer)!=null&&s.getDisableClickZoom()||this.enableClickZoom()}this.updateIcon(),this.updateCount(),this.checkByZoomAndMinClusterSize()}checkByZoomAndMinClusterSize(){var n;const e=this._markerClusterer;if(!e)return;const t=e.getMinClusterSize(),s=e.getMaxZoom(),r=(n=e.getMap())==null?void 0:n.getZoom();!r||(this.getCount()<t?this._showMember():(this._hideMember(),s<=r&&this._showMember()))}updateCount(){if(!this._markerClusterer||!this._clusterMarker)return;const e=this._markerClusterer.getStylingFunction();e&&e(this._clusterMarker,this.getCount())}updateIcon(){var r,n;const e=this.getCount();let t=this._getIndex(e);const s=(r=this._markerClusterer)==null?void 0:r.getIcons();!s||(t=Math.max(t!=null?t:0,0),t=Math.min(t,s.length-1),(n=this._clusterMarker)==null||n.setIcon(s[t]))}_showMember(){var r;const e=(r=this._markerClusterer)==null?void 0:r.getMap(),t=this._clusterMarker,s=this._clusterMember;!e||(s.forEach(n=>{n.setMap(e)}),t&&t.setMap(null))}_hideMember(){var r;const e=(r=this._markerClusterer)==null?void 0:r.getMap(),t=this._clusterMarker,s=this._clusterMember;!e||(s.forEach(n=>{n.setMap(null)}),t&&!t.getMap()&&t.setMap(e))}_calcBounds(e){var c,h,m;const t=(c=this._markerClusterer)==null?void 0:c.getMap();if(!t)return;const s=new naver.maps.LatLngBounds(e.clone(),e.clone()),r=t.getBounds(),n=t.getProjection(),i=n.fromCoordToOffset(r.getNE()),o=n.fromCoordToOffset(r.getSW()),a=n.fromCoordToOffset(s.getNE()),u=n.fromCoordToOffset(s.getSW());if(!((h=this._markerClusterer)!=null&&h.getGridSize()))return;const l=((m=this._markerClusterer)==null?void 0:m.getGridSize())/2;a.add(l,-l),u.add(-l,l);const d=Math.min(i.x,a.x),p=Math.max(i.y,a.y),C=Math.max(o.x,u.x),f=Math.min(o.y,u.y),M=n.fromOffsetToCoord(new naver.maps.Point(d,p)),k=n.fromOffsetToCoord(new naver.maps.Point(C,f));return new naver.maps.LatLngBounds(k,M)}_getIndex(e){var s;const t=(s=this._markerClusterer)==null?void 0:s.getIndexGenerator();if(typeof t=="function")return t(e);if(Array.isArray(t)){let r=0;for(let n=r;n<t.length;n++){const i=t[n];if(e<i)break;r++}return r}}_isMember(e){return this._clusterMember.indexOf(e)!==-1}_calcAverageCenter(e){const t=e.length,s=[0,0];for(let r=0;r<t;r++){const{x:n,y:i}=e[r].getPosition();s[0]+=n,s[1]+=i}return s[0]/=t,s[1]/=t,new naver.maps.Point(s[0],s[1])}}const _={map:null,markers:[],disableClickZoom:!0,minClusterSize:2,maxZoom:13,gridSize:100,icons:[],indexGenerator:[10,100,200,500,1e3],averageCenter:!1,stylingFunction(){}};class x extends naver.maps.OverlayView{constructor(e){super(),this._clusters=[],this._mapRelations=null,this._markerRelations=[],this._geoTree=null,this._clusters=[],this._mapRelations=null,this._markerRelations=[],this.setOptions({..._,...e})}onAdd(){var t;const e=this.getMap();this._mapRelations=naver.maps.Event.addListener(e,"idle",this._onIdle.bind(this)),((t=this.getMarkers())==null?void 0:t.length)>0&&(this._createClusters(),this._updateClusters())}onRemove(){this._mapRelations&&naver.maps.Event.removeListener(this._mapRelations),this._clearClusters(),this._geoTree=null,this._mapRelations=null}setOptions(e){Object.entries(e).forEach(([t,s])=>{t==="map"?this.setMap(s):this.set(t,s)})}getOptions(e){const t={};return e!==void 0?this.get(e):(Object.keys(_).forEach(s=>{t[s]=this.get(s)}),t)}getMinClusterSize(){return this.getOptions("minClusterSize")}setMinClusterSize(e){this.setOptions({minClusterSize:e})}getMaxZoom(){return this.getOptions("maxZoom")}setMaxZoom(e){this.setOptions({maxZoom:e})}getGridSize(){return this.getOptions("gridSize")}setGridSize(e){this.setOptions({gridSize:e})}getIndexGenerator(){return this.getOptions("indexGenerator")}setIndexGenerator(e){this.setOptions({indexGenerator:e})}getMarkers(){return this.getOptions("markers")}setMarkers(e){this.setOptions({markers:e})}getIcons(){return this.getOptions("icons")}setIcons(e){this.setOptions({icons:e})}getStylingFunction(){return this.getOptions("stylingFunction")}setStylingFunction(e){this.setOptions({stylingFunction:e})}getDisableClickZoom(){return this.getOptions("disableClickZoom")}setDisableClickZoom(e){this.setOptions({disableClickZoom:e})}getAverageCenter(){return this.getOptions("averageCenter")}draw(){}setAverageCenter(e){this.setOptions({averageCenter:e})}changed(e,t){if(!!this.getMap())switch(e){case"marker":case"minClusterSize":case"gridSize":case"averageCenter":this._redraw();break;case"indexGenerator":case"icons":this._clusters.forEach(function(r){r.updateIcon()});break;case"maxZoom":this._clusters.forEach(function(r){r.getCount()>1&&r.checkByZoomAndMinClusterSize()});break;case"stylingFunction":this._clusters.forEach(function(r){r.updateCount()});break;case"disableClickZoom":let s="enableClickZoom";t&&(s="disableClickZoom"),this._clusters.forEach(function(r){r[s]()});break}}_createClusters(){const e=this.getMap();if(!e)return;const t=e.getBounds(),s=this.getMarkers();for(let r=0;r<s.length;r++){const n=s[r],i=n.getPosition();if(!t.hasPoint(i))continue;const o=this._getClosestCluster(i);o==null||o.addMarker(n),this._markerRelations.push(naver.maps.Event.addListener(n,"dragend",this._onDragEnd.bind(this)))}}_updateClusters(){const e=this._clusters;for(let t=0;t<e.length;t++)e[t].updateCluster()}_clearClusters(){const e=this._clusters;for(let t=0;t<e.length;t++)e[t].destroy();naver.maps.Event.removeListener(this._markerRelations),this._markerRelations=[],this._clusters=[]}_redraw(){this._clearClusters(),this._createClusters(),this._updateClusters()}_getClosestCluster(e){const t=this.getMap(),s=this.getProjection()||(t==null?void 0:t.getProjection());if(!s)return;const r=this._clusters;let n=null,i=1/0;for(let o=0;o<r.length;o++){const a=r[o],u=a.getCenter();if(a.isInBounds(e)&&u){const l=s.getDistance(u,e);l<i&&(i=l,n=a)}}return n||(n=new b(this),this._clusters.push(n)),n}_onIdle(){this._redraw()}_onDragEnd(){this._redraw()}}exports.MarkerClustering=x;