@dra2020/baseclient 1.0.42 → 1.0.45
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/baseclient.js +56 -8
- package/dist/baseclient.js.map +1 -1
- package/dist/poly/polylabel.d.ts +1 -0
- package/lib/poly/polylabel.ts +52 -7
- package/lib/poly/topo.ts +11 -2
- package/package.json +1 -1
package/dist/poly/polylabel.d.ts
CHANGED
package/lib/poly/polylabel.ts
CHANGED
|
@@ -11,6 +11,28 @@ interface PolyLabelResult
|
|
|
11
11
|
d: number;
|
|
12
12
|
}
|
|
13
13
|
|
|
14
|
+
//
|
|
15
|
+
// polyDistance: return (smallest) distance to polygon edge.
|
|
16
|
+
// Positive value indicates point is in poly, negative indicates point is outside.
|
|
17
|
+
//
|
|
18
|
+
|
|
19
|
+
export function polyDistance(poly: any, x: number, y: number): number
|
|
20
|
+
{
|
|
21
|
+
let pp = P.polyNormalize(poly);
|
|
22
|
+
if (pp == null) return 0;
|
|
23
|
+
|
|
24
|
+
let forEachPointPair = (iter: any) => {
|
|
25
|
+
PP.polyPackEachRing(pp, (b: Float64Array, iPoly, iRing: number, iOffset: number, nPoints: number) => {
|
|
26
|
+
let iFirst = iOffset;
|
|
27
|
+
let iLast = iOffset + nPoints * 2;
|
|
28
|
+
let iSecond = iLast - 2;
|
|
29
|
+
for (; iFirst < iLast; iSecond = iFirst, iFirst += 2)
|
|
30
|
+
iter(iPoly, iRing, b[iFirst], b[iFirst+1], b[iSecond], b[iSecond+1]);
|
|
31
|
+
});
|
|
32
|
+
};
|
|
33
|
+
return pointToPolygonDist(x, y, forEachPointPair);
|
|
34
|
+
}
|
|
35
|
+
|
|
14
36
|
//
|
|
15
37
|
// polyLabel: given polygon, return contained point furthest from any edge, and that distance
|
|
16
38
|
//
|
|
@@ -47,7 +69,7 @@ export function polyLabel(poly: any, precision?: number, debug?: boolean): PolyL
|
|
|
47
69
|
let iLast = iOffset + nPoints * 2;
|
|
48
70
|
let iSecond = iLast - 2;
|
|
49
71
|
for (; iFirst < iLast; iSecond = iFirst, iFirst += 2)
|
|
50
|
-
iter(b[iFirst], b[iFirst+1], b[iSecond], b[iSecond+1]);
|
|
72
|
+
iter(iPoly, iRing, b[iFirst], b[iFirst+1], b[iSecond], b[iSecond+1]);
|
|
51
73
|
});
|
|
52
74
|
};
|
|
53
75
|
|
|
@@ -142,15 +164,38 @@ class Cell
|
|
|
142
164
|
// signed distance from point to polygon outline (negative if point is outside)
|
|
143
165
|
function pointToPolygonDist(x: number, y: number, forEachPointPair: any): number
|
|
144
166
|
{
|
|
145
|
-
let
|
|
167
|
+
let iPolyLast = -1;
|
|
168
|
+
let iRingLast = -1;
|
|
169
|
+
let inside = false;
|
|
170
|
+
let thisInside = false;
|
|
171
|
+
let useInside = false;
|
|
172
|
+
let isHole = false;
|
|
146
173
|
let minDistSq: number = Infinity;
|
|
147
174
|
|
|
148
|
-
forEachPointPair((ax: number, ay: number, bx: number, by: number) => {
|
|
175
|
+
forEachPointPair((iPoly: number, iRing: number, ax: number, ay: number, bx: number, by: number) => {
|
|
176
|
+
if (iPoly != iPolyLast || iRing != iRingLast)
|
|
177
|
+
{
|
|
178
|
+
if (useInside)
|
|
179
|
+
inside = isHole ? ! thisInside : thisInside;
|
|
180
|
+
iPolyLast = iPoly;
|
|
181
|
+
iRingLast = iRing;
|
|
182
|
+
thisInside = false;
|
|
183
|
+
useInside = false;
|
|
184
|
+
isHole = false;
|
|
185
|
+
}
|
|
149
186
|
if ((ay > y !== by > y) && (x < (bx - ax) * (y - ay) / (by - ay) + ax))
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
187
|
+
thisInside = !thisInside;
|
|
188
|
+
|
|
189
|
+
let thisDistSq = getSegDistSq(x, y, ax, ay, bx, by);
|
|
190
|
+
if (thisDistSq < minDistSq)
|
|
191
|
+
{
|
|
192
|
+
minDistSq = thisDistSq;
|
|
193
|
+
useInside = true;
|
|
194
|
+
isHole = iRing != 0;
|
|
195
|
+
}
|
|
153
196
|
});
|
|
197
|
+
if (useInside)
|
|
198
|
+
inside = isHole ? ! thisInside : thisInside;
|
|
154
199
|
|
|
155
200
|
return (inside ? 1 : -1) * Math.sqrt(minDistSq);
|
|
156
201
|
}
|
|
@@ -164,7 +209,7 @@ function getCentroidCell(forEachPointPair: any): Cell
|
|
|
164
209
|
let fx: number;
|
|
165
210
|
let fy: number;
|
|
166
211
|
|
|
167
|
-
forEachPointPair((ax: number, ay: number, bx: number, by: number) => {
|
|
212
|
+
forEachPointPair((iPoly: number, iRing: number, ax: number, ay: number, bx: number, by: number) => {
|
|
168
213
|
if (fx === undefined) fx = ax, fy = ay;
|
|
169
214
|
let f: number = ax * by - bx * ay;
|
|
170
215
|
x += (ax + bx) * f;
|
package/lib/poly/topo.ts
CHANGED
|
@@ -313,12 +313,21 @@ export function topoSimplifyCollection(col: any, options?: SimplifyOptions): any
|
|
|
313
313
|
if (! bDecided)
|
|
314
314
|
{
|
|
315
315
|
let pp = PP.polyPackTopoArcs(testtopo, arcs);
|
|
316
|
-
|
|
317
|
-
if (selfIntersectFast(pp) || (x && y && !polyContainsPoint(pp, x, y)))
|
|
316
|
+
if (selfIntersectFast(pp))
|
|
318
317
|
{
|
|
319
318
|
keepArcs(topo, oOld.arcs, keepweight);
|
|
320
319
|
nBad++;
|
|
321
320
|
}
|
|
321
|
+
else
|
|
322
|
+
{
|
|
323
|
+
let {x,y} = intpt(f);
|
|
324
|
+
if (x && y && !polyContainsPoint(pp, x, y))
|
|
325
|
+
{
|
|
326
|
+
keepArcs(topo, oOld.arcs, keepweight);
|
|
327
|
+
nBad++;
|
|
328
|
+
log(`topoSimplifyCollection: ${f.properties.id}: increasing feature fidelity because of intpt problem`);
|
|
329
|
+
}
|
|
330
|
+
}
|
|
322
331
|
}
|
|
323
332
|
}
|
|
324
333
|
});
|