1import{j as e,a as D}from"./index-CCbjxSDg.js";import{L as U,r as T}from"./vendor-BH4DxC9-.js";import{H as $,a as W}from"./HeroFigure-DY1xAmb5.js";import"./purify.es-Bc-0F0ao.js";import{S as O,A as h}from"./SerifHeading-bNhAmdCt.js";import{L as B}from"./LimeGlow-Cq-KIZtM.js";import"./CodePanel-B4W90WMJ.js";import{F as q}from"./FeatureChip-BUluipsx.js";import{C as F}from"./CtaLink-CA8j17-z.js";import{D as y}from"./DiagramCard-BfrcIdOa.js";import{S as b,a as K}from"./SectionHeader-B0PZO4mU.js";import{S as I}from"./SegmentedTabs-uVKUoERP.js";import{E as Y}from"./EngineeringNote-BBcLAWr6.js";import{F as Q}from"./FinalCta-rF39yFtK.js";import{F as V}from"./FaqSection-CY79GavH.js";import"./icons-CPzQQ5QY.js";import"./Button-DozEmmz-.js";import"./Pill-CoMH70Z4.js";const E="#4dd9d0",d={cx:230,cy:240,w:190,h:95},G=16,M=8,X=G*1.5,g=M*Math.sqrt(3),P=(t,s)=>[0,60,120,180,240,300].map(i=>{const n=i*Math.PI/180;return`${(t+G*Math.cos(n)).toFixed(1)},${(s+M*Math.sin(n)).toFixed(1)}`}).join(" "),Z=(t,s)=>Math.abs(t-d.cx)/d.w+Math.abs(s-d.cy)/d.h<=.9,J=Array.from({length:17},(t,s)=>s-8).flatMap(t=>Array.from({length:17},(s,i)=>i-8).map(s=>({x:d.cx+t*X,y:d.cy+s*g+(Math.abs(t)%2===1?g/2:0)})).filter(s=>Z(s.x,s.y))),ee=[{x:182,y:d.cy-g},{x:158,y:d.cy+g/2},{x:206,y:d.cy-g/2},{x:278,y:d.cy+g}],A="M70 255 L120 230 L170 250 L215 225 L260 245 L310 222 L370 240",te=[{x:70,y:255},{x:120,y:230},{x:170,y:250},{x:215,y:225},{x:260,y:245},{x:310,y:222},{x:370,y:240}],se="140,214 218,208 238,240 196,266 138,254",N={x:185,y:235},ie=[{x:196,y:398,hot:!1},{x:230,y:398,hot:!0},{x:264,y:398,hot:!1}],ae=["0s","-1.8s"],ne=({cx:t,cy:s,w:i,h:n})=>`${t},${s-n} ${t+i},${s} ${t},${s+n} ${t-i},${s}`,oe=(t,s)=>`${t},${s-7} ${t+14},${s} ${t},${s+7} ${t-14},${s}`,re=()=>e.jsxs("svg",{viewBox:"0 0 460 470",xmlns:"http://www.w3.org/2000/svg",className:"block h-auto w-full",children:[J.map(t=>e.jsx("polygon",{points:P(t.x,t.y),fill:"none",stroke:"rgba(255,255,255,0.1)",strokeWidth:"0.8"},`${t.x}-${t.y}`)),e.jsx("polygon",{points:ne(d),fill:"none",stroke:"rgba(181,255,61,0.45)",strokeWidth:"1"}),ee.map((t,s)=>e.jsx("polygon",{points:P(t.x,t.y),fill:"rgba(181,255,61,0.16)",stroke:"rgba(181,255,61,0.5)",strokeWidth:"0.8",className:"arch-pulse",style:{animationDelay:`${s*.6}s`}},`${t.x}-${t.y}`)),e.jsx("line",{x1:"176",y1:"202",x2:"176",y2:"208",stroke:"rgba(255,255,255,0.2)",strokeWidth:"1"}),e.jsx("text",{x:"176",y:"196",textAnchor:"middle",className:"font-mono",fontSize:"9.5",letterSpacing:"0.08em",fill:"rgba(181,255,61,0.75)",children:"H3 · RES 8"}),e.jsx("polygon",{points:se,fill:"none",stroke:"rgba(181,255,61,0.35)",strokeWidth:"1",strokeDasharray:"3 4"}),e.jsx("circle",{cx:N.x,cy:N.y,r:"6",fill:"none",stroke:"rgba(181,255,61,0.4)",strokeWidth:"1",className:"arch-pulse"}),e.jsx("circle",{cx:N.x,cy:N.y,r:"2",fill:"#ffffff",opacity:"0.7"}),e.jsx("path",{d:A,fill:"none",stroke:"rgba(255,255,255,0.45)",strokeWidth:"1.2"}),te.map(t=>e.jsx("circle",{cx:t.x,cy:t.y,r:"2",fill:"#ffffff",opacity:"0.5"},`${t.x}-${t.y}`)),e.jsx("text",{x:"378",y:"226",className:"font-mono",fontSize:"9.5",letterSpacing:"0.08em",fill:"rgba(255,255,255,0.35)",children:"TRACK"}),e.jsx("path",{d:"M230 340 L230 382",fill:"none",stroke:"rgba(255,255,255,0.1)",strokeWidth:"1",strokeDasharray:"2 4"}),ie.map(t=>e.jsx("polygon",{points:oe(t.x,t.y),fill:"none",stroke:t.hot?"rgba(181,255,61,0.5)":"rgba(255,255,255,0.2)",strokeWidth:"1"},t.x)),e.jsx("text",{x:"230",y:"430",textAnchor:"middle",className:"font-mono",fontSize:"9.5",letterSpacing:"0.08em",fill:"rgba(255,255,255,0.25)",children:"WMS TILES"}),e.jsx("g",{className:"motion-only",children:ae.map(t=>e.jsx("circle",{r:"3",fill:E,style:{filter:`drop-shadow(0 0 4px ${E})`},children:e.jsx("animateMotion",{dur:"3.6s",repeatCount:"indefinite",begin:t,path:A})},t))})]}),le={parent:"Capabilities",parentHref:"/",current:"Geospatial"},ce="Spatial operations from",de="hours",xe="to minutes.",he=[{label:"Geospatial",lead:!0},{label:"GPU + parallel CPU"},{label:"PostGIS grammar"},{label:"H3"},{label:"Tracks"},{label:"Server-side render"}],me="150+ PostGIS-compatible functions, H3 indexing, track operators, and server-side map rendering â all in SQL, all on GPU.",pe={label:"Start Free",href:"/kinetica-developer-edition"},fe="SQL · H3 · WKT · WMS · VTS",ge={id:"FIG. 05",label:"H3 cells + track solve",sub:"spatial sql on gpu · tiles rendered server-side"},c={breadcrumb:le,headlinePart1:ce,headlineAccent:de,headlinePart2:xe,categoryChips:he,subtitle:me,ctaPrimary:pe,meta:fe,figure:ge},be=()=>e.jsxs("section",{className:"relative overflow-hidden px-6 pb-14 pt-16 md:px-10 md:pb-16 md:pt-20",children:[e.jsx(B,{position:"top-right"}),e.jsxs("div",{className:`relative mx-auto max-w-[1280px] ${$}`,children:[e.jsx(W,{caption:c.figure,accent:"#b5ff3d",children:e.jsx(re,{})}),e.jsxs("nav",{"aria-label":"Breadcrumb",className:"mb-7 font-mono text-[12px] uppercase tracking-[0.06em] text-white/35",children:[e.jsx(U,{to:c.breadcrumb.parentHref,className:"hover:text-white/60",children:c.breadcrumb.parent}),e.jsx("span",{className:"mx-2.5 opacity-50",children:"/"}),e.jsx("span",{className:"text-[#b5ff3d]",children:c.breadcrumb.current})]}),e.jsxs(O,{size:"hero",className:"mb-8",children:[c.headlinePart1," ",e.jsx(h,{children:c.headlineAccent})," ",c.headlinePart2]}),e.jsx("div",{className:"mb-7 inline-flex flex-wrap gap-1.5 rounded-full border border-white/[0.08] bg-white/[0.02] p-1.5",children:c.categoryChips.map(t=>e.jsx(q,{lead:t.lead,children:t.label},t.label))}),e.jsx("p",{className:"mb-9 max-w-[640px] text-[19px] leading-[1.55] text-white/65",children:c.subtitle}),e.jsxs("div",{className:"flex flex-wrap items-center gap-6",children:[e.jsx(F,{to:c.ctaPrimary.href,arrow:!0,children:c.ctaPrimary.label}),e.jsx("span",{className:"font-mono text-[12px] tracking-[0.06em] text-white/35",children:c.meta})]})]})]}),ue={label:"The Category"},je="PostGIS is the richest geospatial library â ",we="but it's CPU-bound at scale. Kinetica runs the same SQL, 240x faster.",ye="",Ne=[{id:"postgis",label:"PostGIS"},{id:"warehouse",label:"Cloud warehouses"},{id:"python",label:"Python + Spark"},{id:"kinetica",label:"Kinetica",lead:!0,badge:"Best fit"}],Se={postgis:{examples:"POSTGRES + POSTGIS",headlinePart1:"The richest function library â",headlineAccent:"CPU-bound at scale.",description:"Decades of development have made PostGIS the gold standard for geospatial depth. The cost: it's a row-store on CPUs. Point-in-polygon over hundreds of millions of rows hits a wall.",prosCons:[{kind:"plus",text:"Deepest geospatial function library in OSS"},{kind:"minus",text:"Single-machine, single-core query execution"},{kind:"minus",text:"Performance falters on very large datasets"}]},warehouse:{examples:"CLOUD WAREHOUSE",headlinePart1:"Massive parallelism â",headlineAccent:"shallow geospatial coverage.",description:"Snowflake, BigQuery, Redshift offer basic spatial operations, but the advanced toolbox â routing, isochrones, server-side rendering â isn't available out of the box.",prosCons:[{kind:"plus",text:"Enterprise-scale columnar performance"},{kind:"minus",text:"Lacks advanced geospatial algorithms"}
1,{kind:"minus",text:"No native graph, tracks, or visualization"}]},python:{examples:"GEOPANDAS · SEDONA · PYSPARK",headlinePart1:"Maximum flexibility â",headlineAccent:"at the cost of specialist effort.",description:"Anything is possible if you can write the code. The cost: serialization, cluster orchestration, pipeline maintenance, and the team to do it.",prosCons:[{kind:"plus",text:"Unbounded flexibility for custom analyses"},{kind:"minus",text:"Requires deep programming expertise"},{kind:"minus",text:"Each query is a pipeline, not a SQL statement"}]},kinetica:{examples:"HYBRID NATIVE",headlinePart1:"Every dialect, one engine â",headlineAccent:"routed to the right substrate.",description:"PostGIS-style ST_ functions, H3 cell operations, time-aware track functions, and native graph integration â all SQL, all in one vectorized engine.",prosCons:[{kind:"plus",text:"PostGIS depth + cloud-warehouse scale"},{kind:"plus",text:"Spatial + temporal + graph in one SQL query"},{kind:"plus",text:"Server-side rendering â no client lift"}]}},m={eyebrow:ue,titlePart1:je,titleAccent:we,lede:ye,tabs:Ne,panels:Se},ke=({kind:t,text:s})=>{const i=t==="plus",n=i?"bg-[#b5ff3d]/[0.18] text-[#b5ff3d] ring-1 ring-[#b5ff3d]/60":"bg-[#ff6b3d]/[0.18] text-[#ff6b3d] ring-1 ring-[#ff6b3d]/60";return e.jsxs("div",{className:"flex items-start gap-3 text-[13px] leading-[1.5] text-white/75",children:[e.jsx("span",{"aria-hidden":"true",className:`mt-[2px] inline-flex h-[18px] w-[18px] shrink-0 items-center justify-center rounded-full font-mono text-[12px] font-semibold leading-none ${n}`,children:i?"+":"â"}),e.jsx("span",{children:s})]})},ve=()=>e.jsxs("svg",{viewBox:"0 0 480 245",xmlns:"http://www.w3.org/2000/svg",className:"block h-auto w-full",role:"img","aria-label":"PostGIS: rows processed sequentially on a single CPU; progress bar stalls at 9.8M of 100M iterations.",children:[e.jsx("text",{x:"20",y:"28",fill:"#ff6b3d",className:"font-mono",fontSize:"10",letterSpacing:"0.08em",children:"CPU · ROW-BY-ROW · GIST INDEX"}),e.jsx("rect",{x:"20",y:"44",width:"440",height:"22",rx:"3",fill:"rgba(255,107,61,0.10)",stroke:"#ff6b3d",strokeWidth:"0.6"}),e.jsx("rect",{x:"20",y:"44",width:"80",height:"22",rx:"3",fill:"rgba(255,107,61,0.28)"}),e.jsx("text",{x:"28",y:"59",fill:"#ff6b3d",className:"font-mono",fontSize:"10",children:"i=0 · ST_CONTAINS(poly, point)"}),[0,1,2].map(t=>e.jsxs("g",{opacity:.4-t*.1,children:[e.jsx("rect",{x:"20",y:72+t*28,width:"440",height:"22",rx:"3",fill:"rgba(255,255,255,0.03)",stroke:"#3a3a45",strokeWidth:"0.6"}),e.jsxs("text",{x:"28",y:87+t*28,className:"fill-white/35 font-mono",fontSize:"10",children:["i=",t+1," · waitingâ¦"]})]},t)),e.jsx("text",{x:"20",y:"170",className:"fill-white/35 font-mono",fontSize:"10",children:"⦠100,000,000 iterations"}),e.jsx("rect",{x:"20",y:"182",width:"200",height:"6",rx:"3",fill:"rgba(255,255,255,0.05)"}),e.jsx("rect",{x:"20",y:"182",width:"20",height:"6",rx:"3",fill:"#ff6b3d",opacity:"0.7"}),e.jsx("text",{x:"230",y:"188",fill:"#ff6b3d",className:"font-mono",fontSize:"10",children:"9.8M / 100M"}),e.jsx("text",{x:"20",y:"216",className:"fill-white/40 italic font-mono",fontSize:"10",children:"Per-row dispatch · wall-clock grows linearly · hours on a real dataset"})]}),Te=()=>e.jsxs("svg",{viewBox:"0 0 480 245",xmlns:"http://www.w3.org/2000/svg",className:"block h-auto w-full",role:"img","aria-label":"Cloud warehouses: columnar storage with massive scale, but only basic ST_ functions; routing, isochrones, rendering, and tracks are unavailable.",children:[e.jsx("text",{x:"20",y:"28",fill:"#a78bfa",className:"font-mono",fontSize:"10",letterSpacing:"0.08em",children:"COLUMNAR · BASIC ST_ ONLY"}),e.jsx("rect",{x:"20",y:"44",width:"180",height:"160",rx:"6",fill:"rgba(167,139,250,0.05)",stroke:"#a78bfa",strokeWidth:"0.8"}),e.jsx("text",{x:"30",y:"68",className:"fill-white/65 font-mono",fontSize:"11",children:"ST_INTERSECTS"}),e.jsx("text",{x:"30",y:"88",className:"fill-white/65 font-mono",fontSize:"11",children:"ST_DISTANCE"}),e.jsx("text",{x:"30",y:"118",className:"fill-white/35 font-mono",fontSize:"11",children:"isochrones â"}),e.jsx("text",{x:"30",y:"136",className:"fill-white/35 font-mono",fontSize:"11",children:"routing â"}),e.jsx("text",{x:"30",y:"154",className:"fill-white/35 font-mono",fontSize:"11",children:"WMS render â"}),e.jsx("text",{x:"30",y:"172",className:"fill-white/35 font-mono",fontSize:"11",children:"tracks â"}),e.jsx("text",{x:"30",y:"190",className:"fill-white/35 font-mono",fontSize:"11",children:"graph â"}),e.jsx("text",{x:"240",y:"80",className:"fill-white/65 font-mono",fontSize:"11",children:"Massive scale"}),e.jsx("text",{x:"240",y:"106",fill:"#a78bfa",className:"font-mono",fontSize:"11",children:"Shallow geospatial"}),e.jsx("text",{x:"240",y:"130",fill:"#a78bfa",className:"font-mono",fontSize:"11",children:"No graph / tracks"}),e.jsx("text",{x:"240",y:"154",fill:"#a78bfa",className:"font-mono",fontSize:"11",children:"No server rendering"})]}),Ee=()=>e.jsxs("svg",{viewBox:"0 0 480 245",xmlns:"http://www.w3.org/2000/svg",className:"block h-auto w-full",role:"img","aria-label":"Geopandas + Sedona + PySpark: each query becomes a pipeline of ETL ingest, cluster orchestration, serialization, and custom UDFs.",children:[e.jsx("text",{x:"20",y:"28",fill:"#4dd9d0",className:"font-mono",fontSize:"10",letterSpacing:"0.08em",children:"GEOPANDAS · SEDONA · PYSPARK"}),e.jsx("rect",{x:"20",y:"44",width:"200",height:"40",rx:"6",fill:"rgba(77,217,208,0.05)",stroke:"#4dd9d0",strokeWidth:"0.8"}),e.jsx("text",{x:"30",y:"68",className:"fill-white/65 font-mono",fontSize:"11",children:"ETL · ingest · serialize"}),e.jsx("line",{x1:"220",y1:"64",x2:"262",y2:"64",stroke:"#4dd9d0",strokeWidth:"1",opacity:"0.6"}),e.jsx("polygon",{points:"262,64 256,60 256,68",fill:"#4dd9d0",opacity:"0.6"}),e.jsx("rect",{x:"262",y:"44",width:"200",height:"40",rx:"6",fill:"rgba(77,217,208,0.05)",stroke:"#4dd9d0",strokeWidth:"0.8"}),e.jsx("text",{x:"272",y:"62",className:"fill-white/65 font-mono",fontSize:"11",children:"cluster orchestration"}),e.jsx("text",{x:"272",y:"76",className:"fill-white/35 font-mono",fontSize:"10",children:"serialize · shuffle · spill"}),e.jsx("rect",{x:"20",y:"100",width:"442",height:"40",rx:"6",fill:"rgba(77,217,208,0.04)",stroke:"#4dd9d0",strokeWidth:"0.6",strokeDasharray:"3 3"}),e.jsx("text",{x:"30",y:"124",className:"fill-white/65 font-mono",fontSize:"11",children:"custom UDFs + glue code · each query is a pipeline"}),e.jsx("text",{x:"20",y:"168",fill:"#b5ff3d",className:"font-mono",fontSize:"11",children:"+ Unbounded flexibility"}),e.jsx("text",{x:"20",y:"188",fill:"#ff6b3d",className:"font-mono",fontSize:"11",opacity:"0.85",children:"â Deep programming expertise required"}),e.jsx("text",{x:"20",y:"208",fill:"#ff6b3d",className:"font-mono",fontSize:"11",opacity:"0.85",children:"â Not a query â it's a project"})]}),Pe=()=>e.jsxs("svg",{viewBox:"0 0 480 245",xmlns:"http://www.w3.org/2000/svg",className:"block h-auto w-full",role:"img","aria-label":"Kinetica hybrid native: one engine routes geo, graph, tracks, and vector operations to GPU lanes or parallel CPU.",children:[e.jsx("rect",{x:"20",y:"15",width:"440",height:"215",rx:"10",fill:"rgba(181,255,61,0.04)",stroke:"#b5ff3d",strokeWidth:"1.4"}),e.jsx("text",{x:"240",y:"46",textAnchor:"middle",fill:"#b5ff3d",className:"font-mono",fontSize:"11",letterSpacing:"0.06em",children:"KINETICA · ONE ENGINE"}),[{x:60,label:"geo"},{x:160,label:"graph"},{x:260,label:"tracks"},{x:360,label:"vector"}].map(t=>e.jsxs("g",{children:[e.jsx("rect",{x:t.x,y:"60",width:"60",height:"38",rx:"4",fill:"rgba(181,255,61,0.12)",stroke:"#b5ff3d",strokeWidth:"0.8"}),e.jsx("text",{x:t.x+30,y:"83",textAnchor:"middle",fill:"#b5ff3d",className:"font-mono",fontSize:"11",children:t.label})]},t.label)),e.jsx("text",{x:"40",y:"124",className:"fill-white/55 font-mono",fontSize:"10",children:"hundreds of ST_ functions · H3 · WMS · VTS"}),e.jsx("rect",{x:"40",y:"138",width:"400",height:"50",rx:"6",fill:"rgba(181,255,61,0.04)",stroke:"rgba(181,255,61,0.25)",strokeWidth:"0.8"}),e.jsx("text",{x:"52",y:"158",className:"fill-white/65 font-mono",fontSize:"10",children:"GPU lanes: column-wide GIS · rendering · heatmaps"}),e.jsx("text",{x:"52",y:"178",className:"fill-white/65 font-mono",fontSize:"10",children:"CPU parallel: individual ST_ · graph solvers · H3"}),e.jsx("text",{x:"240",y:"214",textAnchor:"middle",fill:"#b5ff3d",className:"font-mono",fontSize:"10",letterSpacing:"0.04em",children:"SPATIAL · TEMPORAL · NETWORK â IN ONE QUERY"})]}),Ae={postgis:e.jsx(ve,{}),warehouse:e.jsx(Te,{}),python:e.jsx(Ee,{}),kinetica:e.jsx(Pe,{})},Ce=({panel:t})=>e.jsxs("div",{children:[e.jsx("div",{className:"font-mono text-[10px] uppercase tracking-[0.08em] text-white/40",children:t.examples}),e.jsxs("h4",{className:"mb-3 mt-2 max-w-[60ch] text-[22px] font-[family-name:var
1(--font-serif)] font-normal leading-[1.25] text-white",children:[t.headlinePart1," ",e.jsx(h,{children:t.headlineAccent})]}),e.jsx("p",{className:"m-0 max-w-[68ch] text-[14px] leading-[1.55] text-white/65",children:t.description}),e.jsx("div",{className:"mt-6 grid gap-3 border-t border-white/[0.08] pt-6",children:t.prosCons.map(s=>e.jsx(ke,{kind:s.kind,text:s.text},s.text))})]}),_e=()=>{const[t,s]=T.useState(m.tabs[0].id),i=m.panels[t],n=t==="kinetica";return e.jsx("section",{className:"border-t border-white/[0.08] px-6 pb-20 pt-12 md:px-10 md:pb-24 md:pt-14",children:e.jsxs("div",{className:"mx-auto max-w-[1280px]",children:[e.jsxs(b,{eyebrow:m.eyebrow.label,lede:m.lede,className:"mb-14",children:[m.titlePart1," ",e.jsx(h,{children:m.titleAccent}),""]}),e.jsxs(y,{children:[e.jsx(I,{tabs:m.tabs,active:t,onChange:s,ariaLabel:"Geospatial stack architectures",className:"mb-10"}),e.jsxs("div",{role:"tabpanel",className:"grid gap-10 lg:grid-cols-[minmax(0,5fr)_minmax(0,7fr)] lg:items-center lg:gap-12",children:[e.jsxs("div",{children:[Ae[t],n&&e.jsx("div",{className:"mt-5 text-center font-mono text-[11px] tracking-[0.08em] text-[#b5ff3d]",children:"ONE GRAMMAR · EVERY GEOMETRY"})]}),e.jsx(Ce,{panel:i})]})]})]})})},Le={label:"The Mechanism"},Re="Point-in-polygon over 100M rows skips the chunks it can â",Oe="then vectorizes the rest.",Ie="Pruned first, dispatched once, not 100 million row iterations.",Ge="",Me="Execution model · 100M-row point-in-polygon",ze=[{color:"#ff6b3d",label:"Row-by-row CPU"},{color:"#b5ff3d",label:"Chunk-skip â vectorized GPU + CPU"}],He={head:"CPU · row-by-row execution",sub:"One function call per row",rows:["i=0 · ST_CONTAINS(poly, point)","i=1 · ST_CONTAINS(poly, point)","i=2 · ST_CONTAINS(poly, point)","i=3 · ST_CONTAINS(poly, point)","i=4 · ST_CONTAINS(poly, point)"],iterationsNote:"⦠100,000,000 iterations",meterCaption:"processing 9.8M / 100M",wallTitle:"Grows linearly with row count.",wallSub:"Every row pays the full function cost."},De={head:"Chunk-skip â vectorized · GPU + parallel CPU",sub:"Prune by chunk, then dispatch once across N lanes",prune:{title:"â CHUNK SKIP · min/max range vs polygon bbox",chunks:["skip","skip","keep","keep","skip","keep","skip","skip","skip","keep","skip","skip"],captionPart1:"Each chunk = 8M rows with cached min/max ranges. Chunks outside the polygon's bounding box are ",captionStrong:"skipped before ST_CONTAINS runs",captionPart2:" â the predicate only touches candidate chunks."},lanesLabel:"â¡ VECTORIZE · function dispatched once · ranks â TOMs â lanes",lanes:["TOMâ","TOMâ","TOMâ","TOMâ","TOMâ","TOMâ
","TOMâ","TOMâ"],lanesMore:"one rank per GPU · multiple TOMs per rank â¦",meterCaption:"candidate rows · done",wallTitle:"Skipped chunks cost nothing; survivors run in parallel.",wallSub:"Sublinear when the query is selective."},Ue={tag:"Field report",text:"Spatial operations that typically take several hours on traditional databases can now be completed within a couple of minutes, allowing Foursquare to push the boundaries of what's possible with SQL in the geospatial domain.",attribution:"Foursquare",context:"on building the FSQ DB geospatial compute layer with Kinetica"},$e={tag:"How it works",lines:["Columnar storage touches only the columns in the query; horizontal chunks (8M rows, default) carry per-column min/max metadata so chunks that can't contain a match are skipped. The survivors are dispatched once and vectorized across ranks and TOMs â GPU for rendering and most GIS functions, parallel CPU for the st_functions that run there.","Source: Kinetica Core Database 7.1 â vertical/horizontal grouping & GPU/CPU query orchestration."]},l={eyebrow:Le,titlePart1:Re,titleAccent:Oe,titlePart2:Ie,lede:Ge,diagramLabel:Me,legend:ze,cpu:He,gpu:De,quote:Ue,footnote:$e},C=({tone:t,title:s,sub:i})=>e.jsxs("div",{className:"mt-[22px] border-t border-white/[0.08] pt-[18px]",children:[e.jsx("div",{className:`mb-2 font-mono text-[11px] uppercase tracking-[0.08em] ${t==="cpu"?"text-[#ff6b3d]":"text-[#b5ff3d]"}`,children:"Wall clock"}),e.jsx("div",{className:"mb-0.5 text-[16px] text-white",children:s}
1),e.jsx("div",{className:"font-[family-name:var(--font-serif)] text-[15px] italic text-white/40",children:i})]}),We=()=>{const{cpu:t,gpu:s}=l;return e.jsx("section",{className:"section-y border-t border-white/[0.08] px-6 md:px-10",children:e.jsxs("div",{className:"mx-auto max-w-[1280px]",children:[e.jsxs(b,{eyebrow:l.eyebrow.label,lede:l.lede,className:"mb-14",children:[l.titlePart1," ",e.jsx(h,{children:l.titleAccent}),` ${l.titlePart2}`]}),e.jsx(y,{label:l.diagramLabel,legend:l.legend,children:e.jsxs("div",{className:"grid grid-cols-1 gap-5 md:grid-cols-2",children:[e.jsxs("div",{className:"rounded-xl border border-[#ff6b3d]/25 p-6",children:[e.jsx("div",{className:"mb-2 font-mono text-[13px] uppercase tracking-[0.08em] text-[#ff6b3d]",children:t.head}),e.jsx("div",{className:"mb-6 font-mono text-[11px] tracking-[0.04em] text-white/40",children:t.sub}),t.rows.map((i,n)=>{const H=n===0;return e.jsx("div",{className:`mb-2 rounded-[7px] border px-3.5 py-[11px] font-mono text-[12.5px] ${H?"geo-cpu-row border-[#ff6b3d]/40 bg-[#ff6b3d]/[0.06] text-[#ff6b3d]":"border-white/[0.08] text-white/40"}`,children:i},i)}),e.jsx("div",{className:"mb-2 mt-4 font-mono text-[11px] text-white/40",children:t.iterationsNote}),e.jsx("div",{className:"h-2 overflow-hidden rounded-md bg-white/[0.06]",children:e.jsx("div",{className:"h-full w-[9.8%] rounded-md bg-[#ff6b3d]"})}),e.jsx("div",{className:"mt-2 text-right font-mono text-[11px] text-[#ff6b3d]",children:t.meterCaption}),e.jsx(C,{tone:"cpu",title:t.wallTitle,sub:t.wallSub})]}),e.jsxs("div",{className:"rounded-xl border border-[#b5ff3d]/30 p-6",children:[e.jsx("div",{className:"mb-2 font-mono text-[13px] uppercase tracking-[0.08em] text-[#b5ff3d]",children:s.head}),e.jsx("div",{className:"mb-6 font-mono text-[11px] tracking-[0.04em] text-white/40",children:s.sub}),e.jsxs("div",{className:"mb-4 rounded-[10px] border border-dashed border-[#b5ff3d]/35 bg-[#b5ff3d]/[0.03] px-4 py-3.5",children:[e.jsx("div",{className:"mb-2.5 font-mono text-[11px] tracking-[0.04em] text-[#b5ff3d]",children:s.prune.title}),e.jsx("div",{className:"flex flex-wrap gap-[5px]",children:s.prune.chunks.map((i,n)=>e.jsx("span",{"aria-hidden":"true",className:`h-[18px] w-[30px] rounded-[3px] border ${i==="keep"?"geo-chunk-keep border-[#b5ff3d] bg-[#b5ff3d]/[0.22]":"border-white/[0.12] bg-transparent"}`},n))}),e.jsxs("p",{className:"mt-2.5 font-mono text-[10.5px] leading-[1.5] text-white/40",children:[s.prune.captionPart1,e.jsx("strong",{className:"font-medium text-[#b5ff3d]",children:s.prune.captionStrong}),s.prune.captionPart2]})]}),e.jsx("div",{className:"mb-2.5 font-mono text-[11px] tracking-[0.02em] text-white/60",children:s.lanesLabel}),e.jsx("div",{className:"grid gap-1.5",style:{gridTemplateColumns:`repeat(${s.lanes.length}, minmax(0, 1fr))`},children:s.lanes.map(i=>e.jsxs("div",{className:"flex flex-col items-center gap-1.5",children:[e.jsx("div",{className:"flex w-full flex-col gap-1",children:[0,1,2,3].map(n=>e.jsx("div",{className:"geo-lane-cell h-3.5 rounded-[3px] border border-[#b5ff3d]/40 bg-[#b5ff3d]/[0.18]"},n))}),e.jsx("div",{className:"mt-0.5 font-mono text-[9px] text-white/40",children:i})]},i))}),e.jsx("div",{className:"mt-2 text-right font-mono text-[10px] text-white/40",children:s.lanesMore}),e.jsxs("div",{className:"relative mt-3.5 h-2 overflow-hidden rounded-md bg-white/[0.06]",children:[e.jsx("div",{className:"h-full w-full rounded-md bg-[#b5ff3d]"}),e.jsx("div",{className:"geo-gpu-bar-shimmer motion-only absolute inset-y-0 left-0 w-20 bg-white/55"})]}),e.jsx("div",{className:"mt-2 text-right font-mono text-[11px] text-[#b5ff3d]",children:s.meterCaption}),e.jsx(C,{tone:"gpu",title:s.wallTitle,sub:s.wallSub})]})]})}),e.jsxs("div",{className:"mt-8 flex flex-wrap items-start gap-4 roun
1ded-2xl border border-white/[0.08] bg-[#131318] px-6 py-5",children:[e.jsx("span",{className:"rounded-full bg-[#a78bfa]/20 px-2.5 py-1 font-mono text-[10px] uppercase tracking-[0.08em] text-[#a78bfa]",children:l.footnote.tag}),e.jsx("div",{className:"min-w-[12rem] flex-1 text-[12px] leading-[1.7] text-white/55",children:l.footnote.lines.map(i=>e.jsx("div",{children:i},i))})]}),e.jsxs("figure",{className:"mt-6 flex flex-col gap-4 rounded-2xl border border-[#a78bfa]/30 bg-[#a78bfa]/[0.05] px-6 py-6",children:[e.jsx("span",{className:"w-fit rounded-full bg-[#a78bfa]/20 px-2.5 py-1 font-mono text-[10px] uppercase tracking-[0.08em] text-[#a78bfa]",children:l.quote.tag}),e.jsxs("blockquote",{className:"m-0 font-[family-name:var(--font-serif)] text-[20px] leading-[1.45] text-white",children:["â",l.quote.text,"â"]}),e.jsxs("figcaption",{className:"font-mono text-[12px] tracking-[0.04em] text-white/55",children:[e.jsx("strong",{className:"text-white",children:l.quote.attribution})," ",l.quote.context]})]})]})})},Be={label:"The Numbers"},qe="Independent benchmark.",Fe="Same hardware.",Ke="100M rows.",Ye="",Qe=[{id:"filter",title:"Geo Filter & Sum",sub:"100M trips · less is better",question:"How long were rides originating in this area? STXY_INTERSECTS + aggregation.",speedup:"3.4Ã",speedupLabel:"faster",kineticaSec:"16.0 s",postgisSec:"54.1 s",kineticaPct:29.6,postgisPct:100,scale:[{rows:"10M",kinetica:"2.83 s",postgis:"7.29 s"},{rows:"50M",kinetica:"8.50 s",postgis:"26.78 s"},{rows:"100M",kinetica:"16.02 s",postgis:"54.13 s"}]},{id:"join",title:"Geo Join & Count",sub:"100M trips · less is better",question:"How many trips originated and ended in an area? STXY_INTERSECTS over both endpoints.",speedup:"270Ã",speedupLabel:"faster",kineticaSec:"64 s",postgisSec:"17,285 s (~4.8 hrs)",kineticaPct:.37,postgisPct:100,scale:[{rows:"10M",kinetica:"8.84 s",postgis:"3,779 s"},{rows:"50M",kinetica:"30.4 s",postgis:"11,113 s"},{rows:"100M",kinetica:"64 s",postgis:"17,285 s"}]},{id:"temporal",title:"Geo Join & Temporal Filter",sub:"100M trips · less is better",question:"Trips intersecting an area where duration < 10 min â joined geometry + time predicate.",speedup:"34Ã",speedupLabel:"faster",kineticaSec:"0.27 s",postgisSec:"9.28 s",kineticaPct:2.9,postgisPct:100,scale:[{rows:"10M",kinetica:"0.14 s",postgis:"4.76 s"},{rows:"50M",kinetica:"0.23 s",postgis:"13.62 s"},{rows:"100M",kinetica:"0.27 s",postgis:"9.28 s"}]}],Ve={tag:"Methodology",lines:["Source: Radiant Advisors Independent Space & Time Database Benchmark, Q3 2022.","Workload: 100M Citi Bike trips. Hardware: both systems provisioned with 192 CPUs and 2 TB premium SSD â","Kinetica distributed across 4à ESDv2 nodes; PostGIS on a single Azure M192. Equivalent compute, distinct topology."],link:{label:"Full SQL and data on the Radiant Advisors GitHub",href:"https://github.com/RadiantAdvisors"}},x={eyebrow:Be,titlePart1:qe,titleAccent:Fe,titlePart2:Ke,lede:Ye,benches:Qe,footnote:Ve},Xe=()=>e.jsx("section",{className:"section-y border-t border-white/[0.08] px-6 md:px-10",children:e.jsxs("div",{className:"mx-auto max-w-[1280px]",children:[e.jsxs(b,{eyebrow:x.eyebrow.label,lede:x.lede,className:"mb-14",children:[x.titlePart1," ",e.jsx(h,{children:x.titleAccent})," ",x.titlePart2]}),e.jsx("div",{className:"grid grid-cols-1 gap-5 md:grid-cols-3",children:x.benches.map(t=>e.jsxs("div",{className:"flex flex-col rounded-2xl border border-white/[0.08] bg-[#131318] p-6",children:[e.jsxs("div",{className:"flex items-start justify-between gap-3",children:[e.jsxs("div",{children:[e.jsx("h4",{className:"m-0 font-[family-name:var(--font-serif)] text-[22px] leading-[1.2] text-white",children:t.title}),e.jsx("div",{className:"mt-1 font-mono text-[10px] uppercase tracking-[0.06em] text-white/40",children:t.sub})]}),e.jsxs("div",{className:"flex shrink-0 flex-col items-end rounded-lg border border-[#b5ff3d]/40 bg-[#b5ff3d]/[0.08] px-3 py-2 text-[#b5ff3d]",children:[e.jsx("span",{className:"font-[family-name:var(--font-serif)] text-[28px] leading-none",children:t.speedup}),e.jsx("span",{className:"font-mono text-[9px] uppercase tracking-[0.08em]",children:t.speedupLabel})]})]}
1),e.jsx("p",{className:"mt-4 min-h-[60px] text-[13px] leading-[1.55] text-white/65",children:t.question}),e.jsxs("div",{className:"mt-5 grid gap-3",children:[e.jsxs("div",{children:[e.jsxs("div",{className:"mb-1 flex items-baseline justify-between font-mono text-[11px]",children:[e.jsx("span",{className:"text-[#b5ff3d]",children:"Kinetica"}),e.jsx("span",{className:"text-[#b5ff3d]",children:t.kineticaSec})]}),e.jsx("div",{className:"h-2 overflow-hidden rounded-full bg-white/[0.05]",children:e.jsx("div",{className:"h-full rounded-full bg-[#b5ff3d]",style:{width:`${Math.max(t.kineticaPct,.6)}%`}})})]}),e.jsxs("div",{children:[e.jsxs("div",{className:"mb-1 flex items-baseline justify-between font-mono text-[11px]",children:[e.jsx("span",{className:"text-white/45",children:"PostGIS"}),e.jsx("span",{className:"text-white/45",children:t.postgisSec})]}),e.jsx("div",{className:"h-2 overflow-hidden rounded-full bg-white/[0.05]",children:e.jsx("div",{className:"h-full rounded-full bg-[#ff6b3d]/70",style:{width:`${t.postgisPct}%`}})})]})]}),e.jsxs("div",{className:"mt-5 grid grid-cols-[4rem_1fr_1fr] gap-x-3 gap-y-1.5 border-t border-white/[0.08] pt-4 font-mono text-[11px]",children:[e.jsx("span",{className:"text-white/40",children:"rows"}),e.jsx("span",{className:"text-[#b5ff3d]/80",children:"Kinetica"}),e.jsx("span",{className:"text-white/45",children:"PostGIS"}),t.scale.map(s=>e.jsxs(T.Fragment,{children:[e.jsx("span",{className:"text-white/55",children:s.rows}),e.jsx("span",{className:"text-[#b5ff3d]",children:s.kinetica}),e.jsx("span",{className:"text-white/60",children:s.postgis})]},s.rows))]})]},t.id))}),e.jsxs("div",{className:"mt-8 flex flex-wrap items-start gap-4 roun
1ded-2xl border border-white/[0.08] bg-[#131318] px-6 py-5",children:[e.jsx("span",{className:"rounded-full bg-[#a78bfa]/20 px-2.5 py-1 font-mono text-[10px] uppercase tracking-[0.08em] text-[#a78bfa]",children:x.footnote.tag}),e.jsx("div",{className:"min-w-[12rem] flex-1 text-[12px] leading-[1.7] text-white/55",children:x.footnote.lines.map(t=>e.jsx("div",{children:t},t))}),e.jsxs("a",{href:x.footnote.link.href,target:"_blank",rel:"noopener noreferrer",className:"font-mono text-[12px] text-[#b5ff3d] hover:text-white",children:[x.footnote.link.label," â"]})]})]})}),Ze={label:"The Toolkit"},Je="Geometry. Hex grids. Tracks. Maps.",et="One toolbox.",tt="",st=[{id:"geometry",name:"Geometry",endpoint:"ST_*",tone:"lime",count:"150+ functions",title:"Full PostGIS-style geometry library.",description:"Predicates, measurements, constructions, set operations, transforms. Plus enhanced STXY_* variants for raw x/y columns.",fns:"ST_CONTAINS · ST_INTERSECTS · ST_DWITHIN · ST_BUFFER · ST_AREA · ST_LENGTH · ST_CENTROID · ST_DISTANCE · ST_UNION · ST_CONVEXHULL"},{id:"h3",name:"H3 grids",endpoint:"H3_*",tone:"teal",count:"native indexing",title:"Uber's hex tessellation, in SQL.",description:"Convert points and polygons to H3 cells, walk parent and child levels, take grid disks and rings. Sixteen resolutions, continent to half-meter.",fns:"H3_LATLNGTOCELL · H3_POLYGONTOCELLS · H3_GRIDDISK · H3_GRIDRING · H3_CELLTOPARENT · H3_CELLTOCHILDREN · H3_CELLTOBOUNDARY"},{id:"tracks",name:"Tracks",endpoint:"ST_TRACK*",tone:"purple",count:"spatial à temporal",title:"Time-aware moving objects.",description:"A track is a sequence of points ordered by time â flights, vehicles, ships. Match tracks against geofences or find tracks within a space-time tolerance.",fns:"ST_TRACK_DWITHIN · ST_TRACKINTERSECTS · ST_TRACKLENGTH · ST_TRACKDURATION · ST_LINESTRINGFROMORDEREDPOINTS"},{id:"render",name:"Visualization",endpoint:"/wms · /vts",tone:"amber",count:"GPU rendering",title:"Render the map in the database.",description:"Issue an HTTP request, get back a PNG. Six rendering modes covering point clouds, choropleths, density surfaces, and route reachability.",fns:"raster · cb_raster · heatmap (60+ colormaps) · contour (isolines) · labels · isochrones · vector tile service (VTS)"}],u={eyebrow:Ze,titlePart1:Je,titleAccent:et,lede:tt,cards:st},r=({children:t})=>e.jsx("span",{className:"text-[#ff7ac6]",children:t}),k=({children:t})=>e.jsx("span",{className:"text-[#b5ff3d]",children:t}),_=({children:t})=>e.jsx("span",{className:"text-[#ffb86c]",children:t}),z=({children:t})=>e.jsx("span",{className:"text-[#ffb86c]",children:t}),it=e.jsxs(e.Fragment,{children:[e.jsx(r,{children:"SELECT"})," id",` 2`,e.jsx(r,{children:"FROM"})," points",` 3`,e.jsx(r,{children:"WHERE"})," ",e.jsx(k,{children:"STXY_CONTAINS"}),`( 4 zone_geom, lon, lat 5) = `,e.jsx(z,{children:"1"}),";"]}),at=e.jsxs(e.Fragment,{children:[e.jsx(r,{children:"SELECT"}),` 6 `,e.jsx(k,{children:"H3_LATLNGTOCELL"}),`( 7 lat, lon, `,e.jsx(z,{children:"9"}),` 8 ) `,e.jsx(r,{children:"AS"})," cell,",` 9 `,e.jsx(k,{children:"COUNT"}),`(*) 10`,e.jsx(r,{children:"FROM"})," events",` 11`,e.jsx(r,{children:"GROUP BY"})," cell;"]}),nt=e.jsxs(e.Fragment,{children:[e.jsx(r,{children:"SELECT"})," *",` 12`,e.jsx(r,{children:"FROM TABLE"}),`( 13 `,e.jsx(k,{children:"ST_TRACKINTERSECTS"}),`( 14 `,e.jsx(r,{children:"TRACK_TABLE"}),` => ..., 15 `,e.jsx(r,{children:"GEOFENCE_TABLE"}),` => ... 16 ) 17);`]}),ot=e.jsxs(e.Fragment,{children:[e.jsx(r,{children:"GET"})," /wms?",e.jsx(r,{children:"REQUEST"}),"=",` 18 `,e.jsx(_,{children:"'GetMap'"}),` 19 &`,e.jsx(r,{children:"STYLES"}),"=",e.jsx(_,{children:"'heatmap'"}),` 20 &`,e.jsx(r,{children:"LAYERS"}),"=trips",` 21 &`,e.jsx(r,{children:"BBOX"}),"=..."]}
21),rt={geometry:it,h3:at,tracks:nt,render:ot},lt=()=>e.jsxs("svg",{viewBox:"0 0 40 40",xmlns:"http://www.w3.org/2000/svg",className:"block h-10 w-10","aria-hidden":"true",children:[e.jsx("polygon",{points:"20,4 36,13 36,27 20,36 4,27 4,13",fill:"rgba(181,255,61,0.12)",stroke:"#b5ff3d",strokeWidth:"1.4"}),e.jsx("circle",{cx:"20",cy:"20",r:"3.5",fill:"#b5ff3d",opacity:"0.6"})]}),ct=()=>e.jsxs("svg",{viewBox:"0 0 40 40",xmlns:"http://www.w3.org/2000/svg",className:"block h-10 w-10","aria-hidden":"true",children:[e.jsx("polygon",{points:"14,8 20,4 26,8 26,16 20,20 14,16",fill:"rgba(77,217,208,0.10)",stroke:"#4dd9d0",strokeWidth:"1"}),e.jsx("polygon",{points:"8,18 14,14 20,18 20,26 14,30 8,26",fill:"rgba(77,217,208,0.10)",stroke:"#4dd9d0",strokeWidth:"1"}),e.jsx("polygon",{points:"20,18 26,14 32,18 32,26 26,30 20,26",fill:"rgba(77,217,208,0.10)",stroke:"#4dd9d0",strokeWidth:"1"}),e.jsx("text",{x:"20",y:"23",textAnchor:"middle",fill:"#4dd9d0",className:"font-mono",fontSize:"7",children:"H3"})]}),dt=()=>e.jsxs("svg",{viewBox:"0 0 40 40",xmlns:"http://www.w3.org/2000/svg",className:"block h-10 w-10","aria-hidden":"true",children:[e.jsx("polyline",{points:"4,30 12,18 20,22 28,8 36,12",fill:"none",stroke:"#a78bfa",strokeWidth:"1.6"}),e.jsx("circle",{cx:"4",cy:"30",r:"2.2",fill:"#a78bfa"}),e.jsx("circle",{cx:"36",cy:"12",r:"2.2",fill:"#a78bfa"}),e.jsx("rect",{x:"16",y:"16",width:"12",height:"8",rx:"1",fill:"none",stroke:"#a78bfa",strokeWidth:"1",strokeDasharray:"3 2",opacity:"0.6"})]}),xt=()=>e.jsxs("svg",{viewBox:"0 0 40 40",xmlns:"http://www.w3.org/2000/svg",className:"block h-10 w-10","aria-hidden":"true",children:[e.jsx("rect",{x:"4",y:"4",width:"32",height:"32",rx:"3",fill:"none",stroke:"#ffb86c",strokeWidth:"1.4"}),e.jsx("rect",{x:"9",y:"9",width:"22",height:"22",rx:"2",fill:"rgba(255,184,108,0.08)",stroke:"#ffb86c",strokeWidth:"0.8",opacity:"0.6"}),e.jsx("circle",{cx:"20",cy:"20",r:"5",fill:"rgba(255,184,108,0.32)",stroke:"#ffb86c",strokeWidth:"1"})]}),ht={geometry:e.jsx(lt,{}),h3:e.jsx(ct,{}),tracks:e.jsx(dt,{}),render:e.jsx(xt,{})},mt={lime:"text-[#b5ff3d]",teal:"text-[#4dd9d0]",purple:"text-[#a78bfa]",amber:"text-[#ffb86c]"},pt={lime:"border-[#b5ff3d]/40",teal:"border-[#4dd9d0]/40",purple:"border-[#a78bfa]/40",amber:"border-[#ffb86c]/40"},ft=()=>e.jsx("section",{className:"section-y border-t border-white/[0.08] px-6 md:px-10",children:e.jsxs("div",{className:"mx-auto max-w-[1280px]",children:[e.jsxs(b,{eyebrow:u.eyebrow.label,lede:u.lede,className:"mb-14",children:[u.titlePart1," ",e.jsx(h,{children:u.titleAccent})]}),e.jsx("div",{className:"grid grid-cols-1 gap-5 md:grid-cols-2",children:u.cards.map(t=>e.jsxs("div",{className:"flex flex-col rounded-2xl border border-white/[0.08] bg-[#131318] p-6 md:p-8",children:[e.jsx("div",{className:"flex items-start justify-between gap-4",children:e.jsxs("div",{className:"flex items-start gap-4",children:[ht[t.id],e.jsxs("div",{children:[e.jsxs("div",{className:`font-mono text-[12px] tracking-[0.04em] ${mt[t.tone]}`,children:[t.name," ",e.jsx("span",{className:"text-white/35",children:"·"})," ",t.endpoint]}),e.jsx("div",{className:"mt-1 font-mono text-[10px] uppercase tracking-[0.08em] text-white/40",children:t.count})]})]})}),e.jsx("h4",{className:"mt-5 font-[family-name:var(--font-serif)] text-[24px] leading-[1.2] text-white",children:t.title}),e.jsx("p",{className:"mt-3 text-[14px] leading-[1.6] text-white/65",children:t.description}),e.jsx("pre",{className:`mt-5 overflow-x-auto rounded-lg border bg-black/30 p-4 font-mono text-[11px] leading-[1.7] text-white/85 ${pt[t.tone]}`,children:rt[t.id]}),e.jsx("div",{className:"mt-4 border-t border-white/[0.08] pt-4 font-mono text-[11px] leading-[1.6] text-white/50",children:t.fns})]},t.id))})]})}),gt={label:"The Hybrid"},bt="Moving objects, geofences, and time windows in one SQL table function â ",ut="no streaming layer, no graph DB, no glue code.",jt="",wt={label:"Tracks · Geofences · Time tolerance",legend:[{color:"#b5ff3d",label:"downtown_fence"},{color:"#4dd9d0",label:"airport_fence"},{color:"#a78bfa",label:"matched track"}]},yt={label:"SQL · flights_through_geofences.sql",name:"ST_TRACKINTERSECTS",footer
21:"â Spatial + temporal + label-aware. No streaming layer, no graph DB."},Nt={eyebrow:"And because graph is native",titlePart1:"Travel-time curves over a road network â",titleAccent:"produced by the same engine.",body:""},St={label:"Isochrone · spatial à graph",legend:[{color:"#a78bfa",label:"5 min"},{color:"#4dd9d0",label:"15 min"},{color:"#b5ff3d",label:"30 min"}],footer:"One HTTP GET returns a PNG. Style with URL parameters; restyle without re-querying."},kt={label:"URL · isochrone_render.sh",name:"/wms · isochrones",footer:"Graph weighted by ST_LENGTH · one HTTP call returns the rendered image"},o={eyebrow:gt,titlePart1:bt,titleAccent:ut,lede:jt,trackDiagram:wt,trackSql:yt,isochroneBeat:Nt,isochroneDiagram:St,isochroneSql:kt},a=({children:t})=>e.jsx("span",{className:"text-[#ff7ac6]",children:t}),S=({children:t})=>e.jsx("span",{className:"text-[#b5ff3d]",children:t}),f=({children:t})=>e.jsx("span",{className:"text-[#ffb86c]",children:t}),L=({children:t})=>e.jsx("span",{className:"text-[#ffb86c]",children:t}),v=({children:t})=>e.jsx("span",{className:"text-[#c8a2ff]",children:t}),w=({children:t})=>e.jsx("span",{className:"italic text-white/35",children:t}),vt=e.jsxs(e.Fragment,{children:[e.jsx(w,{children:"-- Find every flight that crosses"}),` 22`,e.jsx(w,{children:"-- a geofence within a time window."}),` 23`,e.jsx(w,{children:"-- One table function. One query."}),` 24 25`,e.jsx(a,{children:"SELECT"})," *",` 26`,e.jsx(a,{children:"FROM TABLE"}),`( 27 `,e.jsx(S,{children:"ST_TRACKINTERSECTS"}),`( 28 `,e.jsx(a,{children:"TRACK_TABLE"})," => ",e.jsx(a,{children:"INPUT_TABLE"}),"(",e.jsx(v,{children:"flights"}),`), 29 `,e.jsx(a,{children:"TRACK_ID_COLUMN"})," => ",e.jsx(f,{children:"'flight_id'"}),`, 30 `,e.jsx(a,{children:"TRACK_X_COLUMN"})," => ",e.jsx(f,{children:"'lon'"}),`, 31 `,e.jsx(a,{children:"TRACK_Y_COLUMN"})," => ",e.jsx(f,{children:"'lat'"}),`, 32 `,e.jsx(a,{children:"TRACK_ORDER_COLUMN"})," => ",e.jsx(f,{children:"'flight_time'"}),`, 33 `,e.jsx(a,{children:"GEOFENCE_TABLE"})," => ",e.jsx(a,{children:"INPUT_TABLE"}),"(",e.jsx(v,{children:"geofences"}),`), 34 `,e.jsx(a,{children:"GEOFENCE_ID_COLUMN"})," => ",e.jsx(f,{children:"'fence_name'"}),`, 35 `,e.jsx(a,{children:"GEOFENCE_WKT_COLUMN"})," => ",e.jsx(f,{children:"'fence_wkt'"}),` 36 ) 37) 38`,e.jsx(a,{children:"ORDER BY"})," flight_id, fence_name;"]}),Tt=e.jsxs(e.Fragment,{children:[e.jsx(w,{children:"# A graph weighted by ST_LENGTH"}),` 39`,e.jsx(a,{children:"CREATE OR REPLACE GRAPH"})," ",e.jsx(v,{children:"roads"}),` ( 40 `,e.jsx(a,{children:"EDGES"})," => ",e.jsx(a,{children:"INPUT_TABLES"}),`( 41 `,e.jsx(a,{children:"SELECT"}),` 42 shape `,e.jsx(a,{children:"AS"})," ",e.jsx(S,{children:"EDGE_WKTLINE"}),`, 43 `,e.jsx(S,{children:"ST_LENGTH"}),"(shape, ",e.jsx(L,{children:"1"}),`) / speed 44 `,e.jsx(a,{children:"AS"})," ",e.jsx(S,{children:"WEIGHTS_VALUESPECIFIED"}),`
45 `,e.jsx(a,{children:"FROM"})," ",e.jsx(v,{children:"road_network"}),` 46 ) 47); 48 49`,e.jsx(w,{children:"# One HTTP call returns a PNG"}),` 50`,e.jsx(a,{children:"GET"}),` /wms? 51 `,e.jsx(a,{children:"STYLES"}),`=isochrones 52 &`,e.jsx(a,{children:"GRAPH_NAME"}),`=roads 53 &`,e.jsx(a,{children:"SOURCE_NODE"}),"=",e.jsx(f,{children:"'POINT(-122 47)'"}),` 54 &`,e.jsx(a,{children:"NUM_LEVELS"}),"=",e.jsx(L,{children:"3"}),` 55 &`,e.jsx(a,{children:"COLORMAP"}),"=viridis"]}),R=({label:t,name:s,children:i,footer:n})=>e.jsxs("div",{className:"flex flex-col overflow-hidden rounded-xl border border-white/[0.08] bg-[#0a0a0c]",children:[e.jsxs("div",{className:"flex items-center gap-2.5 border-b border-white/[0.08] bg-white/[0.02] px-4 py-3.5",children:[e.jsx("span",{className:"font-mono text-[10px] uppercase tracking-[0.08em] text-white/40",children:t}),e.jsx("span",{className:"ml-auto text-[13px] font-medium text-white",children:s})]}),e.jsx("pre",{className:"m-0 flex-grow overflow-x-auto whitespace-pre p-5 font-mono text-[12px] leading-[1.7] text-white",children:i}),e.jsx("div",{className:"border-t border-white/[0.08] bg-black/20 px-5 py-3 font-mono text-[11px] tracking-[0.04em] text-white/40",children:n})]}),Et=()=>e.jsxs("svg",{viewBox:"0 0 600 320",xmlns:"http://www.w3.org/2000/svg",className:"block h-auto w-full",role:"img","aria-label":"Three flight tracks plotted against two geofences. Flight A1024 crosses the downtown fence; flight C998 enters the airport fence; flight B204 misses both. A time band marks the ±5-minute tolerance window.",children:[e.jsx("rect",{x:"60",y:"20",width:"160",height:"80",rx:"6",fill:"rgba(181,255,61,0.06)",stroke:"#b5ff3d",strokeWidth:"1",strokeDasharray:"4 3"}),e.jsx("text",{x:"74",y:"42",fill:"#b5ff3d",className:"font-mono",fontSize:"10",children:"DOWNTOWN_FENCE"}),e.jsx("rect",{x:"380",y:"36",width:"170",height:"80",rx:"6",fill:"rgba(77,217,208,0.06)",stroke:"#4dd9d0",strokeWidth:"1",strokeDasharray:"4 3"}),e.jsx("text",{x:"394",y:"58",fill:"#4dd9d0",className:"font-mono",fontSize:"10",children:"AIRPORT_FENCE"}),e.jsx("polyline",{points:"30,150 140,108 280,128 420,86 570,80",fill:"none",stroke:"#b5ff3d",strokeWidth:"2"}),e.jsx("circle",{cx:"30",cy:"150",r:"4",fill:"#b5ff3d"}),e.jsx("circle",{cx:"570",cy:"80",r:"4",fill:"#b5ff3d"}),e.jsx("text",{x:"30",y:"142",fill:"#b5ff3d",className:"font-mono",fontSize:"10",children:"flight_A1024 · matched"}),e.jsx("polyline",{points:"30,196 140,184 280,188 420,180 570,186",fill:"none",stroke:"#6b6b73",strokeWidth:"1.4",strokeDasharray:"3 3"}),e.jsx("text",{x:"30",y:"184",className:"fill-white/40 font-mono",fontSize:"10",children:"flight_B204 · no intersect"}),e.jsx("polyline",{points:"30,240 140,232 280,220 420,80 570,72",fill:"none",stroke:"#a78bfa",strokeWidth:"2"}),e.jsx("circle",{cx:"30",cy:"240",r:"4",fill:"#a78bfa"}),e.jsx("text",{x:"30",y:"232",fill:"#a78bfa",className:"font-mono",fontSize:"10",children:"flight_C998 · enters airport_fence"}),e.jsx("line",{x1:"30",y1:"280",x2:"570",y2:"280",stroke:"rgba(255,255,255,0.15)",strokeWidth:"0.8"}),[{x:30,label:"14:00"},{x:140,label:"14:15"},{x:280,label:"14:30"},{x:420,label:"14:45"},{x:560,label:"15:00"}].map(t=>e.jsxs("g",{children:[e.jsx("line",{x1:t.x,y1:"276",x2:t.x,y2:"284",stroke:"rgba(255,255,255,0.25)",strokeWidth:"0.8"}),e.jsx("text",{x:t.x,y:"300",textAnchor:"middle",className:"fill-white/45 font-mono",fontSize:"10",children:t.label})]},t.label)),e.jsx("rect",{x:"395",y:"266",width:"50",height:"28",rx:"3",fill:"rgba(181,255,61,0.10)",stroke:"rgba(181,255,61,0.4)",strokeWidth:"0.8"}),e.jsx("text",{x:"420",y:"284",textAnchor:"middle",fill:"#b5ff3d",className:"font-mono",fontSize:"9",children:"±5m"})]}),Pt=()=>e.jsxs("svg",{viewBox:"0 0 600 320",xmlns:"http://www.w3.org/2000/svg",className:"block h-auto w-full",role:"img","aria-label":"Three nested travel-time rings emanate from a source node: 5-minute (purple), 15-minute (teal), and 30-minute (lime). Each ring is computed by the integrated graph engine and rendered into the same image.",children:[e.jsx("ellipse",{cx:"300",cy:"160",rx:"240",ry:"130",fill:"rgba(181,255,61,0.04)",stroke:"rgba(181,255,61,0.25)",strokeWidth:"1"}),e.jsx("ellipse",{cx:"300",cy:"160",rx:"160",ry:"90",fill:"rgba(77,217,208,0.05)",stroke:"rgba(77,217,208,0.30
55)",strokeWidth:"1"}),e.jsx("ellipse",{cx:"300",cy:"160",rx:"80",ry:"45",fill:"rgba(167,139,250,0.10)",stroke:"rgba(167,139,250,0.45)",strokeWidth:"1"}),[{x1:70,y1:160,x2:530,y2:160},{x1:300,y1:40,x2:300,y2:280},{x1:140,y1:90,x2:460,y2:230},{x1:140,y1:230,x2:460,y2:90}].map((t,s)=>e.jsx("line",{x1:t.x1,y1:t.y1,x2:t.x2,y2:t.y2,stroke:"rgba(255,255,255,0.10)",strokeWidth:"0.8"},s)),e.jsx("circle",{cx:"300",cy:"160",r:"7",fill:"#b5ff3d"}),e.jsx("text",{x:"312",y:"158",fill:"#b5ff3d",className:"font-mono",fontSize:"10",children:"SOURCE_NODE"}),e.jsx("text",{x:"76",y:"166",fill:"#b5ff3d",className:"font-mono",fontSize:"10",children:"30 min"}),e.jsx("text",{x:"160",y:"166",fill:"#4dd9d0",className:"font-mono",fontSize:"10",children:"15 min"}),e.jsx("text",{x:"232",y:"166",fill:"#a78bfa",className:"font-mono",fontSize:"10",children:"5 min"}),e.jsx("text",{x:"300",y:"306",textAnchor:"middle",className:"fill-white/45 font-mono",fontSize:"10",letterSpacing:"0.04em",children:"weight = ST_LENGTH(shape) / speed"})]}),At=()=>e.jsx("section",{className:"section-y border-t border-white/[0.08] px-6 md:px-10",children:e.jsxs("div",{className:"mx-auto max-w-[1280px]",children:[e.jsxs(b,{eyebrow:o.eyebrow.label,lede:o.lede,className:"mb-14",children:[o.titlePart1," ",e.jsx(h,{children:o.titleAccent})]}),e.jsxs("div",{className:"grid grid-cols-1 gap-5 lg:grid-cols-[1.45fr_1fr]",children:[e.jsx(y,{label:o.trackDiagram.label,legend:o.trackDiagram.legend,children:e.jsx(Et,{})}),e.jsx(R,{label:o.trackSql.label,name:o.trackSql.name,footer:o.trackSql.footer,children:vt})]}),e.jsxs("div",{className:"mt-14 border-t border-white/[0.08] pt-14",children:[e.jsxs("div",{className:"mb-8 max-w-[760px]",children:[e.jsx(K,{tone:"muted",children:o.isochroneBeat.eyebrow}),e.jsxs(O,{size:"subsection",className:"mb-4 mt-3",children:[o.isochroneBeat.titlePart1," ",e.jsx(h,{children:o.isochroneBeat.titleAccent})]}),o.isochroneBeat.body]}),e.jsxs("div",{className:"grid grid-cols-1 gap-5 lg:grid-cols-[1.45fr_1fr]",children:[e.jsxs(y,{label:o.isochroneDiagram.label,legend:o.isochroneDiagram.legend,children:[e.jsx(Pt,{}),e.jsx("div",{className:"mt-4 border-t border-white/[0.08] pt-4 font-mono text-[11px] leading-[1.6] tracking-[0.04em] text-white/40",children:o.isochroneDiagram.footer})]}),e.jsx(R,{label:o.isochroneSql.label,name:o.isochroneSql.name,footer:o.isochroneSql.footer,children:Tt})]})]})]})}),Ct={label:"The Visualization"},_t="Render the map",Lt="in the database.",Rt="",Ot=[{id:"heatmap",label:"Heatmap"},{id:"isochrones",label:"Isochrones"},{id:"contour",label:"Contour"},{id:"classbreak",label:"Class break"}],It={heatmap:{title:"Density surfaces from millions of points.",description:"Per-pixel aggregation directly over the source table. Sum, count, average, log-scaled â paired with any of 60+ colormaps from viridis to magma to inferno. Shown: 100M Citi Bike trips, rendered server-side in under one second, delivered as a PNG over HTTP.",image:{src:"https://kinetica-web-assets.s3.us-east-1.amazonaws.com/assets/pages/geospatial-viz-heatmap.png",alt:"Server-rendered heatmap of 100M Citi Bike trips across Manhattan, with density blooming in plasma colors over Midtown and downtown."},params:["VAL_ATTR = count / sum / avg / min / max / log(...)","COLORMAP: 60+ built in","BLUR_RADIUS · MIN_LEVEL · MAX_LEVEL parameterized"]},isochrones:{title:"Reachability â graph-driven.",description:"Travel-time curves over a road network, computed by the integrated graph engine and rendered into the same image surface. Shown: a 6-level isochrone of 5-minute travel rings from the Empire State Building â rendered in 0.9 seconds at every scale tested (10M, 50M, 100M rows).",image:{src:"https://kinetica-web-assets.s3.us-east-1.amazonaws.com/assets/pages/geospatial-viz-isochrones.png",alt:"Six concentric 5-minute isochrone rings radiating from the Empire State Building, layered on the Manhattan road network."},params:["GRAPH_NAME · SOURCE_NODE · NUM_LEVELS","MAX_SOLUTION_RADIUS · restrictions honored","weights: ST_LENGTH / speed · graph-aware"]},contour:{title:"Isolines and flooded surfaces.",description:"Marching-squares contours over an interpolated grid. Inverse-distance weighting, automatic level adjustment, label rendering â everything you'd build by hand in a notebook, exposed as URL parameters on the WMS endpoint. Shown: 9 auto-detected levels, IDW with power=2, 5 km search radius.",image:{src:"https://kinetica-web-assets.s3.us-east-1.amazonaws.com/assets/pages/geospatial-viz-contour.jpg",alt:"WMS contour output showing nine auto-detected isolines flooded across an interpolated demand surface."},params:["GRIDDING = inverse_distance_power","NUM_LEVELS: arbitrary · auto-detected","labels & smoothing parameterized","MIN_LEVEL · MAX_LEVEL · CELL_SIZE"]},classbreak:{title:"Class-break thematic maps.",description:"Categorize by column value or numeric range, then style each class independently â colors, sizes, shapes. Shown: demand density over Manhattan broken into five percentile classes, from very low (0â30th %ile) to very high (90thâ100th %ile).",image:{src:"https://kinetica-web-assets.s3.us-east-1.amazonaws.com/assets/pages/geospatial-viz-classbreak.jpg",alt:"Class-break thematic map of Manhattan with demand density styled into five percentile buckets â
55color and point size scaling with each class."},params:["CB_VALS = ranges or distinct values","per-class shape · color · size · alpha","CB_POINTCOLOR_* · CB_POINTSIZE_*","CB_POINTSHAPE_* · render order configurable"]}},p={eyebrow:Ct,titlePart1:_t,titleAccent:Lt,lede:Rt,tabs:Ot,panels:It},Gt=()=>{const[t,s]=T.useState(p.tabs[0].id),i=p.panels[t];return e.jsx("section",{className:"section-y border-t border-white/[0.08] px-6 md:px-10",children:e.jsxs("div",{className:"mx-auto max-w-[1280px]",children:[e.jsxs(b,{eyebrow:p.eyebrow.label,lede:p.lede,className:"mb-14",children:[p.titlePart1," ",e.jsx(h,{children:p.titleAccent})]}),e.jsxs(y,{children:[e.jsx(I,{tabs:p.tabs,active:t,onChange:s,ariaLabel:"Visualization rendering modes",className:"mb-10"}),e.jsxs("div",{role:"tabpanel",className:"grid gap-10 lg:grid-cols-[minmax(0,7fr)_minmax(0,5fr)] lg:items-center lg:gap-12",children:[e.jsx("div",{className:"overflow-hidden rounded-xl border border-white/[0.08] bg-black/40",children:e.jsx("img",{src:i.image.src,alt:i.image.alt,loading:"lazy",decoding:"async",className:"block h-auto w-full"})}),e.jsxs("div",{children:[e.jsx("h4",{className:"m-0 font-[family-name:var(--font-serif)] text-[24px] leading-[1.2] text-white",children:i.title}),e.jsx("p",{className:"mt-4 max-w-[60ch] text-[14px] leading-[1.6] text-white/65",children:i.description}),e.jsx("ul",{className:"mt-6 grid gap-2 border-t border-white/[0.08] pt-5 font-mono text-[11px] leading-[1.7] text-white/55",children:i.params.map(n=>e.jsx("li",{children:n},n))})]})]})]})]})})},Mt="Engineering note",zt="Pre-baking tiles is the wrong layer. The renderer should sit next to the data, not downstream of it â ",Ht="the map is finished when it leaves the database.",Dt=" One HTTP GET returns the rendered PNG; style with URL parameters and restyle without re-querying.",Ut="â Kinetica engineering · WMS rendering of 2.3B NYC taxi pickups · sub-second response from a single GET, vs. ~12 sec to ship raw points to a client renderer and rasterize there",j={tag:Mt,bodyPart1:zt,bodyAccent:Ht,bodyPart2:Dt,footnote:Ut},$t=()=>e.jsx("section",{className:"section-y border-t border-white/[0.08] px-6 md:px-10",children:e.jsx("div",{className:"mx-auto max-w-[1280px]",children:e.jsxs(Y,{tag:j.tag,footnote:j.footnote,children:[j.bodyPart1,e.jsx(h,{children:j.bodyAccent}),j.bodyPart2]})})}),Wt="Every dialect of geospatial.",Bt="One vectorized engine.",qt={label:"Start Free",href:"/kinetica-developer-edition"},Ft={label:"Read the docs",href:"https://docs.kinetica.com/7.2/"},Kt={headlinePart1:Wt,headlineAccent:Bt,ctaPrimary:qt,ctaSecondary:Ft},Yt=()=>e.jsx(Q,{...Kt}),Qt=[{q:"How is Kinetica's geospatial engine different from PostGIS?",a:"PostGIS is the gold standard for geospatial depth on a single-machine row-store. Kinetica matches PostGIS-style grammar with 150+ ST_ functions â and adds GPU-vectorized execution, parallel CPU dispatch, and a distributed shared-nothing architecture. The same SQL that hits a wall on PostGIS at 100M rows runs in seconds on Kinetica. The independent Radiant Advisors benchmark measured a 270à speedup on a 100M-trip geo-join workload."},{q:"Does Kinetica run on GPU, CPU, or both?",a:"Both â and the planner picks. Column-wide GIS work (point-in-polygon over a billion rows, server-side rendering, density surfaces) is routed to GPU lanes. Individual ST_ functions, graph solvers, and H3 grid operations run on parallel CPU. There's no manual hint required: same SQL, the substrate adapts to the shape of the workload."},{q:"Is H3 indexing native, or do I need an extension?",a:"Native. H3 functions ship as first-class SQL â <code>H3_LATLNGTOCELL</code>, <code>H3_POLYGONTOCELLS</code>, <code>H3_GRIDDISK</code>, <code>H3_CELLTOPARENT</code>, and the full Uber H3 family â with sixteen resolutions from continent to half-meter. No extension to install, no UDF library to package."},{q:"Can I run spatiotemporal queries on moving objects?",a:"Yes. A <em>track</em> is a first-class object â a sequence of points ordered by time, addressed by an ID column. <code>ST_TRACKINTERSECTS</code> matches tracks against geofences (with optional time tolerance), <code>ST_TRACK_DWITHIN</code> finds tracks within a space-time radius, and <code>ST_LINESTRINGFROMORDEREDPOINTS</code> materializes the line geometry. One table function replaces a streaming layer plus a spatial DB plus a graph engine."},{q:"What rendering modes does the WMS endpoint support?",a:"Six modes, all GPU-rendered server-side and returned as PNG over HTTP: <strong>raster</strong> (point clouds), <strong>cb_raster</strong> (class breaks), <strong>heatmap</strong> (60+ colormaps with log/sum/avg/count aggregation), <strong>contour</strong> (marching-squares isolines with IDW gridding), <strong>labels</strong>, and <strong>isochrones</strong> (graph-driven reachability surfaces). All six are also available as vector tiles via the <code>/vts</code> endpoint."},{q:"How do spatial queries combine with graph queries?",a:"In one SQL statement. Spatial geometries are valid graph weights â <code>ST_LENGTH</code> on a road segment is a travel-time weight when divided by speed. Build the graph with <code>CREATE OR REPLACE GRAPH</code> over a road network, then issue <code>SHORTEST_PATH</code> or render an isochrone via the WMS endpoint. The same engine that ran your point-in-polygon query just walked the graph and rendered the image."}],Vt={items:Qt},fs=()=>(D("Geospatial | Kinetica"),e.jsxs("div",{className:"hex-tile-bg",children:[e.jsx(be,{}),e.jsx(_e,{}),e.jsx(We,{}),e.jsx(Xe,{}),e.jsx(ft,{}),e.jsx(At,{}),e.jsx(Gt,{}),e.jsx($t,{}),e.jsx(Yt,{}),e.jsx(V,{items:Vt.items})]}));export{fs as FeaturesGeospatialAnalyticsPage,_e as GeospatialAnalyticsCategory,$t as GeospatialAnalyticsEngineeringNote,Yt as GeospatialAnalyticsFinalCta,be as GeospatialAnalyticsHero,At as GeospatialAnalyticsHybrid,We as GeospatialAnalyticsMechanism,Xe as GeospatialAnalyticsNumbers,ft as GeospatialAnalyticsToolkit,Gt as GeospatialAnalyticsVisualization};
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.