@arcgis/core
Version:
ArcGIS Maps SDK for JavaScript: A complete 2D and 3D mapping and data visualization API
6 lines (5 loc) • 3.19 kB
JavaScript
/*
All material copyright ESRI, All Rights Reserved, unless otherwise specified.
See https://js.arcgis.com/4.32/esri/copyright.txt for details.
*/
import{t as e,b as t,G as r}from"./Geometry.js";import{Envelope2D as n}from"./Envelope2D.js";import{m as s,a as o,c as i}from"./SideCalculator2D-BNwb5gvz.js";import{c as a}from"./Envelope.js";import{P as u}from"./Point2D.js";import{i as c}from"./ProjectionTransformation.js";class m{getOperatorType(){return 10500}accelerateGeometry(e,t,r){return!1}canAccelerateGeometry(e){return!1}supportsCurves(){return!0}getNearestCoordinate(n,o,i,a){if(o.isNAN()&&e("NAN xy coordinates are not allowed"),n.isEmpty())return s();switch(n.getGeometryType()){case r.enumPoint:return this.pointGetNearestVertex(n,o);case r.enumMultiPoint:return this.multiVertexGetNearestVertex(n,o);case r.enumPolyline:case r.enumPolygon:return this.multiPathGetNearestCoordinate(n,o,i,a);default:t("")}}getNearestVertex(n,o){if(o.isNAN()&&e("NAN xy coordinates are not allowed"),n.isEmpty())return s();switch(n.getGeometryType()){case r.enumPoint:return this.pointGetNearestVertex(n,o);case r.enumMultiPoint:case r.enumPolyline:case r.enumPolygon:return this.multiVertexGetNearestVertex(n,o);default:t("")}}getNearestVertices(n,s,o,i){if(0===i&&e(""),s.isNAN()&&e("NAN xy coordinates are not allowed"),n.isEmpty())return[];switch(n.getGeometryType()){case r.enumPoint:return this.pointGetNearestVertices(n,s,o,i);case r.enumMultiPoint:case r.enumPolyline:case r.enumPolygon:return this.multiVertexGetNearestVertices(n,s,o,i);default:t("")}}multiPathGetNearestCoordinate(t,s,m,l){if(t.getGeometryType()===r.enumPolygon&&m){const e=new n;t.queryEnvelope(e);const r=a(null,e,!1);let i;if(i=c(t,s,l?0:r),0!==i){const e=o(s,-1,0);return l&&(e.m_bRightSide=!0),e}}const g=t.querySegmentIterator(),y=new u;let N=-1,p=-1,f=Number.MAX_VALUE,d=0;for(;g.nextPath();)for(;g.hasNextSegment();){const e=g.nextSegment(),t=e.getClosestCoordinate(s,!1),r=e.getCoord2D(t),n=u.sqrDistance(r,s);n<f?(d=1,y.assign(r),N=g.getStartPointIndex(),p=g.getPathIndex(),f=n):n===f&&d++}-1===N&&e("");const h=o(y,N,Math.sqrt(f));if(l)if(t.getGeometryType()!==r.enumPolygon){let e=!1;if(d>1){const r=i(t,s,N,p);e=0!==r&&3!==r}else{g.resetToVertex(N,p);const t=g.nextSegment();e=0!==i(t,s)}h.m_bRightSide=e}else if(!m){0!==c(t,s,0)&&(h.m_bRightSide=!0)}return h}pointGetNearestVertex(e,t){const r=e.getXY(),n=u.distance(r,t);return o(r,0,n)}multiVertexGetNearestVertex(e,t){const r=e.getAttributeStreamRef(0),n=e.getPointCount();let s=-1;const i=new u;let a=Number.MAX_VALUE;const c=new u;for(let o=0;o<n;o++){r.queryPoint2D(2*o,c);const e=u.sqrDistance(c,t);e<a&&(i.assign(c),s=o,a=e)}return o(i,s,Math.sqrt(a))}pointGetNearestVertices(e,t,r,n){const s=[];if(0!==n){const n=r*r,i=e.getXY(),a=u.sqrDistance(i,t);a<=n&&s.push(o(i,0,Math.sqrt(a)))}return s}multiVertexGetNearestVertices(e,t,r,n){const s=[];if(0!==n){const i=e.getAttributeStreamRef(0),a=e.getPointCount();s.length=n+1;const c=r*r;for(let e=0;e<a;e++){const r=i.read(2*e),n=i.read(2*e+1),a=t.x-r,m=t.y-n,l=a*a+m*m;l<=c&&s.push(o(u.construct(r,n),e,Math.sqrt(l)))}s.sort(((e,t)=>e.m_distance-t.m_distance))}return s.slice(0,n)}}export{m as O};