{"id":2645,"date":"2022-01-27T13:01:05","date_gmt":"2022-01-27T12:01:05","guid":{"rendered":"https:\/\/geopard.tech\/?page_id=2645"},"modified":"2026-10-06T20:31:38","modified_gmt":"2026-10-06T18:31:38","slug":"faltbenchmarking","status":"publish","type":"page","link":"https:\/\/geopard.tech\/swe\/field-benchmarking\/","title":{"rendered":"G\u00e5rdsvy: F\u00e4ltj\u00e4mf\u00f6relse"},"content":{"rendered":"\n<div class=\"gp-fv\" id=\"gp-fv\" data-theme=\"light\">\n<style>\n\/* ===== theme-chrome (ID-scoped; rule 7 precedent from \/ai and \/yield-report). Header + footer KEPT;\n   only the duplicate WP page title (bare h1 in #simple_page > .container) is hidden. ===== *\/\n#simple_page > .container > h1{display:none !important}\n\/* full-bleed: the theme .container is FIXED 1500px + left-pinned below 1500px viewports, so\n   50%\/50vw breakout math misfires. On this takeover page the container only holds this embed. *\/\n#simple_page > .container{width:auto !important;max-width:none !important;margin:0 !important;padding:0 !important}\n#simple_page{padding:0 !important}\n\/* the site-wide WPBot chat widget collides with this page's mobile CTA bar (same call as \/ai).\n   Written with an html ancestor so the design gate reads them as theme-chrome, not as unscoped tool CSS. *\/\nhtml .wp-chatbot-container{display:none !important}\nhtml .qcld-chatbot-wp-container{display:none !important}\nhtml div[id^=\"qcld-chatbot\"]{display:none !important}\nhtml #wp-chatbot-ball{display:none !important}\nhtml .wp-chatbot-ball{display:none !important}\nhtml div[id^=\"wp-chatbot\"]{display:none !important}\nhtml #qcld-chatbot-widget{display:none !important}\n\n\/* Roboto for this page at first paint and at every weight (rule 24): the variable Roboto the site's own\n   WP.com fonts stylesheet serves (fonts.wp.com, Automattic). Latin-ext, then latin. Never Google-hosted. *\/\n@font-face{font-family:\"Roboto\";font-style:normal;font-weight:100 900;font-display:swap;src:url(https:\/\/fonts.wp.com\/s\/roboto\/v51\/KFO7CnqEu92Fr1ME7kSn66aGLdTylUAMa3KUBHMdazTgWw.woff2) format(\"woff2\");unicode-range:U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF}\n@font-face{font-family:\"Roboto\";font-style:normal;font-weight:100 900;font-display:swap;src:url(https:\/\/fonts.wp.com\/s\/roboto\/v51\/KFO7CnqEu92Fr1ME7kSn66aGLdTylUAMa3yUBHMdazQ.woff2) format(\"woff2\");unicode-range:U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD}\n\/* ===== GPV:CSS START \u2550 all rules scoped under .gp-fv (rule 5). Light theme only (rule 11).\n   Tokens are the shared\/tokens.css set (rule 24): Roboto 400\/700, radii 8\/6\/4\/2, no decorative\n   shadow or gradient, surfaces measured off \/2026-pricing\/. ===== *\/\n.gp-fv{\n  --f:\"Roboto\",-apple-system,\"Segoe UI\",Helvetica,Arial,sans-serif;\n  --ink:#212121; --ink2:#2c3a30; --dim:#4c6066; --faint:#8a9a8e;\n  --accent:#145328; --accent-mid:#15701e; --accent-soft:#1b7a2a; --orange:#f76a0c; --amber:#b0741f;\n  --panel:#ffffff; --paper:#fcfdf9; --paper2:#f6f9f0; --wash:#eef4e8; --wash2:#e4eedd; --hair:#eef2e8; --line:#e3e7da; --mute:#c3cdbf;\n  --r-panel:8px; --r-card:6px; --r-ctl:4px; --r-bar:2px;\n  --pass:#15701e; --pass-bg:#e9f4e7; --lose:#b3261e; --lose-bg:#fdebe9;\n  color:var(--ink2);background:var(--paper);position:relative;overflow-x:clip;\n  font-family:var(--f);\n  font-size:16px;line-height:1.55;font-variant-numeric:tabular-nums;\n}\n.gp-fv h1,.gp-fv h2,.gp-fv h3,.gp-fv h4{font-family:var(--f);font-weight:700;line-height:1.16;margin:0;color:var(--ink)}\n.gp-fv p{margin:0}\n.gp-fv section{position:relative;max-width:1200px;margin:0 auto;padding:52px 32px}\n.gp-fv .gpv-kicker{font-family:var(--f);font-size:.95rem;font-weight:700;letter-spacing:.04em;text-transform:uppercase;color:var(--accent-mid);margin-bottom:14px}\n.gp-fv .gpv-accent{color:var(--accent-mid)}\n.gp-fv .gpv-lede{color:var(--dim);font-size:1.08rem;line-height:1.65}\n.gp-fv .gpv-h2{font-size:clamp(1.9rem,3.1vw,2.8rem);font-weight:700;max-width:900px;text-wrap:balance}\n.gp-fv .gpv-sechead{text-align:center;max-width:800px;margin:0 auto 32px}\n.gp-fv .gpv-sechead .gpv-h2{margin:0 auto}\n.gp-fv .gpv-sechead .gpv-lede{margin-top:12px}\n\n\/* ---- section-chip nav (fixed under the theme header; slides in after the hero) + mobile\n   sticky CTA bar. Both FIXED, never CSS sticky (theme overflow ancestors kill sticky). They float\n   above the page, so they carry the only shadows on it (design gate allowShadow). ---- *\/\n.gp-fv .gpv-secnav{position:fixed;left:0;right:0;top:0;z-index:50;background:var(--panel);border-bottom:1px solid var(--line);box-shadow:0 2px 10px rgba(20,83,40,.08);transform:translateY(-110%);transition:transform .3s}\n.gp-fv .gpv-secnav.is-on{transform:none}\n.gp-fv .gpv-secnav-row{display:flex;gap:6px;overflow-x:auto;scrollbar-width:none;padding:6px 12px;max-width:1200px;margin:0 auto}\n.gp-fv .gpv-secnav-row::-webkit-scrollbar{display:none}\n.gp-fv .gpv-secnav a{flex:0 0 auto;display:inline-flex;align-items:center;min-height:44px;padding:0 14px;border-radius:var(--r-ctl);text-decoration:none;color:var(--dim);font-family:var(--f);font-size:.9rem;font-weight:400}\n.gp-fv .gpv-secnav a:hover{color:var(--accent-mid)}\n.gp-fv .gpv-secnav a.is-active{color:var(--accent-mid);background:var(--wash);font-weight:700}\n@media (min-width:821px){ .gp-fv .gpv-secnav-row{justify-content:center} }\n.gp-fv .gpv-ctabar{position:fixed;left:0;right:0;bottom:0;z-index:55;display:none;gap:10px;padding:10px 14px calc(10px + env(safe-area-inset-bottom));background:var(--panel);border-top:1px solid var(--line);box-shadow:0 -4px 18px rgba(20,83,40,.08);transform:translateY(110%);transition:transform .3s}\n@media (max-width:820px){ .gp-fv .gpv-ctabar{display:flex} }\n.gp-fv .gpv-ctabar.is-on{transform:none}\n.gp-fv .gpv-ctabar.is-off{transform:translateY(110%)}\n.gp-fv .gpv-ctabar .gpv-btn,.gp-fv .gpv-ctabar .gpv-btn-ghost{flex:1;justify-content:center;padding:0 12px}\n\n\/* ---- hero ---- *\/\n.gp-fv .gpv-hero{text-align:center;padding-top:20px}\n.gp-fv .gpv-hero h1{font-size:clamp(2.2rem,4.8vw,4.2rem);font-weight:700;max-width:980px;margin:0 auto;letter-spacing:-0.01em;text-wrap:balance}\n.gp-fv .gpv-hero .gpv-lede{max-width:780px;margin:18px auto 0}\n.gp-fv .gpv-hero-ctas{display:flex;gap:14px;margin-top:22px;flex-wrap:wrap;justify-content:center}\n.gp-fv .gpv-btn{display:inline-flex;align-items:center;min-height:48px;background:var(--accent);color:#fff;font-family:var(--f);font-weight:700;font-size:1rem;padding:0 26px;border-radius:var(--r-ctl);text-decoration:none;transition:background .15s}\n.gp-fv .gpv-btn:hover{color:#fff;background:var(--accent-mid)}\n.gp-fv .gpv-btn-ghost{display:inline-flex;align-items:center;min-height:48px;border:1px solid var(--mute);background:transparent;color:var(--ink);font-family:var(--f);font-weight:400;font-size:1rem;padding:0 24px;border-radius:var(--r-ctl);text-decoration:none}\n.gp-fv .gpv-btn-ghost:hover{border-color:var(--accent-mid);color:var(--accent-mid)}\n\n\/* ---- Arcade walkthrough (iframe injected by the script from data-arcade) ---- *\/\n.gp-fv .gpv-arcade-wrap{max-width:1080px;margin:30px auto 0;border-radius:var(--r-panel);overflow:hidden;border:1px solid var(--mute);background:var(--panel);text-align:left}\n.gp-fv .gpv-arcade-head{display:flex;align-items:center;justify-content:space-between;gap:12px;flex-wrap:wrap;padding:12px 18px;border-bottom:1px solid var(--line)}\n.gp-fv .gpv-arcade-head b{font-family:var(--f);font-size:.95rem;color:var(--ink)}\n.gp-fv .gpv-arcade-head span{color:var(--dim);font-size:.9rem}\n.gp-fv .gpv-arcade{position:relative;width:100%;height:0;padding-bottom:calc(57.71% + 41px);background:var(--wash)}\n.gp-fv .gpv-arcade iframe{position:absolute;top:0;left:0;width:100%;height:100%;border:0;color-scheme:light}\n.gp-fv .gpv-arcade-fallback{position:absolute;top:0;left:0;right:0;bottom:0;display:block;text-decoration:none;color:inherit;z-index:1}\n.gp-fv .gpv-arcade-fallback img{width:100%;height:100%;object-fit:contain;object-position:center;display:block;background:var(--wash)}\n.gp-fv .gpv-arcade-open{position:absolute;left:50%;bottom:22px;transform:translateX(-50%);display:inline-flex;align-items:center;min-height:48px;background:var(--accent);color:#fff;border-radius:var(--r-ctl);padding:0 24px;font-family:var(--f);font-weight:700;font-size:.95rem;white-space:nowrap}\n.gp-fv .gpv-arcade.has-embed .gpv-arcade-fallback{display:none}\n.gp-fv .gpv-arcade-fallback.is-loading .gpv-arcade-open{opacity:.7}\n.gp-fv .gpv-arcade-fallback.is-loading .gpv-arcade-open::after{content:\" \u2026\"}\n.gp-fv .gpv-arcade-fallback:hover .gpv-arcade-open{background:var(--accent-mid)}\n\n\/* ---- cards ---- *\/\n.gp-fv .gpv-cards{display:grid;grid-template-columns:repeat(3,1fr);gap:16px}\n.gp-fv .gpv-cards4{grid-template-columns:repeat(4,1fr)}\n.gp-fv .gpv-cards2{grid-template-columns:repeat(2,1fr)}\n.gp-fv .gpv-card{background:var(--panel);border:1px solid var(--line);border-radius:var(--r-card);padding:22px}\n.gp-fv .gpv-card h3{display:block;font-size:1.1rem;font-weight:700;color:var(--ink);line-height:1.3;letter-spacing:-.01em}\n.gp-fv .gpv-card span{display:block;color:var(--dim);font-size:.95rem;line-height:1.55;margin-top:8px}\n.gp-fv .gpv-card .gpv-num{display:block;font-family:var(--f);font-weight:700;color:var(--accent-mid);font-size:.78rem;letter-spacing:.04em;text-transform:uppercase;margin:0 0 8px}\n\n\/* ---- checklist (rule 22: marker is a ::before on the same <p>, hanging indent) ---- *\/\n.gp-fv .gpv-check{max-width:900px;margin:28px auto 0;background:var(--wash);border:1px solid var(--line);border-radius:var(--r-panel);padding:20px 24px}\n.gp-fv .gpv-check h3{font-size:1rem;margin-bottom:10px}\n.gp-fv .gpv-check p{margin:0;padding-left:1.7em;text-indent:-1.7em;color:var(--dim);line-height:1.6}\n.gp-fv .gpv-check p+p{margin-top:8px}\n.gp-fv .gpv-check p::before{content:\"\\2713\";color:var(--accent-mid);font-weight:700;margin-right:.5em}\n\n\/* ---- product screenshots (server-rendered img, pre-photonized; tap to zoom) ---- *\/\n.gp-fv .gpv-shot{margin:0;min-width:0;max-width:100%;border:1px solid var(--line);border-radius:var(--r-card);overflow:hidden;background:var(--panel)}\n.gp-fv .gpv-shots2 > *{min-width:0}\n.gp-fv .gpv-shot img{display:block;width:100%;max-width:100%;height:auto;cursor:zoom-in}\n.gp-fv .gpv-shot figcaption{font-size:.85rem;color:var(--dim);padding:10px 14px;border-top:1px solid var(--line)}\n.gp-fv .gpv-shots2{display:grid;grid-template-columns:1fr 1fr;gap:16px}\n.gp-fv .gpv-shots-gap{margin-top:24px}\n\n\/* ---- benchmark table (the statistics panel, on a sample farm) ---- *\/\n.gp-fv .gpv-bench{background:var(--panel);border:1px solid var(--line);border-radius:var(--r-panel);padding:28px}\n.gp-fv .gpv-bench-head{display:flex;flex-wrap:wrap;align-items:center;justify-content:space-between;gap:8px 14px}\n.gp-fv .gpv-bench-head h3{font-size:1.15rem}\n.gp-fv .gpv-units{display:flex;flex-wrap:wrap;align-items:center;gap:6px 12px;color:var(--dim);font-size:.88rem}\n.gp-fv .gpv-units-btn{min-height:44px;border:1px solid var(--mute);background:var(--panel);color:var(--accent-mid);font-family:var(--f);font-weight:400;font-size:.88rem;border-radius:var(--r-ctl);padding:0 12px;cursor:pointer}\n.gp-fv .gpv-units-btn:hover{border-color:var(--accent-mid)}\n.gp-fv .gpv-sample{color:var(--dim);margin-top:10px;font-size:.92rem;line-height:1.55}\n.gp-fv .gpv-sample b{color:var(--ink)}\n.gp-fv .gpv-controls{display:grid;grid-template-columns:1fr 1fr;gap:14px;margin-top:16px}\n.gp-fv .gpv-ctl{background:var(--wash);border:1px solid var(--line);border-radius:var(--r-card);padding:12px 14px}\n.gp-fv .gpv-ctl label{display:block;font-family:var(--f);font-weight:700;font-size:.9rem;color:var(--ink);margin-bottom:6px}\n.gp-fv .gpv-ctl select{box-sizing:border-box;width:100%;min-height:44px;font:inherit;font-size:16px;padding:8px 10px;border:1px solid var(--mute);border-radius:var(--r-ctl);background:var(--panel);color:var(--ink)}\n.gp-fv .gpv-ctl select:focus{border-color:var(--accent-mid)}\n.gp-fv .gpv-ctl small{display:block;color:var(--dim);font-size:.85rem;margin-top:6px;line-height:1.45}\n.gp-fv .gpv-find{display:flex;flex-wrap:wrap;align-items:center;gap:8px;margin-top:16px}\n.gp-fv .gpv-find-label{font-family:var(--f);font-weight:700;font-size:.9rem;color:var(--ink);margin-right:4px}\n.gp-fv .gpv-fchip{display:inline-flex;align-items:center;min-height:44px;padding:0 14px;border:1px solid var(--mute);border-radius:var(--r-ctl);background:var(--panel);color:var(--ink);font-family:var(--f);font-size:.9rem;font-weight:400;cursor:pointer}\n.gp-fv .gpv-fchip:hover{border-color:var(--accent-mid);color:var(--accent-mid)}\n.gp-fv .gpv-fchip.is-on{background:var(--accent);border-color:var(--accent);color:#fff;font-weight:700}\n\/* the verdict card carries the answer: the top three fields for the chosen rule *\/\n.gp-fv .gpv-verdict{margin-top:16px;border:1px solid var(--line);border-radius:var(--r-card);padding:18px 20px;background:var(--wash)}\n.gp-fv .gpv-verdict-kicker{display:block;font-size:.78rem;font-weight:700;letter-spacing:.04em;text-transform:uppercase;color:var(--accent-mid);margin-bottom:6px}\n.gp-fv .gpv-verdict p{font-size:clamp(1.05rem,1.5vw,1.3rem);font-weight:700;line-height:1.35;margin:0;color:var(--ink)}\n.gp-fv .gpv-verdict small{display:block;color:var(--dim);font-size:.9rem;margin-top:6px;font-weight:400}\n.gp-fv .gpv-table-wrap{overflow-x:auto;margin-top:18px}\n.gp-fv .gpv-table{width:100%;border-collapse:collapse;font-size:.95rem;min-width:620px}\n.gp-fv .gpv-table th,.gp-fv .gpv-table td{text-align:right;padding:10px 12px;border-bottom:1px solid var(--line);vertical-align:middle;white-space:nowrap}\n.gp-fv .gpv-table th:first-child,.gp-fv .gpv-table td:first-child{text-align:left}\n.gp-fv .gpv-table th{font-family:var(--f);font-size:.82rem;color:var(--faint);font-weight:400;padding:0}\n.gp-fv .gpv-table th[aria-sort=\"ascending\"] .gpv-sort,.gp-fv .gpv-table th[aria-sort=\"descending\"] .gpv-sort{color:var(--accent-mid);font-weight:700;background:var(--wash)}\n.gp-fv .gpv-sort{display:block;width:100%;min-height:44px;border:0;background:transparent;color:inherit;font:inherit;text-align:inherit;padding:10px 12px;cursor:pointer;border-radius:var(--r-ctl)}\n.gp-fv .gpv-sort:hover{color:var(--accent-mid)}\n.gp-fv .gpv-sort i{font-style:normal;display:inline-block;width:1em;color:var(--mute)}\n.gp-fv .gpv-table th[aria-sort=\"ascending\"] .gpv-sort i::before{content:\"\\2191\";color:var(--accent-mid)}\n.gp-fv .gpv-table th[aria-sort=\"descending\"] .gpv-sort i::before{content:\"\\2193\";color:var(--accent-mid)}\n.gp-fv .gpv-table td b{font-weight:700;color:var(--ink)}\n.gp-fv .gpv-table tr.is-top td{background:var(--paper2)}\n.gp-fv .gpv-rank{display:inline-flex;align-items:center;justify-content:center;min-width:26px;height:26px;border-radius:var(--r-ctl);background:var(--accent);color:#fff;font-size:.82rem;font-weight:700;margin-right:8px;vertical-align:middle;cursor:help}\n.gp-fv .gpv-rank.is-blank{background:transparent;color:transparent}\n.gp-fv .gpv-cell{position:relative;display:inline-block;min-width:120px;text-align:right}\n.gp-fv .gpv-cell b{position:relative;z-index:1}\n.gp-fv .gpv-cell i{position:absolute;left:0;bottom:-3px;height:4px;border-radius:var(--r-bar);background:#a0d468;display:block}\n.gp-fv .gpv-cell.is-hi i{background:var(--accent-mid)}\n.gp-fv .gpv-table tfoot td{border-bottom:0;border-top:1px solid var(--mute);color:var(--ink);font-weight:700;background:var(--wash)}\n.gp-fv .gpv-table tfoot td small{display:block;font-weight:400;color:var(--dim);font-size:.8rem}\n.gp-fv .gpv-table td.gpv-cv{cursor:help}\n.gp-fv .gpv-cv-hi{color:var(--lose)}\n.gp-fv .gpv-cv-lo{color:var(--pass)}\n.gp-fv .gpv-actions{display:flex;flex-wrap:wrap;align-items:center;gap:8px;margin-top:16px}\n.gp-fv .gpv-actions span{color:var(--dim);font-size:.9rem;margin-right:4px}\n.gp-fv .gpv-chips{display:flex;flex-wrap:wrap;gap:8px}\n.gp-fv .gpv-chip{display:inline-flex;align-items:center;border:1px solid var(--mute);border-radius:var(--r-ctl);padding:9px 14px;font-size:.9rem;color:var(--ink);min-height:44px;background:var(--panel)}\n.gp-fv .gpv-chip.is-hot{border-color:var(--accent-mid);color:var(--accent-mid);font-weight:700}\n.gp-fv .gpv-math-details{margin-top:22px;border:1px solid var(--line);border-radius:var(--r-card);background:var(--panel)}\n.gp-fv .gpv-math-details summary{display:flex;align-items:center;justify-content:space-between;min-height:44px;padding:12px 18px;cursor:pointer;font-weight:700;color:var(--ink);list-style:none}\n.gp-fv .gpv-math-details summary::-webkit-details-marker{display:none}\n.gp-fv .gpv-math-details summary::after{content:\"+\";color:var(--accent-mid);font-size:1.3rem;font-weight:700;line-height:1}\n.gp-fv .gpv-math-details[open] summary::after{content:\"\u2212\"}\n.gp-fv .gpv-math{display:grid;grid-template-columns:1fr 1fr;gap:16px;padding:0 18px 18px}\n.gp-fv .gpv-math-col{background:var(--wash);border:1px solid var(--hair);border-radius:var(--r-card);padding:18px}\n.gp-fv .gpv-math-col h4{font-size:.95rem;margin:0 0 10px}\n.gp-fv .gpv-math-col p{font-family:var(--f);font-size:.88rem;color:var(--ink2);line-height:1.6}\n.gp-fv .gpv-math-col p+p{margin-top:6px}\n.gp-fv .gpv-math-note{grid-column:1 \/ -1;color:var(--dim);font-size:.92rem;line-height:1.6}\n\/* single floating tooltip (rule 17): it floats, so it keeps a shadow *\/\n.gp-fv .gpv-tip{position:fixed;z-index:90;max-width:280px;background:#212121;color:#fff;border-radius:var(--r-ctl);padding:10px 12px;font-size:.85rem;line-height:1.45;box-shadow:0 10px 30px rgba(0,0,0,.25);pointer-events:none;opacity:0;transform:translateY(4px);transition:opacity .15s,transform .15s}\n.gp-fv .gpv-tip.is-on{opacity:1;transform:none}\n.gp-fv .gpv-tip b{display:block;font-family:var(--f);color:#fff;margin-bottom:2px}\n\n\/* ---- bands ---- *\/\n.gp-fv .gpv-center-note{text-align:center;color:var(--dim);font-size:1.02rem;margin-top:22px;max-width:760px;margin-left:auto;margin-right:auto}\n.gp-fv .gpv-center-note b{color:var(--ink)}\n.gp-fv .gpv-band{background:var(--panel);border:1px solid var(--line);border-radius:var(--r-panel);padding:44px}\n.gp-fv .gpv-band p{color:var(--dim);font-size:1.03rem;line-height:1.65;max-width:760px;margin-top:12px}\n.gp-fv .gpv-deep{color:var(--accent-mid);font-weight:700;text-decoration:none;min-height:44px;display:inline-flex;align-items:center}\n.gp-fv .gpv-deep:hover{text-decoration:underline;color:var(--accent-mid)}\n.gp-fv .gpv-linksep{display:inline-block;width:18px}\n.gp-fv .gpv-aiband{display:flex;align-items:center;gap:24px;flex-wrap:wrap;background:var(--wash);border:1px solid var(--line);border-radius:var(--r-panel);padding:28px 32px}\n.gp-fv .gpv-aiband-txt{flex:1 1 380px}\n.gp-fv .gpv-aiband h2{font-size:clamp(1.4rem,2.2vw,2rem);font-weight:700}\n.gp-fv .gpv-aiband p{color:var(--dim);margin-top:8px;line-height:1.6}\n\n\/* ---- FAQ (native details\/summary; no JS) ---- *\/\n.gp-fv .gpv-faq{max-width:860px;margin:0 auto}\n.gp-fv .gpv-faq details{background:var(--panel);border:1px solid var(--line);border-radius:var(--r-card);margin-top:10px;overflow:hidden}\n.gp-fv .gpv-faq summary{display:flex;align-items:center;justify-content:space-between;gap:12px;min-height:44px;padding:14px 18px;cursor:pointer;font-family:var(--f);color:var(--ink);list-style:none}\n.gp-fv .gpv-faq summary::-webkit-details-marker{display:none}\n.gp-fv .gpv-faq summary h3{font-size:1.05rem;font-weight:700;line-height:1.4;margin:0}\n.gp-fv .gpv-faq summary::after{content:\"+\";color:var(--accent-mid);font-size:1.3rem;font-weight:700;line-height:1}\n.gp-fv .gpv-faq details[open] summary::after{content:\"\u2212\"}\n.gp-fv .gpv-faq details p{padding:0 18px 16px;color:var(--dim);font-size:.98rem;line-height:1.6}\n\n\/* ---- testimonials carousel: five public customer quotes (geopard.tech homepage) ---- *\/\n.gp-fv .gpv-tcar{position:relative;max-width:1136px;margin:0 auto}\n.gp-fv .gpv-ttrack{display:flex;gap:16px;overflow-x:auto;scroll-snap-type:x mandatory;scrollbar-width:none;padding:4px 2px 8px;-webkit-overflow-scrolling:touch}\n.gp-fv .gpv-ttrack::-webkit-scrollbar{display:none}\n.gp-fv .gpv-ttrack:focus-visible{outline:2px solid var(--accent-mid);outline-offset:4px;border-radius:var(--r-card)}\n.gp-fv .gpv-tcard{flex:0 0 calc((100% - 32px) \/ 3);scroll-snap-align:start;display:flex;flex-direction:column;justify-content:space-between;margin:0;background:var(--panel);border:1px solid var(--line);border-radius:var(--r-card);padding:22px}\n.gp-fv .gpv-tcard blockquote{margin:0 0 18px;font-family:var(--f);font-size:1rem;font-weight:400;line-height:1.55;color:var(--ink)}\n.gp-fv .gpv-tperson{display:flex;align-items:center;gap:12px}\n.gp-fv .gpv-tperson img,.gp-fv .gpv-tinitials{width:48px;height:48px;border-radius:50%;object-fit:cover;flex:0 0 48px}\n.gp-fv .gpv-tinitials{display:inline-flex;align-items:center;justify-content:center;background:var(--wash);color:var(--accent-mid);font-family:var(--f);font-weight:700}\n.gp-fv .gpv-tperson b{display:block;font-family:var(--f);font-weight:700;color:var(--ink);font-size:.95rem}\n.gp-fv .gpv-tperson small{display:block;color:var(--dim);font-size:.85rem}\n.gp-fv .gpv-tnav{display:flex;align-items:center;justify-content:center;gap:10px;margin-top:12px}\n.gp-fv .gpv-tbtn{width:44px;height:44px;border-radius:50%;border:1px solid var(--mute);background:var(--panel);color:var(--accent-mid);font-size:1.15rem;line-height:1;cursor:pointer;display:inline-flex;align-items:center;justify-content:center;padding:0}\n.gp-fv .gpv-tbtn:hover{border-color:var(--accent-mid)}\n.gp-fv .gpv-tdots{display:flex}\n.gp-fv .gpv-tdot{width:44px;height:44px;border:0;background:transparent;padding:0;cursor:pointer;position:relative}\n.gp-fv .gpv-tdot::after{content:\"\";position:absolute;left:50%;top:50%;width:10px;height:10px;margin:-5px 0 0 -5px;border-radius:50%;background:var(--mute);transition:background .2s,transform .2s}\n.gp-fv .gpv-tdot.is-on::after{background:var(--accent-mid);transform:scale(1.2)}\n@media (max-width:1100px){ .gp-fv .gpv-tcard{flex-basis:calc((100% - 16px) \/ 2)} }\n@media (max-width:700px){ .gp-fv .gpv-tcard{flex-basis:100%} }\n\n\/* ---- CTA ---- *\/\n.gp-fv .gpv-cta{text-align:center;padding-bottom:96px}\n.gp-fv .gpv-cta h2{font-size:clamp(1.9rem,3.2vw,2.9rem);font-weight:700;max-width:760px;margin:0 auto}\n.gp-fv .gpv-cta .gpv-lede{max-width:640px;margin:14px auto 0}\n\n\/* ---- tap-to-zoom lightbox (floats: shadow allowed) ---- *\/\n.gp-fv .gpv-lightbox{position:fixed;top:0;left:0;right:0;bottom:0;z-index:80;display:none;align-items:center;justify-content:center;background:rgba(8,14,24,.93);padding:20px;cursor:zoom-out}\n.gp-fv .gpv-lightbox.is-open{display:flex}\n.gp-fv .gpv-lightbox img{max-width:100%;max-height:100%;object-fit:contain;border-radius:var(--r-card);box-shadow:0 20px 80px rgba(0,0,0,.6)}\n.gp-fv .gpv-lightbox-close{position:absolute;top:16px;right:16px;width:44px;height:44px;border-radius:50%;border:1px solid rgba(255,255,255,.4);background:rgba(255,255,255,.08);color:#fff;font-size:1.3rem;line-height:1;display:flex;align-items:center;justify-content:center;cursor:pointer}\n\n\/* ---- craft ---- *\/\n.gp-fv ::selection{background:var(--accent-soft);color:#ffffff}\n.gp-fv a:focus-visible,.gp-fv button:focus-visible,.gp-fv [tabindex]:focus-visible,.gp-fv summary:focus-visible,.gp-fv select:focus-visible{outline:2px solid var(--accent-mid);outline-offset:2px;border-radius:var(--r-ctl)}\n@media (hover:hover) and (prefers-reduced-motion: no-preference){\n  .gp-fv .gpv-card,.gp-fv .gpv-shot{transition:border-color .2s}\n  .gp-fv .gpv-card:hover,.gp-fv .gpv-shot:hover{border-color:var(--mute)}\n}\n@media (prefers-reduced-motion: no-preference){\n  .gp-fv.gpv-live [data-reveal]{opacity:0;transform:translateY(20px)}\n  .gp-fv.gpv-live [data-reveal].is-in{opacity:1;transform:none;transition:opacity .6s,transform .6s}\n  .gp-fv .gpv-hero h1{animation:gpv-rise .7s .05s cubic-bezier(.2,.7,.2,1) both}\n  .gp-fv .gpv-hero .gpv-lede{animation:gpv-rise .7s .26s cubic-bezier(.2,.7,.2,1) both}\n  .gp-fv .gpv-hero .gpv-hero-ctas{animation:gpv-rise .7s .36s cubic-bezier(.2,.7,.2,1) both}\n  .gp-fv .gpv-hero .gpv-arcade-wrap{animation:gpv-rise .85s .48s cubic-bezier(.2,.7,.2,1) both}\n}\n@keyframes gpv-rise{from{opacity:0;transform:translateY(26px)}to{opacity:1;transform:none}}\n\n\/* ---- widescreen (rule 13) ---- *\/\n@media (min-width:1440px){\n  .gp-fv section{max-width:1320px}\n  .gp-fv .gpv-arcade-wrap{max-width:1180px}\n}\n\/* ---- tablet \/ mobile (rule 9) ---- *\/\n@media (max-width:980px){\n  .gp-fv .gpv-cards,.gp-fv .gpv-cards4{grid-template-columns:repeat(2,1fr)}\n}\n@media (max-width:820px){\n  .gp-fv section{padding:48px 18px}\n  \/* mobile hero: title, WALKTHROUGH, then CTAs; the lede is retold below *\/\n  .gp-fv .gpv-hero{display:flex;flex-direction:column;align-items:center}\n  .gp-fv .gpv-hero h1{order:1}\n  .gp-fv .gpv-hero .gpv-arcade-wrap{order:3;margin-top:22px;width:100%}\n  .gp-fv .gpv-hero .gpv-hero-ctas{order:4;margin-top:22px}\n  .gp-fv .gpv-hero .gpv-lede{display:none}\n  .gp-fv .gpv-controls,.gp-fv .gpv-math{grid-template-columns:1fr}\n  .gp-fv .gpv-bench{padding:20px 16px}\n  .gp-fv .gpv-band{padding:26px 20px}\n  .gp-fv .gpv-aiband{padding:22px 18px}\n  .gp-fv .gpv-table{font-size:.9rem}\n  .gp-fv .gpv-table td{padding:8px 8px}\n  .gp-fv .gpv-sort{padding:8px 8px}\n  .gp-fv .gpv-cell{min-width:90px}\n}\n@media (max-width:600px){\n  .gp-fv .gpv-cards,.gp-fv .gpv-cards4,.gp-fv .gpv-cards2,.gp-fv .gpv-shots2{grid-template-columns:1fr}\n  .gp-fv .gpv-arcade-head{padding:10px 14px}\n  .gp-fv .gpv-arcade-open{font-size:.9rem;padding:0 18px;bottom:14px}\n}\n@media (max-width:480px){\n  .gp-fv .gpv-hero{padding-top:0}\n}\n\/* ===== GPV:CSS END ===== *\/\n<\/style>\n\n<main class=\"gpv-main\">\n\n<section class=\"gpv-hero\" id=\"gpv-s1\">\n  <h1><span class=\"gpv-accent\">Farm View.<\/span> Which fields come first?<\/h1>\n  <p class=\"gpv-lede\">Benchmark every field on one map and see which to target first: the most variable, the lowest by yield, lime candidates by pH, the lowest current vegetation, the steepest. Then sort the attributes table on any layer: satellite, soil, yield, as-applied, as-planted and topography.<\/p>\n  <div class=\"gpv-hero-ctas\">\n    <a class=\"gpv-btn\" href=\"https:\/\/app.geopard.tech\/auth\/sign-up?utm_source=geopard.tech&amp;utm_medium=landing&amp;utm_campaign=farm-view\">Try Farm View free<\/a>\n    <a class=\"gpv-btn-ghost\" href=\"https:\/\/docs.geopard.tech\/geopard-tutorials\/changelog-and-product-releases\/release-web-march-2026-field-trials-design-generative-synthetic-yield-maps-farm-view-stats-mcp\">Read documentation<\/a>\n  <\/div>\n  <div class=\"gpv-arcade-wrap\" id=\"gpv-arcade-wrap\">\n    <div class=\"gpv-arcade-head\"><b>Interactive walkthrough<\/b><span>First the field tree, then the layer picker and the map, on a real farm.<\/span><\/div>\n    <div class=\"gpv-arcade\" id=\"gpv-arcade\" data-arcade=\"https:\/\/demo.arcade.software\/zhO4vF1iSjRPrK7qlyU0?embed&amp;embed_mobile=inline&amp;embed_desktop=inline&amp;show_copy_link=false\">\n      <a class=\"gpv-arcade-fallback\" href=\"https:\/\/app.arcade.software\/share\/zhO4vF1iSjRPrK7qlyU0\">\n        <img fetchpriority=\"high\" src=\"https:\/\/i0.wp.com\/geopard.tech\/wp-content\/uploads\/2026\/10\/farm-view-walkthrough-poster-full.jpg?w=1600&amp;quality=88&amp;ssl=1\" srcset=\"https:\/\/i0.wp.com\/geopard.tech\/wp-content\/uploads\/2026\/10\/farm-view-walkthrough-poster-full.jpg?w=1080&amp;quality=88&amp;ssl=1 1080w, https:\/\/i0.wp.com\/geopard.tech\/wp-content\/uploads\/2026\/10\/farm-view-walkthrough-poster-full.jpg?w=1600&amp;quality=88&amp;ssl=1 1600w\" sizes=\"(max-width: 1120px) 100vw, 1080px\" alt=\"Farm View: field tree, map layers, six fields with potassium legends, and the statistics table with the Create Sampling Plans and Create Equation Batch buttons\" width=\"1600\" height=\"860\" decoding=\"async\" fetchpriority=\"high\">\n        <span class=\"gpv-arcade-open\">Start the walkthrough<\/span>\n      <\/a>\n    <\/div>\n  <\/div>\n<\/section>\n\n<nav class=\"gpv-secnav\" id=\"gpv-secnav\" aria-label=\"Page sections\">\n  <div class=\"gpv-secnav-row\">\n    <a href=\"#gpv-s2\">Benchmark<\/a><a href=\"#gpv-s3\">What you get<\/a><a href=\"#gpv-s4\">Prioritize<\/a><a href=\"#gpv-s5\">Next actions<\/a><a href=\"#gpv-s6\">ROI<\/a><a href=\"#gpv-s7\">Who it is for<\/a><a href=\"#gpv-faq\">FAQ<\/a>\n  <\/div>\n<\/nav>\n\n<section id=\"gpv-s2\">\n  <div class=\"gpv-sechead\">\n    <div class=\"gpv-kicker\">Benchmark<\/div>\n    <h2 class=\"gpv-h2\">Sort the farm by any attribute.<\/h2>\n    <p class=\"gpv-lede\">The attributes table under the map, on a sample farm. Pick what to find, or any layer and a rule; the top three fields are marked, every column sorts both ways, and the farm row underneath is weighted by area as well as totalled.<\/p>\n  <\/div>\n  <div class=\"gpv-bench\" id=\"gpv-bench\" data-reveal data-no-translation>\n    <div class=\"gpv-bench-head\">\n      <h3>Sample farm<\/h3>\n      <div class=\"gpv-units\" id=\"gpv-units\">\n        <span id=\"gpv-units-label\">Shown in metric units: ha, t\/ha.<\/span>\n        <button class=\"gpv-units-btn\" id=\"gpv-units-btn\" type=\"button\">Switch to US units<\/button>\n      <\/div>\n    <\/div>\n    <p class=\"gpv-sample\">Six corn fields, <b id=\"gpv-farm-area\">314 ha<\/b>, with satellite imagery, a soil lab round, the last harvest, the as-applied and as-planted maps, and topography. Indeed, the potassium figures are the ones in the walkthrough.<\/p>\n    <div class=\"gpv-find\" id=\"gpv-find\" role=\"group\" aria-label=\"Find\">\n      <span class=\"gpv-find-label\">Find<\/span>\n      <button class=\"gpv-fchip\" type=\"button\" data-find=\"variable\">Most variable fields<\/button>\n      <button class=\"gpv-fchip\" type=\"button\" data-find=\"lowyield\">Lowest by yield<\/button>\n      <button class=\"gpv-fchip\" type=\"button\" data-find=\"lime\">Lime candidates by pH<\/button>\n      <button class=\"gpv-fchip\" type=\"button\" data-find=\"lowveg\">Lowest current vegetation<\/button>\n      <button class=\"gpv-fchip\" type=\"button\" data-find=\"steep\">Steepest fields<\/button>\n      <button class=\"gpv-fchip\" type=\"button\" data-find=\"highn\">Highest applied nitrogen<\/button>\n      <button class=\"gpv-fchip\" type=\"button\" data-find=\"lowseed\">Lowest seeding rate<\/button>\n    <\/div>\n    <div class=\"gpv-controls\">\n      <div class=\"gpv-ctl\">\n        <label for=\"gpv-layer\">Data layer<\/label>\n        <select id=\"gpv-layer\">\n          <optgroup label=\"Satellite\"><option value=\"satnow\">Current vegetation, NDVI<\/option><option value=\"ndvi\">Long-term productivity<\/option><\/optgroup>\n          <optgroup label=\"Soil\"><option value=\"k\" selected>Potassium<\/option><option value=\"ph\">pH<\/option><option value=\"om\">Organic matter<\/option><\/optgroup>\n          <optgroup label=\"Yield\"><option value=\"yld\">Last harvest<\/option><\/optgroup>\n          <optgroup label=\"As-applied\"><option value=\"asapplied\">Nitrogen rate<\/option><\/optgroup>\n          <optgroup label=\"As-planted\"><option value=\"asplanted\">Seeding rate<\/option><\/optgroup>\n          <optgroup label=\"Topography\"><option value=\"slope\">Slope<\/option><\/optgroup>\n        <\/select>\n        <small id=\"gpv-layer-note\">Lab results on a 1 ha grid, interpolated inside each boundary.<\/small>\n      <\/div>\n      <div class=\"gpv-ctl\">\n        <label for=\"gpv-rule\">Rank by<\/label>\n        <select id=\"gpv-rule\">\n          <option value=\"cv\" selected>Most variable first<\/option>\n          <option value=\"low\">Lowest average first<\/option>\n          <option value=\"high\">Highest average first<\/option>\n        <\/select>\n        <small id=\"gpv-rule-note\">Zone sampling and variable rate pay most where the field is least uniform.<\/small>\n      <\/div>\n    <\/div>\n    <div class=\"gpv-verdict\" id=\"gpv-verdict\">\n      <span class=\"gpv-verdict-kicker\">Top three<\/span>\n      <p id=\"gpv-verdict-line\"><\/p>\n      <small id=\"gpv-verdict-sub\"><\/small>\n    <\/div>\n    <div class=\"gpv-table-wrap\">\n      <table class=\"gpv-table\" id=\"gpv-table\">\n        <thead><tr>\n          <th scope=\"col\" data-col=\"name\"><button class=\"gpv-sort\" type=\"button\" data-col=\"name\">Field <i><\/i><\/button><\/th>\n          <th scope=\"col\" data-col=\"area\"><button class=\"gpv-sort\" type=\"button\" data-col=\"area\">Area, <span id=\"gpv-u-area\">ha<\/span> <i><\/i><\/button><\/th>\n          <th scope=\"col\" data-col=\"avg\"><button class=\"gpv-sort\" type=\"button\" data-col=\"avg\">Average<span id=\"gpv-u-avg\"><\/span> <i><\/i><\/button><\/th>\n          <th scope=\"col\" data-col=\"min\"><button class=\"gpv-sort\" type=\"button\" data-col=\"min\">Min <i><\/i><\/button><\/th>\n          <th scope=\"col\" data-col=\"max\"><button class=\"gpv-sort\" type=\"button\" data-col=\"max\">Max <i><\/i><\/button><\/th>\n          <th scope=\"col\" data-col=\"cv\"><button class=\"gpv-sort\" type=\"button\" data-col=\"cv\">CV % <i><\/i><\/button><\/th>\n        <\/tr><\/thead>\n        <tbody id=\"gpv-body\"><\/tbody>\n        <tfoot><tr id=\"gpv-foot\"><\/tr><\/tfoot>\n      <\/table>\n    <\/div>\n    <div class=\"gpv-actions\">\n      <span>In GeoPard, the same table opens:<\/span>\n      <div class=\"gpv-chips\"><span class=\"gpv-chip is-hot\">Create Sampling Plans<\/span><span class=\"gpv-chip is-hot\">Create Equation Batch<\/span><span class=\"gpv-chip\">Export<\/span><\/div>\n    <\/div>\n    <details class=\"gpv-math-details\">\n      <summary>How the numbers are calculated<\/summary>\n      <div class=\"gpv-math\">\n        <div class=\"gpv-math-col\" data-reveal>\n          <h4>Per field<\/h4>\n          <p>Average = mean of the layer&#8217;s cells inside the field boundary<\/p>\n          <p>Min and Max = lowest and highest cell inside the boundary<\/p>\n          <p>CV % = standard deviation \u00f7 average \u00d7 100<\/p>\n        <\/div>\n        <div class=\"gpv-math-col\" data-reveal>\n          <h4>Farm row<\/h4>\n          <p>Area = sum of the selected fields<\/p>\n          <p>Average = field averages weighted by area<\/p>\n          <p>Min and Max = lowest minimum and highest maximum<\/p>\n        <\/div>\n        <p class=\"gpv-math-note\"><b>Rank<\/b> orders the fields by the rule, so the badge stays on the same field whichever column the table is sorted by. On yield, slope and productivity the Farm row&#8217;s CV is the area-weighted mean of the field CVs.<\/p>\n      <\/div>\n    <\/details>\n  <\/div>\n<\/section>\n\n<section id=\"gpv-s3\">\n  <div class=\"gpv-sechead\">\n    <div class=\"gpv-kicker\">What you get<\/div>\n    <h2 class=\"gpv-h2\">What is in Farm View.<\/h2>\n    <p class=\"gpv-lede\">The farm as one map, with a statistics panel that reads whichever layer is on it. Select the farms and fields in the tree, then the panel fills in.<\/p>\n  <\/div>\n  <div class=\"gpv-cards\">\n    <div class=\"gpv-card\" data-reveal><h3>Every field on one map<\/h3><span>Boundaries render together, each with its own legend, so a weak field stands out next to its neighbours.<\/span><\/div>\n    <div class=\"gpv-card\" data-reveal><h3>Any data layer<\/h3><span>Satellite imagery, soil by any lab attribute, yield, as-applied, as-planted, topography and zones maps, either raw or processed. In addition, a transparency slider blends the layer over the basemap.<\/span><\/div>\n    <div class=\"gpv-card\" data-reveal><h3>Attributes table for any layer<\/h3><span>Area, average, minimum, maximum and CV % per field for whichever layer is on the map, as well as the heterogeneity factor whenever it is a zones map.<\/span><\/div>\n    <div class=\"gpv-card\" data-reveal><h3>Sort by any column<\/h3><span>Ascending or descending on every attribute, so the best candidates rise to the top, with the farm total and the area-weighted average underneath.<\/span><\/div>\n    <div class=\"gpv-card\" data-reveal><h3>Export<\/h3><span>The table leaves as a file, so the ranking reaches the agronomist&#8217;s spreadsheet or the grower meeting unchanged. As a result, everyone argues from the same numbers.<\/span><\/div>\n    <div class=\"gpv-card\" data-reveal><h3>Quick actions<\/h3><span>Create Sampling Plans and Create Equation Batch open with the selected fields already in, so the ranking becomes work orders.<\/span><\/div>\n  <\/div>\n  <div class=\"gpv-check\" data-reveal>\n    <h3>Before you start<\/h3>\n    <p><b>Fields with a boundary.<\/b> Satellite imagery and topography are there for every field without an upload, whereas soil, yield and as-applied layers need an import or a John Deere Operations Center sync.<\/p>\n    <p><b>Processed or raw.<\/b> Cleaned yield and interpolated soil layers are marked Processed in the picker, so they are the default for benchmarking.<\/p>\n    <p><b>Labels on the fields.<\/b> The filter reads field names and labels, so a crop or a landlord label selects the right set at once.<\/p>\n  <\/div>\n<\/section>\n\n<section id=\"gpv-s4\">\n  <div class=\"gpv-sechead\">\n    <div class=\"gpv-kicker\">Prioritize<\/div>\n    <h2 class=\"gpv-h2\">Which fields to target first.<\/h2>\n    <p class=\"gpv-lede\">One layer and one sort, then the best candidates are at the top of the table.<\/p>\n  <\/div>\n  <div class=\"gpv-cards\">\n    <div class=\"gpv-card\" data-reveal><span class=\"gpv-num\">Most variable<\/span><h3>Which fields get the soil sampling budget?<\/h3><span>Sort by CV % on the last soil layer, then open Create Sampling Plans with the top of the list. Uniform fields can wait a season, because a flat rate already fits them.<\/span><\/div>\n    <div class=\"gpv-card\" data-reveal><span class=\"gpv-num\">Lowest by yield<\/span><h3>Where is the limiting factor?<\/h3><span>Sort the last harvest lowest first, then open the field in Compare Layers with soil and topography next to the yield, so the cause is known before a rate changes.<\/span><\/div>\n    <div class=\"gpv-card\" data-reveal><span class=\"gpv-num\">Lime candidates<\/span><h3>Which fields need lime this autumn?<\/h3><span>Sort soil pH lowest first, because lime raises pH. The acidic fields head the lime plan, and a wide minimum-to-maximum gap on one of them is where a variable-rate lime map pays, so confirm the rates with trial strips before scaling them.<\/span><\/div>\n    <div class=\"gpv-card\" data-reveal><span class=\"gpv-num\">Lowest vegetation<\/span><h3>Where do I scout first?<\/h3><span>Sort the latest NDVI lowest first. A field below the farm average mid-season is the first stop, and then the note goes into Scouting from the same map.<\/span><\/div>\n    <div class=\"gpv-card\" data-reveal><span class=\"gpv-num\">Steepest<\/span><h3>Where do runoff and erosion start?<\/h3><span>Sort slope highest first. The steep fields get the conservation tillage, the buffer strips and the nitrogen split, while their 3D maps show where the water goes.<\/span><\/div>\n    <div class=\"gpv-card\" data-reveal><span class=\"gpv-num\">As-applied, as-planted<\/span><h3>Did the machines do what was planned?<\/h3><span>Sort the applied nitrogen highest first and the seeding rate lowest first. In that case a field far from the plan is an execution issue rather than an agronomic one.<\/span><\/div>\n  <\/div>\n<\/section>\n\n<section id=\"gpv-s5\">\n  <div class=\"gpv-sechead\">\n    <div class=\"gpv-kicker\">Next actions<\/div>\n    <h2 class=\"gpv-h2\">From the ranking to the field.<\/h2>\n  <\/div>\n  <div class=\"gpv-cards\">\n    <div class=\"gpv-card\" data-reveal><h3>Create Sampling Plans<\/h3><span>Grid or zonal, core or composite, for all selected fields in one run. Then the path is routed, the lab labels are printed, and the points are on the mobile app.<\/span><\/div>\n    <div class=\"gpv-card\" data-reveal><h3>Create Equation Batch<\/h3><span>One equation across the selected fields: nutrient removal, a variable-rate prescription or a profit map. In each case the average and total per field come along.<\/span><\/div>\n    <div class=\"gpv-card\" data-reveal><h3>Export the table<\/h3><span>The ranking with the same columns for every field, for the budget meeting as well as the landlord report. Therefore the order of work is agreed once.<\/span><\/div>\n  <\/div>\n  <div class=\"gpv-shots2 gpv-shots-gap\">\n    <figure class=\"gpv-shot\" data-reveal>\n      <img loading=\"lazy\" src=\"https:\/\/i0.wp.com\/geopard.tech\/wp-content\/uploads\/2026\/10\/farm-view-batch-equation-select.png?w=1152&amp;quality=90&amp;ssl=1\" data-full=\"https:\/\/i0.wp.com\/geopard.tech\/wp-content\/uploads\/2026\/10\/farm-view-batch-equation-select.png?w=1152&amp;ssl=1\" alt=\"Batch equation analytics: choose a saved equation and the fields it runs on\" width=\"1152\" height=\"620\" loading=\"lazy\" decoding=\"async\">\n      <figcaption>Equation batch: the saved equation, with its variables, for the selected fields.<\/figcaption>\n    <\/figure>\n    <figure class=\"gpv-shot\" data-reveal>\n      <img loading=\"lazy\" src=\"https:\/\/i0.wp.com\/geopard.tech\/wp-content\/uploads\/2026\/10\/farm-view-batch-equation-results.png?w=1152&amp;quality=90&amp;ssl=1\" data-full=\"https:\/\/i0.wp.com\/geopard.tech\/wp-content\/uploads\/2026\/10\/farm-view-batch-equation-results.png?w=1152&amp;ssl=1\" alt=\"Batch equation analytics results: one nitrogen removal map per field with average and sum\" width=\"1152\" height=\"664\" loading=\"lazy\" decoding=\"async\">\n      <figcaption>One nitrogen removal map per field, with the average and the total.<\/figcaption>\n    <\/figure>\n  <\/div>\n  <p class=\"gpv-center-note\"><b>Getting data in:<\/b> yield and as-applied layers sync from John Deere Operations Center or import as files, while soil results import as CSV, Excel or shapefile.<\/p>\n<\/section>\n\n<section id=\"gpv-s6\">\n  <div class=\"gpv-sechead\">\n    <div class=\"gpv-kicker\">ROI<\/div>\n    <h2 class=\"gpv-h2\">Where ROI comes from.<\/h2>\n  <\/div>\n  <div class=\"gpv-cards\">\n    <div class=\"gpv-card\" data-reveal><h3>Prioritization<\/h3><span>Sampling, scouting and variable-rate budgets go to the fields that move the farm average instead of being spread evenly. Consequently the same budget returns more.<\/span><\/div>\n    <div class=\"gpv-card\" data-reveal><h3>Input savings<\/h3><span>A flat rate on a field whose maximum is three times its minimum is the first place to cut, because half of that product lands where it is not needed.<\/span><\/div>\n    <div class=\"gpv-card\" data-reveal><h3>Yield gains<\/h3><span>Fields below the farm average on long-term productivity carry the upside, so they are where a limiting factor is worth finding first.<\/span><\/div>\n    <div class=\"gpv-card\" data-reveal><h3>Time<\/h3><span>One table replaces opening the fields one at a time. As a result, the farm review before the season takes an hour rather than a day.<\/span><\/div>\n    <div class=\"gpv-card\" data-reveal><h3>Risk reduction<\/h3><span>A field whose minimum sits far below the rest is checked before planting instead of being explained after harvest.<\/span><\/div>\n    <div class=\"gpv-card\" data-reveal><h3>Evidence<\/h3><span>An exported table with the same numbers for every field settles the ranking with owners as well as advisors, because nobody argues with a column they can sort.<\/span><\/div>\n  <\/div>\n<\/section>\n\n<section id=\"gpv-s7\">\n  <div class=\"gpv-sechead\">\n    <div class=\"gpv-kicker\">Who it is for<\/div>\n    <h2 class=\"gpv-h2\">Growers, advisors, cooperatives, and producers.<\/h2>\n  <\/div>\n  <div class=\"gpv-cards gpv-cards4\">\n    <div class=\"gpv-card\" data-reveal><h3>Growers and farm managers<\/h3><span>Rank the farm before the season, then spend the sampling and input budget where it returns. Afterwards, the harvest shows whether the ranking held.<\/span><\/div>\n    <div class=\"gpv-card\" data-reveal><h3>Agronomists and advisors<\/h3><span>Benchmark every client field on one layer, then walk into the meeting with the order of work.<\/span><\/div>\n    <div class=\"gpv-card\" data-reveal><h3>Cooperatives and agriholdings<\/h3><span>Hundreds of fields across farms and organizations, with roles and sharing per team, in one table. So a regional lead sees the whole estate on one layer.<\/span><\/div>\n    <div class=\"gpv-card\" data-reveal><h3>Seed and fertilizer producers<\/h3><span>Rank trial fields by the response layer, then run the same equation across all of them in a batch. Finally, the averages go into the trial report.<\/span><\/div>\n  <\/div>\n  <div class=\"gpv-band gpv-shots-gap\" data-reveal>\n    <div class=\"gpv-kicker\">For dealers and ag retailers<\/div>\n    <h2 class=\"gpv-h2\" style=\"font-size:clamp(1.3rem,2vw,1.8rem)\">Offer it under your own brand.<\/h2>\n    <p>Farm View ships in GeoPard white-label deployments, so your growers benchmark their farms inside your brand. Likewise, the sampling plans and the equation batch run under it.<\/p>\n    <p style=\"margin-top:14px\"><a class=\"gpv-deep\" href=\"https:\/\/geopard.tech\/white-labels\/\">White label solutions<\/a>\n    <span class=\"gpv-linksep\"> <\/span>\n    <a class=\"gpv-deep\" href=\"https:\/\/geopard.tech\/partner\/\">Partner program<\/a><\/p>\n  <\/div>\n<\/section>\n\n<section id=\"gpv-ai\">\n  <div class=\"gpv-aiband\" data-reveal>\n    <div class=\"gpv-aiband-txt\">\n      <h2>Ask the AI Assistant which field comes first.<\/h2>\n      <p>It reads the same fields and layers: ask for the most variable fields on potassium, or have it start the sampling plans for them. Either way, you approve every step.<\/p>\n    <\/div>\n    <a class=\"gpv-btn\" href=\"https:\/\/geopard.tech\/ai\/\">Meet the AI Assistant<\/a>\n  <\/div>\n<\/section>\n\n<section class=\"gpv-faqsec\" id=\"gpv-faq\">\n  <div class=\"gpv-sechead\">\n    <div class=\"gpv-kicker\">FAQ<\/div>\n    <h2 class=\"gpv-h2\">Common questions.<\/h2>\n  <\/div>\n  <div class=\"gpv-faq\">\n    <details>\n      <summary><h3>Which data layers can I benchmark?<\/h3><\/summary>\n      <p>Satellite imagery, soil by any lab attribute or scan, yield, as-applied, as-planted, topography and zones maps, either raw or processed. Then the attributes table reads whichever layer is selected on the map, one attribute at a time.<\/p>\n    <\/details>\n    <details>\n      <summary><h3>What does a high CV % mean for a field?<\/h3><\/summary>\n      <p>CV % is the standard deviation divided by the average, so it compares variability across fields with different averages. A soil nutrient above 25% is usually worth zone sampling, whereas below 10% a flat rate is defensible; confirm the cut-off with your lab and crop plan.<\/p>\n    <\/details>\n    <details>\n      <summary><h3>Can I benchmark fields across several farms?<\/h3><\/summary>\n      <p>Yes. Select several farms in the tree, or filter by field name or label, then the table lists every selected field. In addition, the farm total and the weighted average sit underneath.<\/p>\n    <\/details>\n    <details>\n      <summary><h3>How do the layers get into GeoPard?<\/h3><\/summary>\n      <p>Satellite imagery and topography are there as soon as a boundary exists. Yield and as-applied layers sync from John Deere Operations Center or import as files, while soil results import as CSV, Excel or shapefile.\n      <a class=\"gpv-deep\" href=\"https:\/\/docs.geopard.tech\/geopard-tutorials\/changelog-and-product-releases\/release-web-march-2026-field-trials-design-generative-synthetic-yield-maps-farm-view-stats-mcp\">Read the Farm View notes<\/a><\/p>\n    <\/details>\n  <\/div>\n<\/section>\n\n<section class=\"gpv-quotesec\" id=\"gpv-quote\">\n  <div class=\"gpv-sechead\">\n    <div class=\"gpv-kicker\">Customers<\/div>\n    <h2 class=\"gpv-h2\">What GeoPard users say.<\/h2>\n  <\/div>\n  <div class=\"gpv-tcar\" id=\"gpv-tcar\" data-reveal>\n    <div class=\"gpv-ttrack\" id=\"gpv-ttrack\" tabindex=\"0\" aria-label=\"Customer testimonials, use the arrow keys to move\">\n    <figure class=\"gpv-tcard\">\n      <blockquote>&#8220;GeoPard doesn&#8217;t just help us visualise data, it gives us the tools to analyse it, create solutions, and write prescriptions.&#8221;<\/blockquote>\n      <figcaption class=\"gpv-tperson\"><img loading=\"lazy\" loading=\"lazy\" decoding=\"async\" src=\"https:\/\/i0.wp.com\/geopard.tech\/wp-content\/uploads\/2021\/10\/Steve-Larocque-e1633670985874.jpg?w=112&amp;ssl=1\" alt=\"Steve Larocque\" width=\"56\" height=\"56\"><span><b>Steve Larocque<\/b><small>Beyond Agronomy owner and FarmVU CEO<\/small><\/span><\/figcaption>\n    <\/figure>\n    <figure class=\"gpv-tcard\">\n      <blockquote>&#8220;A system where I store my own data and receive current satellite imagery from my fields, securely in the cloud and accessible any time. My data is only shared when I give permission.&#8221;<\/blockquote>\n      <figcaption class=\"gpv-tperson\"><img loading=\"lazy\" loading=\"lazy\" decoding=\"async\" src=\"https:\/\/i0.wp.com\/geopard.tech\/wp-content\/uploads\/2021\/10\/Databoerin-Nicole-Bartelds-e1633670897845.jpg?w=112&amp;ssl=1\" alt=\"Nicole Bartelds\" width=\"56\" height=\"56\"><span><b>Nicole Bartelds<\/b><small>Databoerin<\/small><\/span><\/figcaption>\n    <\/figure>\n    <figure class=\"gpv-tcard\">\n      <blockquote>&#8220;Using GeoPard has streamlined key parts of our workflow. In seasons where time is money, we can rely on the GeoPard team to get it done.&#8221;<\/blockquote>\n      <figcaption class=\"gpv-tperson\"><img loading=\"lazy\" loading=\"lazy\" decoding=\"async\" src=\"https:\/\/i0.wp.com\/geopard.tech\/wp-content\/uploads\/2021\/10\/Brendon-Friesen.jpeg?w=112&amp;ssl=1\" alt=\"Brendon Friesen\" width=\"56\" height=\"56\"><span><b>Brendon Friesen<\/b><small>PointForward, operations and technology manager<\/small><\/span><\/figcaption>\n    <\/figure>\n    <figure class=\"gpv-tcard\">\n      <blockquote>&#8220;We&#8217;re happy to have GeoPard among the platforms working with SoilOptix data, giving growers and agronomists the tools to accurately analyse and manage their fields.&#8221;<\/blockquote>\n      <figcaption class=\"gpv-tperson\"><img loading=\"lazy\" loading=\"lazy\" decoding=\"async\" src=\"https:\/\/i0.wp.com\/geopard.tech\/wp-content\/uploads\/2021\/10\/Zachary-Harmer-SoilOptix%C2%AE.jpg?w=112&amp;ssl=1\" alt=\"Zachary Harmer\" width=\"56\" height=\"56\"><span><b>Zachary Harmer<\/b><small>SoilOptix<\/small><\/span><\/figcaption>\n    <\/figure>\n    <figure class=\"gpv-tcard\">\n      <blockquote>&#8220;GeoPard&#8217;s analytics make it easy for our team and farmers to use precision-ag tools effectively. Reliable analytics and steady support through the season improved our input planning.&#8221;<\/blockquote>\n      <figcaption class=\"gpv-tperson\"><span class=\"gpv-tinitials\" aria-hidden=\"true\">SB<\/span><span><b>Sergio Bassan<\/b><small>Precision agriculture agronomist, Italy<\/small><\/span><\/figcaption>\n    <\/figure>\n    <\/div>\n    <div class=\"gpv-tnav\">\n      <button class=\"gpv-tbtn\" id=\"gpv-tprev\" type=\"button\" aria-label=\"Previous testimonials\">&#8592;<\/button>\n      <div class=\"gpv-tdots\" id=\"gpv-tdots\" role=\"tablist\" aria-label=\"Testimonial pages\"><\/div>\n      <button class=\"gpv-tbtn\" id=\"gpv-tnext\" type=\"button\" aria-label=\"Next testimonials\">&#8594;<\/button>\n    <\/div>\n  <\/div>\n<\/section>\n\n<section class=\"gpv-cta\" id=\"gpv-s8\">\n  <h2>Open Farm View on your fields.<\/h2>\n  <p class=\"gpv-lede\">The statistics table sits under the map on every farm with a boundary, so the first ranking is one layer away.<\/p>\n  <div class=\"gpv-hero-ctas\">\n    <a class=\"gpv-btn\" href=\"https:\/\/app.geopard.tech\/auth\/sign-up?utm_source=geopard.tech&amp;utm_medium=landing&amp;utm_campaign=farm-view\">Try Farm View free<\/a>\n    <a class=\"gpv-btn-ghost\" href=\"https:\/\/docs.geopard.tech\/geopard-tutorials\/changelog-and-product-releases\/release-web-march-2026-field-trials-design-generative-synthetic-yield-maps-farm-view-stats-mcp\">Read documentation<\/a>\n  <\/div>\n<\/section>\n\n<\/main>\n\n<div class=\"gpv-ctabar\" id=\"gpv-ctabar\">\n  <a class=\"gpv-btn\" href=\"https:\/\/app.geopard.tech\/auth\/sign-up?utm_source=geopard.tech&amp;utm_medium=landing&amp;utm_campaign=farm-view\">Try free<\/a>\n  <a class=\"gpv-btn-ghost\" href=\"https:\/\/docs.geopard.tech\/geopard-tutorials\/changelog-and-product-releases\/release-web-march-2026-field-trials-design-generative-synthetic-yield-maps-farm-view-stats-mcp\">Read docs<\/a>\n<\/div>\n\n<div class=\"gpv-lightbox\" id=\"gpv-lightbox\" role=\"dialog\" aria-modal=\"true\" aria-label=\"Enlarged screenshot\">\n  <img decoding=\"async\" id=\"gpv-lightbox-img\" src=\"\" alt=\"\">\n  <button class=\"gpv-lightbox-close\" type=\"button\" aria-label=\"Close\">&#10005;<\/button>\n<\/div>\n<div class=\"gpv-tip\" id=\"gpv-tip\" role=\"tooltip\" aria-hidden=\"true\"><\/div>\n<\/div>\n\n<script type=\"application\/ld+json\" nowprocket data-no-optimize=\"1\" data-no-defer=\"1\" data-no-minify=\"1\">\n{\"@context\":\"https:\/\/schema.org\",\"@graph\":[\n {\"@type\":\"WebPage\",\"name\":\"GeoPard Farm View: field benchmarking on one map\",\n  \"description\":\"Benchmark every field on one map and see which to target first: the most variable, the lowest by yield, lime candidates by pH, the lowest current vegetation, the steepest. An attributes table for any layer: satellite, soil, yield, as-applied, as-planted, topography.\",\n  \"url\":\"https:\/\/geopard.tech\/field-benchmarking\/\",\n  \"isPartOf\":{\"@type\":\"WebSite\",\"name\":\"GeoPard Agriculture\",\"url\":\"https:\/\/geopard.tech\/\"},\n  \"primaryImageOfPage\":{\"@type\":\"ImageObject\",\"url\":\"https:\/\/geopard.tech\/wp-content\/uploads\/2026\/10\/farm-view-walkthrough-poster-full.jpg\",\"width\":1600,\"height\":860}},\n {\"@type\":\"BreadcrumbList\",\"itemListElement\":[\n  {\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/geopard.tech\/\"},\n  {\"@type\":\"ListItem\",\"position\":2,\"name\":\"Field Benchmarking\",\"item\":\"https:\/\/geopard.tech\/field-benchmarking\/\"}\n ]},\n {\"@type\":\"FAQPage\",\"mainEntity\":[\n  {\"@type\":\"Question\",\"name\":\"Which data layers can I benchmark?\",\"acceptedAnswer\":{\"@type\":\"Answer\",\"text\":\"Satellite imagery, soil by any lab attribute or scan, yield, as-applied, as-planted, topography and zones maps, either raw or processed. The attributes table reads whichever layer is selected on the map, one attribute at a time.\"}},\n  {\"@type\":\"Question\",\"name\":\"What does a high CV percent mean for a field?\",\"acceptedAnswer\":{\"@type\":\"Answer\",\"text\":\"CV percent is the standard deviation divided by the average, so it compares variability across fields with different averages. A soil nutrient above 25 percent is usually worth zone sampling, whereas below 10 percent a flat rate is defensible; confirm the cut-off with your lab and crop plan.\"}},\n  {\"@type\":\"Question\",\"name\":\"Can I benchmark fields across several farms?\",\"acceptedAnswer\":{\"@type\":\"Answer\",\"text\":\"Yes. Select several farms in the tree, or filter by field name or label, then the table lists every selected field with the farm total and the weighted average underneath.\"}},\n  {\"@type\":\"Question\",\"name\":\"How do the layers get into GeoPard?\",\"acceptedAnswer\":{\"@type\":\"Answer\",\"text\":\"Satellite imagery and topography are there as soon as a boundary exists. Yield and as-applied layers sync from John Deere Operations Center or import as files, and soil results import as CSV, Excel or shapefile.\"}}\n ]}\n]}\n<\/script>\n<script nowprocket data-no-optimize=\"1\" data-no-defer=\"1\" data-no-minify=\"1\">\n(function(){\n'use strict';\nvar win = window, doc = document;\nvar root = doc.getElementById('gp-fv');\nif (!root) return;\n\/* the geopard theme prints the WP page title as an extra CSS-hidden h1; remove the node so the\n   DOM carries exactly one h1 (the hero) *\/\nvar themeH1 = doc.querySelector('#simple_page > .container > h1');\n(themeH1 ? themeH1.parentNode : null) ? themeH1.parentNode.removeChild(themeH1) : null;\n\/* \u2550\u2550 Arcade walkthrough: injected on tap from the slot's data-arcade attribute (the URL's query\n   separators live in HTML as entities, never in JS). Poster stays until the frame has loaded. *\/\nvar arcadeEl = doc.getElementById('gpv-arcade');\nvar ARCADE_URL = arcadeEl ? (arcadeEl.getAttribute('data-arcade') ? arcadeEl.getAttribute('data-arcade') : '') : '';\nvar arcadeDone = false;\nfunction injectArcade(){\n  if (arcadeDone) return;\n  if (!arcadeEl ? true : !ARCADE_URL) return;\n  arcadeDone = true;\n  var f = doc.createElement('iframe');\n  f.src = ARCADE_URL;\n  f.title = 'Farm View interactive walkthrough';\n  f.loading = 'lazy';\n  f.setAttribute('allow', 'clipboard-write; fullscreen');\n  f.addEventListener('load', function(){ arcadeEl.classList.add('has-embed'); });\n  arcadeEl.appendChild(f);\n  \/* if load never fires (blocked frame), reveal after a grace period anyway *\/\n  win.setTimeout(function(){ arcadeEl.classList.add('has-embed'); }, 6000);\n}\nfunction wireArcade(){\n  if (!arcadeEl ? true : !ARCADE_URL) return;\n  \/* click-to-load: the player bundle is the heaviest asset on the page, so it loads on tap\n     (inline, rule 25), not on scroll. Without JS the poster stays a link to the share page. *\/\n  var face = arcadeEl.querySelector('.gpv-arcade-fallback');\n  if (!face) return;\n  face.addEventListener('click', function(ev){\n    ev.preventDefault();\n    face.classList.add('is-loading');\n    injectArcade();\n  });\n}\nwireArcade();\n\/* \u2550\u2550 section-chip nav + mobile CTA bar (plain IntersectionObserver). Bars slide in once the hero\n   scrolls out; the CTA bar hides again at the final CTA section. *\/\nvar secnav = doc.getElementById('gpv-secnav');\nvar ctabar = doc.getElementById('gpv-ctabar');\nvar heroEl = doc.getElementById('gpv-s1');\nvar lastSec = doc.getElementById('gpv-s8');\nfunction headerH(){\n  var h = doc.getElementById('header');\n  return h ? h.getBoundingClientRect().height : 0;\n}\nfunction placeBars(){\n  secnav ? secnav.style.top = headerH() + 'px' : null;\n}\nplaceBars();\nwin.addEventListener('resize', placeBars);\nif (win.IntersectionObserver ? (secnav ? heroEl : null) : null) {\n  var chipRow = secnav.querySelector('.gpv-secnav-row');\n  var chips = [];\n  secnav.querySelectorAll('a').forEach(function(a){ chips.push(a); });\n  var heroIO = new win.IntersectionObserver(function(es){\n    es.forEach(function(e){\n      var past = e.isIntersecting ? false : (e.boundingClientRect.bottom < 0);\n      secnav.classList.toggle('is-on', past);\n      ctabar ? ctabar.classList.toggle('is-on', past) : null;\n    });\n  });\n  heroIO.observe(heroEl);\n  if (lastSec ? ctabar : null) {\n    var endIO = new win.IntersectionObserver(function(es){\n      es.forEach(function(e){ ctabar.classList.toggle('is-off', e.isIntersecting); });\n    });\n    endIO.observe(lastSec);\n  }\n  var byId = {};\n  chips.forEach(function(a){ byId[a.getAttribute('href').slice(1)] = a; });\n  var actIO = new win.IntersectionObserver(function(es){\n    es.forEach(function(e){\n      if (!e.isIntersecting) return;\n      var act = byId[e.target.id];\n      chips.forEach(function(a){ a.classList.toggle('is-active', a === act); });\n      if (act ? chipRow : null) {\n        chipRow.scrollTo ? chipRow.scrollTo({ left: act.offsetLeft - 24, behavior: 'smooth' }) : null;\n      }\n    });\n  }, { rootMargin: '-35% 0px -55% 0px' });\n  Object.keys(byId).forEach(function(id){\n    var el = doc.getElementById(id);\n    el ? actIO.observe(el) : null;\n  });\n  chips.forEach(function(a){\n    a.addEventListener('click', function(ev){\n      var el = doc.getElementById(a.getAttribute('href').slice(1));\n      if (!el) return;\n      ev.preventDefault();\n      var y = el.getBoundingClientRect().top + win.pageYOffset - headerH() - 60;\n      win.scrollTo({ top: y, behavior: 'smooth' });\n    });\n  });\n}\n\/* \u2550\u2550 tap-to-zoom: any screenshot opens full-res in the lightbox *\/\nvar lb = doc.getElementById('gpv-lightbox');\nvar lbImg = doc.getElementById('gpv-lightbox-img');\nfunction lbClose(){\n  lb ? lb.classList.remove('is-open') : null;\n  lbImg ? lbImg.src = '' : null;\n}\nif (lb ? lbImg : null) {\n  function wireZoom(img){\n    img.addEventListener('click', function(){\n      lbImg.src = img.getAttribute('data-full') ? img.getAttribute('data-full') : (img.currentSrc ? img.currentSrc : img.src);\n      lbImg.alt = img.alt;\n      lb.classList.add('is-open');\n    });\n  }\n  doc.querySelectorAll('.gp-fv .gpv-shot img').forEach(wireZoom);\n  lb.addEventListener('click', lbClose);\n  doc.addEventListener('keydown', function(ev){ ev.key === 'Escape' ? lbClose() : null; });\n}\n\/* \u2550\u2550 reveals: mark the root live only when IO exists and motion is allowed (static tier otherwise) *\/\nvar reduced = win.matchMedia ? win.matchMedia('(prefers-reduced-motion: reduce)').matches : false;\nif (win.IntersectionObserver ? !reduced : false) {\n  root.classList.add('gpv-live');\n  var revIO = new win.IntersectionObserver(function(es){\n    es.forEach(function(e){\n      if (!e.isIntersecting) return;\n      e.target.classList.add('is-in');\n      revIO.unobserve(e.target);\n    });\n  }, { rootMargin: '0px 0px -8% 0px' });\n  doc.querySelectorAll('.gp-fv [data-reveal]').forEach(function(el){ revIO.observe(el); });\n}\n\/* \u2550\u2550 tidy the address bar: strip utm params + click ids AFTER the trackers could read them\n   (WP Rocket delays analytics until the first interaction) *\/\n(function(){\n  var qs = win.location.search;\n  var hasCampaign = qs.indexOf('utm_') >= 0 || qs.indexOf('gclid=') >= 0 || qs.indexOf('fbclid=') >= 0 || qs.indexOf('msclkid=') >= 0;\n  if (!hasCampaign) return;\n  if (!win.URLSearchParams) return;\n  if (!win.history ? true : !win.history.replaceState) return;\n  var done = false;\n  function strip(){\n    if (done) return;\n    done = true;\n    var p = new win.URLSearchParams(win.location.search);\n    var kill = [];\n    p.forEach(function(v, k){\n      (k.indexOf('utm_') === 0 || k === 'gclid' || k === 'fbclid' || k === 'msclkid') ? kill.push(k) : null;\n    });\n    kill.forEach(function(k){ p.delete(k); });\n    var rest = p.toString();\n    win.history.replaceState(null, '', win.location.pathname + (rest ? '?' + rest : '') + win.location.hash);\n  }\n  var armed = false;\n  function arm(){\n    if (armed) return;\n    armed = true;\n    win.setTimeout(strip, 4000);\n  }\n  ['pointerdown','keydown','touchstart','scroll'].forEach(function(ev){\n    win.addEventListener(ev, arm, { once: true, passive: true });\n  });\n  win.setTimeout(strip, 15000);\n})();\n\/* \u2550\u2550 benchmark table: the statistics panel on a fixed sample farm \u2550\u2550\n   Six fields. The potassium column is the farm in the walkthrough (areas and figures as the\n   product printed them, field names anonymised per rule 16); the other layers are a consistent\n   sample for the same six fields. Locale-aware units (rule 12: browser hints only, never an IP\n   lookup): area ha\/ac, yield t\/ha and bu\/ac (corn, 1 t\/ha = 15.93 bu\/ac). *\/\nvar FIELDS = [\n  { name: 'Field 1', area: 67.49, k: [136.06, 79.35, 239.61, 30.42], ph: [6.1, 5.4, 6.9, 7.8], om: [2.4, 1.6, 3.3, 14.0], yld: [10.4, 5.9, 13.8, 18.6], ndvi: [0.62, 0.41, 0.78, 15.1], satnow: [0.48, 0.21, 0.66, 22.0], asapplied: [162, 120, 200, 9.8], asplanted: [78, 70, 86, 4.1], slope: [2.8, 0.2, 8.9, 61.0] },\n  { name: 'Field 2', area: 30.52, k: [147.70, 75.25, 243.22, 37.26], ph: [5.8, 5.1, 6.6, 9.1], om: [2.1, 1.2, 3.0, 19.0], yld: [9.6, 4.8, 13.1, 24.1], ndvi: [0.57, 0.33, 0.74, 19.8], satnow: [0.39, 0.15, 0.61, 31.0], asapplied: [170, 110, 210, 13.5], asplanted: [74, 62, 84, 6.8], slope: [4.1, 0.3, 11.6, 58.0] },\n  { name: 'Field 3', area: 34.57, k: [151.69, 83.64, 214.39, 26.40], ph: [6.4, 5.9, 7.0, 5.2], om: [2.9, 2.2, 3.6, 10.0], yld: [10.9, 7.2, 13.5, 14.0], ndvi: [0.66, 0.49, 0.79, 11.2], satnow: [0.55, 0.32, 0.70, 17.0], asapplied: [155, 130, 180, 6.1], asplanted: [80, 74, 88, 3.2], slope: [1.9, 0.1, 6.2, 55.0] },\n  { name: 'Field 4', area: 61.35, k: [179.03, 78.10, 241.66, 20.22], ph: [6.6, 5.8, 7.3, 6.4], om: [3.1, 2.4, 3.8, 9.0], yld: [11.8, 8.1, 14.6, 12.3], ndvi: [0.70, 0.52, 0.82, 9.6], satnow: [0.58, 0.36, 0.72, 14.0], asapplied: [148, 125, 175, 7.4], asplanted: [82, 76, 90, 3.0], slope: [2.3, 0.1, 7.4, 57.0] },\n  { name: 'Field 5', area: 29.17, k: [194.88, 90.13, 274.08, 24.09], ph: [6.9, 6.2, 7.6, 5.9], om: [2.7, 1.9, 3.5, 12.0], yld: [11.2, 7.4, 14.9, 16.7], ndvi: [0.68, 0.47, 0.83, 12.4], satnow: [0.52, 0.28, 0.71, 19.0], asapplied: [180, 140, 220, 10.2], asplanted: [79, 70, 88, 4.5], slope: [3.4, 0.2, 9.8, 60.0] },\n  { name: 'Field 6', area: 90.98, k: [211.30, 114.39, 253.03, 10.05], ph: [7.1, 6.5, 7.8, 4.3], om: [3.4, 2.8, 4.0, 7.0], yld: [12.6, 9.8, 15.1, 8.4], ndvi: [0.74, 0.61, 0.84, 6.1], satnow: [0.63, 0.45, 0.76, 11.0], asapplied: [150, 135, 165, 4.0], asplanted: [84, 80, 90, 2.1], slope: [1.2, 0.0, 4.1, 52.0] }\n];\n\/* unit conversions for US visitors: corn yield 1 t\/ha = 15.93 bu\/ac, nitrogen 1 kg\/ha = 0.8922 lb\/ac,\n   seeding rate 1 thousand seeds\/ha = 0.4047 thousand seeds\/ac; ppm, pH, %, NDVI do not convert *\/\nvar LAYERS = {\n  satnow:    { label: 'Satellite: current vegetation', word: 'current vegetation', unit: 'NDVI', dec: 2, note: 'Latest cloud-free image, NDVI inside each boundary.' },\n  ndvi:      { label: 'Satellite: long-term productivity', word: 'long-term productivity', unit: 'NDVI', dec: 2, note: 'Mean peak-season NDVI over the cloud-free seasons on record.' },\n  k:         { label: 'Soil: potassium', word: 'potassium', unit: 'ppm', dec: 2, note: 'Lab results on a 1 ha grid, interpolated inside each boundary.' },\n  ph:        { label: 'Soil: pH', word: 'pH', unit: '', dec: 1, note: 'Same lab round as the potassium layer.' },\n  om:        { label: 'Soil: organic matter', word: 'organic matter', unit: '%', dec: 1, note: 'Same lab round as the potassium layer.' },\n  yld:       { label: 'Yield: last harvest', word: 'yield', unit: 't\/ha', unitUS: 'bu\/ac', conv: 15.93, dec: 1, decUS: 0, note: 'Cleaned and calibrated corn yield from the last harvest.' },\n  asapplied: { label: 'As-applied: nitrogen rate', word: 'applied nitrogen', unit: 'kg\/ha', unitUS: 'lb\/ac', conv: 0.8922, dec: 0, decUS: 0, note: 'Nitrogen as the spreader logged it, from the as-applied file.' },\n  asplanted: { label: 'As-planted: seeding rate', word: 'seeding rate', unit: 'k seeds\/ha', unitUS: 'k seeds\/ac', conv: 0.4047, dec: 0, decUS: 1, note: 'Population as the planter logged it, from the as-planted file.' },\n  slope:     { label: 'Topography: slope', word: 'slope', unit: '%', dec: 1, note: 'Slope from the elevation model; CV is high on every field by nature.' }\n};\nvar RULES = {\n  cv:   { col: 'cv',  dir: -1, word: 'most variable first', note: 'Zone sampling and variable rate pay most where the field is least uniform.' },\n  low:  { col: 'avg', dir: 1,  word: 'lowest average first', note: 'The fields below the farm average are where scouting and a limiting-factor check start.' },\n  high: { col: 'avg', dir: -1, word: 'highest average first', note: 'The fields above the farm average set the harvest order and the benchmark for the rest.' }\n};\n\/* find presets: each names a target in the grower's words and sets the layer and the rule *\/\nvar FINDS = {\n  variable: { layer: 'k',         rule: 'cv',   word: 'most variable fields',       note: 'Zone sampling and variable rate pay most where the field is least uniform.' },\n  lowyield: { layer: 'yld',       rule: 'low',  word: 'lowest by yield',            note: 'The limiting factor is found in Compare Layers, with soil and topography next to the yield.' },\n  lime:     { layer: 'ph',        rule: 'low',  word: 'lime candidates by pH',      note: 'Lime raises pH, so the acidic fields head the lime plan; confirm the target pH with the crop and the lab.' },\n  lowveg:   { layer: 'satnow',    rule: 'low',  word: 'lowest current vegetation',  note: 'The fields below the farm average on the latest image are the first stop for scouting.' },\n  steep:    { layer: 'slope',     rule: 'high', word: 'steepest fields',            note: 'Runoff and erosion risk; conservation tillage, buffer strips and split nitrogen start here.' },\n  highn:    { layer: 'asapplied', rule: 'high', word: 'highest applied nitrogen',   note: 'A field far above the plan is an execution issue; compare with the prescription before the next pass.' },\n  lowseed:  { layer: 'asplanted', rule: 'low',  word: 'lowest seeding rate',        note: 'A stand below the plan is a planter issue first; check the as-planted map against the prescription.' }\n};\nvar UNITS = {\n  metric: { area: 'ha', areaConv: 1, label: 'Shown in metric units: ha, t\/ha.', other: 'Switch to US units' },\n  us:     { area: 'ac', areaConv: 2.4711, label: 'Shown in US units: ac, bu\/ac.', other: 'Switch to metric units' }\n};\nfunction layerUnit(L, u){ return (u === 'us' ? (L.unitUS ? L.unitUS : L.unit) : L.unit); }\nfunction layerDec(L, u){ return (u === 'us' ? (typeof L.decUS === 'number' ? L.decUS : L.dec) : L.dec); }\nfunction rows(layer, u){\n  var L = LAYERS[layer] ? LAYERS[layer] : LAYERS.k;\n  var key = LAYERS[layer] ? layer : 'k';\n  var conv = (u === 'us' ? (L.conv ? L.conv : 1) : 1);\n  var ac = UNITS[u] ? UNITS[u].areaConv : 1;\n  return FIELDS.map(function(f){\n    var v = f[key];\n    return { name: f.name, area: f.area * ac, avg: v[0] * conv, min: v[1] * conv, max: v[2] * conv, cv: v[3] };\n  });\n}\nfunction farm(list){\n  var A = 0, sAvg = 0, sCv = 0, mn = Infinity, mx = -Infinity;\n  list.forEach(function(r){\n    A = A + r.area; sAvg = sAvg + r.avg * r.area; sCv = sCv + r.cv * r.area;\n    mn = Math.min(mn, r.min); mx = Math.max(mx, r.max);\n  });\n  return { area: A, avg: A > 0 ? sAvg \/ A : 0, cv: A > 0 ? sCv \/ A : 0, min: mn, max: mx, n: list.length };\n}\nfunction sortRows(list, col, dir){\n  var out = list.slice();\n  out.sort(function(a, b){\n    if (col === 'name') return dir * a.name.localeCompare(b.name);\n    return dir * (a[col] - b[col]);\n  });\n  return out;\n}\nfunction ranked(layer, rule, u){\n  var R = RULES[rule] ? RULES[rule] : RULES.cv;\n  return sortRows(rows(layer, u), R.col, R.dir);\n}\nfunction fmt(n, d){\n  var s = Math.abs(n).toFixed(d);\n  var parts = s.split('.');\n  parts[0] = parts[0].replace(\/\\B(?=(\\d{3})+(?!\\d))\/g, ' ');\n  return (n < 0 ? '\u2212' : '') + parts.join('.');\n}\nfunction signed(n, d){ return (n > 0 ? '+' : '') + fmt(n, d); }\nfunction detectUnits(){\n  var nav = win.navigator ? win.navigator : null;\n  var lang = (nav ? nav.language : '') ? nav.language : '';\n  var tzName = '';\n  try { tzName = win.Intl ? win.Intl.DateTimeFormat().resolvedOptions().timeZone : ''; } catch (e) { tzName = ''; }\n  tzName = tzName ? tzName : '';\n  var US_TZ = ['America\/New_York','America\/Chicago','America\/Denver','America\/Los_Angeles','America\/Phoenix','America\/Anchorage','America\/Honolulu','America\/Detroit','America\/Boise'];\n  var isUS = lang === 'en-US' || US_TZ.indexOf(tzName) >= 0 || tzName.indexOf('America\/Indiana') === 0;\n  return isUS ? 'us' : 'metric';\n}\nvar units = detectUnits();\nvar layer = 'k', rule = 'cv', sortCol = 'cv', sortDir = -1, find = 'variable';\nvar layerEl = doc.getElementById('gpv-layer'), ruleEl = doc.getElementById('gpv-rule');\nvar layerNote = doc.getElementById('gpv-layer-note'), ruleNote = doc.getElementById('gpv-rule-note');\nvar bodyEl = doc.getElementById('gpv-body'), footEl = doc.getElementById('gpv-foot'), tableEl = doc.getElementById('gpv-table');\nvar unitsLabel = doc.getElementById('gpv-units-label'), unitsBtn = doc.getElementById('gpv-units-btn');\nvar uArea = doc.getElementById('gpv-u-area'), uAvg = doc.getElementById('gpv-u-avg');\nvar verdictLine = doc.getElementById('gpv-verdict-line'), verdictSub = doc.getElementById('gpv-verdict-sub');\nvar farmAreaEl = doc.getElementById('gpv-farm-area');\nvar findEl = doc.getElementById('gpv-find');\nfunction activeFind(){\n  var hit = '';\n  Object.keys(FINDS).forEach(function(f){ (FINDS[f].layer === layer ? FINDS[f].rule === rule : false) ? hit = f : null; });\n  return hit;\n}\nfunction summarize(layerKey, ruleKey, u){\n  var L = LAYERS[layerKey] ? LAYERS[layerKey] : LAYERS.k;\n  var R = RULES[ruleKey] ? RULES[ruleKey] : RULES.cv;\n  var U = UNITS[u] ? UNITS[u] : UNITS.metric;\n  var list = ranked(layerKey, ruleKey, u);\n  var top = list.slice(0, 3);\n  var F = farm(list);\n  var unit = layerUnit(L, u), d = layerDec(L, u);\n  var parts = top.map(function(r){\n    return r.name + ' (' + (R.col === 'cv' ? 'CV ' + fmt(r.cv, 1) + '%' : fmt(r.avg, d) + (unit ? ' ' + unit : '')) + ')';\n  });\n  var topArea = 0;\n  top.forEach(function(r){ topArea = topArea + r.area; });\n  var hit = '';\n  Object.keys(FINDS).forEach(function(f){ (FINDS[f].layer === layerKey ? FINDS[f].rule === ruleKey : false) ? hit = f : null; });\n  var head = hit ? FINDS[hit].word.charAt(0).toUpperCase() + FINDS[hit].word.slice(1) : 'Top three by ' + L.word + ', ' + R.word;\n  return {\n    line: head + ': ' + parts.join(', ') + '.',\n    sub: fmt(topArea, 0) + ' ' + U.area + ' of ' + fmt(F.area, 0) + ' ' + U.area + '; farm average ' + fmt(F.avg, d) + (unit ? ' ' + unit : '') + ', CV ' + fmt(F.cv, 1) + '%.'\n  };\n}\nfunction render(){\n  var L = LAYERS[layer], R = RULES[rule], U = UNITS[units];\n  var unit = layerUnit(L, units), d = layerDec(L, units);\n  var all = rows(layer, units);\n  var F = farm(all);\n  var order = ranked(layer, rule, units);\n  var rankOf = {};\n  order.forEach(function(r, i){ rankOf[r.name] = i + 1; });\n  var list = sortRows(all, sortCol, sortDir);\n  var maxAvg = 0;\n  all.forEach(function(r){ maxAvg = Math.max(maxAvg, r.avg); });\n  unitsLabel ? unitsLabel.textContent = U.label : null;\n  unitsBtn ? unitsBtn.textContent = U.other : null;\n  uArea ? uArea.textContent = U.area : null;\n  uAvg ? uAvg.textContent = (unit ? ', ' + unit : '') : null;\n  farmAreaEl ? farmAreaEl.textContent = fmt(F.area, 0) + ' ' + U.area : null;\n  layerNote ? layerNote.textContent = L.note : null;\n  find = activeFind();\n  ruleNote ? ruleNote.textContent = (find ? FINDS[find].note : R.note) : null;\n  findEl ? findEl.querySelectorAll('[data-find]').forEach(function(b){ b.classList.toggle('is-on', b.getAttribute('data-find') === find); }) : null;\n  if (tableEl) {\n    tableEl.querySelectorAll('th[data-col]').forEach(function(th){\n      var c = th.getAttribute('data-col');\n      c === sortCol ? th.setAttribute('aria-sort', sortDir > 0 ? 'ascending' : 'descending') : th.removeAttribute('aria-sort');\n    });\n  }\n  var cvHi = 25, cvLo = 10;\n  if (bodyEl) {\n    var html = '';\n    list.forEach(function(r){\n      var rk = rankOf[r.name];\n      var top = rk <= 3;\n      var delta = F.avg > 0 ? (r.avg - F.avg) \/ F.avg * 100 : 0;\n      var tipAvg = r.name + ' \u00b7 ' + L.word + ' average ' + fmt(r.avg, d) + (unit ? ' ' + unit : '') + ' \u00b7 farm average ' + fmt(F.avg, d) + (unit ? ' ' + unit : '') + ' (' + signed(delta, 0) + '%)';\n      var tipCv = r.name + ' \u00b7 CV ' + fmt(r.cv, 1) + '% \u00b7 range ' + fmt(r.min, d) + ' to ' + fmt(r.max, d) + (unit ? ' ' + unit : '') + (layer === 'slope' ? '' : (r.cv >= cvHi ? ' \u00b7 worth zoning' : (r.cv <= cvLo ? ' \u00b7 uniform' : ' \u00b7 in between')));\n      var tipRank = r.name + ' \u00b7 rank ' + rk + ' of ' + all.length + ', ' + R.word;\n      var cvCls = layer === 'slope' ? '' : (r.cv >= cvHi ? ' gpv-cv-hi' : (r.cv <= cvLo ? ' gpv-cv-lo' : ''));\n      html = html\n        + '<tr' + (top ? ' class=\"is-top\"' : '') + '>'\n        + '<td><span class=\"gpv-rank' + (top ? '' : ' is-blank') + '\" tabindex=\"0\" data-tip=\"' + tipRank + '\" aria-label=\"' + tipRank + '\">' + rk + '<\/span><b>' + r.name + '<\/b><\/td>'\n        + '<td>' + fmt(r.area, units === 'us' ? 1 : 2) + '<\/td>'\n        + '<td><span class=\"gpv-cell' + (r.avg >= F.avg ? ' is-hi' : '') + '\" tabindex=\"0\" data-tip=\"' + tipAvg + '\" aria-label=\"' + tipAvg + '\"><b>' + fmt(r.avg, d) + '<\/b><i style=\"width:' + (maxAvg > 0 ? (r.avg \/ maxAvg * 100).toFixed(1) : 0) + '%\"><\/i><\/span><\/td>'\n        + '<td>' + fmt(r.min, d) + '<\/td>'\n        + '<td>' + fmt(r.max, d) + '<\/td>'\n        + '<td class=\"gpv-cv' + cvCls + '\" tabindex=\"0\" data-tip=\"' + tipCv + '\" aria-label=\"' + tipCv + '\">' + fmt(r.cv, layer === 'slope' ? 0 : 1) + '<\/td>'\n        + '<\/tr>';\n    });\n    bodyEl.innerHTML = html;\n  }\n  if (footEl) {\n    footEl.innerHTML = ''\n      + '<td>Farm<small>' + F.n + ' fields<\/small><\/td>'\n      + '<td>' + fmt(F.area, units === 'us' ? 1 : 2) + '<\/td>'\n      + '<td>' + fmt(F.avg, d) + '<small>weighted by area<\/small><\/td>'\n      + '<td>' + fmt(F.min, d) + '<\/td>'\n      + '<td>' + fmt(F.max, d) + '<\/td>'\n      + '<td>' + fmt(F.cv, layer === 'slope' ? 0 : 1) + '<small>weighted by area<\/small><\/td>';\n  }\n  var S = summarize(layer, rule, units);\n  verdictLine ? verdictLine.textContent = S.line : null;\n  verdictSub ? verdictSub.textContent = S.sub : null;\n  return { rows: list, farm: F, order: order };\n}\nfunction setUnits(u){\n  units = UNITS[u] ? u : 'metric';\n  return render();\n}\nfunction setLayer(l){\n  layer = LAYERS[l] ? l : 'k';\n  layerEl ? layerEl.value = layer : null;\n  return render();\n}\nfunction setRule(r){\n  rule = RULES[r] ? r : 'cv';\n  ruleEl ? ruleEl.value = rule : null;\n  sortCol = RULES[rule].col; sortDir = RULES[rule].dir;\n  return render();\n}\nfunction setFind(f){\n  if (!FINDS[f]) return render();\n  layer = FINDS[f].layer; rule = FINDS[f].rule;\n  layerEl ? layerEl.value = layer : null;\n  ruleEl ? ruleEl.value = rule : null;\n  sortCol = RULES[rule].col; sortDir = RULES[rule].dir;\n  return render();\n}\nfunction setSort(col, dir){\n  var cols = ['name','area','avg','min','max','cv'];\n  if (cols.indexOf(col) < 0) return render();\n  sortDir = typeof dir === 'number' ? dir : (sortCol === col ? -sortDir : (col === 'name' ? 1 : -1));\n  sortCol = col;\n  return render();\n}\nlayerEl ? layerEl.addEventListener('change', function(){ setLayer(layerEl.value); }) : null;\nruleEl ? ruleEl.addEventListener('change', function(){ setRule(ruleEl.value); }) : null;\nunitsBtn ? unitsBtn.addEventListener('click', function(){ setUnits(units === 'us' ? 'metric' : 'us'); }) : null;\nfindEl ? findEl.addEventListener('click', function(ev){\n  var b = ev.target.closest ? ev.target.closest('[data-find]') : null;\n  b ? setFind(b.getAttribute('data-find')) : null;\n}) : null;\nif (tableEl) {\n  tableEl.addEventListener('click', function(ev){\n    var b = ev.target.closest ? ev.target.closest('.gpv-sort') : null;\n    if (!b) return;\n    setSort(b.getAttribute('data-col'));\n  });\n}\nrender();\n\/* \u2550\u2550 single floating tooltip for every bar, rank badge and CV cell (rule 17): hover + focus on\n   desktop, tap on touch *\/\nvar tip = doc.getElementById('gpv-tip');\nvar tipFor = null;\nfunction showTip(el){\n  if (!tip) return;\n  var text = el.getAttribute('data-tip');\n  if (!text) return;\n  tipFor = el;\n  tip.textContent = '';\n  var parts = text.split(' \u00b7 ');\n  var head = doc.createElement('b');\n  head.textContent = parts.shift();\n  tip.appendChild(head);\n  tip.appendChild(doc.createTextNode(parts.join(' \u00b7 ')));\n  tip.classList.add('is-on');\n  tip.setAttribute('aria-hidden', 'false');\n  var r = el.getBoundingClientRect();\n  var tw = tip.offsetWidth ? tip.offsetWidth : 240, th = tip.offsetHeight ? tip.offsetHeight : 60;\n  var vw = win.innerWidth ? win.innerWidth : 1200;\n  var x = r.left + r.width \/ 2 - tw \/ 2;\n  x = Math.max(8, Math.min(x, vw - tw - 8));\n  var y = r.top - th - 10;\n  y = y < 8 ? r.bottom + 10 : y;\n  tip.style.left = x + 'px';\n  tip.style.top = y + 'px';\n}\nfunction hideTip(){\n  if (!tip) return;\n  tipFor = null;\n  tip.classList.remove('is-on');\n  tip.setAttribute('aria-hidden', 'true');\n}\nif (tip ? tableEl : null) {\n  tableEl.addEventListener('mouseover', function(ev){\n    var el = ev.target.closest ? ev.target.closest('[data-tip]') : null;\n    el ? showTip(el) : null;\n  });\n  tableEl.addEventListener('mouseout', function(ev){\n    var el = ev.target.closest ? ev.target.closest('[data-tip]') : null;\n    el ? hideTip() : null;\n  });\n  tableEl.addEventListener('focusin', function(ev){\n    var el = ev.target.closest ? ev.target.closest('[data-tip]') : null;\n    el ? showTip(el) : null;\n  });\n  tableEl.addEventListener('focusout', hideTip);\n  tableEl.addEventListener('click', function(ev){\n    var el = ev.target.closest ? ev.target.closest('[data-tip]') : null;\n    if (!el) return;\n    (tipFor === el ? tip.classList.contains('is-on') : false) ? hideTip() : showTip(el);\n  });\n  doc.addEventListener('click', function(ev){\n    var inside = ev.target.closest ? ev.target.closest('#gpv-table') : null;\n    inside ? null : hideTip();\n  });\n  win.addEventListener('scroll', hideTip, { passive: true });\n}\n\/* \u2550\u2550 testimonials carousel: scroll-snap track drives position; prev\/next + dots scroll it;\n   gentle autoplay only while in view, paused on hover\/focus\/touch, never under reduced motion *\/\nvar ttrack = doc.getElementById('gpv-ttrack');\nvar tcards = ttrack ? ttrack.querySelectorAll('.gpv-tcard') : [];\nif (ttrack ? tcards.length > 1 : false) {\n  var tdots = doc.getElementById('gpv-tdots');\n  var tprev = doc.getElementById('gpv-tprev'), tnext = doc.getElementById('gpv-tnext');\n  var tIndex = 0, tPages = 1, tPaused = false, tInView = false, tHoldTimer = 0;\n  function tStep(){\n    var st = tcards[1].offsetLeft - tcards[0].offsetLeft;\n    return st > 0 ? st : (ttrack.clientWidth > 0 ? ttrack.clientWidth : 1);\n  }\n  function tPaint(){\n    tIndex = Math.min(tPages - 1, Math.max(0, Math.round(ttrack.scrollLeft \/ tStep())));\n    tdots ? tdots.querySelectorAll('.gpv-tdot').forEach(function(d, i){\n      d.classList.toggle('is-on', i === tIndex);\n      d.setAttribute('aria-selected', i === tIndex ? 'true' : 'false');\n    }) : null;\n  }\n  function tGo(i, byUser){\n    var n = tPages;\n    i = ((i % n) + n) % n;\n    ttrack.scrollTo ? ttrack.scrollTo({ left: i * tStep(), behavior: 'smooth' }) : (ttrack.scrollLeft = i * tStep());\n    byUser ? tHold() : null;\n  }\n  function tHold(){\n    tPaused = true;\n    win.clearTimeout(tHoldTimer);\n    tHoldTimer = win.setTimeout(function(){ tPaused = false; }, 12000);\n  }\n  function tLayout(){\n    var vis = Math.max(1, Math.round(ttrack.clientWidth \/ tStep()));\n    tPages = Math.max(1, tcards.length - vis + 1);\n    if (tdots) {\n      var d = '';\n      for (var i = 0; i < tPages; i++) {\n        d = d + '<button class=\"gpv-tdot\" type=\"button\" role=\"tab\" aria-label=\"Testimonials ' + (i + 1) + ' of ' + tPages + '\"><\/button>';\n      }\n      tdots.innerHTML = d;\n      tdots.querySelectorAll('.gpv-tdot').forEach(function(b, i){ b.addEventListener('click', function(){ tGo(i, true); }); });\n    }\n    ttrack.scrollLeft = Math.min(tIndex, tPages - 1) * tStep();\n    tPaint();\n  }\n  tprev ? tprev.addEventListener('click', function(){ tGo(tIndex - 1, true); }) : null;\n  tnext ? tnext.addEventListener('click', function(){ tGo(tIndex + 1, true); }) : null;\n  ttrack.addEventListener('scroll', tPaint, { passive: true });\n  ttrack.addEventListener('keydown', function(ev){\n    ev.key === 'ArrowRight' ? tGo(tIndex + 1, true) : (ev.key === 'ArrowLeft' ? tGo(tIndex - 1, true) : null);\n  });\n  ttrack.addEventListener('pointerenter', function(){ tPaused = true; });\n  ttrack.addEventListener('pointerleave', function(){ tPaused = false; });\n  ttrack.addEventListener('focusin', function(){ tPaused = true; });\n  ttrack.addEventListener('focusout', function(){ tPaused = false; });\n  ttrack.addEventListener('touchstart', tHold, { passive: true });\n  win.addEventListener('resize', tLayout);\n  tLayout();\n  if (!reduced ? win.IntersectionObserver : false) {\n    var tIO = new win.IntersectionObserver(function(es){ es.forEach(function(e){ tInView = e.isIntersecting; }); }, { threshold: 0.4 });\n    tIO.observe(ttrack);\n    win.setInterval(function(){ (tInView ? !tPaused : false) ? tGo(tIndex + 1, false) : null; }, 6000);\n  }\n}\n\/* test hooks *\/\nwin.__GPV = {\n  fields: FIELDS,\n  layers: LAYERS,\n  rules: RULES,\n  rows: rows,\n  farm: farm,\n  ranked: ranked,\n  sortRows: sortRows,\n  summarize: summarize,\n  units: function(){ return units; },\n  setUnits: setUnits,\n  setLayer: setLayer,\n  setRule: setRule,\n  setFind: setFind,\n  finds: FINDS,\n  setSort: setSort,\n  state: function(){ return { layer: layer, rule: rule, find: find, sortCol: sortCol, sortDir: sortDir, units: units }; },\n  arcadeUrl: ARCADE_URL,\n  render: render\n};\n})();\n<\/script>\n\n\n<!--\n  GeoPard docs launcher \u2014 the strip that opens the documentation ON the page\n  the reader is already on. Source of truth for the WordPress Reusable Block.\n\n  GENERATED between the GPD-DOCS-EMBED markers from\n  tools\/docs-hub\/docs-embed-core.js. Never hand-edit that section:\n     node tools\/docs-hub\/build-launcher.js\n  writes shared\/docs_embed.html from this template, and tools\/docs-hub\/tests.js\n  fails if the two copies of the core have drifted.\n\n  One block, every page: the strip reads the page's own address and opens the\n  documentation page that matches it, so the same block sends the reader of\n  \/johndeere\/ to the machine account integration and the reader of\n  \/yield-report\/ to the yield report playbook. Nothing loads until a click.\n\n  Rule 25: opens in place, never a new tab. Rule 5b: no bare header or footer.\n  Rule 1: no ampersand inside any script body.\n-->\n<div class=\"gp-docsbar\" id=\"gp-docsbar\" data-theme=\"light\">\n<style>\n.gp-docsbar{--f:\"Roboto\",-apple-system,\"Segoe UI\",Helvetica,Arial,sans-serif;\n  --ink:#212121;--ink2:#2c3a30;--dim:#4c6066;--accent:#145328;--accent-mid:#15701e;--accent-soft:#1b7a2a;\n  --panel:#ffffff;--paper2:#f6f9f0;--wash:#eef4e8;--hair:#eef2e8;--line:#e3e7da;--mute:#c3cdbf;\n  --ink:#212121;--faint:#8a9a8e;\n  font-family:var(--f);color:var(--ink2);font-size:16px;line-height:1.55}\n.gp-docsbar *{box-sizing:border-box}\n.gp-docsbar .dxb{max-width:1600px;margin:18px auto;padding:16px 18px;background:var(--wash);border:1px solid var(--line);border-radius:8px;display:flex;flex-direction:column;gap:12px}\n.gp-docsbar .dxb-txt{flex:1;min-width:260px}\n.gp-docsbar .dxb-t{font-size:1.02rem;font-weight:700;color:var(--ink);margin:0 0 2px}\n.gp-docsbar .dxb-d{font-size:.9rem;color:var(--dim);margin:0}\n.gp-docsbar .dxb-sr{position:absolute;width:1px;height:1px;overflow:hidden;clip:rect(0 0 0 0);white-space:nowrap}\n.gp-docsbar .dxb-row{display:flex;flex-wrap:wrap;gap:10px;align-items:flex-start;width:100%}\n.gp-docsbar .dxb-search{position:relative;flex:1;min-width:260px}\n.gp-docsbar .dxb-q{font-family:var(--f);font-size:1rem;font-weight:400;color:var(--ink);background:var(--panel);border:1px solid var(--mute);border-radius:4px;min-height:48px;padding:10px 14px;width:100%;display:block}\n.gp-docsbar .dxb-q:focus{outline:2px solid var(--accent-soft);outline-offset:-1px}\n.gp-docsbar .dxb-q::placeholder{color:var(--faint)}\n.gp-docsbar .dx-res{margin:8px 0 0;background:var(--panel);border:1px solid var(--line);border-radius:6px;overflow:hidden}\n.gp-docsbar .dx-row{display:block;padding:10px 14px;border-top:1px solid var(--hair);text-decoration:none;color:var(--ink2);cursor:pointer}\n.gp-docsbar .dx-row:first-child{border-top:0}\n.gp-docsbar .dx-row:hover,.gp-docsbar .dx-row.on{background:var(--paper2)}\n.gp-docsbar button.dx-row{width:100%;text-align:left;font-family:var(--f);font-size:1rem;background:var(--panel);border:0}\n.gp-docsbar .dx-row-t{display:block;font-size:.95rem;font-weight:700;color:var(--accent);line-height:1.35}\n.gp-docsbar .dx-row-m{display:block;font-size:.8rem;color:var(--faint);margin-top:2px}\n.gp-docsbar .dx-row-m i{font-style:normal;color:var(--accent-mid)}\n.gp-docsbar .dxb-btns{display:flex;flex-wrap:wrap;gap:8px}\n.gp-docsbar .dxb-b{font-family:var(--f);font-size:.92rem;font-weight:700;min-height:44px;padding:0 16px;border-radius:4px;border:1px solid var(--accent);background:var(--accent);color:#ffffff;cursor:pointer}\n.gp-docsbar .dxb-b:hover{background:var(--accent-mid);border-color:var(--accent-mid)}\n.gp-docsbar .dxb-b.is-ghost{background:var(--panel);color:var(--accent);font-weight:400}\n.gp-docsbar .dxb-b.is-ghost:hover{background:var(--panel);border-color:var(--accent-soft);color:var(--accent-mid)}\n@media (max-width:620px){\n  .gp-docsbar .dxb{padding:14px}\n  .gp-docsbar .dxb-btns{width:100%}\n  .gp-docsbar .dxb-b{flex:1}\n  .gp-docsbar .dxb-search{min-width:0}\n}\n\/* The docs panel is injected at click time and ships at z-index 9998, under\n   the theme's sticky header at 999999999. Two ids, both of which only exist\n   once the reader has opened the documentation. *\/\n#gitbook-widget-window{z-index:1000000001}\n#gitbook-widget-button{z-index:1000000002}\n<\/style>\n  <div class=\"dxb\">\n    <div class=\"dxb-txt\">\n      <p class=\"dxb-t\">Precision ag documentation, module by module<\/p>\n      <p class=\"dxb-d\">Imports, management zones, variable rate, yield cleaning, soil sampling, trials, exports and the API. Each one step by step, with the agronomy behind the map.<\/p>\n    <\/div>\n    <div class=\"dxb-row\">\n      <div class=\"dxb-search\" data-gp-docsearch data-ds-limit=\"6\">\n        <label class=\"dxb-sr\" for=\"gp-docsbar-q\">Search the documentation<\/label>\n        <input class=\"dxb-q\" id=\"gp-docsbar-q\" data-ds-input type=\"search\" autocomplete=\"off\" spellcheck=\"false\" placeholder=\"ask it in your own words, or type a word\">\n        <div class=\"dx-res\" data-ds-results role=\"listbox\" aria-label=\"Search results\" hidden><\/div>\n        <div class=\"dx-res\" data-ds-none hidden><button class=\"dx-row\" type=\"button\"><span class=\"dx-row-t\">No title matched. Ask the documentation instead.<\/span><span class=\"dx-row-m\">It reads the full text of every page and answers in the panel.<\/span><\/button><\/div>\n      <\/div>\n      <div class=\"dxb-btns\">\n        <button class=\"dxb-b\" type=\"button\" data-dxb=\"open\">Open the docs for this module<\/button>\n        <!--\n          One question button per page, all hidden but the one that matches.\n          The question is the button's own text, which is why it is written\n          here and not in the script: TranslatePress translates the DOM, so on\n          \/de\/ertragsdaten\/ this button already reads its German question. A\n          script-built label would stay English on all 24 translated copies.\n\n          Clicking it ASKS the documentation, through the site's own ask\n          route rather than the embed API: navigateToAssistant is a silent\n          no-op in the embed, but\n          docs.geopard.tech\/geopard-tutorials?ask=<question> opens the\n          assistant on that question, and the locale spaces answer in their\n          own language.\n        -->\n        <button class=\"dxb-b is-ghost\" type=\"button\" data-dxb=\"find\">Search all of it<\/button>\n        <button class=\"dxb-b is-ghost\" type=\"button\" data-dxb=\"find\" data-page=\"2445\" hidden>Which layers should I build management zones from?<\/button>\n        <button class=\"dxb-b is-ghost\" type=\"button\" data-dxb=\"find\" data-page=\"2488\" hidden>Which satellite index should I use for my crop?<\/button>\n        <button class=\"dxb-b is-ghost\" type=\"button\" data-dxb=\"find\" data-page=\"2520\" hidden>What can elevation data tell me about my fields?<\/button>\n        <button class=\"dxb-b is-ghost\" type=\"button\" data-dxb=\"find\" data-page=\"2550\" hidden>How do I look at a field in 3D?<\/button>\n        <button class=\"dxb-b is-ghost\" type=\"button\" data-dxb=\"find\" data-page=\"2582\" hidden>How do I scout a field against a zones map?<\/button>\n        <button class=\"dxb-b is-ghost\" type=\"button\" data-dxb=\"find\" data-page=\"2600\" hidden>How do I plan soil sampling points and routes?<\/button>\n        <button class=\"dxb-b is-ghost\" type=\"button\" data-dxb=\"find\" data-page=\"2613\" hidden>How do I clean and calibrate a yield map?<\/button>\n        <button class=\"dxb-b is-ghost\" type=\"button\" data-dxb=\"find\" data-page=\"2628\" hidden>How do I check what the machine actually applied?<\/button>\n        <button class=\"dxb-b is-ghost\" type=\"button\" data-dxb=\"find\" data-page=\"2645\" hidden>How do I compare fields and seasons against each other?<\/button>\n        <button class=\"dxb-b is-ghost\" type=\"button\" data-dxb=\"find\" data-page=\"8062\" hidden>How do I connect John Deere Operations Center?<\/button>\n        <button class=\"dxb-b is-ghost\" type=\"button\" data-dxb=\"find\" data-page=\"3349\" hidden>Which file formats can I import?<\/button>\n      <\/div>\n    <\/div>\n  <\/div>\n\n<script type=\"application\/json\" data-gp-docs-index nowprocket data-no-optimize=\"1\" data-no-defer=\"1\" data-no-minify=\"1\">{\"built\":\"2026-09-30\",\"origin\":\"https:\/\/docs.geopard.tech\",\"space\":\"\/geopard-tutorials\",\"languages\":25,\"sections\":[{\"slug\":\"geopard-docs-precision-agriculture-tutorials-and-api-reference\",\"title\":\"GeoPard Tutorials Precision Agriculture Software\",\"count\":2},{\"slug\":\"product-tour-web-app\",\"title\":\"Product Tour - Web App\",\"count\":100},{\"slug\":\"changelog-and-product-releases\",\"title\":\"Changelog and Product Releases\",\"count\":26},{\"slug\":\"agronomy\",\"title\":\"Agronomy\",\"count\":23},{\"slug\":\"product-tour-mobile-app\",\"title\":\"Product Tour - Mobile App\",\"count\":13},{\"slug\":\"api-docs\",\"title\":\"API Docs\",\"count\":134},{\"slug\":\"platform-roadmap\",\"title\":\"Platform Roadmap\",\"count\":1},{\"slug\":\"gis-quick-hints\",\"title\":\"GIS Quick Hints\",\"count\":9},{\"slug\":\"policies\",\"title\":\"Policies\",\"count\":1}],\"u\":[\"geopard-docs-precision-agriculture-tutorials-and-api-reference\/geopard-platform-frequently-asked-questions-faq\",\"geopard-docs-precision-agriculture-tutorials-and-api-reference\/glossary-precision-ag-terms-used-in-geopard\",\"product-tour-web-app\/3d-maps\",\"product-tour-web-app\/compare-layers\",\"product-tour-web-app\/equation-based-analytics\",\"product-tour-web-app\/equation-based-analytics\/batch-equation-analytics\",\"product-tour-web-app\/equation-based-analytics\/catalog-of-custom-functions\",\"product-tour-web-app\/equation-based-analytics\/catalog-of-predefined-agronomic-equations\",\"product-tour-web-app\/export-download\",\"product-tour-web-app\/export-download\/batch-export-of-boundaries-zones-and-scouting-pins\",\"product-tour-web-app\/export-download\/export-application-operation-data-to-john-deere-ops-center\",\"product-tour-web-app\/export-download\/export-equation-based-map\",\"product-tour-web-app\/export-download\/export-scouting-notes-as-shapefile\",\"product-tour-web-app\/export-download\/export-to-myjohndeere\",\"product-tour-web-app\/export-download\/export-vra-map-in-isoxml-format\",\"product-tour-web-app\/export-download\/field-boundary-export\",\"product-tour-web-app\/export-download\/satellite-imagery-export-as-geotiff-or-geojson\",\"product-tour-web-app\/export-download\/zones-map-export-as-shapefile\",\"product-tour-web-app\/farm-user-and-access-setup\",\"product-tour-web-app\/farm-user-and-access-setup\/add-a-label\",\"product-tour-web-app\/farm-user-and-access-setup\/create-a-new-farm\",\"product-tour-web-app\/farm-user-and-access-setup\/delete-farms\",\"product-tour-web-app\/farm-user-and-access-setup\/draw-a-new-field\",\"product-tour-web-app\/farm-user-and-access-setup\/edit-a-boundary\",\"product-tour-web-app\/farm-user-and-access-setup\/edit-a-field-name\",\"product-tour-web-app\/farm-user-and-access-setup\/farms-sharing-between-accounts-and-organizations\",\"product-tour-web-app\/farm-user-and-access-setup\/manage-client-and-colleague-accounts-on-the-pay-as-you-go-plan\",\"product-tour-web-app\/farm-user-and-access-setup\/organizations-and-roles\",\"product-tour-web-app\/farm-user-and-access-setup\/upload-a-field-boundary\",\"product-tour-web-app\/geopard-ai-assistant\",\"product-tour-web-app\/geopard-ai-assistant\/accuracy-and-evaluation\",\"product-tour-web-app\/geopard-ai-assistant\/agronomy-knowledge-base\",\"product-tour-web-app\/geopard-ai-assistant\/precision-agriculture-ai-assistant-faq\",\"product-tour-web-app\/geopard-ai-assistant\/prompt-library\",\"product-tour-web-app\/geopard-api-for-farm-data-and-analytics\",\"product-tour-web-app\/geopard-mcp\",\"product-tour-web-app\/geopard-mcp\/clean-and-calibrate-yield-data\",\"product-tour-web-app\/geopard-mcp\/connect-geopard-mcp\",\"product-tour-web-app\/geopard-mcp\/explain-vegetation-patterns\",\"product-tour-web-app\/geopard-mcp\/geopard-mcp-capabilities\",\"product-tour-web-app\/geopard-mcp\/optimal-tillage-depth\",\"product-tour-web-app\/geopard-mcp\/verify-geopard-mcp-connection\",\"product-tour-web-app\/import-precision-agriculture-data\",\"product-tour-web-app\/import-precision-agriculture-data\/as-applied-as-planted-data-import\",\"product-tour-web-app\/import-precision-agriculture-data\/import-field-boundaries\",\"product-tour-web-app\/import-precision-agriculture-data\/import-from-myjohndeere\",\"product-tour-web-app\/import-precision-agriculture-data\/machinery-proprietary-formats\",\"product-tour-web-app\/import-precision-agriculture-data\/soil-data-shp-with-coordinates\",\"product-tour-web-app\/import-precision-agriculture-data\/soil-lab-results-csv-excel-smart-import\",\"product-tour-web-app\/import-precision-agriculture-data\/yield-data-import\",\"product-tour-web-app\/john-deere-operations-center-integration\",\"product-tour-web-app\/john-deere-operations-center-integration\/1.-create-a-free-trial-account-with-your-john-deere-account\",\"product-tour-web-app\/john-deere-operations-center-integration\/10.-export-application-operation-data-to-john-deere-ops-center\",\"product-tour-web-app\/john-deere-operations-center-integration\/11.-synchronize-a-field-with-john-deere-operations-center\",\"product-tour-web-app\/john-deere-operations-center-integration\/2.-connect-to-john-deere-operations-center\",\"product-tour-web-app\/john-deere-operations-center-integration\/3.-connect-to-john-deere-organizations\",\"product-tour-web-app\/john-deere-operations-center-integration\/4.-import-into-geopard-from-john-deere-operations-center\",\"product-tour-web-app\/john-deere-operations-center-integration\/5.-configure-automated-data-sync\",\"product-tour-web-app\/john-deere-operations-center-integration\/6.-export-rx-maps-to-john-deere-operations-center-as-files\",\"product-tour-web-app\/john-deere-operations-center-integration\/7.-export-field-boundaries-to-john-deere-operations-center\",\"product-tour-web-app\/john-deere-operations-center-integration\/7.-export-field-boundaries-to-john-deere-operations-center\/7a.-configure-boundary-export-to-john-deere-operations-center-as-files\",\"product-tour-web-app\/john-deere-operations-center-integration\/8.-export-rx-maps-to-john-deere-operations-center-as-work-plans\",\"product-tour-web-app\/john-deere-operations-center-integration\/9.-export-soil-topography-satellite-or-analytics-as-map-layers\",\"product-tour-web-app\/john-deere-operations-center-integration\/data-sharing-options\",\"product-tour-web-app\/john-deere-operations-center-integration\/data-sharing-options\/1.-staff-member-sharing\",\"product-tour-web-app\/john-deere-operations-center-integration\/data-sharing-options\/2.-problem-solving-of-staff-member-sharing\",\"product-tour-web-app\/john-deere-operations-center-integration\/data-sharing-options\/3.-partner-organization-sharing\",\"product-tour-web-app\/john-deere-operations-center-integration\/data-sharing-options\/4.-problem-solving-of-partner-organization-sharing\",\"product-tour-web-app\/john-deere-operations-center-integration\/data-sharing-options\/5.-problem-solving-of-import-from-john-deere-to-geopard\",\"product-tour-web-app\/john-deere-operations-center-integration\/data-sharing-options\/6.-problem-solving-of-work-plan-creation\",\"product-tour-web-app\/john-deere-operations-center-integration\/data-sharing-options\/7.-sharing-fields-and-boundaries-between-partner-organizations-in-jd-ops-center\",\"product-tour-web-app\/managing-crop-season-information-with-tags-labels\",\"product-tour-web-app\/managing-crop-season-information-with-tags-labels\/case-field-operation-details\",\"product-tour-web-app\/managing-crop-season-information-with-tags-labels\/case-managing-fields-for-several-clients\",\"product-tour-web-app\/managing-crop-season-information-with-tags-labels\/case-season-details-including-crop-and-year\",\"product-tour-web-app\/on-farm-trials-design-and-creation\",\"product-tour-web-app\/operations-log-track-errors-imports-and-analytics\",\"product-tour-web-app\/satellite-monitoring\",\"product-tour-web-app\/satellite-monitoring\/crop-development-index-graph\",\"product-tour-web-app\/satellite-monitoring\/indices-for-crops-and-soils\",\"product-tour-web-app\/satellite-monitoring\/order-planet-scope-3m-daily-imagery\",\"product-tour-web-app\/soil-sampling-automated-planning\",\"product-tour-web-app\/topography-analysis-for-precision-agriculture\",\"product-tour-web-app\/user-settings\",\"product-tour-web-app\/user-settings\/changing-preferences\",\"product-tour-web-app\/user-settings\/order-the-package\",\"product-tour-web-app\/user-settings\/reset-password\",\"product-tour-web-app\/user-settings\/subscriptions-account-limits-and-plans\",\"product-tour-web-app\/yield-data-and-harvest-analytics\",\"product-tour-web-app\/zones-maps-and-analytics\",\"product-tour-web-app\/zones-maps-and-analytics\/assign-variable-rates-in-zones-ag-input-rates-distribution-tool\",\"product-tour-web-app\/zones-maps-and-analytics\/create-a-zones-map-using-a-template\",\"product-tour-web-app\/zones-maps-and-analytics\/create-a-zones-map-using-satellite-imagery\",\"product-tour-web-app\/zones-maps-and-analytics\/create-a-zones-map-using-soil-yield-or-as-applied-data\",\"product-tour-web-app\/zones-maps-and-analytics\/create-a-zones-map-using-topography\",\"product-tour-web-app\/zones-maps-and-analytics\/draw-zones-manually-or-clone-from-an-existing-layer\",\"product-tour-web-app\/zones-maps-and-analytics\/edit-zones-map-merge-and-split\",\"product-tour-web-app\/zones-maps-and-analytics\/heterogeneity-factor\",\"product-tour-web-app\/zones-maps-and-analytics\/multi-layer-analytics\",\"product-tour-web-app\/zones-maps-and-analytics\/multi-year-zones\",\"product-tour-web-app\/zones-maps-and-analytics\/relative-variation-factor\",\"product-tour-web-app\/zones-maps-and-analytics\/using-data-classification\",\"changelog-and-product-releases\/release-mobile-august-2023-mobile-app-improvements\",\"changelog-and-product-releases\/release-mobile-may-2023-social-login\",\"changelog-and-product-releases\/release-notes\",\"changelog-and-product-releases\/release-sep-2026-yield-report-ai-assistant-attachments-guidance-lines-tillage-workplans\",\"changelog-and-product-releases\/release-web-and-mobile-february-2026-farm-view-soil-lab-csv-excel-import-zones-dynamic-editing\",\"changelog-and-product-releases\/release-web-and-mobile-july-2026-ai-assistant-beta-ab-line-grids-trials-exports\",\"changelog-and-product-releases\/release-web-and-mobile-september-2025-automated-soil-sampling-zones-from-equations-billing-portal\",\"changelog-and-product-releases\/release-web-april-2022-3d-maps-and-zoning-tools\",\"changelog-and-product-releases\/release-web-april-2024-batch-equation-maps-and-enhanced-layer-transparency\",\"changelog-and-product-releases\/release-web-august-2024-data-layer-previews-spatially-localized-zones-reusable-zones\",\"changelog-and-product-releases\/release-web-february-2024-per-area-pricing-units\",\"changelog-and-product-releases\/release-web-january-2023-huge-amount-of-small-improvements\",\"changelog-and-product-releases\/release-web-january-2024-many-ui-improvements\",\"changelog-and-product-releases\/release-web-january-2025-free-trial-usage-based-pricing-plan-usda-yield-cleaning-protocol-export-of\",\"changelog-and-product-releases\/release-web-july-2023-operations-log-page-sum-in-datasets\",\"changelog-and-product-releases\/release-web-july-2024-equation-map-creation-spatially-localized-zones-seeding-and-application-work-p\",\"changelog-and-product-releases\/release-web-june-2023-improved-equations-operations-log-v1\",\"changelog-and-product-releases\/release-web-march-2025-improved-zones-workplans-updates-yield-data-enhancements\",\"changelog-and-product-releases\/release-web-march-2026-field-trials-design-generative-synthetic-yield-maps-farm-view-stats-mcp\",\"changelog-and-product-releases\/release-web-may-2023-john-deere-integration-improvements\",\"changelog-and-product-releases\/release-web-may-2024-raw-view-for-satellite-images-export-of-zone-maps-as-workplan-to-the-john-deere\",\"changelog-and-product-releases\/release-web-may-2025-rates-distribution-improved-legends\",\"changelog-and-product-releases\/release-web-november-2023-clone-polygons-subscription-management\",\"changelog-and-product-releases\/release-web-october-2022-integration-with-aggateway-protocols-isoxml-support-and-more\",\"changelog-and-product-releases\/release-web-october-2023-yield-calibration-equation-maps-as-isoxml-pdf-export-and-john-deere-integra\",\"changelog-and-product-releases\/release-web-september-2023-cleaning-and-calibrating-yield-datasets-more-language-support\",\"agronomy\/analyzing-john-deere-see-and-spray-data-with-custom-formulas\",\"agronomy\/compare-soil-scanner-data-between-years\",\"agronomy\/comparing-yield-datasets\",\"agronomy\/create-soil-sampling-zones-points-routes-export-as-kml-and-execute\",\"agronomy\/dealer-workflow-in-italy-john-deere-ops-center-geopard-vra-nitrogen-trials-profit-maps\",\"agronomy\/detecting-clay-and-sand-with-sbi\",\"agronomy\/evaluate-accuracy-of-fertilizer-application\",\"agronomy\/evaluate-accuracy-of-seeding-application\",\"agronomy\/field-management-zones-productivity-zones-creation-process\",\"agronomy\/field-trial-analytics\",\"agronomy\/flood-insurance-report\",\"agronomy\/nitrogen-use-efficiency-nue-and-nitrogen-uptake\",\"agronomy\/precision-agronomy-use-cases-and-best-practices-overview\",\"agronomy\/synthetic-yield-map\",\"agronomy\/use-case-variable-rate-nitrogen-vra-for-potatoes-to-realize-5-10-more-yield\",\"agronomy\/variable-rate-fertilizer-maps\",\"agronomy\/variable-rate-seeding-planting-maps\",\"agronomy\/vr-lime-application-based-on-soil-ph-data\",\"agronomy\/vr-tillage-from-soil-compaction\",\"agronomy\/vra-seeding-and-nitrogen-maps-from-plant-available-water-and-organic-matter\",\"agronomy\/weed-patches-detection-and-herbicide-vra-rx-map\",\"agronomy\/yield-calibration-and-cleaning\",\"agronomy\/yield-report\",\"product-tour-mobile-app\/filters-for-mobile-field-review\",\"product-tour-mobile-app\/install-the-geopard-mobile-app\",\"product-tour-mobile-app\/log-in-to-the-geopard-mobile-app\",\"product-tour-mobile-app\/map-and-layer-options-in-the-mobile-app\",\"product-tour-mobile-app\/mobile-app-settings-and-preferences\",\"product-tour-mobile-app\/viewing-as-applied-datasets\",\"product-tour-mobile-app\/viewing-satellite-images\",\"product-tour-mobile-app\/viewing-soil-data\",\"product-tour-mobile-app\/viewing-topography-maps\",\"product-tour-mobile-app\/viewing-yield-data\",\"product-tour-mobile-app\/viewing-zones-maps\",\"product-tour-mobile-app\/working-in-the-field-scouting-zones-maps\",\"product-tour-mobile-app\/working-offline\",\"api-docs\/authorization-apikey-credentials-or-oauth-2.0\",\"api-docs\/diagrams-with-basic-flows\",\"api-docs\/diagrams-with-basic-flows\/1.-field-registration\",\"api-docs\/diagrams-with-basic-flows\/2.-graphql-subscription\",\"api-docs\/diagrams-with-basic-flows\/3.-get-satellite-imagery\",\"api-docs\/diagrams-with-basic-flows\/4.-upload-soil-or-asapplied-or-yield-datasets\",\"api-docs\/diagrams-with-basic-flows\/5.-execute-equations\",\"api-docs\/diagrams-with-basic-flows\/6.-generate-zonesmap\",\"api-docs\/diagrams-with-basic-flows\/7.-download-gridded-data\",\"api-docs\/diagrams-with-basic-flows\/8.-download-original-data\",\"api-docs\/geo-endpoints-for-spatial-data-access\",\"api-docs\/geo-endpoints-for-spatial-data-access\/wfs-get-spatial-data-layers-in-vector-format-shp-geojson\",\"api-docs\/geo-endpoints-for-spatial-data-access\/wfs-get-spatial-data-layers-in-vector-format-shp-geojson\/1.-get-the-field-boundary-as-geojson\",\"api-docs\/geo-endpoints-for-spatial-data-access\/wfs-get-spatial-data-layers-in-vector-format-shp-geojson\/2.-get-the-zones-map-as-geojson\",\"api-docs\/geo-endpoints-for-spatial-data-access\/wfs-get-spatial-data-layers-in-vector-format-shp-geojson\/3.-get-zones-attributes-as-json\",\"api-docs\/geo-endpoints-for-spatial-data-access\/wfs-get-spatial-data-layers-in-vector-format-shp-geojson\/4.-get-soil-data-as-geojson\",\"api-docs\/geo-endpoints-for-spatial-data-access\/wfs-get-spatial-data-layers-in-vector-format-shp-geojson\/5.-get-yield-data-as-geojson\",\"api-docs\/geo-endpoints-for-spatial-data-access\/wms-get-raster-pictures-of-spatial-data-layers\",\"api-docs\/geo-endpoints-for-spatial-data-access\/wms-get-raster-pictures-of-spatial-data-layers\/1.-lai\",\"api-docs\/geo-endpoints-for-spatial-data-access\/wms-get-raster-pictures-of-spatial-data-layers\/10.-rastermap-thumbnail\",\"api-docs\/geo-endpoints-for-spatial-data-access\/wms-get-raster-pictures-of-spatial-data-layers\/11.-topographymap-elevation-in-absolute-numbers\",\"api-docs\/geo-endpoints-for-spatial-data-access\/wms-get-raster-pictures-of-spatial-data-layers\/12.-yielddatasetsmap\",\"api-docs\/geo-endpoints-for-spatial-data-access\/wms-get-raster-pictures-of-spatial-data-layers\/13.-soildatasetsmap\",\"api-docs\/geo-endpoints-for-spatial-data-access\/wms-get-raster-pictures-of-spatial-data-layers\/14.-soildatasetsmap-custom-color-schema\",\"api-docs\/geo-endpoints-for-spatial-data-access\/wms-get-raster-pictures-of-spatial-data-layers\/15.-asapplieddatasetsmap\",\"api-docs\/geo-endpoints-for-spatial-data-access\/wms-get-raster-pictures-of-spatial-data-layers\/16.-satellite-image-cropped-by-field-boundary\",\"api-docs\/geo-endpoints-for-spatial-data-access\/wms-get-raster-pictures-of-spatial-data-layers\/17.-satellite-image-cropped-by-field-boundary-and-custom-color-schema\",\"api-docs\/geo-endpoints-for-spatial-data-access\/wms-get-raster-pictures-of-spatial-data-layers\/18.-yielddatasetsmap-custom-color-schema\",\"api-docs\/geo-endpoints-for-spatial-data-access\/wms-get-raster-pictures-of-spatial-data-layers\/19.-satellite-image-10-colors-visualization\",\"api-docs\/geo-endpoints-for-spatial-data-access\/wms-get-raster-pictures-of-spatial-data-layers\/2.-rgb\",\"api-docs\/geo-endpoints-for-spatial-data-access\/wms-get-raster-pictures-of-spatial-data-layers\/3.-field-boundary\",\"api-docs\/geo-endpoints-for-spatial-data-access\/wms-get-raster-pictures-of-spatial-data-layers\/4.-field-thumbnail\",\"api-docs\/geo-endpoints-for-spatial-data-access\/wms-get-raster-pictures-of-spatial-data-layers\/5.-zonesmap\",\"api-docs\/geo-endpoints-for-spatial-data-access\/wms-get-raster-pictures-of-spatial-data-layers\/6.-zonesmap-custom-color-schema\",\"api-docs\/geo-endpoints-for-spatial-data-access\/wms-get-raster-pictures-of-spatial-data-layers\/7.-zonesmap-thumbnail\",\"api-docs\/geo-endpoints-for-spatial-data-access\/wms-get-raster-pictures-of-spatial-data-layers\/8.-rastermap\",\"api-docs\/geo-endpoints-for-spatial-data-access\/wms-get-raster-pictures-of-spatial-data-layers\/9.-rastermap-custom-color-schema\",\"api-docs\/geopard-api-data-schema\",\"api-docs\/geopard-api-faq-and-common-questions\",\"api-docs\/geopard-api-overview\",\"api-docs\/geopard-api-requests-overview\",\"api-docs\/geopard-api-requests-overview\/1.-subscription-get-events\",\"api-docs\/geopard-api-requests-overview\/10.-mutation-generate-rastermap-asynchronously\",\"api-docs\/geopard-api-requests-overview\/11.-mutation-generate-yield-based-zonesmap-asynchronously\",\"api-docs\/geopard-api-requests-overview\/12.-mutation-generate-soil-based-zonesmap-asynchronously\",\"api-docs\/geopard-api-requests-overview\/13.-mutation-create-farm\",\"api-docs\/geopard-api-requests-overview\/14.-mutation-create-a-field-or-edit-the-boundary-of-the-existing-field-with-optional-labels\",\"api-docs\/geopard-api-requests-overview\/15.-query-get-topographymap\",\"api-docs\/geopard-api-requests-overview\/16.-query-get-yielddatasets\",\"api-docs\/geopard-api-requests-overview\/17.-query-get-soildatasets\",\"api-docs\/geopard-api-requests-overview\/18.-mutation-generate-zip-archive-with-zonesmap-and-field\",\"api-docs\/geopard-api-requests-overview\/19.-mutation-delete-field\",\"api-docs\/geopard-api-requests-overview\/2.-query-get-fields\",\"api-docs\/geopard-api-requests-overview\/20.-mutation-delete-farm\",\"api-docs\/geopard-api-requests-overview\/21.-mutation-delete-zonesmap\",\"api-docs\/geopard-api-requests-overview\/22.-mutation-delete-rasteranalysismap\",\"api-docs\/geopard-api-requests-overview\/23.-mutation-delete-soildataset\",\"api-docs\/geopard-api-requests-overview\/24.-mutation-delete-yielddataset\",\"api-docs\/geopard-api-requests-overview\/3.-query-get-satelliteimages\",\"api-docs\/geopard-api-requests-overview\/37.-query-get-satelliteimages-in-the-defined-interval\",\"api-docs\/geopard-api-requests-overview\/38.-query-get-userdata\",\"api-docs\/geopard-api-requests-overview\/39.-mutation-set-custom-color-schemas-to-selected-geomaps\",\"api-docs\/geopard-api-requests-overview\/4.-query-get-defined-satelliteimage\",\"api-docs\/geopard-api-requests-overview\/40.-query-get-labels-on-the-account-level\",\"api-docs\/geopard-api-requests-overview\/41.-mutation-save-labels-on-the-account-level\",\"api-docs\/geopard-api-requests-overview\/42.-mutation-delete-label-on-the-account-level\",\"api-docs\/geopard-api-requests-overview\/43.-query-get-fields\",\"api-docs\/geopard-api-requests-overview\/44.-mutation-set-field-labels\",\"api-docs\/geopard-api-requests-overview\/45.-mutation-save-user-data\",\"api-docs\/geopard-api-requests-overview\/46.-mutation-generate-multi-layer-zonesmap-asynchronously\",\"api-docs\/geopard-api-requests-overview\/47.-query-get-zonesmaps\",\"api-docs\/geopard-api-requests-overview\/48.-query-get-gridded-data-from-topographymap\",\"api-docs\/geopard-api-requests-overview\/49.-query-get-gridded-data-from-fieldsatelliteimage\",\"api-docs\/geopard-api-requests-overview\/5.-query-get-rastermaps\",\"api-docs\/geopard-api-requests-overview\/50.-query-get-gridded-data-from-vectoranalysismap\",\"api-docs\/geopard-api-requests-overview\/51.-query-get-gridded-data-from-yielddataset\",\"api-docs\/geopard-api-requests-overview\/52.-query-get-gridded-data-from-soildataset\",\"api-docs\/geopard-api-requests-overview\/53.-query-get-gridded-data-from-asapplieddataset\",\"api-docs\/geopard-api-requests-overview\/54.-query-get-vector-data-from-soildataset\",\"api-docs\/geopard-api-requests-overview\/55.-upload-zip-files-over-6-mb\",\"api-docs\/geopard-api-requests-overview\/56.-upload-photos\",\"api-docs\/geopard-api-requests-overview\/57.-query-get-photos-attached-to-the-selected-note\",\"api-docs\/geopard-api-requests-overview\/58.-query-get-photos-attached-to-comments\",\"api-docs\/geopard-api-requests-overview\/59.-query-get-asapplieddatasets\",\"api-docs\/geopard-api-requests-overview\/6.-query-get-zonesmaps\",\"api-docs\/geopard-api-requests-overview\/60.-mutation-generate-as-applied-based-zonesmap-asynchronously\",\"api-docs\/geopard-api-requests-overview\/61.-mutation-delete-asapplieddataset\",\"api-docs\/geopard-api-requests-overview\/62.-mutation-share-farms\",\"api-docs\/geopard-api-requests-overview\/63.-mutation-save-organization\",\"api-docs\/geopard-api-requests-overview\/64.-mutation-add-users-to-organization\",\"api-docs\/geopard-api-requests-overview\/65.-mutation-delete-users-from-organization\",\"api-docs\/geopard-api-requests-overview\/66.-mutation-save-field\",\"api-docs\/geopard-api-requests-overview\/67.-mutation-save-farm\",\"api-docs\/geopard-api-requests-overview\/68.-mutation-refresh-vectoranalysismap-statistics\",\"api-docs\/geopard-api-requests-overview\/69.-mutation-delete-photo\",\"api-docs\/geopard-api-requests-overview\/7.-mutation-generate-zonesmap\",\"api-docs\/geopard-api-requests-overview\/70.-mutation-delete-multiple-photos\",\"api-docs\/geopard-api-requests-overview\/71.-mutation-generate-a-zip-archive-with-notes\",\"api-docs\/geopard-api-requests-overview\/72.-query-get-gridded-data-as-geojson-or-geotiff\",\"api-docs\/geopard-api-requests-overview\/73.-query-get-gridded-data-with-the-selected-buffer\",\"api-docs\/geopard-api-requests-overview\/74.-mutation-verify-equation\",\"api-docs\/geopard-api-requests-overview\/75.-mutation-generate-equationmap-asynchronously\",\"api-docs\/geopard-api-requests-overview\/76.-query-get-equationmap\",\"api-docs\/geopard-api-requests-overview\/77.-mutation-delete-equationmap\",\"api-docs\/geopard-api-requests-overview\/78.-query-find-fields-by-externalkey\",\"api-docs\/geopard-api-requests-overview\/79.-query-find-farms-by-externalkey\",\"api-docs\/geopard-api-requests-overview\/8.-mutation-generate-rastermap\",\"api-docs\/geopard-api-requests-overview\/80.-query-get-original-data\",\"api-docs\/geopard-api-requests-overview\/81.-query-get-geojson-of-equationmap\",\"api-docs\/geopard-api-requests-overview\/82.-query-restore-subscription-events\",\"api-docs\/geopard-api-requests-overview\/83.-query-collect-platform-context\",\"api-docs\/geopard-api-requests-overview\/84.-mutation-calibrate-and-clean-yielddataset\",\"api-docs\/geopard-api-requests-overview\/85.-mutation-assign-rates-to-vectoranalysismap-zonesmap\",\"api-docs\/geopard-api-requests-overview\/86.-query-get-farms\",\"api-docs\/geopard-api-requests-overview\/87.-mutation-save-custom-vectoranalysismap-zonesmap\",\"api-docs\/geopard-api-requests-overview\/88.-mutation-export-zonesmap-as-zipped-shapefile\",\"api-docs\/geopard-api-requests-overview\/89.-mutation-export-zonesmap-as-zipped-isoxml\",\"api-docs\/geopard-api-requests-overview\/9.-mutation-generate-zonesmap-asynchronously\",\"api-docs\/geopard-api-requests-overview\/90.-query-get-satelliteimagery-data-by-geometry\",\"api-docs\/geopard-api-requests-overview\/notes-pins\",\"api-docs\/geopard-api-requests-overview\/notes-pins\/25.-mutation-save-note-attached-to-field\",\"api-docs\/geopard-api-requests-overview\/notes-pins\/26.-mutation-save-note-attached-to-zonesmap\",\"api-docs\/geopard-api-requests-overview\/notes-pins\/27.-mutation-save-note-attached-to-soildataset\",\"api-docs\/geopard-api-requests-overview\/notes-pins\/28.-mutation-save-multiple-notes-batch-operation\",\"api-docs\/geopard-api-requests-overview\/notes-pins\/29.-mutation-delete-note\",\"api-docs\/geopard-api-requests-overview\/notes-pins\/30.-mutation-delete-multiple-notes\",\"api-docs\/geopard-api-requests-overview\/notes-pins\/31.-query-get-all-notes-related-to-field\",\"api-docs\/geopard-api-requests-overview\/notes-pins\/32.-query-get-notes-related-to-zonesmap-and-type\",\"api-docs\/geopard-api-requests-overview\/notes-pins\/33.-query-get-notes-related-to-soildataset-and-type\",\"api-docs\/geopard-api-requests-overview\/notes-pins\/34.-query-get-a-selected-note-with-all-comments\",\"api-docs\/geopard-api-requests-overview\/notes-pins\/35.-mutation-add-comment-to-the-selected-note\",\"api-docs\/geopard-api-requests-overview\/notes-pins\/36.-mutation-add-multiple-comments-to-the-selected-notes\",\"api-docs\/getting-started-with-the-geopard-api\",\"api-docs\/upload-files-with-the-geopard-api\",\"platform-roadmap\/geopard-platform-roadmap\",\"gis-quick-hints\/qgis-calculate-ndvi-for-the-drone-geotiff-file\",\"gis-quick-hints\/qgis-change-string-to-number-values-in-the-shapefile\",\"gis-quick-hints\/qgis-convert-csv-to-shp\",\"gis-quick-hints\/qgis-merge-selected-features-from-vector-files\",\"gis-quick-hints\/qgis-merge-vector-layers\",\"gis-quick-hints\/qgis-reproject-shapefile\",\"gis-quick-hints\/qgis-split-boundaries-into-subfields\",\"gis-quick-hints\/qgis-split-multi-field-shapefiles\",\"gis-quick-hints\/qgis-yield-data-manipulations\",\"policies\/your-data-stays-yours-securely-managed-by-geopard\"],\"t\":[\"GeoPard Platform: Frequently Asked Questions (FAQ)\",\"Glossary: precision ag terms used in GeoPard\",\"3D Maps\",\"Compare Layers\",\"Equation-based Analytics\",\"Batch Equation Analytics\",\"Catalog of Custom Functions\",\"Catalog of Predefined Agronomic Equations\",\"Export \/ Download\",\"Batch Export of Boundaries, Zones and Scouting Pins\",\"Export Application Operation data to John Deere Ops Center\",\"Export Equation-based map\",\"Export Scouting Notes as Shapefile\",\"Export to MyJohnDeere\",\"Export VRA Map in ISOXML Format\",\"Field Boundary Export\",\"Satellite Imagery Export as GeoTIFF or GeoJSON\",\"Zones Map Export as shapefile\",\"Farm, user and access setup\",\"Add a label\",\"Create a new farm\",\"Delete Farms\",\"Draw a new field\",\"Edit a boundary\",\"Edit a field name\",\"Farms Sharing between Accounts and Organizations\",\"Manage Client and Colleague Accounts on the Pay-As-You-Go Plan\",\"Organizations and Roles\",\"Upload a field boundary\",\"GeoPard AI Assistant\",\"Accuracy and evaluation\",\"Agronomy knowledge base\",\"Precision Agriculture AI Assistant FAQ\",\"Prompt library\",\"GeoPard API for Farm Data and Analytics\",\"GeoPard MCP\",\"Clean and Calibrate Yield Data\",\"Connect GeoPard MCP\",\"Explain Vegetation Patterns\",\"GeoPard MCP Capabilities\",\"Optimal Tillage Depth\",\"Verify GeoPard MCP Connection\",\"Import Precision Agriculture Data\",\"As-Applied\/As-Planted Data Import\",\"Import Field Boundaries\",\"Import from MyJohnDeere\",\"Machinery Proprietary Formats\",\"Soil Data (shp, with coordinates)\",\"Soil Lab results (CSV\/Excel) - Smart Import\",\"Yield Data Import\",\"John Deere Operations Center Integration\",\"1. Create a Free Trial Account with Your John Deere Account\",\"10. Export Application Operation data to John Deere Ops Center\",\"11. Synchronize a Field with John Deere Operations Center\",\"2. Connect to John Deere Operations Center\",\"3. Connect to John Deere Organizations\",\"4. Import into GeoPard from John Deere Operations Center\",\"5. Configure Automated Data Sync\",\"6. Export Rx Maps to John Deere Operations Center as Files\",\"7. Export Field Boundaries to John Deere Operations Center\",\"7a. Configure Boundary Export to John Deere Operations Center as Files\",\"8. Export Rx Maps to John Deere Operations Center as Work Plans\",\"9. Export Soil, Topography, Satellite or Analytics as Map Layers\",\"Data Sharing Options\",\"1. \\\"Staff Member\\\" sharing\",\"2. Problem-solving of \\\"Staff Member\\\" sharing\",\"3. \\\"Partner Organization\\\" sharing\",\"4. Problem-solving of \\\"Partner Organization\\\" sharing\",\"5. Problem-solving of import from John Deere to GeoPard\",\"6. Problem-solving of Work Plan creation\",\"7. Sharing Fields and Boundaries Between Partner Organizations in JD Ops Center\",\"Managing Crop Season Information with Tags (Labels)\",\"Case: Field operation details\",\"Case: Managing fields for several clients\",\"Case: Season details including crop and year\",\"On-Farm Trials Design and Creation\",\"Operations Log - Track errors\/Imports and Analytics\",\"Satellite Monitoring\",\"Crop Development Index Graph\",\"Indices for Crops and Soils\",\"Order Planet Scope (3m daily) imagery\",\"Soil Sampling - Automated Planning\",\"Topography Analysis for Precision Agriculture\",\"User Settings\",\"Changing preferences\",\"Order the package\",\"Reset Password\",\"Subscriptions, Account Limits and Plans\",\"Yield Data and Harvest Analytics\",\"Zones Maps and Analytics\",\"Assign Variable Rates in Zones (Ag Input Rates Distribution Tool)\",\"Create a Zones Map Using a Template\",\"Create a Zones Map Using Satellite Imagery\",\"Create a Zones Map Using Soil, Yield, or As-Applied Data\",\"Create a Zones Map Using Topography\",\"Draw Zones Manually or Clone from an Existing Layer\",\"Edit Zones Map: Merge and Split\",\"Heterogeneity factor\",\"Multi-Layer Analytics\",\"Multi-Year Zones\",\"Relative variation factor\",\"Using Data Classification\",\"Release Mobile August 2023 (Mobile App Improvements)\",\"Release Mobile May 2023 (Social Login)\",\"Release Notes\",\"Sep 2026: Yield Report, AI Assistant attachments, guidance lines, tillage workplans, attribute tables and polygon cloning. Release details\",\"Release Web and Mobile February 2026 (Farm View, Soil Lab csv\/excel import, Zones dynamic editing)\",\"Release Web and Mobile July 2026 (AI Assistant Beta, AB-Line Grids, Trials, Exports)\",\"Release Web and Mobile September 2025 (Automated Soil Sampling, Zones from Equations, Billing portal)\",\"Release Web April 2022 (3D maps and Zoning Tools)\",\"Release Web April 2024 (Batch Equation Maps and enhanced layer transparency)\",\"Release Web August 2024 (Data Layer Previews, Spatially Localized Zones, Reusable Zones)\",\"Release Web February 2024 (Per area pricing, units)\",\"Release Web January 2023 (huge amount of small improvements)\",\"Release Web January 2024 (many UI improvements)\",\"Release Web January 2025 (Free Trial, Usage-based Pricing Plan, USDA Yield Cleaning protocol, Export of calibrated Yield data to John Deere Ops Center, Import of kml)\",\"Release Web July 2023 (Operations Log page, Sum in datasets)\",\"Release Web July 2024 (Equation Map creation, Spatially localized zones, Seeding and Application Work Plans)\",\"Release Web June 2023 (Improved Equations, Operations log v1)\",\"Release Web March 2025 (Improved Zones, WorkPlans updates, Yield data enhancements)\",\"Release Web March 2026 (Field Trials Design, Generative Synthetic Yield Maps, Farm View Stats, MCP)\",\"Release Web May 2023 (John Deere integration improvements)\",\"Release Web May 2024 (Raw view for Satellite Images, export of Zone Maps as WorkPlan to the John Deere Operations Center, redesign of Batch Analytics)\",\"Release Web May 2025 (Rates Distribution, improved Legends)\",\"Release Web November 2023 (Clone Polygons, Subscription management)\",\"Release Web October 2022 (Integration with AgGateway Protocols, ISOXML Support, and More)\",\"Release Web October 2023 (Yield Calibration, Equation Maps as ISOXML, PDF Export and John Deere Integration)\",\"Release Web September 2023 (Cleaning and Calibrating Yield Datasets, More Language Support)\",\"Analyzing John Deere See and Spray Data with Custom Formulas\",\"Compare Soil Scanner Data between Years\",\"Comparing Yield Datasets\",\"Create Soil Sampling Zones, Points, Routes, Export as KML, and Execute\",\"Dealer Workflow in Italy: John Deere Ops Center - GeoPard - VRA Nitrogen - Trials - Profit Maps\",\"Detecting Clay and Sand with SBI\",\"Evaluate Accuracy of Fertilizer Application\",\"Evaluate Accuracy of Seeding Application\",\"Field Management Zones (Productivity Zones) Creation Process\",\"Field Trial Analytics\",\"Flood Insurance Report\",\"Nitrogen Use Efficiency (NUE) and Nitrogen Uptake\",\"Precision Agronomy Use Cases and Best Practices Overview\",\"Synthetic Yield Map\",\"Use Case: Variable-Rate Nitrogen (VRA) for Potatoes to Realize 5\u201310% More Yield\",\"Variable Rate Fertilizer Maps\",\"Variable Rate Seeding (Planting) Maps\",\"VR Lime Application Based on Soil pH Data\",\"VR Tillage from Soil Compaction\",\"VRA Seeding and Nitrogen Maps from Plant Available Water and Organic Matter\",\"Weed Patches Detection and Herbicide VRA Rx Map\",\"Yield Calibration and Cleaning\",\"Yield Report\",\"Filters for Mobile Field Review\",\"Install the GeoPard Mobile App\",\"Log In to the GeoPard Mobile App\",\"Map and Layer Options in the Mobile App\",\"Mobile App Settings and Preferences\",\"Viewing as-applied datasets\",\"Viewing satellite images\",\"Viewing soil data\",\"Viewing topography maps\",\"Viewing yield data\",\"Viewing zones maps\",\"Working in the field\/Scouting zones maps\",\"Working offline\",\"Authorization: ApiKey, Credentials or OAuth 2.0\",\"Diagrams with Basic Flows\",\"1. Field Registration\",\"2. GraphQL Subscription\",\"3. Get Satellite Imagery\",\"4. Upload Soil | AsApplied | Yield Datasets\",\"5. Execute Equations\",\"6. Generate ZonesMap\",\"7. Download Gridded Data\",\"8. Download Original Data\",\"Geo Endpoints for Spatial Data Access\",\"WFS - Get Spatial Data Layers in Vector Format (SHP, GeoJSON)\",\"1. Get the Field Boundary as GeoJSON\",\"2. Get the Zones Map as GeoJSON\",\"3. Get Zones Attributes as JSON\",\"4. Get Soil Data as GeoJSON\",\"5. Get Yield Data as GeoJSON\",\"WMS - Get Raster Pictures of Spatial Data Layers\",\"1. LAI\",\"10. RasterMap: thumbnail\",\"11. TopographyMap: elevation in absolute numbers\",\"12. YieldDatasetsMap\",\"13. SoilDatasetsMap\",\"14. SoilDatasetsMap: custom color schema\",\"15. AsAppliedDatasetsMap\",\"16. Satellite Image: cropped by Field boundary\",\"17. Satellite Image: cropped by Field boundary and custom color schema\",\"18. YieldDatasetsMap: custom color schema\",\"Previous 19. Satellite Image: 10 colors visualization\",\"2. RGB\",\"3. Field: boundary\",\"4. Field: thumbnail\",\"5. ZonesMap\",\"6. ZonesMap: custom color schema\",\"7. ZonesMap: thumbnail\",\"8. RasterMap\",\"9. RasterMap: custom color schema\",\"GeoPard API Data Schema\",\"GeoPard API FAQ and Common Questions\",\"GeoPard API Overview\",\"GeoPard API Requests Overview\",\"1. Subscription: Get Events\",\"10. Mutation: Generate \\\"RasterMap\\\" asynchronously\",\"11. Mutation: Generate Yield based \\\"ZonesMap\\\" asynchronously\",\"12. Mutation: Generate Soil based \\\"ZonesMap\\\" asynchronously\",\"Request 1 or R1\",\"Request 2 or R2\",\"15. Query: Get \\\"TopographyMap\\\"\",\"16. Query: Get YieldDatasets\",\"17. Query: Get \\\"SoilDatasets\\\"\",\"18. Mutation: Generate zip archive with \\\"ZonesMap\\\" and \\\"Field\\\"\",\"19. Mutation: Delete \\\"Field\\\"\",\"2. Query: Get \\\"Fields\\\"\",\"20. Mutation: Delete \\\"Farm\\\"\",\"21. Mutation: Delete \\\"ZonesMap\\\"\",\"22. Mutation: Delete \\\"RasterAnalysisMap\\\"\",\"23. Mutation: Delete \\\"SoilDataset\\\"\",\"24. Mutation: Delete \\\"YieldDataset\\\"\",\"3. Query: Get \\\"SatelliteImages\\\"\",\"37. Query: Get \\\"SatelliteImages\\\" in the defined interval\",\"38. Query: Get \\\"UserData\\\"\",\"39. Mutation: Set custom color schemas to selected \\\"GeoMaps\\\"\",\"4. Query: Get defined \\\"SatelliteImage\\\"\",\"40. Query: Get \\\"Labels\\\" on the account level\",\"41. Mutation: Save \\\"Labels\\\" on the account level\",\"42. Mutation: Delete \\\"Label\\\" on the account level\",\"43. Query Get \\\"Fields\\\"\",\"Request 3 or R3\",\"45. Mutation: Save User Data\",\"46. Mutation: Generate multi-layer \\\"ZonesMap\\\" asynchronously\",\"47. Query: Get \\\"ZonesMaps\\\"\",\"48. Query: Get Gridded Data from \\\"TopographyMap\\\"\",\"49. Query: Get Gridded Data from \\\"FieldSatelliteImage\\\"\",\"5. Query: Get \\\"RasterMaps\\\"\",\"50. Query: Get Gridded Data from \\\"VectorAnalysisMap\\\"\",\"51. Query: Get Gridded Data from \\\"YieldDataset\\\"\",\"52. Query: Get Gridded Data from \\\"SoilDataset\\\"\",\"53. Query: Get Gridded Data from \\\"AsAppliedDataset\\\"\",\"54. Query: Get Vector Data from \\\"SoilDataset\\\"\",\"55. Upload zip files (over 6 MB)\",\"56. Upload photos\",\"57. Query: Get \\\"Photos\\\" attached to the selected \\\"Note\\\"\",\"58. Query: Get \\\"Photos\\\" attached to \\\"Comments\\\"\",\"59. Query: Get \\\"AsAppliedDatasets\\\"\",\"6. Query: Get \\\"ZonesMaps\\\"\",\"60. Mutation: Generate As-Applied-based \\\"ZonesMap\\\" asynchronously\",\"61. Mutation: Delete \\\"AsAppliedDataset\\\"\",\"62. Mutation: Share Farms\",\"63. Mutation: Save Organization\",\"64. Mutation: Add Users to Organization\",\"65. Mutation: Delete Users from Organization\",\"66. Mutation: Save Field\",\"67. Mutation: Save Farm\",\"68. Mutation: Refresh \\\"VectorAnalysisMap\\\" Statistics\",\"69. Mutation: Delete \\\"Photo\\\"\",\"7. Mutation: Generate \\\"ZonesMap\\\"\",\"70. Mutation: Delete multiple \\\"Photos\\\"\",\"71. Mutation: Generate a zip archive with \\\"Notes\\\"\",\"72. Query: Get Gridded Data as GeoJSON or GeoTIFF\",\"73. Query: Get Gridded Data with the Selected Buffer\",\"74. Mutation: Verify \\\"Equation\\\"\",\"75. Mutation: Generate \\\"EquationMap\\\" asynchronously\",\"76. Query: Get \\\"EquationMap\\\"\",\"77. Mutation: Delete \\\"EquationMap\\\"\",\"78. Query: Find \\\"Fields\\\" by \\\"externalKey\\\"\",\"79. Query: Find \\\"Farms\\\" by \\\"externalKey\\\"\",\"8. Mutation: Generate \\\"RasterMap\\\"\",\"80. Query: Get Original Data\",\"81. Query: Get GeoJSON of \\\"EquationMap\\\"\",\"82. Query: Restore Subscription Events\",\"83. Query: Collect Platform Context\",\"84. Mutation: Calibrate and Clean YieldDataset\",\"85. Mutation: Assign Rates to VectorAnalysisMap (ZonesMap)\",\"86. Query: Get \\\"Farms\\\"\",\"87. Mutation: Save Custom VectorAnalysisMap (ZonesMap)\",\"88. Mutation: Export ZonesMap as Zipped Shapefile\",\"89. Mutation: Export ZonesMap as Zipped ISOXML\",\"9. Mutation: Generate \\\"ZonesMap\\\" asynchronously\",\"90. Query: Get SatelliteImagery Data by Geometry\",\"Notes (Pins)\",\"25. Mutation: Save \\\"Note\\\" attached to \\\"Field\\\"\",\"26. Mutation: Save \\\"Note\\\" attached to \\\"ZonesMap\\\"\",\"27. Mutation: Save \\\"Note\\\" attached to \\\"SoilDataset\\\"\",\"28. Mutation: Save multiple \\\"Notes\\\", Batch operation\",\"29. Mutation: Delete \\\"Note\\\"\",\"30. Mutation: Delete multiple \\\"Notes\\\"\",\"31. Query: Get all \\\"Notes\\\" related to \\\"Field\\\"\",\"32. Query: Get \\\"Notes\\\" related to \\\"ZonesMap\\\" and type\",\"33. Query: Get \\\"Notes\\\" related to \\\"SoilDataset\\\" and type\",\"34. Query: Get a selected \\\"Note\\\" with all \\\"Comments\\\"\",\"35. Mutation: Add \\\"Comment\\\" to the selected \\\"Note\\\"\",\"36. Mutation: Add multiple \\\"Comments\\\" to the selected \\\"Notes\\\"\",\"Getting Started with the GeoPard API\",\"Upload Files with the GeoPard API\",\"GeoPard Platform Roadmap\",\"QGIS: Calculate NDVI for the Drone Geotiff File\",\"QGIS: Change String to Number values in the shapefile\",\"QGIS: Convert CSV to SHP\",\"QGIS: Merge Selected Features from Vector Files\",\"QGIS: Merge Vector Layers\",\"QGIS: Reproject Shapefile\",\"QGIS: Split Boundaries Into Subfields\",\"QGIS: Split Multi-field Shapefiles\",\"QGIS: Yield Data Manipulations\",\"Your Data Stays Yours, Securely Managed by GeoPard\"],\"m\":[\"2026-04\",\"2026-04\",\"2026-04\",\"2026-07\",\"2026-04\",\"2026-04\",\"2026-04\",\"2026-04\",\"2026-04\",\"2026-04\",\"2026-04\",\"2026-04\",\"2026-04\",\"2026-04\",\"2026-04\",\"2026-04\",\"2026-04\",\"2026-04\",\"2026-04\",\"2026-04\",\"2026-04\",\"2026-04\",\"2026-04\",\"2026-04\",\"2026-04\",\"2026-08\",\"2026-04\",\"2026-04\",\"2026-04\",\"2026-08\",\"2026-08\",\"2026-08\",\"2026-08\",\"2026-08\",\"2026-04\",\"2026-08\",\"2026-04\",\"2025-11\",\"2026-04\",\"2026-08\",\"2025-11\",\"2026-04\",\"2026-04\",\"2026-04\",\"2026-04\",\"2026-06\",\"2026-04\",\"2026-04\",\"2026-08\",\"2026-04\",\"2026-08\",\"2026-04\",\"2026-04\",\"2026-06\",\"2026-06\",\"2026-06\",\"2026-06\",\"2026-06\",\"2026-04\",\"2026-07\",\"2026-04\",\"2026-04\",\"2026-04\",\"2026-04\",\"2026-04\",\"2026-04\",\"2026-04\",\"2026-04\",\"2026-04\",\"2026-04\",\"2026-04\",\"2026-04\",\"2026-04\",\"2023-05\",\"2023-05\",\"2026-04\",\"2026-04\",\"2026-04\",\"2026-04\",\"2026-04\",\"2026-04\",\"2026-06\",\"2026-04\",\"2026-04\",\"2026-04\",\"2026-04\",\"2026-04\",\"2026-04\",\"2026-08\",\"2026-04\",\"2026-04\",\"2026-04\",\"2026-04\",\"2026-04\",\"2026-04\",\"2026-04\",\"2026-04\",\"2026-04\",\"2026-04\",\"2026-04\",\"2026-04\",\"2026-04\",\"2026-04\",\"2025-04\",\"2026-09\",\"2026-09\",\"2026-04\",\"2026-08\",\"2026-04\",\"2025-04\",\"2024-05\",\"2026-04\",\"2026-04\",\"2025-04\",\"2025-04\",\"2025-01\",\"2024-04\",\"2024-09\",\"2024-04\",\"2025-03\",\"2026-04\",\"2024-09\",\"2024-05\",\"2025-05\",\"2025-04\",\"2026-04\",\"2025-04\",\"2026-04\",\"2026-04\",\"2025-04\",\"2024-12\",\"2026-04\",\"2026-01\",\"2025-11\",\"2024-12\",\"2024-12\",\"2026-04\",\"2026-04\",\"2026-04\",\"2026-02\",\"2026-04\",\"2025-11\",\"2026-04\",\"2026-04\",\"2026-04\",\"2026-02\",\"2026-01\",\"2026-02\",\"2025-11\",\"2026-02\",\"2026-08\",\"2026-04\",\"2026-04\",\"2026-04\",\"2026-04\",\"2026-04\",\"2026-04\",\"2026-04\",\"2026-04\",\"2026-04\",\"2026-04\",\"2026-04\",\"2026-04\",\"2026-04\",\"2025-11\",\"2023-07\",\"2023-07\",\"2023-07\",\"2026-04\",\"2023-07\",\"2023-07\",\"2023-07\",\"2023-07\",\"2023-07\",\"2026-04\",\"2026-04\",\"2026-04\",\"2026-04\",\"2023-02\",\"2026-04\",\"2026-04\",\"2024-06\",\"2023-09\",\"2023-09\",\"2024-10\",\"2024-06\",\"2024-06\",\"2023-09\",\"2023-09\",\"2023-09\",\"2023-09\",\"2023-09\",\"2023-09\",\"2023-09\",\"2023-09\",\"2023-09\",\"2023-09\",\"2024-06\",\"2023-09\",\"2023-09\",\"2023-09\",\"2026-04\",\"2026-04\",\"2026-04\",\"2026-04\",\"2023-07\",\"2023-07\",\"2026-02\",\"2026-02\",\"2026-02\",\"2024-01\",\"2023-04\",\"2026-03\",\"2023-07\",\"2023-07\",\"2023-07\",\"2024-07\",\"2023-07\",\"2023-07\",\"2026-04\",\"2023-07\",\"2023-07\",\"2024-06\",\"2023-07\",\"2023-02\",\"2023-07\",\"2024-06\",\"2023-04\",\"2023-02\",\"2026-02\",\"2024-07\",\"2023-04\",\"2023-07\",\"2025-10\",\"2025-10\",\"2023-07\",\"2023-07\",\"2023-04\",\"2024-06\",\"2024-06\",\"2024-06\",\"2024-06\",\"2024-06\",\"2024-06\",\"2026-02\",\"2024-06\",\"2024-06\",\"2026-02\",\"2025-10\",\"2024-06\",\"2024-06\",\"2024-06\",\"2024-06\",\"2024-06\",\"2024-06\",\"2024-06\",\"2024-06\",\"2024-06\",\"2024-06\",\"2023-07\",\"2024-06\",\"2024-06\",\"2026-02\",\"2024-06\",\"2024-06\",\"2024-07\",\"2025-10\",\"2024-06\",\"2024-06\",\"2024-04\",\"2023-07\",\"2024-06\",\"2026-02\",\"2024-06\",\"2024-06\",\"2026-03\",\"2024-06\",\"2024-06\",\"2026-02\",\"2026-02\",\"2026-02\",\"2023-07\",\"2026-02\",\"2024-05\",\"2024-05\",\"2024-05\",\"2024-05\",\"2024-05\",\"2023-02\",\"2023-02\",\"2023-02\",\"2023-02\",\"2023-02\",\"2023-02\",\"2024-05\",\"2024-05\",\"2026-04\",\"2026-04\",\"2026-04\",\"2026-04\",\"2026-04\",\"2026-04\",\"2026-04\",\"2026-04\",\"2026-04\",\"2026-04\",\"2026-04\",\"2026-04\",\"2026-04\"]}<\/script>\n\n<script nowprocket data-no-optimize=\"1\" data-no-defer=\"1\" data-no-minify=\"1\">\n\/* GPD-DOCS-SEARCH BEGIN \u2014 generated from tools\/docs-hub\/docs-search-core.js by node tools\/docs-hub\/build-launcher.js. DO NOT EDIT HERE. *\/\n\/* GPD-DOCS-SEARCH \u2014 search over the whole documentation, source of truth.\n   Injected into tools\/docs-hub\/source.html and shared\/docs_embed.html by\n   node tools\/docs-hub\/build-launcher.js. Edit THIS file, never a generated\n   section; tests.js fails if the two copies drift.\n\n   Self-mounting. A host page needs, in its own markup and its own scope:\n\n     - the index, as a JSON script block carrying  data-gp-docs-index\n     - a container carrying                        data-gp-docsearch\n     - inside it, an input carrying                data-ds-input\n     - inside it, an empty results box carrying    data-ds-results\n     - optionally an empty-state box carrying      data-ds-none\n     - optionally a keyboard hint carrying         data-ds-hint\n\n   Tags are named rather than shown here: a literal script tag inside this\n   comment would trip the embed's own optimizer-attribute check, and a literal\n   closing one would end the script element and take the rest of the page with\n   it. Both happened.\n\n   It also wires every [data-p] and [data-gp-doc] link in the document to the\n   docs panel, and fills every [data-dx-n] number slot. Both hosts use the same\n   row class names and style them under their own scope, so nothing here needs\n   configuring.\n\n   Rule 1: no ampersand anywhere in this file. Every user-visible label is\n   static markup in the host, because TranslatePress translates the DOM and a\n   label written here would stay English on the 24 translated copies. *\/\n(function () {\n  if (window.__GP_DOCS_INDEX) { return; }\n\n  var blob = document.querySelector('[data-gp-docs-index]');\n  if (!blob) { return; }\n  var DATA;\n  try { DATA = JSON.parse(blob.textContent); } catch (e) { return; }\n  var N = DATA.u ? DATA.u.length : 0;\n  if (!N) { return; }\n\n  var secBySlug = {};\n  var SECS = DATA.sections || [];\n  for (var i = 0; i < SECS.length; i++) { secBySlug[SECS[i].slug] = SECS[i]; }\n\n  \/* Section, depth and the breadcrumb all follow from the path, so the index\n     does not carry them and they are rebuilt once here. *\/\n  var byPath = {};\n  for (var j = 0; j < N; j++) { byPath[DATA.u[j]] = j; }\n\n  var PAGE = [];\n  for (var k = 0; k < N; k++) {\n    var u = DATA.u[k];\n    var parts = u.split('\/');\n    var trail = [];\n    for (var a = 1; a < parts.length - 1; a++) {\n      var anc = byPath[parts.slice(0, a + 1).join('\/')];\n      if (anc !== undefined) { trail.push(DATA.t[anc]); }\n    }\n    var sec = secBySlug[parts[0]];\n    PAGE.push({\n      u: u,\n      t: DATA.t[k],\n      m: DATA.m[k] || '',\n      sec: parts[0],\n      secT: sec ? sec.title : parts[0],\n      crumb: trail.join(' \/ '),\n      depth: parts.length - 1,\n      hay: (DATA.t[k] + ' ' + trail.join(' ') + ' ' + (sec ? sec.title : '')).toLowerCase()\n    });\n  }\n\n  \/* \u2500\u2500 numbers into static sentences \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 *\/\n  var MONTHS = ['January', 'February', 'March', 'April', 'May', 'June', 'July',\n    'August', 'September', 'October', 'November', 'December'];\n  var newest = '';\n  for (var q = 0; q < PAGE.length; q++) { if (PAGE[q].m > newest) { newest = PAGE[q].m; } }\n  function setN(name, value) {\n    var els = document.querySelectorAll('[data-dx-n=\"' + name + '\"]');\n    for (var q0 = 0; q0 < els.length; q0++) { els[q0].textContent = value; }\n  }\n  setN('pages', String(N));\n  setN('langs', String(DATA.languages || ''));\n  if (newest) { setN('updated', MONTHS[parseInt(newest.slice(5, 7), 10) - 1] + ' ' + newest.slice(0, 4)); }\n\n  \/* \u2500\u2500 opening a page \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 *\/\n  function docUrl(path) {\n    return DATA.origin + DATA.space + (path ? '\/' + path : '');\n  }\n  function openDoc(path) {\n    var D = window.__GP_DOCS;\n    if (D) { D.open(path); return; }\n    window.location.href = docUrl(path);   \/* same tab, rule 25 *\/\n  }\n  function wire(el, path) {\n    if (el.getAttribute('data-ds-wired')) { return; }\n    el.setAttribute('data-ds-wired', '1');\n    el.setAttribute('href', docUrl(path));\n    el.addEventListener('click', function (ev) {\n      \/* A reader who asks the browser for a new tab gets one. That is not the\n         same as us opening one. *\/\n      if (ev.metaKey || ev.ctrlKey || ev.shiftKey || ev.altKey || ev.button > 0) { return; }\n      ev.preventDefault();\n      openDoc(path);\n    });\n  }\n  function wireAll() {\n    var links = document.querySelectorAll('[data-p],[data-gp-doc]');\n    for (var w = 0; w < links.length; w++) {\n      var p = links[w].getAttribute('data-p') || links[w].getAttribute('data-gp-doc');\n      if (p) { wire(links[w], p); }\n    }\n  }\n  wireAll();\n\n  \/* \u2500\u2500 reading a question \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n     People type sentences, not keywords: \"how to create synthetic yield\".\n     Three things have to happen before that can match a title.\n\n     1. Drop the words that carry no meaning here. Every title in the\n        documentation is a noun phrase, so \"how\", \"do\", \"I\" and \"to\" can only\n        ever fail the match.\n     2. Stem to a prefix. The haystack is matched by substring, so stemming\n        the QUERY (\"zones\" to \"zone\", \"creating\" to \"creat\") matches both\n        directions without a stemmer on the index.\n     3. Translate the words a farmer uses into the words the documentation\n        uses. Somebody types \"prescription\" or \"rx\"; the page is called\n        Variable Rate. Somebody types \"combine\"; the page says yield. This\n        table is the difference between a search that works and one that\n        sends people away. *\/\n  var STOP = {};\n  ('how do does did i me my we us you your a an the to of in on for and or is are ' +\n   'can could should would what which who where when why with from by at as it its ' +\n   'that this these those be been being get got make making want need help please ' +\n   'there their then than so if about into out up down any some all no not ' +\n   'best way ways step steps guide tutorial ' +\n   'much many more most two three four several between against each other over ' +\n   'under after before every same also just only still here work works').split(' ')\n    .forEach(function (w) { STOP[w] = 1; });\n\n  var SYN = {\n    rx: ['variable rate', 'prescription'],\n    prescription: ['variable rate', 'rx'],\n    vra: ['variable rate'],\n    variable: ['variable rate'],\n    spreader: ['fertilizer'],\n    fertiliser: ['fertilizer'],\n    fertilis: ['fertilizer'],\n    fertiliz: ['fertilizer'],\n    nitrogen: ['nitrogen', 'nue'],\n    planter: ['seeding', 'planting'],\n    seeder: ['seeding'],\n    seed: ['seeding'],\n    sow: ['seeding', 'planting'],\n    sprayer: ['herbicide', 'spray'],\n    spray: ['herbicide'],\n    weed: ['weed', 'herbicide'],\n    lime: ['lime'],\n    ph: ['lime', 'soil lab'],\n    till: ['tillage'],\n    compaction: ['tillage', 'compaction'],\n    combine: ['yield'],\n    harvester: ['yield'],\n    harvest: ['yield'],\n    clean: ['cleaning', 'calibration'],\n    calibrat: ['calibration'],\n    zone: ['zones'],\n    zoning: ['zones'],\n    boundary: ['boundary', 'boundaries'],\n    outline: ['boundary'],\n    shp: ['shapefile'],\n    shape: ['shapefile'],\n    tif: ['geotiff'],\n    tiff: ['geotiff'],\n    raster: ['geotiff', 'satellite'],\n    drone: ['geotiff', 'drone'],\n    uav: ['geotiff', 'drone'],\n    isoxml: ['isoxml'],\n    iso: ['isoxml'],\n    terminal: ['isoxml', 'work plan'],\n    tractor: ['work plan', 'machinery'],\n    machine: ['machinery', 'work plan'],\n    jd: ['john deere'],\n    deere: ['john deere'],\n    ops: ['operations center'],\n    token: ['authorization'],\n    auth: ['authorization'],\n    key: ['authorization', 'apikey'],\n    apikey: ['authorization'],\n    ndvi: ['indices'],\n    ndre: ['indices'],\n    index: ['indices'],\n    indice: ['indices'],\n    imagery: ['satellite'],\n    image: ['satellite'],\n    lab: ['soil lab'],\n    laboratory: ['soil lab'],\n    sample: ['sampling'],\n    sampling: ['sampling'],\n    scan: ['scanner'],\n    scout: ['scouting'],\n    trial: ['trial'],\n    strip: ['trial'],\n    plan: ['work plan'],\n    applied: ['as-applied'],\n    asapplied: ['as-applied'],\n    price: ['subscriptions', 'plans'],\n    cost: ['subscriptions', 'plans'],\n    subscription: ['subscriptions'],\n    phone: ['mobile'],\n    offline: ['offline'],\n    export: ['export'],\n    import: ['import'],\n    upload: ['import', 'upload'],\n    download: ['export', 'download'],\n    load: ['import'],\n    open: ['import'],\n    fail: ['problem-solving', 'operations log'],\n    error: ['problem-solving', 'operations log'],\n    broken: ['problem-solving', 'operations log'],\n    problem: ['problem-solving', 'operations log'],\n    wrong: ['problem-solving', 'operations log'],\n    stuck: ['problem-solving', 'operations log'],\n    projection: ['reproject'],\n    crs: ['reproject'],\n    epsg: ['reproject'],\n    season: ['season', 'multi-year'],\n    year: ['multi-year', 'year'],\n    compare: ['comparing', 'compare'],\n    report: ['report'],\n    pdf: ['export', 'pdf'],\n    share: ['sharing'],\n    user: ['user', 'access'],\n    team: ['organizations', 'access'],\n    login: ['log in'],\n    password: ['password']\n  };\n\n  function stem(w) {\n    if (w.length > 5 ? w.slice(-3) === 'ing' : false) { return w.slice(0, -3); }\n    if (w.length > 5 ? w.slice(-2) === 'ed' : false) { return w.slice(0, -2); }\n    if (w.length > 4 ? w.slice(-3) === 'ies' : false) { return w.slice(0, -3) + 'i'; }\n    if (w.length > 3 ? w.slice(-1) === 's' : false) { w = w.slice(0, -1); }\n    \/* \"compare\" has to reach \"Comparing\", so a trailing e goes too. The\n       haystack is matched by substring, so a shorter stem only widens. *\/\n    if (w.length > 5 ? w.slice(-1) === 'e' : false) { return w.slice(0, -1); }\n    return w;\n  }\n\n  \/* One group per meaningful word: the word, its stem, and whatever the\n     documentation calls the same thing. A page matches the group if ANY form\n     is in its haystack. *\/\n  \/* \"will not load\", \"cannot\", \"fails\" all say the same thing: something is\n     broken. The negation would otherwise be dropped with the stopwords, and\n     \"my shapefile will not load\" would return the pages about EXPORTING a\n     shapefile. *\/\n  var BROKEN = \/\\b(not|cannot|cant|wont|doesnt|didnt|fail|fails|failed|failing|error|errors|broken|wrong|issue|issues|problem|problems|stuck|missing|empty|blank)\\b\/;\n\n  function parse(q) {\n    var lower = q.toLowerCase();\n    var words = lower.replace(\/[^a-z0-9\\s-]\/g, ' ').split(\/\\s+\/);\n    var groups = [];\n    for (var i = 0; i < words.length; i++) {\n      var w = words[i];\n      if (w.length < 2 ? true : STOP[w]) { continue; }\n      var st = stem(w);\n      var forms = [st];\n      var syn = SYN[w] || SYN[st] || null;\n      if (syn) { forms = forms.concat(syn); }\n      groups.push(forms);\n    }\n    if (groups.length ? BROKEN.test(lower.replace(\/['\\u2019]\/g, '')) : false) {\n      groups.push(['problem-solving', 'operations log', 'reproject', 'calibration']);\n    }\n    return groups;\n  }\n\n  \/* \u2500\u2500 ranking \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 *\/\n  function score(page, groups, whole, need) {\n    var t = page.t.toLowerCase();\n    var sc = 0;\n    \/* The whole phrase at the very start of a title is the strongest signal\n       there is. The same phrase buried mid-title is barely a signal at all: a\n       release headline listing nine features carries half the vocabulary of\n       the documentation, and used to beat the page that teaches the thing. *\/\n    if (t.indexOf(whole) === 0) { sc += 120; }\n    else if (t.indexOf(whole) >= 0) { sc += 25; }\n\n    var matched = 0;\n    for (var i2 = 0; i2 < groups.length; i2++) {\n      var forms = groups[i2];\n      var best = -1;\n      for (var f = 0; f < forms.length; f++) {\n        var tok = forms[f];\n        if (page.hay.indexOf(tok) < 0) { continue; }\n        var here;\n        if (t.indexOf(tok) === 0) { here = 30; }\n        else if (t.indexOf(' ' + tok) > 0) { here = 20; }\n        else if (t.indexOf(tok) > 0) { here = 10; }\n        else { here = 3; }\n        \/* A word the reader actually typed beats one we substituted for it. *\/\n        if (f > 0) { here = Math.round(here * 0.7); }\n        if (here > best) { best = here; }\n      }\n      if (best < 0) { continue; }\n      matched++;\n      sc += best;\n    }\n    \/* A sentence carries words the documentation will not have. Matching every\n       one of them is the old keyword behaviour and returns nothing for a real\n       question, so a page qualifies on enough of them and ranks on how many. *\/\n    if (matched < need) { return -1; }\n    sc += matched * 55;\n\n    \/* Somebody typing a task wants the page that teaches it, not the month it\n       shipped in. The changelog stays searchable, one rank down. *\/\n    if (page.sec === 'changelog-and-product-releases') { sc -= 30; }\n    sc -= page.depth * 4;\n    \/* A short title is a specific one. A long one is a list. *\/\n    sc -= Math.min(30, Math.round(page.t.length \/ 8));\n    return sc;\n  }\n\n  \/* The one ranking entry point. Every search box uses it, and so does the\n     test suite, which pins what a list of real questions must return. *\/\n  function rank(text, limit) {\n    var raw = String(text || '').trim();\n    if (raw.length < 2) { return []; }\n    var whole = raw.toLowerCase();\n    var groups = parse(raw);\n    if (!groups.length) { return []; }\n    \/* One or two meaningful words is a keyword search and all of them must\n       land. Three or more is a sentence, where two carrying words is enough\n       to be the right page. *\/\n    var need = groups.length <= 2 ? groups.length : 2;\n    var out = [];\n    \/* Strict first, then relax. \"compare two seasons\" leaves two carrying\n       words that no single page has both of, and a reader who gets nothing\n       back assumes the documentation has nothing. Dropping the bar one notch\n       at a time keeps precision where it exists and still answers where it\n       does not. *\/\n    while (need >= 1) {\n      out = [];\n      for (var i = 0; i < PAGE.length; i++) {\n        var sc = score(PAGE[i], groups, whole, need);\n        if (sc >= 0) { out.push([sc, PAGE[i]]); }\n      }\n      if (out.length) { break; }\n      need--;\n    }\n    out.sort(function (x, y) { return y[0] - x[0]; });\n    var rows = [];\n    var cap = limit || 8;\n    for (var j = 0; j < out.length ? j < cap : false; j++) { rows.push(out[j][1]); }\n    return rows;\n  }\n\n  \/* \u2500\u2500 one search box \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 *\/\n  function mount(box) {\n    var input = box.querySelector('[data-ds-input]');\n    var res = box.querySelector('[data-ds-results]');\n    if (input ? !res : true) { return; }\n    var none = box.querySelector('[data-ds-none]');\n    var hint = box.querySelector('[data-ds-hint]');\n    var limit = parseInt(box.getAttribute('data-ds-limit') || '8', 10);\n    var cur = -1;\n\n    \/* Nothing matched the titles, so hand the words to the documentation's\n       own assistant, which reads the full text. *\/\n    var noneBtn = none ? none.querySelector('button,a') : null;\n    if (noneBtn) {\n      noneBtn.addEventListener('click', function (ev) {\n        ev.preventDefault();\n        var D = window.__GP_DOCS;\n        var q = input.value.trim();\n        if (D ? q : false) { D.ask(q, D.locale ? D.locale() : ''); return; }\n        openDoc('');\n      });\n    }\n\n    function render(rows) {\n      res.textContent = '';\n      cur = -1;\n      if (!rows.length) {\n        res.hidden = true;\n        if (none) { none.hidden = false; }\n        if (hint) { hint.hidden = true; }\n        return;\n      }\n      if (none) { none.hidden = true; }\n      for (var i3 = 0; i3 < rows.length; i3++) {\n        var row = document.createElement('a');\n        row.className = 'dx-row';\n        row.setAttribute('role', 'option');\n        var rt = document.createElement('span');\n        rt.className = 'dx-row-t';\n        rt.textContent = rows[i3].t;\n        row.appendChild(rt);\n        var meta = document.createElement('span');\n        meta.className = 'dx-row-m';\n        var em = document.createElement('i');\n        em.textContent = rows[i3].secT;\n        meta.appendChild(em);\n        if (rows[i3].crumb) { meta.appendChild(document.createTextNode(' \u00b7 ' + rows[i3].crumb)); }\n        row.appendChild(meta);\n        wire(row, rows[i3].u);\n        res.appendChild(row);\n      }\n      res.hidden = false;\n      if (hint) { hint.hidden = false; }\n    }\n\n    function search() {\n      var raw = input.value.trim();\n      if (raw.length < 2) {\n        res.hidden = true;\n        res.textContent = '';\n        if (none) { none.hidden = true; }\n        if (hint) { hint.hidden = true; }\n        return;\n      }\n      render(rank(raw, limit));\n    }\n\n    function highlight(next) {\n      var items = res.querySelectorAll('.dx-row');\n      if (!items.length) { return; }\n      if (cur >= 0) { items[cur].classList.remove('on'); }\n      cur = next < 0 ? items.length - 1 : next % items.length;\n      items[cur].classList.add('on');\n      items[cur].scrollIntoView({ block: 'nearest' });\n    }\n\n    runners.push({ box: box, input: input, run: search });\n\n    input.addEventListener('input', search);\n    input.addEventListener('keydown', function (ev) {\n      if (ev.key === 'ArrowDown') { ev.preventDefault(); highlight(cur + 1); return; }\n      if (ev.key === 'ArrowUp') { ev.preventDefault(); highlight(cur - 1); return; }\n      if (ev.key === 'Escape') { input.value = ''; search(); return; }\n      if (ev.key === 'Enter') {\n        var items = res.querySelectorAll('.dx-row');\n        var pick = cur >= 0 ? items[cur] : items[0];\n        if (pick) { ev.preventDefault(); pick.click(); }\n      }\n    });\n  }\n\n  var boxes = document.querySelectorAll('[data-gp-docsearch]');\n  var runners = [];\n  for (var b = 0; b < boxes.length; b++) { mount(boxes[b]); }\n\n  \/* Run a query from outside: a question button puts its own terms in the\n     nearest search box and shows what answers it. The terms are English\n     because the index is, which is why a question button carries a seed\n     rather than being searched on its own words: the label is translated,\n     the seed is not. *\/\n  function runQuery(text, near) {\n    if (!runners.length) { return false; }\n    var pick = runners[0];\n    if (near) {\n      for (var r = 0; r < runners.length; r++) {\n        if (runners[r].box.contains(near) ? true : near.contains(runners[r].box)) { pick = runners[r]; break; }\n      }\n    }\n    pick.input.value = String(text || '');\n    pick.run();\n    try { pick.input.focus({ preventScroll: true }); } catch (e) { pick.input.focus(); }\n    return true;\n  }\n\n  window.__GP_DOCS_INDEX = {\n    pages: PAGE,\n    url: docUrl,\n    open: openDoc,\n    wire: wire,\n    wireAll: wireAll,\n    runQuery: runQuery,\n    rank: rank\n  };\n})();\n\/* GPD-DOCS-SEARCH END *\/\n<\/script>\n\n<script nowprocket data-no-optimize=\"1\" data-no-defer=\"1\" data-no-minify=\"1\">\n\/* GPD-DOCS-EMBED BEGIN \u2014 generated from tools\/docs-hub\/docs-embed-core.js by build-launcher.js. DO NOT EDIT HERE. *\/\n\/* GPD-DOCS-EMBED \u2014 the docs overlay driver, source of truth.\n   Injected into source.html between the GPD-DOCS-EMBED markers by\n   scripts\/rebuild.sh. Edit THIS file, never the generated section.\n   shared\/docs_embed.html carries the same text; tests.js pins the two.\n\n   What it does: opens docs.geopard.tech in a panel ON the current page, at the\n   exact documentation page the reader asked for, and never in a new tab\n   (rule 25). Nothing loads until the reader clicks: the GitBook loader, its\n   bundle and the iframe are all deferred to the first open, so a visitor who\n   never opens the docs pays nothing for them.\n\n   Three things here are not optional:\n\n   1. siteURL MUST be overridden. The GitBook loader computes\n      new URL('\/geopard-tutorials', window.location.origin), which on\n      geopard.tech resolves to a page that does not exist, so the panel would\n      load empty. window.gitbookSettings is spread last inside the loader, so\n      setting it first is the supported override.\n   2. The panel ships at z-index 9998. The geopard theme puts the sticky site\n      header at 999999999, so without a lift the header paints over the panel \u2014\n      the same collision rule 5b describes, from the other side.\n   3. Readiness is probed, not assumed. The loader resolves as soon as IT runs;\n      the bundle it then pulls from a third-party host can still fail. If no\n      panel element exists within the timeout, the click falls back to the docs\n      page in the SAME tab.\n\n   Rule 1: no ampersand anywhere in this file \u2014 it lives in a script body. *\/\n(function () {\n  if (window.__GP_DOCS) { return; }\n\n  var ORIGIN = 'https:\/\/docs.geopard.tech';\n  var SPACE = '\/geopard-tutorials';\n  var TIMEOUT = 9000;\n  var PANEL = 'gitbook-widget-window';\n\n  var state = 'idle';   \/* idle | booting | loaded | open | failed *\/\n  var pending = [];\n\n  \/* The documentation is published in 25 spaces, one per language.\n\n     The EMBED route is always the English one: GitBook redirects every locale\n     embed endpoint back to the site level, so\n     \/geopard-tutorials\/de\/~gitbook\/embed lands on the English\n     \/geopard-tutorials\/~gitbook\/embed\/page. Measured 2026-09-30, do not try\n     again.\n\n     The ASK route is different: the documentation SITE honours a locale, so\n     \/geopard-tutorials\/de?ask=... answers in German. ask() uses it; open()\n     cannot, because the translated spaces carry translated slugs and our\n     index holds the English ones. *\/\n  function url(path) {\n    var p = path ? String(path).replace(\/^\\\/+\/, '').replace(\/\\\/+$\/, '') : '';\n    return ORIGIN + SPACE + (p ? '\/' + p : '');\n  }\n\n  function gb() {\n    return typeof window.GitBook === 'function' ? window.GitBook : null;\n  }\n\n  \/* Same tab, always: an embed that opens a new tab reads as a broken page. *\/\n  function leave(path) {\n    window.location.href = url(path);\n  }\n\n  function emit(name, detail) {\n    try {\n      window.dispatchEvent(new CustomEvent('gp-docs-' + name, { detail: detail || null }));\n    } catch (e) { \/* older browsers: the caller just does not get the hint *\/ }\n  }\n\n  \/* Our shape and our stacking on the third-party panel. Injected from here so\n     the tool's own stylesheet stays scoped to its class root (rule 5). *\/\n  function style() {\n    if (document.getElementById('gp-docs-widget-css')) { return; }\n    var st = document.createElement('style');\n    st.id = 'gp-docs-widget-css';\n    st.textContent =\n      '#gitbook-widget-window{z-index:1000000001;' +\n      '--gitbook-widget-window-width:36rem;--gitbook-widget-window-height:44rem;' +\n      '--gitbook-widget-radius:8px;--gitbook-widget-border-color:#e3e7da}' +\n      '#gitbook-widget-button{z-index:1000000002}';\n    document.head.appendChild(st);\n  }\n\n  \/* GitBook's floating button doubles as the close control: while the panel is\n     open it drops its label and its icon becomes a cross. Hiding it for good,\n     which the first version did, left the panel with no way out. So it is\n     hidden while the panel is closed, which keeps the bubble off every page,\n     and shown while the panel is open, where it is the X. *\/\n  function syncButton() {\n    var panel = document.getElementById(PANEL);\n    var g = gb();\n    if (panel ? !g : true) { return; }\n    var open = !panel.classList.contains('hidden');\n    g(open ? 'show' : 'hide');\n    if (open) { state = 'open'; }\n    else if (state === 'open') { state = 'loaded'; emit('close', null); }\n  }\n\n  var watching = false;\n  function watchPanel() {\n    if (watching) { return; }\n    var panel = document.getElementById(PANEL);\n    if (!panel) { return; }\n    watching = true;\n    \/* The reader can also close the panel from inside the frame, which the\n       bundle does by hiding the panel without telling us. Watching the class\n       is how we find out. *\/\n    try {\n      new MutationObserver(syncButton)\n        .observe(panel, { attributes: true, attributeFilter: ['class'] });\n    } catch (e) { \/* no observer: the button stays as it is *\/ }\n    \/* The loader queues our calls and the bundle replays them after it builds\n       the panel, so a single sync can be overtaken by a replayed show or\n       hide. Re-asserting for a couple of seconds costs nothing and settles\n       it. *\/\n    syncButton();\n    var at = [150, 500, 1200, 2500];\n    for (var t = 0; t < at.length; t++) { window.setTimeout(syncButton, at[t]); }\n  }\n\n  \/* Escape closes it, wherever the focus is. *\/\n  document.addEventListener('keydown', function (ev) {\n    if (ev.key !== 'Escape') { return; }\n    var panel = document.getElementById(PANEL);\n    if (panel ? panel.classList.contains('hidden') : true) { return; }\n    var g = gb();\n    if (g) { g('close'); }\n    syncButton();\n  });\n\n  function probe(path) {\n    var t0 = Date.now();\n    (function tick() {\n      if (document.getElementById(PANEL)) {\n        state = 'open';\n        watchPanel();\n        emit('open', { path: path || '' });\n        return;\n      }\n      if (Date.now() - t0 > TIMEOUT) {\n        state = 'failed';\n        emit('failed', { path: path || '' });\n        leave(path);\n        return;\n      }\n      window.setTimeout(tick, 200);\n    })();\n  }\n\n  function boot(run, path) {\n    if (state === 'failed') { leave(path); return; }\n    if (state === 'loaded' || state === 'open') { run(gb()); probe(path); return; }\n\n    pending.push(run);\n    if (state === 'booting') { return; }\n    state = 'booting';\n    style();\n    emit('loading', { path: path || '' });\n\n    window.gitbookSettings = window.gitbookSettings || {};\n    window.gitbookSettings.siteURL = url('');\n\n    var s = document.createElement('script');\n    \/* One query parameter only: a second would need an ampersand, which WordPress\n       rewrites to an entity inside a script body (rule 1). *\/\n    s.src = ORIGIN + SPACE + '\/~gitbook\/embed\/script.js?theme=light';\n    s.async = true;\n    s.setAttribute('nowprocket', '');\n    s.setAttribute('data-no-optimize', '1');\n    s.setAttribute('data-no-defer', '1');\n    s.setAttribute('data-no-minify', '1');\n    s.onload = function () {\n      var g = gb();\n      if (!g) { state = 'failed'; pending = []; leave(path); return; }\n      state = 'loaded';\n      var q = pending;\n      pending = [];\n      for (var i = 0; i < q.length; i++) { q[i](g); }\n      probe(path);\n    };\n    s.onerror = function () {\n      state = 'failed';\n      pending = [];\n      emit('failed', { path: path || '' });\n      leave(path);\n    };\n    document.head.appendChild(s);\n  }\n\n  \/* Why each new target gets a fresh frame.\n\n     The bundle talks to the panel over a MessagePort handshake made with the\n     iframe's ORIGINAL document. The first navigateToPage replaces that\n     document with the page itself, which kills the port, so every later\n     message is delivered to nothing: the panel kept showing whatever was\n     opened first, however many times the reader opened something else\n     (reported 2026-10-01). Sends are queued until a handshake completes, so a\n     brand new frame navigates correctly; an already-navigated one never does.\n\n     So: when the target changes, unload the frame and initialise again, which\n     is the documented way to get a new one. Reopening the SAME target skips\n     all of it and is instant. *\/\n  var target = '';\n\n  function retarget(next) {\n    if (next === target) { return false; }\n    target = next;\n    var g = gb();\n    if (!g) { return true; }\n    if (document.getElementById('gitbook-widget-iframe')) {\n      g('unload');\n      \/* unload clears the client, so it has to be initialised again before\n         anything else is asked of it. *\/\n      g('init', { siteURL: url('') }, { colorScheme: 'light' });\n    }\n    return true;\n  }\n\n  window.__GP_DOCS = {\n    url: url,\n    \/* Open one documentation page in the panel. path is relative to the space,\n       for example 'product-tour-web-app\/zones-maps-and-analytics'. *\/\n    open: function (path) {\n      var p = path ? String(path).replace(\/^\\\/+\/, '') : '';\n      var moved = retarget('page:' + p);\n      boot(function (g) {\n        \/* An empty path is the documentation home, which is where the panel\n           opens anyway. Asking it to navigate to \"\" sends the frame to a page\n           route with no page and it renders blank. *\/\n        if (p ? moved : false) { g('navigateToPage', p); }\n        g('open');\n      }, p);\n    },\n    \/* Ask the documentation a question, in words.\n\n       Not through the embed API: navigateToAssistant is a silent no-op here\n       and the embed route ignores an ask parameter. The ask experience lives\n       on the documentation SITE, which answers\n       docs.geopard.tech\/geopard-tutorials?ask=<question> by opening its\n       assistant on that question. The site sends frame-ancestors https: like\n       the embed does, so the panel can hold it.\n\n       So the panel is opened the normal way and its frame is pointed at that\n       URL. The next open() unloads and re-initialises, which puts the frame\n       back on the embed route. *\/\n    ask: function (question, locale) {\n      var q = String(question || '').trim();\n      if (!q) { this.open(''); return; }\n      var sp = locale ? SPACE + '\/' + locale : SPACE;\n      retarget('ask:' + sp + ':' + q);\n      boot(function (g) {\n        g('open');\n        var tries = 0;\n        (function point() {\n          var f = document.getElementById('gitbook-widget-iframe');\n          if (f) {\n            var u = new URL(ORIGIN + sp);\n            u.searchParams.set('ask', q);\n            f.src = u.toString();\n            return;\n          }\n          if (tries++ < 30) { window.setTimeout(point, 100); }\n        })();\n      }, '');\n    },\n    \/* Page language to documentation space. The ask route honours a locale\n       space and answers in that language, measured on\n       \/geopard-tutorials\/de?ask=... which replies \"5 Ergebnisse\". Deep links\n       still cannot: those spaces carry translated slugs. *\/\n    locale: function (lang) {\n      var L = {\n        de: 'de', fr: 'fr', es: 'esp', it: 'it', ro: 'ro', nl: 'nl', pl: 'pl',\n        uk: 'ukrainian', pt: 'pt-br', sl: 'svn', lt: 'ltu', lv: 'lva',\n        nb: 'nor', no: 'nor', fi: 'fin', sv: 'swe', da: 'dnk', bg: 'bg',\n        hu: 'hu', ru: 'ru', ar: 'ar', ja: 'jpn', cs: 'cze', tr: 'tr'\n      };\n      var code = String(lang || document.documentElement.getAttribute('lang') || '')\n        .slice(0, 2).toLowerCase();\n      return L[code] || '';\n    },\n    close: function () {\n      var g = gb();\n      if (g) { g('close'); g('hide'); }\n      if (state === 'open') { state = 'loaded'; }\n      emit('close', null);\n    },\n    \/* Dismiss: the iframe is removed. The next open reloads the documentation\n       from scratch. Use it when a page wants the memory back. *\/\n    dismiss: function () {\n      var g = gb();\n      if (g) { g('unload'); }\n      target = '';\n      state = 'idle';\n      emit('close', null);\n    },\n    \/* GitBook ships its own floating button. We hide it on boot and drive the\n       panel from our own controls, but a page that wants the bubble can ask\n       for it. *\/\n    showButton: function () { var g = gb(); if (g) { g('show'); } },\n    hideButton: function () { var g = gb(); if (g) { g('hide'); } },\n    state: function () { return state; }\n  };\n\n  \/* A link can arrive with the panel already asked for:\n       \/any-page\/?docs=agronomy\/yield-calibration-and-cleaning\n       \/any-page\/?ask=How do I clean a yield map\n       \/any-page\/#docs=api-docs\/getting-started-with-the-geopard-api\n     Useful in an email or a campaign: the reader lands on the page they were\n     sent to, with the documentation already open at the right place. Parsed\n     with URLSearchParams because splitting a query string by hand would need\n     an ampersand, which cannot appear in a script body (rule 1). *\/\n  (function () {\n    var open = '';\n    var ask = '';\n    try {\n      var qs = new URLSearchParams(window.location.search);\n      open = qs.get('docs') || '';\n      ask = qs.get('ask') || '';\n    } catch (e) { \/* older browsers just do not get the deep link *\/ }\n    var hash = window.location.hash || '';\n    if (!open ? hash.indexOf('#docs=') === 0 : false) {\n      open = decodeURIComponent(hash.slice(6));\n    }\n    if (ask) { window.__GP_DOCS.ask(ask); return; }\n    if (open) { window.__GP_DOCS.open(open); }\n  })();\n})();\n\/* GPD-DOCS-EMBED END *\/\n<\/script>\n\n<script nowprocket data-no-optimize=\"1\" data-no-defer=\"1\" data-no-minify=\"1\">\n\/* Which documentation page this page deserves, and which question it should\n   offer to ask. One block serves every page, so both are read off the page\n   rather than set per page.\n\n   Keyed by WordPress PAGE ID, not by slug. TranslatePress translates slugs:\n   \/yield-data\/ is \/de\/ertragsdaten\/ in German, so slug matching silently\n   failed on all 24 translated copies. The body class stays page-id-2613 in\n   every language. Slug matching is kept as a fallback for anywhere the body\n   class is missing. *\/\n(function () {\n  var bar = document.getElementById('gp-docsbar');\n  if (!bar) { return; }\n\n  var BY_ID = {\n    \/* Solutions *\/\n    '2445': 'agronomy\/field-management-zones-productivity-zones-creation-process',\n    '2488': 'product-tour-web-app\/satellite-monitoring',\n    '2520': 'product-tour-web-app\/topography-analysis-for-precision-agriculture',\n    '2550': 'product-tour-web-app\/3d-maps',\n    '2582': 'product-tour-mobile-app\/working-in-the-field-scouting-zones-maps',\n    '2600': 'product-tour-web-app\/soil-sampling-automated-planning',\n    '2613': 'agronomy\/yield-calibration-and-cleaning',\n    '2628': 'product-tour-web-app\/import-precision-agriculture-data\/as-applied-as-planted-data-import',\n    '2645': 'agronomy\/comparing-yield-datasets',\n    \/* Integrations and reference *\/\n    '8062': 'product-tour-web-app\/john-deere-operations-center-integration',\n    '3349': 'product-tour-web-app\/import-precision-agriculture-data',\n    '12728': 'product-tour-web-app\/user-settings\/subscriptions-account-limits-and-plans',\n    '7356': 'changelog-and-product-releases\/release-notes',\n    '13883': 'product-tour-web-app\/geopard-ai-assistant',\n    \/* Tools *\/\n    '13070': 'product-tour-web-app\/import-precision-agriculture-data',\n    '13171': 'product-tour-web-app\/export-download',\n    '13185': 'agronomy\/variable-rate-fertilizer-maps',\n    '14154': 'agronomy\/yield-report',\n    '14251': 'product-tour-web-app\/satellite-monitoring',\n    '14327': 'product-tour-web-app\/import-precision-agriculture-data\/as-applied-as-planted-data-import',\n    '14338': 'product-tour-web-app\/satellite-monitoring',\n    '14344': 'agronomy\/create-soil-sampling-zones-points-routes-export-as-kml-and-execute',\n    '14351': 'agronomy\/variable-rate-fertilizer-maps',\n    '14418': 'agronomy\/nitrogen-use-efficiency-nue-and-nitrogen-uptake',\n    '14428': 'agronomy\/variable-rate-fertilizer-maps',\n    '14440': 'agronomy\/variable-rate-seeding-planting-maps',\n    '13341': 'product-tour-web-app\/satellite-monitoring'\n  };\n\n  var BY_SLUG = {\n    'management-zones-vra-maps': 'agronomy\/field-management-zones-productivity-zones-creation-process',\n    'crop-monitoring': 'product-tour-web-app\/satellite-monitoring',\n    'field-benchmarking': 'agronomy\/comparing-yield-datasets',\n    'yield-data': 'agronomy\/yield-calibration-and-cleaning',\n    'topography': 'product-tour-web-app\/topography-analysis-for-precision-agriculture',\n    'scouting': 'product-tour-mobile-app\/working-in-the-field-scouting-zones-maps',\n    'soil-sampling': 'product-tour-web-app\/soil-sampling-automated-planning',\n    'as-applied-as-planted-data': 'product-tour-web-app\/import-precision-agriculture-data\/as-applied-as-planted-data-import',\n    'data-compatibility': 'product-tour-web-app\/import-precision-agriculture-data',\n    'johndeere': 'product-tour-web-app\/john-deere-operations-center-integration',\n    'api': 'api-docs\/getting-started-with-the-geopard-api',\n    'white-labels': 'api-docs\/geopard-api-overview',\n    'widgets': 'api-docs\/geo-endpoints-for-spatial-data-access',\n    'documentation': ''\n  };\n\n  var LANGS = {\n    de: 1, fr: 1, es: 1, it: 1, ro: 1, nl: 1, pl: 1, uk: 1, pt: 1, sl: 1,\n    lt: 1, lv: 1, nb: 1, no: 1, fi: 1, sv: 1, da: 1, bg: 1, hu: 1, ru: 1,\n    ar: 1, ja: 1, cs: 1, tr: 1\n  };\n\n  function pageId() {\n    var m = \/(?:^|\\s)page-id-(\\d+)(?:\\s|$)\/.exec(document.body.className || '');\n    return m ? m[1] : '';\n  }\n\n  function bySlug() {\n    var segs = window.location.pathname.split('\/');\n    for (var i = 0; i < segs.length; i++) {\n      var seg = segs[i];\n      if (!seg) { continue; }\n      if (LANGS[seg.toLowerCase()]) { continue; }\n      return BY_SLUG[seg.toLowerCase()] || '';\n    }\n    return '';\n  }\n\n  var id = pageId();\n  var path = (id ? BY_ID[id] : '') || bySlug();\n\n  \/* Swap the generic button for this page's own question, which the\n     translator has already rendered in the reader's language. *\/\n  var generic = bar.querySelector('[data-dxb=\"find\"]:not([data-page])');\n  var own = id ? bar.querySelector('[data-dxb=\"find\"][data-page=\"' + id + '\"]') : null;\n  if (own) {\n    own.hidden = false;\n    if (generic) { generic.hidden = true; }\n  }\n\n  bar.addEventListener('click', function (ev) {\n    var btn = ev.target.closest ? ev.target.closest('[data-dxb]') : null;\n    if (!btn) { return; }\n    var D = window.__GP_DOCS;\n    if (!D) {\n      window.location.href = 'https:\/\/docs.geopard.tech\/geopard-tutorials' + (path ? '\/' + path : '');\n      return;\n    }\n    if (btn.getAttribute('data-dxb') === 'find') {\n      \/* The question is the button's own text, so it is already in the\n         reader's language, and the documentation is asked in that language's\n         space. A button with no question of its own just focuses the search\n         box, which is right there. *\/\n      var question = btn.getAttribute('data-page') ? btn.textContent.trim() : '';\n      if (question) { D.ask(question, D.locale ? D.locale() : ''); return; }\n      var box = bar.querySelector('[data-ds-input]');\n      if (box) { box.focus(); return; }\n      D.open(path);\n      return;\n    }\n    D.open(path);\n  });\n})();\n<\/script>\n<\/div>\n\n","protected":false},"excerpt":{"rendered":"<p>J\u00e4mf\u00f6r f\u00e4lt efter produktivitet, variation och eventuella datalager, s\u00e5 att du vet vilka du ska prioritera f\u00f6r scouting, sk\u00f6rd och investeringar.<\/p>","protected":false},"author":210157960,"featured_media":14650,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"_coblocks_attr":"","_coblocks_dimensions":"","_coblocks_responsive_height":"","_coblocks_accordion_ie_support":"","_eb_attr":"","content-type":"","_wpcom_ai_launchpad_about_page":false,"_wpcom_ai_launchpad_gallery_page":false,"_wpcom_ai_launchpad_contact_page":false,"_wpcom_ai_launchpad_events_page":false,"_wpcom_ai_launchpad_video_page":false,"_wpcom_ai_launchpad_portfolio_piece":false,"footnotes":"","big_sky_generated":false},"class_list":["post-2645","page","type-page","status-publish","has-post-thumbnail","hentry"],"acf":[],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v28.6 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Field Benchmarking in Farm View - GeoPard Agriculture<\/title>\n<meta name=\"description\" content=\"Benchmark every field on one map and see which to target first: most variable, lowest by yield, lime candidates by pH, lowest vegetation, steepest. Any layer, sortable.\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/geopard.tech\/swe\/faltbenchmarking\/\" \/>\n<meta property=\"og:locale\" content=\"sv_SE\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Farm View: which fields come first?\" \/>\n<meta property=\"og:description\" content=\"Benchmark every field on one map by satellite, soil, yield, as-applied, as-planted and topography, then sort the attributes table to find the fields to target first.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/geopard.tech\/swe\/faltbenchmarking\/\" \/>\n<meta property=\"og:site_name\" content=\"GeoPard - Precision agriculture Mapping software\" \/>\n<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/geopardAgriculture\/\" \/>\n<meta property=\"article:modified_time\" content=\"2026-10-06T18:31:38+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/i0.wp.com\/geopard.tech\/wp-content\/uploads\/2026\/10\/farm-view-walkthrough-poster-full.jpg?fit=1600%2C860&ssl=1\" \/>\n\t<meta property=\"og:image:width\" content=\"1600\" \/>\n\t<meta property=\"og:image:height\" content=\"860\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/jpeg\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:site\" content=\"@geopardagri\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/geopard.tech\\\/field-benchmarking\\\/\",\"url\":\"https:\\\/\\\/geopard.tech\\\/field-benchmarking\\\/\",\"name\":\"Field Benchmarking in Farm View - GeoPard Agriculture\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/geopard.tech\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/geopard.tech\\\/field-benchmarking\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/geopard.tech\\\/field-benchmarking\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/i0.wp.com\\\/geopard.tech\\\/wp-content\\\/uploads\\\/2026\\\/10\\\/farm-view-walkthrough-poster-full.jpg?fit=1600%2C860&ssl=1\",\"datePublished\":\"2022-01-27T12:01:05+00:00\",\"dateModified\":\"2026-10-06T18:31:38+00:00\",\"description\":\"Benchmark every field on one map and see which to target first: most variable, lowest by yield, lime candidates by pH, lowest vegetation, steepest. Any layer, sortable.\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/geopard.tech\\\/field-benchmarking\\\/#breadcrumb\"},\"inLanguage\":\"sv-SE\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/geopard.tech\\\/field-benchmarking\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"sv-SE\",\"@id\":\"https:\\\/\\\/geopard.tech\\\/field-benchmarking\\\/#primaryimage\",\"url\":\"https:\\\/\\\/i0.wp.com\\\/geopard.tech\\\/wp-content\\\/uploads\\\/2026\\\/10\\\/farm-view-walkthrough-poster-full.jpg?fit=1600%2C860&ssl=1\",\"contentUrl\":\"https:\\\/\\\/i0.wp.com\\\/geopard.tech\\\/wp-content\\\/uploads\\\/2026\\\/10\\\/farm-view-walkthrough-poster-full.jpg?fit=1600%2C860&ssl=1\",\"width\":1600,\"height\":860,\"caption\":\"Farm View: field tree, map layers, six fields with potassium legends, and the statistics table with the Create Sampling Plans and Create Equation Batch buttons\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/geopard.tech\\\/field-benchmarking\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/geopard.tech\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Farm View: Field Benchmarking\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/geopard.tech\\\/#website\",\"url\":\"https:\\\/\\\/geopard.tech\\\/\",\"name\":\"GeoPard - Precision agriculture software\",\"description\":\"Precision agriculture Mapping software\",\"publisher\":{\"@id\":\"https:\\\/\\\/geopard.tech\\\/#organization\"},\"alternateName\":\"GeoPard\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/geopard.tech\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"sv-SE\"},{\"@type\":\"Organization\",\"@id\":\"https:\\\/\\\/geopard.tech\\\/#organization\",\"name\":\"GeoPard Agriculture\",\"alternateName\":\"GeoPard\",\"url\":\"https:\\\/\\\/geopard.tech\\\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"sv-SE\",\"@id\":\"https:\\\/\\\/geopard.tech\\\/#\\\/schema\\\/logo\\\/image\\\/\",\"url\":\"https:\\\/\\\/i0.wp.com\\\/geopard.tech\\\/wp-content\\\/uploads\\\/2026\\\/07\\\/geopard_logo_transparentbackground.png?fit=512%2C68&ssl=1\",\"contentUrl\":\"https:\\\/\\\/i0.wp.com\\\/geopard.tech\\\/wp-content\\\/uploads\\\/2026\\\/07\\\/geopard_logo_transparentbackground.png?fit=512%2C68&ssl=1\",\"width\":512,\"height\":68,\"caption\":\"GeoPard Agriculture\"},\"image\":{\"@id\":\"https:\\\/\\\/geopard.tech\\\/#\\\/schema\\\/logo\\\/image\\\/\"},\"sameAs\":[\"https:\\\/\\\/www.facebook.com\\\/geopardAgriculture\\\/\",\"https:\\\/\\\/x.com\\\/geopardagri\",\"https:\\\/\\\/www.linkedin.com\\\/company\\\/geopard-agriculture\\\/\",\"https:\\\/\\\/www.instagram.com\\\/geopardagriculture\\\/\",\"https:\\\/\\\/www.youtube.com\\\/channel\\\/UCiaPGLAhRPNh-s85dXdC-Sw\",\"https:\\\/\\\/www.g2.com\\\/products\\\/geopard-agriculture-precision-farming-software\\\/reviews\"]}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"F\u00e4ltbenchmarking i g\u00e5rdsvyn - GeoPard Agriculture","description":"J\u00e4mf\u00f6r varje f\u00e4lt p\u00e5 en karta och se vilken du ska rikta in dig p\u00e5 f\u00f6rst: mest variabel, l\u00e4gst efter avkastning, kalkkandidater efter pH, l\u00e4gst vegetation, brantast. Alla lager, sorterbara.","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/geopard.tech\/swe\/faltbenchmarking\/","og_locale":"sv_SE","og_type":"article","og_title":"Farm View: which fields come first?","og_description":"Benchmark every field on one map by satellite, soil, yield, as-applied, as-planted and topography, then sort the attributes table to find the fields to target first.","og_url":"https:\/\/geopard.tech\/swe\/faltbenchmarking\/","og_site_name":"GeoPard - Precision agriculture Mapping software","article_publisher":"https:\/\/www.facebook.com\/geopardAgriculture\/","article_modified_time":"2026-10-06T18:31:38+00:00","og_image":[{"width":1600,"height":860,"url":"https:\/\/i0.wp.com\/geopard.tech\/wp-content\/uploads\/2026\/10\/farm-view-walkthrough-poster-full.jpg?fit=1600%2C860&ssl=1","type":"image\/jpeg"}],"twitter_card":"summary_large_image","twitter_site":"@geopardagri","schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"https:\/\/geopard.tech\/field-benchmarking\/","url":"https:\/\/geopard.tech\/field-benchmarking\/","name":"F\u00e4ltbenchmarking i g\u00e5rdsvyn - GeoPard Agriculture","isPartOf":{"@id":"https:\/\/geopard.tech\/#website"},"primaryImageOfPage":{"@id":"https:\/\/geopard.tech\/field-benchmarking\/#primaryimage"},"image":{"@id":"https:\/\/geopard.tech\/field-benchmarking\/#primaryimage"},"thumbnailUrl":"https:\/\/i0.wp.com\/geopard.tech\/wp-content\/uploads\/2026\/10\/farm-view-walkthrough-poster-full.jpg?fit=1600%2C860&ssl=1","datePublished":"2022-01-27T12:01:05+00:00","dateModified":"2026-10-06T18:31:38+00:00","description":"J\u00e4mf\u00f6r varje f\u00e4lt p\u00e5 en karta och se vilken du ska rikta in dig p\u00e5 f\u00f6rst: mest variabel, l\u00e4gst efter avkastning, kalkkandidater efter pH, l\u00e4gst vegetation, brantast. Alla lager, sorterbara.","breadcrumb":{"@id":"https:\/\/geopard.tech\/field-benchmarking\/#breadcrumb"},"inLanguage":"sv-SE","potentialAction":[{"@type":"ReadAction","target":["https:\/\/geopard.tech\/field-benchmarking\/"]}]},{"@type":"ImageObject","inLanguage":"sv-SE","@id":"https:\/\/geopard.tech\/field-benchmarking\/#primaryimage","url":"https:\/\/i0.wp.com\/geopard.tech\/wp-content\/uploads\/2026\/10\/farm-view-walkthrough-poster-full.jpg?fit=1600%2C860&ssl=1","contentUrl":"https:\/\/i0.wp.com\/geopard.tech\/wp-content\/uploads\/2026\/10\/farm-view-walkthrough-poster-full.jpg?fit=1600%2C860&ssl=1","width":1600,"height":860,"caption":"Farm View: field tree, map layers, six fields with potassium legends, and the statistics table with the Create Sampling Plans and Create Equation Batch buttons"},{"@type":"BreadcrumbList","@id":"https:\/\/geopard.tech\/field-benchmarking\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/geopard.tech\/"},{"@type":"ListItem","position":2,"name":"Farm View: Field Benchmarking"}]},{"@type":"WebSite","@id":"https:\/\/geopard.tech\/#website","url":"https:\/\/geopard.tech\/","name":"GeoPard - Precisionsjordbruksmjukvara","description":"Precisionsjordbruk kartprogramvara","publisher":{"@id":"https:\/\/geopard.tech\/#organization"},"alternateName":"GeoPard","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/geopard.tech\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"sv-SE"},{"@type":"Organization","@id":"https:\/\/geopard.tech\/#organization","name":"GeoPard Jordbruk","alternateName":"GeoPard","url":"https:\/\/geopard.tech\/","logo":{"@type":"ImageObject","inLanguage":"sv-SE","@id":"https:\/\/geopard.tech\/#\/schema\/logo\/image\/","url":"https:\/\/i0.wp.com\/geopard.tech\/wp-content\/uploads\/2026\/07\/geopard_logo_transparentbackground.png?fit=512%2C68&ssl=1","contentUrl":"https:\/\/i0.wp.com\/geopard.tech\/wp-content\/uploads\/2026\/07\/geopard_logo_transparentbackground.png?fit=512%2C68&ssl=1","width":512,"height":68,"caption":"GeoPard Agriculture"},"image":{"@id":"https:\/\/geopard.tech\/#\/schema\/logo\/image\/"},"sameAs":["https:\/\/www.facebook.com\/geopardAgriculture\/","https:\/\/x.com\/geopardagri","https:\/\/www.linkedin.com\/company\/geopard-agriculture\/","https:\/\/www.instagram.com\/geopardagriculture\/","https:\/\/www.youtube.com\/channel\/UCiaPGLAhRPNh-s85dXdC-Sw","https:\/\/www.g2.com\/products\/geopard-agriculture-precision-farming-software\/reviews"]}]}},"jetpack_likes_enabled":true,"jetpack_sharing_enabled":true,"jetpack_shortlink":"https:\/\/wp.me\/PdiCPa-GF","_links":{"self":[{"href":"https:\/\/geopard.tech\/swe\/wp-json\/wp\/v2\/pages\/2645","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/geopard.tech\/swe\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/geopard.tech\/swe\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/geopard.tech\/swe\/wp-json\/wp\/v2\/users\/210157960"}],"replies":[{"embeddable":true,"href":"https:\/\/geopard.tech\/swe\/wp-json\/wp\/v2\/comments?post=2645"}],"version-history":[{"count":2,"href":"https:\/\/geopard.tech\/swe\/wp-json\/wp\/v2\/pages\/2645\/revisions"}],"predecessor-version":[{"id":14654,"href":"https:\/\/geopard.tech\/swe\/wp-json\/wp\/v2\/pages\/2645\/revisions\/14654"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/geopard.tech\/swe\/wp-json\/wp\/v2\/media\/14650"}],"wp:attachment":[{"href":"https:\/\/geopard.tech\/swe\/wp-json\/wp\/v2\/media?parent=2645"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}