@arcgis/core
Version:
ArcGIS Maps SDK for JavaScript: A complete 2D and 3D mapping and data visualization API
3 lines (2 loc) • 6.05 kB
JavaScript
/* COPYRIGHT Esri - https://js.arcgis.com/5.0.8/LICENSE.txt */
import{getMetersPerVerticalUnitForSR as e,segmentLength3d as t,segmentLength as n,segmentLength3dSqr as s,segmentLengthSqr as r,closestPointOnLineSegmentWithZ as a,closestPointOnLineSegment as l}from"./centroid.js";import{getMetersPerUnitForSR as i}from"../../core/units.js";import c from"../../geometry/Point.js";import o from"../../geometry/Polygon.js";import{closestPointOnCurve as u}from"../../geometry/support/curves/closestPointOnCurve.js";import{curveLength as f}from"../../geometry/support/curves/curveLength.js";import{isCoordinate as p,getEndpoint as h}from"../../geometry/support/curves/curveUtils.js";import{splitCurveAtPoint as m}from"../../geometry/support/curves/splitCurveAtPoint.js";function d(e){return Math.sqrt(e[0]*e[0]+e[1]*e[1]+e[2]*e[2])}function g(e){const t=d(e);return[e[0]/t,e[1]/t,e[2]/t]}function y(e,t,n,s){const r=g([t[0]-e[0],t[1]-e[1],t[2]*s-e[2]*s]);return[e[0]+r[0]*n,e[1]+r[1]*n,e[2]+r[2]*n]}function R(e,t,n,s){return e+(t-e)/n*s}function x(e,t,n){let s=t[0]-e[0],r=t[1]-e[1];const a=Math.sqrt(s*s+r*r);return s/=a,r/=a,s*=n,r*=n,[e[0]+s,e[1]+r]}function Z(t,n){if(!t)return null;switch(t.type){case"extent":case"multipoint":case"mesh":case"point":return null}const s="polygon"===t.type?t.rings:t.paths;let r=1;if(t.spatialReference.vcsWkid||t.spatialReference.latestVcsWkid){r=e(t.spatialReference)/i(t.spatialReference)}if(0===s.length)return null;if(0===s[0].length)return null;if(!1===t.hasM)return null;let a=-1,l=0;const{hasM:o,hasZ:u}=t,f=u?3:2,p=2;for(const e of s){if(a++,e.length>0&&e[0][f]===n)return{partId:a,distanceAlong:l,coordinate:new c({hasZ:u,hasM:o,spatialReference:t.spatialReference,x:e[0][0],y:e[0][1],...u?{z:e[0][p]}:{},...o?{m:e[0][f]}:{}}),segmentId:0};let s=-1;for(let i=1;i<e.length;i++){const h=k(e[i-1],e[i],u,r);s++;const m=e[i][f]-e[i-1][f],d=e[i][f];if(d===n)return{partId:a,distanceAlong:h+l,coordinate:new c({hasZ:u,hasM:o,spatialReference:t.spatialReference,x:e[i][0],y:e[i][1],...u?{z:e[i][p]}:{},...o?{m:e[i][f]}:{}}),segmentId:s};if(d>n&&n>e[i-1][f]){const d=(n-e[i-1][f])/m*h;let g=u?y(e[i-1],e[i],d,r):x(e[i-1],e[i],d);g=[...g,n];const R=new c({hasZ:u,hasM:o,spatialReference:t.spatialReference,x:g[0],y:g[1],...u?{z:g[p]}:{},...o?{m:g[f]}:{}});return{partId:a,distanceAlong:l+k(e[i-1],[R.x,R.y,...u?[R.z]:[],...o?[R.m]:[]],u,r),coordinate:R,segmentId:s}}l+=h}}return null}function M(t,n){if(!t)return null;switch(t.type){case"extent":case"multipoint":case"mesh":case"point":return null}const s="polygon"===t.type?t.rings:t.paths;if(n<0)return null;let r=1;if(t.spatialReference.vcsWkid||t.spatialReference.latestVcsWkid){r=e(t.spatialReference)/i(t.spatialReference)}let a=0;const{hasZ:l,hasM:o}=t,u=l?3:2,f=2;let p=-1;if(0===n)return 0===s.length||0===s[0].length?null:{partId:0,coordinate:new c({hasZ:l,hasM:o,spatialReference:t.spatialReference,x:s[0][0][0],y:s[0][0][1],...l?{z:s[0][0][f]}:{},...o?{m:s[0][0][u]}:{}}),segmentId:0};for(const e of s){p++;let s=-1;for(let i=1;i<e.length;i++){s++;const h=k(e[i-1],e[i],l,r),m=a+h;if(m===n)return{partId:p,coordinate:new c({hasZ:l,hasM:o,spatialReference:t.spatialReference,x:e[i][0],y:e[i][1],...l?{z:e[i][f]}:{},...o?{m:e[i][u]}:{}}),segmentId:s};if(m>n){let m=l?y(e[i-1],e[i],n-a,r):x(e[i-1],e[i],n-a);return m=[...m,R(e[i-1][u],e[i][u],h,n-a)],{partId:p,coordinate:new c({hasZ:l,hasM:o,spatialReference:t.spatialReference,x:m[0],y:m[1],...l?{z:m[f]}:{},...o?{m:m[u]}:{}}),segmentId:s}}a=m}}return null}function v(s,r){if(!s)return null;if(!r)return null;let a=1;if(r.spatialReference.vcsWkid||r.spatialReference.latestVcsWkid){a=e(r.spatialReference)/i(r.spatialReference)}let l=null,c=0;return l=s,c=s.hasZ&&r.hasZ?t([r.x,r.y,r.z],[s.x,s.y,s.z],a):n([r.x,r.y],[s.x,s.y],!1),{coordinate:l,distance:c}}function I(t,n){if(!t)return null;if(!n)return null;let a=1;if(n.spatialReference.vcsWkid||n.spatialReference.latestVcsWkid){a=e(n.spatialReference)/i(n.spatialReference)}let l=null,c=0,o=Number.MAX_VALUE,u=-1,f=-1;for(const e of t.points||[]){f++;const l=t.hasZ&&n.hasZ?s([e[0],e[1],e[2]],[n.x,n.y,n.z],a):r([e[0],e[1]],[n.x,n.y],!1);l<o&&(o=l,u=f)}return u<0?null:(c=o,l=t.getPoint(u),{coordinate:l,distance:Math.sqrt(c)})}function z(t,n){if(!t)return null;if(!n)return null;const s="polygon"===t.type?t.curveRings??t.rings:t.curvePaths??t.paths;let r=1;if(n.spatialReference.vcsWkid||n.spatialReference.latestVcsWkid){r=e(n.spatialReference)/i(n.spatialReference)}let a=Number.MAX_VALUE,l=-1,o=-1,u=-1;const f=t.hasZ&&n.hasZ;let d=null;const g=f?[n.x,n.y,n.z]:[n.x,n.y];for(const e of s){o++;for(let t=1;t<e.length;t++){const n=w(g,e[t-1],e[t],f,r);n.distance<a&&(a=n.distance,d=n.closestPoint,u=o,l=t-1)}}if(l<0||!d)return null;const y=t.hasM&&t.hasZ?3:2,x=2,Z=s[u][l],M=h(Z),v=s[u][l+1],I=h(v);let z=null,P=null,W=f?d[2]:null;const A=p(v)?d:m(M,v,d,.001)[0];let j=k(M,A,f,r);const V=k(M,v,f,r);t.hasM&&(P=R(M[y],I[y],V,j)),!t.hasZ||!1!==n.hasZ&&p(A)||(W=R(M[x],I[x],V,j),h(A)[x]=W,j=k(M,A,!0,r)),z=new c({hasZ:f,hasM:t.hasM,spatialReference:n.spatialReference,x:d[0],y:d[1],...t.hasZ?{z:W}:{},...t.hasM?{m:P}:{}});let L=0;for(let e=0;e<=u;e++){const n=s[e],a=e===u?l:n.length-1;for(let e=1;e<=a;e++)L+=k(h(n[e-1]),n[e],t.hasZ,r)}return L+=j,{partId:u,segmentId:l,coordinate:z,distance:a,distanceAlong:L}}function w(e,s,r,i,c){const o=h(s);if(p(r)){const s=i?a(e,o,r):l(e,o,r);return{closestPoint:s,distance:i?t(s,e,c):n(s,e,!1)}}const{curvePoint:f,distance:m}=u(o,r,e);return{closestPoint:f,distance:m}}function k(e,s,r,a){return p(s)?r?t(e,s,a):n(e,s,!1):f(e,s,.001)}function P(e,t){if(!e)return null;if(!t)return null;if("extent"===e.type){const t=e;e=new o({spatialReference:e.spatialReference,rings:[[[t.xmin,t.ymin],[t.xmin,t.ymax],[t.xmax,t.ymax],[t.xmax,t.ymin],[t.xmin,t.ymin]]]})}switch(e.type){case"point":return v(e,t)??null;case"multipoint":return I(e,t)??null;case"polygon":case"polyline":return z(e,t)??null;default:return null}}export{M as distanceToCoordinate,Z as measureToCoordinate,P as pointToCoordinate,k as segmentLength};