NOTICE: Ingest of Reprocessed Landsat 9 Data is Complete. LPCS is available for use. In coordination with the completion of the
Landsat 9 data reprocessing effort, LPCS will be replacing the Landsat 9 information
contained in the system with the new reprocessed data on May 17, 2023. This will require LPCS to
be offline for approximately one day while updates are made.
The performance of the page depends on the browser cache and
internet connection. For the page to load faster and perform better, try clearing browser cache.
Thank you.
Land
Product
Characterization System (LPCS)
...
Land Product Characterization System (LPCS)
is a USGS developed application that has the capability to trend system characterizations for
various
sensors, providing users the ability to do comparative analysis of satellite data and products.
Analysis of
data from multiple sensors allow an evaluation of each sensor's strengths and deficiencies over
various
terrain. A web-enabled interface allows users to select sensors and the associated trending
attributes. A
fundamental goal of the LPCS is to compare product results for each sensor and enable easy
visualization of
sensor differences. Visit this USGS webpage for more information on using the LPCS. Comments,
corrections, and further information on LPCS are welcome
and can be sent to eccoe@usgs.gov.
LPCS Filters
Note: Once a multi-select is picked for a filter, the remaining filters are
single-selects only and filter options are inclusive
to the previous selection.
LPCS Filter Results
-->
! function (e, r) {
"object" == typeof exports && "undefined" != typeof module ? r(exports, require("chart.js"),
require("chart.js/helpers")) : "function" == typeof define && define.amd ? define(["exports", "chart.js",
"chart.js/helpers"], r) : r((e = "undefined" != typeof globalThis ? globalThis : e || self).ChartErrorBars = {},
e.Chart, e.Chart.helpers)
}(this, (function (e, r, t) {
"use strict";
const a = ["xMin", "xMax", "yMin", "yMax"];
function n(e) {
return e ? a.slice(0, 2) : a.slice(2)
}
function s(e, r, t, a, n) {
const s = [`${a.axis}Min`, `${a.axis}Max`],
o = a.getBasePixel();
for (const i of s) {
const s = r[i];
Array.isArray(s) ? e[i] = s.map((e => n ? o : a.getPixelForValue(e, t))) : e[i] = "number" == typeof s ? n ? o :
a.getPixelForValue(s, t) : null
}
}
const o = {
errorBarLineWidth: {
v: [1, 3]
},
errorBarColor: {
v: ["#2c2c2c", "#1f1f1f"]
},
errorBarWhiskerLineWidth: {
v: [1, 3]
},
errorBarWhiskerRatio: {
v: [.2, .25]
},
errorBarWhiskerSize: {
v: [20, 24]
},
errorBarWhiskerColor: {
v: ["#2c2c2c", "#1f1f1f"]
}
},
i = {
_scriptable: !0,
_indexable: e => "v" !== e
},
l = Object.keys(o);
function c(e, r) {
const t = Array.isArray(e) ? e : [e],
a = Array.isArray(r) ? r : [r];
if (t.length === a.length) return t.map(((e, r) => [e, a[r]]));
const n = Math.max(t.length, a.length);
return Array(n).map(((e, r) => [t[r % t.length], a[r % a.length]]))
}
function u(e, r) {
if ("string" == typeof e || "number" == typeof e) return e;
const t = Array.isArray(e) ? e : e.v;
return t[r % t.length]
}
function d(e, r, t) {
const a = u(r.errorBarWhiskerRatio, t);
if (null != e && a > 0) return e * a * .5;
return .5 * u(r.errorBarWhiskerSize, t)
}
function h(e, r) {
var t, a, n, s;
const o = e.getProps(["x", "y", "width", "height", "xMin", "xMax", "yMin", "yMax"]);
null == o.xMin && null == o.xMax || function (e, r, t, a, n) {
n.save(), n.translate(0, e.y);
const s = c(null == r ? e.x : r, null == t ? e.x : t);
s.reverse().forEach((([r, t], o) => {
const i = s.length - o - 1,
l = d(e.height, a, i);
n.lineWidth = u(a.errorBarLineWidth, i), n.strokeStyle = u(a.errorBarColor, i), n.beginPath(), n.moveTo(r, 0),
n.lineTo(t, 0), n.stroke(), n.lineWidth = u(a.errorBarWhiskerLineWidth, i), n.strokeStyle = u(a.errorBarWhiskerColor,
i), n.beginPath(), n.moveTo(r, -l), n.lineTo(r, l), n.moveTo(t, -l), n.lineTo(t, l), n.stroke()
})), n.restore()
}(o, null !== (t = o.xMin) && void 0 !== t ? t : null, null !== (a = o.xMax) && void 0 !== a ? a : null, e.options, r),
null == o.yMin && null == o.yMax || function (e, r, t, a, n) {
n.save(), n.translate(e.x, 0);
const s = c(null == r ? e.y : r, null == t ? e.y : t);
s.reverse().forEach((([r, t], o) => {
const i = s.length - o - 1,
l = d(e.width, a, i);
n.lineWidth = u(a.errorBarLineWidth, i), n.strokeStyle = u(a.errorBarColor, i), n.beginPath(), n.moveTo(0, r),
n.lineTo(0, t), n.stroke(), n.lineWidth = u(a.errorBarWhiskerLineWidth, i), n.strokeStyle = u(a.errorBarWhiskerColor,
i), n.beginPath(), n.moveTo(-l, r), n.lineTo(l, r), n.moveTo(-l, t), n.lineTo(l, t), n.stroke()
})), n.restore()
}(o, null !== (n = o.yMin) && void 0 !== n ? n : null, null !== (s = o.yMax) && void 0 !== s ? s : null, e.options, r)
}
function p(e, r) {
const t = e.getProps(["x", "y", "startAngle", "endAngle", "rMin", "rMax", "outerRadius"]);
null == t.rMin && null == t.rMax || function (e, r, t, a, n) {
n.save(), n.translate(e.x, e.y);
const s = (e.startAngle + e.endAngle) / 2,
o = Math.cos(s),
i = Math.sin(s),
l = {
x: -i,
y: o
},
h = Math.sqrt(l.x * l.x + l.y * l.y);
l.x /= h, l.y /= h;
const p = c(null != r ? r : e.outerRadius, null != t ? t : e.outerRadius);
p.reverse().forEach((([e, r], t) => {
const s = p.length - t - 1,
c = e * o,
h = e * i,
f = r * o,
m = r * i,
y = d(null, a, s),
x = l.x * y,
g = l.y * y;
n.lineWidth = u(a.errorBarLineWidth, s), n.strokeStyle = u(a.errorBarColor, s), n.beginPath(), n.moveTo(c, h),
n.lineTo(f, m), n.stroke(), n.lineWidth = u(a.errorBarWhiskerLineWidth, s), n.strokeStyle = u(a.errorBarWhiskerColor,
s), n.beginPath(), n.moveTo(c + x, h + g), n.lineTo(c - x, h - g), n.moveTo(f + x, m + g), n.lineTo(f - x, m - g),
n.stroke()
})), n.restore()
}(t, t.rMin, t.rMax, e.options, r)
}
class f extends r.BarElement {
draw(e) {
super.draw(e), h(this, e)
}
}
f.id = "barWithErrorBar", f.defaults = {
...r.BarElement.defaults,
...o
}, f.defaultRoutes = r.BarElement.defaultRoutes, f.descriptors = i;
class m extends r.PointElement {
draw(e, r) {
super.draw.call(this, e, r), h(this, e)
}
}
m.id = "pointWithErrorBar", m.defaults = {
...r.PointElement.defaults,
...o
}, m.defaultRoutes = r.PointElement.defaultRoutes, m.descriptors = i;
class y extends r.ArcElement {
draw(e) {
super.draw(e), p(this, e)
}
}
function x(e) {
return Array.isArray(e) ? e.slice().reverse() : e
}
function g(e) {
const t = n(e.element.horizontal),
a = r.Tooltip.defaults.callbacks.label.call(this, e),
s = e.chart.data.datasets[e.datasetIndex].data[e.dataIndex];
return null == s || t.every((e => null == s[e])) ? a : `${a} (${x(s[t[0]])} .. ${s[t[1]]})`
}
y.id = "arcWithErrorBar", y.defaults = {
...r.ArcElement.defaults,
...o
}, y.defaultRoutes = r.ArcElement.defaultRoutes, y.descriptors = i;
const E = {
color(e, r, a) {
const n = e || "transparent",
s = r || "transparent";
if (n === s) return r;
const o = t.color(n),
i = o.valid && t.color(s);
return i && i.valid ? i.mix(o, a).hexString() : r
},
number: (e, r, t) => e === r ? r : e + (r - e) * t
};
function M(e, r, t, a, n) {
if (typeof e === a && typeof r === a) return n(e, r, t);
if (Array.isArray(e) && Array.isArray(r)) return e.map(((e, a) => n(e, r[a], t)));
const s = e => e && Array.isArray(e.v);
return s(e) && s(r) ? {
v: e.v.map(((e, a) => n(e, r.v[a], t)))
} : r
}
const b = {
animations: {
numberArray: {
fn: function (e, r, t) {
return M(e, r, t, "number", E.number)
},
properties: a.concat(l.filter((e => !e.endsWith("Color"))), ["rMin", "rMax"])
},
colorArray: {
fn: function (e, r, t) {
return M(e, r, t, "string", E.color)
},
properties: l.filter((e => e.endsWith("Color")))
}
}
};
function v(e, r) {
const {
axis: t
} = e;
e.axis = `${t}MinMin`;
const {
min: a
} = r(e);
e.axis = `${t}MaxMax`;
const {
max: n
} = r(e);
return e.axis = t, {
min: a,
max: n
}
}
function B(e, r, t) {
return Array.isArray(r) ? t(e, ...r) : "number" == typeof r ? t(e, r) : e
}
function C(e, r, t, a, n) {
const s = "string" == typeof r ? r : r.axis,
o = `${s}Min`,
i = `${s}Max`,
l = `${s}MinMin`,
c = `${s}MaxMax`;
for (let r = 0; r < n; r += 1) {
const n = r + a, u = e[r]; u[o] = "object" == typeof t[n] ? t[n][o] : null,
u[i] = "object" == typeof t[n] ? t[n][i] : null, u[l] = B(u[s], u[o], Math.min), u[c] = B(u[s], u[i], Math.max)
}
} function
W(e, r, t, a) {
const { axis: n } = r, s = r.getLabels(); for (let o = 0; o < a; o += 1) {
const a = o + t;
e[o][n] = r.parse(s[a], a)
}
} function S(e, t, a, n = [], s = []) {
r.registry.addControllers(a), Array.isArray(n) ?
r.registry.addElements(...n) : r.registry.addElements(n), Array.isArray(s) ? r.registry.addScales(...s) :
r.registry.addScales(s); const o = t; return o.type = e, o
} class A extends r.BarController {
getMinMax(e, r) {
return
v(e, (e => super.getMinMax(e, r)))
}
parsePrimitiveData(e, r, t, a) {
const n = super.parsePrimitiveData(e, r, t, a);
return this.parseErrorData(n, e, r, t, a), n
}
parseObjectData(e, r, t, a) {
const n = super.parseObjectData(e, r, t, a);
return this.parseErrorData(n, e, r, t, a), n
}
parseErrorData(e, r, t, a, n) {
C(e, r.vScale, t, a, n), W(e, r.iScale, a, n)
}
updateElement(e, r, t, a) {
"number" == typeof r && s(t, this.getParsed(r), r, this._cachedMeta.vScale, "reset" === a), super.updateElement(e,
r, t, a)
}
}
A.id = "barWithErrorBars", A.defaults = t.merge({}, [r.BarController.defaults, b, {
dataElementType: f.id
}]), A.overrides = t.merge({}, [r.BarController.overrides, {
plugins: {
tooltip: {
callbacks: {
label: g
}
}
}
}]), A.defaultRoutes = r.BarController.defaultRoutes;
class P extends r.Chart {
constructor(e, t) {
super(e, S("barWithErrorBars", t, A, f, [r.LinearScale, r.CategoryScale]))
}
}
P.id = A.id;
class D extends r.LineController {
getMinMax(e, r) {
return v(e, (e => super.getMinMax(e, r)))
}
parsePrimitiveData(e, r, t, a) {
const n = super.parsePrimitiveData(e, r, t, a);
return this.parseErrorData(n, e, r, t, a), n
}
parseObjectData(e, r, t, a) {
const n = super.parseObjectData(e, r, t, a);
return this.parseErrorData(n, e, r, t, a), n
}
parseErrorData(e, r, t, a, n) {
C(e, r.vScale, t, a, n);
const s = r.iScale;
"linear" === s.type || "logarithmic" === s.type ? C(e, r.iScale, t, a, n) : W(e, r.iScale, a, n)
}
updateElement(e, r, t, a) {
e instanceof m && "number" == typeof r && this.updateElementScale(r, t, a), super.updateElement(e, r, t, a)
}
updateElementScale(e, r, t) {
s(r, this.getParsed(e), e, this._cachedMeta.vScale, "reset" === t);
const a = this._cachedMeta.iScale;
("linear" === a.type || "logarithmic" === a.type) && s(r, this.getParsed(e), e, this._cachedMeta.iScale, "reset" ===
t)
}
updateElements(e, r, t, a) {
const n = "reset" === a,
s = this.chart._animationsDisabled || n || "none" === a;
if (super.updateElements(e, r, t, a), s)
for (let n = r; n < r + t; ++n) { const r = e[n]; r instanceof m && this.updateElementScale(n, r, a) }
}
}
D.id = "lineWithErrorBars", D.defaults = t.merge({}, [r.LineController.defaults, b, { dataElementType: m.id }]),
D.overrides = t.merge({}, [r.LineController.overrides, { plugins: { tooltip: { callbacks: { label: g } } } }]),
D.defaultRoutes = r.LineController.defaultRoutes; class k extends r.Chart {
constructor(e, t) {
super(e,
S("lineWithErrorBars", t, D, m, [r.LinearScale, r.CategoryScale]))
}
} k.id = D.id; class T extends
r.ScatterController {
getMinMax(e, r) {
return v(e, (e => super.getMinMax(e, r)))
}
parsePrimitiveData(e, r, t, a) {
const n = super.parsePrimitiveData(e, r, t, a);
return this.parseErrorData(n, e, r, t, a), n
}
parseObjectData(e, r, t, a) {
const n = super.parseObjectData(e, r, t, a);
return this.parseErrorData(n, e, r, t, a), n
}
parseErrorData(e, r, t, a, n) {
C(e, r.xScale, t, a, n), C(e, r.yScale, t, a, n)
}
updateElement(e, r, t, a) {
e instanceof m && "number" == typeof r && this.updateElementScale(r, t, a), super.updateElement(e, r, t, a)
}
updateElementScale(e, r, t) {
s(r, this.getParsed(e), e, this._cachedMeta.xScale, "reset" === t), s(r, this.getParsed(e), e,
this._cachedMeta.yScale, "reset" === t)
}
updateElements(e, r, t, a) {
const n = "reset" === a,
s = this.chart._animationsDisabled || n || "none" === a;
if (super.updateElements(e, r, t, a), s)
for (let n = r; n < r + t; ++n) { const r = e[n]; r instanceof m && this.updateElementScale(n, r, a) }
}
}
T.id = "scatterWithErrorBars", T.defaults = t.merge({}, [r.ScatterController.defaults, b, {
dataElementType:
m.id
}]), T.overrides = t.merge({}, [r.ScatterController.overrides, {
plugins: {
tooltip: {
callbacks: {
label: function (e) {
const r = e.chart.data.datasets[e.datasetIndex].data[e.dataIndex], t = (e, t) => {
const a = n(t);
return null == r || a.every((e => null == r[e])) ? e : `${e} [${x(r[a[0]])} .. ${r[a[1]]}]`
};
return `(${t(e.label, !0)}, ${t(e.parsed.y, !1)})`
}
}
}
}
}]), T.defaultRoutes = r.LineController.defaultRoutes;
class $ extends r.Chart {
constructor(e, t) {
super(e, S("scatterWithErrorBars", t, T, m, [r.LinearScale]))
}
}
$.id = T.id;
class L extends r.PolarAreaController {
getMinMaxImpl(e) {
const r = this._cachedMeta,
t = {
min: Number.POSITIVE_INFINITY,
max: Number.NEGATIVE_INFINITY
};
return r.data.forEach(((r, a) => {
const n = this.getParsed(a)[e.axis];
!Number.isNaN(n) && this.chart.getDataVisibility(a) && (n < t.min && (t.min = n), n > t.max && (t.max = n))
})), t
}
getMinMax(e) {
return v(e, (e => this.getMinMaxImpl(e)))
}
countVisibleElements() {
const e = this._cachedMeta;
return e.data.reduce(((r, t, a) => !Number.isNaN(e._parsed[a].r) && this.chart.getDataVisibility(a) ? r
+ 1 : r), 0)
}
parsePrimitiveData(e, r, t, a) {
const n = super.parsePrimitiveData(e, r, t, a);
return this.parseErrorData(n, e, r, t, a), n
}
parseObjectData(e, r, t, a) {
const n = super.parseObjectData(e, r, t, a);
return this.parseErrorData(n, e, r, t, a), n
}
parseErrorData(e, r, t, a, n) {
const s = r.rScale;
for (let r = 0; r < n; r += 1) { const n = r + a, o = t[n], i = s.parse(o[s.axis], n); e[r] = { [s.axis]: i } }
C(e, s, t, a, n)
} updateElement(e, r, t, a) {
"number" == typeof r && function (e, r, t, a, n) {
const s = n.animation, o = [`${t.axis}Min`, `${t.axis}Max`], i = e => {
const r = t.getDistanceFromCenterForValue(e),
n = s.animateScale ? 0 : r;
return a ? n : r
};
for (const t of o) {
const a = r[t];
Array.isArray(a) ? e[t] = a.map(i) : e[t] = "number" == typeof a ? i(a) : null
}
}(t, this.getParsed(r), this._cachedMeta.rScale, "reset" === a, this.chart.options),
super.updateElement(e, r, t, a)
}
updateElements(e, r, t, a) {
const n = this.chart.scales.r,
s = n.getDistanceFromCenterForValue;
n.getDistanceFromCenterForValue = function (e) {
return "number" == typeof e ? s.call(this, e) : s.call(this, e.r)
}, super.updateElements(e, r, t, a), n.getDistanceFromCenterForValue = s
}
}
L.id = "polarAreaWithErrorBars", L.defaults = t.merge({}, [r.PolarAreaController.defaults, b, {
dataElementType: y.id
}]), L.overrides = t.merge({}, [r.PolarAreaController.overrides, {
plugins: {
tooltip: {
callbacks: {
label: function (e) {
const t = r.PolarAreaController.overrides.plugins.tooltip.callbacks.label.call(this, e),
a = e.chart.data.datasets[e.datasetIndex].data[e.dataIndex],
n = ["rMin", "rMax"];
return null == a || n.every((e => null == a[e])) ? t : `${t} [${x(a[n[0]])} .. ${a[n[1]]}]`
}
}
}
}
}]), L.defaultRoutes = r.PolarAreaController.defaultRoutes;
class R extends r.Chart {
constructor(e, t) {
super(e, S("polarAreaWithErrorBars", t, L, y, [r.RadialLinearScale]))
}
}
R.id = L.id, r.registry.addControllers(A, D, L, T), r.registry.addElements(f, y, m),
e.ArcWithErrorBar = y, e.BarWithErrorBar = f, e.BarWithErrorBarsChart = P,
e.BarWithErrorBarsController = A, e.LineWithErrorBarsChart = k, e.LineWithErrorBarsController = D,
e.PointWithErrorBar = m, e.PolarAreaWithErrorBarsChart = R, e.PolarAreaWithErrorBarsController = L,
e.ScatterWithErrorBarsChart = $, e.ScatterWithErrorBarsController = T
}));
//# sourceMappingURL=index.umd.min.js.map
//]]>