[{"data":1,"prerenderedAt":924},["ShallowReactive",2],{"page-\u002Fguides\u002Fgeoparquet":3},{"id":4,"title":5,"body":6,"description":917,"extension":918,"meta":919,"navigation":655,"path":920,"seo":921,"stem":922,"__hash__":923},"content\u002F4.guides\u002F12.geoparquet.md","GeoParquet Source",{"type":7,"value":8,"toc":896},"minimark",[9,13,18,28,56,149,153,156,232,239,254,267,271,276,324,328,459,535,539,542,563,571,575,595,598,601,605,615,618,622,626,629,705,709,712,758,762,765,800,804,811,817,821,871,875,892],[10,11,12],"p",{},"This guide covers serving vector tiles on-the-fly from GeoParquet files — no preprocessing or tile generation step required.",[14,15,17],"h2",{"id":16},"what-is-geoparquet","What is GeoParquet?",[10,19,20,27],{},[21,22,26],"a",{"href":23,"rel":24},"https:\u002F\u002Fgeoparquet.org\u002F",[25],"nofollow","GeoParquet"," is a standardized way to store geospatial data in Apache Parquet files. It is rapidly becoming the default interchange format for large geospatial datasets:",[29,30,31,39,53],"ul",{},[32,33,34,38],"li",{},[35,36,37],"strong",{},"Overture Maps Foundation"," distributes its entire dataset (~200 GB) as GeoParquet",[32,40,41,44,45,48,49,52],{},[35,42,43],{},"Source Cooperative",", ",[35,46,47],{},"CARTO",", and ",[35,50,51],{},"Google Open Buildings"," all publish GeoParquet",[32,54,55],{},"The data science ecosystem (pandas, DuckDB, Polars) reads Parquet natively",[57,58,59,77],"table",{},[60,61,62],"thead",{},[63,64,65,69,71,74],"tr",{},[66,67,68],"th",{},"Feature",[66,70,26],{},[66,72,73],{},"Shapefile",[66,75,76],{},"GeoJSON",[78,79,80,94,108,122,136],"tbody",{},[63,81,82,86,89,92],{},[83,84,85],"td",{},"File size",[83,87,88],{},"Compressed (zstd\u002Fsnappy)",[83,90,91],{},"Uncompressed",[83,93,91],{},[63,95,96,99,102,105],{},[83,97,98],{},"Max features",[83,100,101],{},"Billions",[83,103,104],{},"~70M (2 GB limit)",[83,106,107],{},"Memory-limited",[63,109,110,113,116,119],{},[83,111,112],{},"Spatial index",[83,114,115],{},"Row group bbox (v1.1)",[83,117,118],{},".shx index",[83,120,121],{},"None",[63,123,124,127,130,133],{},[83,125,126],{},"Schema",[83,128,129],{},"Typed columns",[83,131,132],{},".dbf types",[83,134,135],{},"JSON types",[63,137,138,141,144,147],{},[83,139,140],{},"Cloud-native",[83,142,143],{},"Yes (range reads)",[83,145,146],{},"No",[83,148,146],{},[14,150,152],{"id":151},"quick-start","Quick Start",[10,154,155],{},"Point tileserver-rs at a GeoParquet file:",[157,158,163],"pre",{"className":159,"code":160,"language":161,"meta":162,"style":162},"language-toml shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","[[sources]]\nid = \"buildings\"\ntype = \"geoparquet\"\npath = \"\u002Fdata\u002Foverture-buildings.parquet\"\n","toml","",[164,165,166,182,202,217],"code",{"__ignoreMap":162},[167,168,171,175,179],"span",{"class":169,"line":170},"line",1,[167,172,174],{"class":173},"sMK4o","[[",[167,176,178],{"class":177},"sBMFI","sources",[167,180,181],{"class":173},"]]\n",[167,183,185,189,192,195,199],{"class":169,"line":184},2,[167,186,188],{"class":187},"sTEyZ","id ",[167,190,191],{"class":173},"=",[167,193,194],{"class":173}," \"",[167,196,198],{"class":197},"sfazB","buildings",[167,200,201],{"class":173},"\"\n",[167,203,205,208,210,212,215],{"class":169,"line":204},3,[167,206,207],{"class":187},"type ",[167,209,191],{"class":173},[167,211,194],{"class":173},[167,213,214],{"class":197},"geoparquet",[167,216,201],{"class":173},[167,218,220,223,225,227,230],{"class":169,"line":219},4,[167,221,222],{"class":187},"path ",[167,224,191],{"class":173},[167,226,194],{"class":173},[167,228,229],{"class":197},"\u002Fdata\u002Foverture-buildings.parquet",[167,231,201],{"class":173},[10,233,234,235,238],{},"Or use zero-config auto-detection — drop a ",[164,236,237],{},".parquet"," file in your data directory:",[157,240,244],{"className":241,"code":242,"language":243,"meta":162,"style":162},"language-bash shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","tileserver-rs \u002Fdata\u002F\n","bash",[164,245,246],{"__ignoreMap":162},[167,247,248,251],{"class":169,"line":170},[167,249,250],{"class":177},"tileserver-rs",[167,252,253],{"class":197}," \u002Fdata\u002F\n",[255,256,258],"alert",{"type":257},"info",[10,259,260,261,263,264],{},"GeoParquet support requires the ",[164,262,214],{}," feature flag: ",[164,265,266],{},"cargo build --features geoparquet",[14,268,270],{"id":269},"configuration","Configuration",[272,273,275],"h3",{"id":274},"basic","Basic",[157,277,278],{"className":159,"code":160,"language":161,"meta":162,"style":162},[164,279,280,288,300,312],{"__ignoreMap":162},[167,281,282,284,286],{"class":169,"line":170},[167,283,174],{"class":173},[167,285,178],{"class":177},[167,287,181],{"class":173},[167,289,290,292,294,296,298],{"class":169,"line":184},[167,291,188],{"class":187},[167,293,191],{"class":173},[167,295,194],{"class":173},[167,297,198],{"class":197},[167,299,201],{"class":173},[167,301,302,304,306,308,310],{"class":169,"line":204},[167,303,207],{"class":187},[167,305,191],{"class":173},[167,307,194],{"class":173},[167,309,214],{"class":197},[167,311,201],{"class":173},[167,313,314,316,318,320,322],{"class":169,"line":219},[167,315,222],{"class":187},[167,317,191],{"class":173},[167,319,194],{"class":173},[167,321,229],{"class":197},[167,323,201],{"class":173},[272,325,327],{"id":326},"full-options","Full Options",[157,329,331],{"className":159,"code":330,"language":161,"meta":162,"style":162},"[[sources]]\nid = \"buildings\"\ntype = \"geoparquet\"\npath = \"\u002Fdata\u002Foverture-buildings.parquet\"\nname = \"Overture Buildings\"\nattribution = \"© Overture Maps Foundation\"\nlayer_name = \"buildings\"\ngeometry_column = \"geometry\"\nminzoom = 0\nmaxzoom = 14\n",[164,332,333,341,353,365,377,392,407,421,436,448],{"__ignoreMap":162},[167,334,335,337,339],{"class":169,"line":170},[167,336,174],{"class":173},[167,338,178],{"class":177},[167,340,181],{"class":173},[167,342,343,345,347,349,351],{"class":169,"line":184},[167,344,188],{"class":187},[167,346,191],{"class":173},[167,348,194],{"class":173},[167,350,198],{"class":197},[167,352,201],{"class":173},[167,354,355,357,359,361,363],{"class":169,"line":204},[167,356,207],{"class":187},[167,358,191],{"class":173},[167,360,194],{"class":173},[167,362,214],{"class":197},[167,364,201],{"class":173},[167,366,367,369,371,373,375],{"class":169,"line":219},[167,368,222],{"class":187},[167,370,191],{"class":173},[167,372,194],{"class":173},[167,374,229],{"class":197},[167,376,201],{"class":173},[167,378,380,383,385,387,390],{"class":169,"line":379},5,[167,381,382],{"class":187},"name ",[167,384,191],{"class":173},[167,386,194],{"class":173},[167,388,389],{"class":197},"Overture Buildings",[167,391,201],{"class":173},[167,393,395,398,400,402,405],{"class":169,"line":394},6,[167,396,397],{"class":187},"attribution ",[167,399,191],{"class":173},[167,401,194],{"class":173},[167,403,404],{"class":197},"© Overture Maps Foundation",[167,406,201],{"class":173},[167,408,410,413,415,417,419],{"class":169,"line":409},7,[167,411,412],{"class":187},"layer_name ",[167,414,191],{"class":173},[167,416,194],{"class":173},[167,418,198],{"class":197},[167,420,201],{"class":173},[167,422,424,427,429,431,434],{"class":169,"line":423},8,[167,425,426],{"class":187},"geometry_column ",[167,428,191],{"class":173},[167,430,194],{"class":173},[167,432,433],{"class":197},"geometry",[167,435,201],{"class":173},[167,437,439,442,444],{"class":169,"line":438},9,[167,440,441],{"class":187},"minzoom ",[167,443,191],{"class":173},[167,445,447],{"class":446},"sbssI"," 0\n",[167,449,451,454,456],{"class":169,"line":450},10,[167,452,453],{"class":187},"maxzoom ",[167,455,191],{"class":173},[167,457,458],{"class":446}," 14\n",[57,460,461,474],{},[60,462,463],{},[63,464,465,468,471],{},[66,466,467],{},"Option",[66,469,470],{},"Description",[66,472,473],{},"Default",[78,475,476,492,505,520],{},[63,477,478,483,486],{},[83,479,480],{},[164,481,482],{},"layer_name",[83,484,485],{},"MVT layer name in tile output",[83,487,488,489],{},"Source ",[164,490,491],{},"id",[63,493,494,499,502],{},[83,495,496],{},[164,497,498],{},"geometry_column",[83,500,501],{},"Name of the WKB geometry column",[83,503,504],{},"Auto-detected from GeoParquet metadata",[63,506,507,512,515],{},[83,508,509],{},[164,510,511],{},"minzoom",[83,513,514],{},"Minimum zoom level to serve",[83,516,517],{},[164,518,519],{},"0",[63,521,522,527,530],{},[83,523,524],{},[164,525,526],{},"maxzoom",[83,528,529],{},"Maximum zoom level to serve",[83,531,532],{},[164,533,534],{},"14",[14,536,538],{"id":537},"how-it-works","How It Works",[10,540,541],{},"When a client requests a tile:",[543,544,545,548,551,554,557],"ol",{},[32,546,547],{},"Convert tile coordinates (z\u002Fx\u002Fy) to a WGS84 bounding box",[32,549,550],{},"Read the Parquet file with row group filtering (skip groups outside the bbox)",[32,552,553],{},"Filter individual features by bbox intersection",[32,555,556],{},"Encode matching features as MVT protobuf",[32,558,559,560],{},"Return the tile with ",[164,561,562],{},"Content-Type: application\u002Fx-protobuf",[157,564,569],{"className":565,"code":567,"language":568},[566],"language-text","Client request: GET \u002Fdata\u002Fbuildings\u002F14\u002F8192\u002F5461.pbf\n    ↓\nz\u002Fx\u002Fy → bbox [-74.01, 40.71, -73.99, 40.73]\n    ↓\nParquet reader (row group pruning via bbox metadata)\n    ↓\nFeature filtering (bbox intersection)\n    ↓\nMVT encoding (protobuf)\n    ↓\nResponse: 200 OK, application\u002Fx-protobuf\n","text",[164,570,567],{"__ignoreMap":162},[272,572,574],{"id":573},"geoparquet-11-bbox-covering","GeoParquet 1.1 Bbox Covering",[10,576,577,578,581,582,44,585,44,588,44,591,594],{},"GeoParquet 1.1 files include a ",[164,579,580],{},"bbox"," struct column with ",[164,583,584],{},"xmin",[164,586,587],{},"ymin",[164,589,590],{},"xmax",[164,592,593],{},"ymax"," fields per feature. tileserver-rs uses this for fast spatial filtering without deserializing geometry data.",[10,596,597],{},"Overture Maps data includes this column — spatial queries on 73M+ features complete in ~140ms.",[10,599,600],{},"Files without the bbox column still work but filter by reading all geometry data (slower on large files).",[14,602,604],{"id":603},"drag-and-drop-upload","Drag-and-Drop Upload",[10,606,607,608,610,611,614],{},"GeoParquet files can be uploaded via the built-in drag-and-drop interface. Drop a ",[164,609,237],{}," or ",[164,612,613],{},".geoparquet"," file onto the map viewer to instantly visualize it as vector tiles.",[10,616,617],{},"The file is uploaded to the server, registered as a GeoParquet source, and tiles are served on-the-fly.",[14,619,621],{"id":620},"obtaining-geoparquet-data","Obtaining GeoParquet Data",[272,623,625],{"id":624},"overture-maps","Overture Maps",[10,627,628],{},"The largest public GeoParquet dataset. Download specific themes:",[157,630,632],{"className":241,"code":631,"language":243,"meta":162,"style":162},"# Install the Overture CLI\npip install overturemaps\n\n# Download buildings for a bounding box\noverturemaps download \\\n  --bbox=-74.1,40.6,-73.8,40.9 \\\n  -f geoparquet \\\n  --type=building \\\n  -o nyc-buildings.parquet\n",[164,633,634,640,651,657,662,673,680,690,697],{"__ignoreMap":162},[167,635,636],{"class":169,"line":170},[167,637,639],{"class":638},"sHwdD","# Install the Overture CLI\n",[167,641,642,645,648],{"class":169,"line":184},[167,643,644],{"class":177},"pip",[167,646,647],{"class":197}," install",[167,649,650],{"class":197}," overturemaps\n",[167,652,653],{"class":169,"line":204},[167,654,656],{"emptyLinePlaceholder":655},true,"\n",[167,658,659],{"class":169,"line":219},[167,660,661],{"class":638},"# Download buildings for a bounding box\n",[167,663,664,667,670],{"class":169,"line":379},[167,665,666],{"class":177},"overturemaps",[167,668,669],{"class":197}," download",[167,671,672],{"class":187}," \\\n",[167,674,675,678],{"class":169,"line":394},[167,676,677],{"class":197},"  --bbox=-74.1,40.6,-73.8,40.9",[167,679,672],{"class":187},[167,681,682,685,688],{"class":169,"line":409},[167,683,684],{"class":197},"  -f",[167,686,687],{"class":197}," geoparquet",[167,689,672],{"class":187},[167,691,692,695],{"class":169,"line":423},[167,693,694],{"class":197},"  --type=building",[167,696,672],{"class":187},[167,698,699,702],{"class":169,"line":438},[167,700,701],{"class":197},"  -o",[167,703,704],{"class":197}," nyc-buildings.parquet\n",[272,706,708],{"id":707},"duckdb","DuckDB",[10,710,711],{},"Query and export GeoParquet from any source:",[157,713,717],{"className":714,"code":715,"language":716,"meta":162,"style":162},"language-sql shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","INSTALL spatial; LOAD spatial;\n\nCOPY (\n  SELECT name, geometry\n  FROM read_parquet('s3:\u002F\u002Foverturemaps-us-west-2\u002Frelease\u002F2025-03\u002Ftheme=places\u002F**\u002F*.parquet')\n  WHERE bbox.xmin >= -74.1 AND bbox.xmax \u003C= -73.8\n    AND bbox.ymin >= 40.6 AND bbox.ymax \u003C= 40.9\n) TO 'nyc-places.parquet' (FORMAT PARQUET);\n","sql",[164,718,719,724,728,733,738,743,748,753],{"__ignoreMap":162},[167,720,721],{"class":169,"line":170},[167,722,723],{},"INSTALL spatial; LOAD spatial;\n",[167,725,726],{"class":169,"line":184},[167,727,656],{"emptyLinePlaceholder":655},[167,729,730],{"class":169,"line":204},[167,731,732],{},"COPY (\n",[167,734,735],{"class":169,"line":219},[167,736,737],{},"  SELECT name, geometry\n",[167,739,740],{"class":169,"line":379},[167,741,742],{},"  FROM read_parquet('s3:\u002F\u002Foverturemaps-us-west-2\u002Frelease\u002F2025-03\u002Ftheme=places\u002F**\u002F*.parquet')\n",[167,744,745],{"class":169,"line":394},[167,746,747],{},"  WHERE bbox.xmin >= -74.1 AND bbox.xmax \u003C= -73.8\n",[167,749,750],{"class":169,"line":409},[167,751,752],{},"    AND bbox.ymin >= 40.6 AND bbox.ymax \u003C= 40.9\n",[167,754,755],{"class":169,"line":423},[167,756,757],{},") TO 'nyc-places.parquet' (FORMAT PARQUET);\n",[272,759,761],{"id":760},"gdalogr2ogr","GDAL\u002Fogr2ogr",[10,763,764],{},"Convert any vector format to GeoParquet:",[157,766,768],{"className":241,"code":767,"language":243,"meta":162,"style":162},"ogr2ogr -f Parquet output.parquet input.geojson\nogr2ogr -f Parquet output.parquet input.shp\n",[164,769,770,787],{"__ignoreMap":162},[167,771,772,775,778,781,784],{"class":169,"line":170},[167,773,774],{"class":177},"ogr2ogr",[167,776,777],{"class":197}," -f",[167,779,780],{"class":197}," Parquet",[167,782,783],{"class":197}," output.parquet",[167,785,786],{"class":197}," input.geojson\n",[167,788,789,791,793,795,797],{"class":169,"line":184},[167,790,774],{"class":177},[167,792,777],{"class":197},[167,794,780],{"class":197},[167,796,783],{"class":197},[167,798,799],{"class":197}," input.shp\n",[14,801,803],{"id":802},"mlt-transcoding","MLT Transcoding",[10,805,806,807,810],{},"GeoParquet sources output MVT tiles. If a client requests ",[164,808,809],{},".mlt"," format, the existing MLT transcoding layer converts MVT→MLT on-the-fly — no additional configuration needed.",[157,812,815],{"className":813,"code":814,"language":568},[566],"GET \u002Fdata\u002Fbuildings\u002F14\u002F8192\u002F5461.mlt  →  MVT generated → MLT transcoded → response\n",[164,816,814],{"__ignoreMap":162},[14,818,820],{"id":819},"performance","Performance",[57,822,823,836],{},[60,824,825],{},[63,826,827,830,833],{},[66,828,829],{},"Dataset Size",[66,831,832],{},"First Tile (cold)",[66,834,835],{},"Notes",[78,837,838,849,860],{},[63,839,840,843,846],{},[83,841,842],{},"1M features",[83,844,845],{},"~50–200ms",[83,847,848],{},"With GeoParquet 1.1 bbox column",[63,850,851,854,857],{},[83,852,853],{},"10M features",[83,855,856],{},"~100–500ms",[83,858,859],{},"Row group pruning essential",[63,861,862,865,868],{},[83,863,864],{},"100M+ features",[83,866,867],{},"~200ms–1s",[83,869,870],{},"Depends on spatial distribution",[272,872,874],{"id":873},"tips","Tips",[29,876,877,880,886,889],{},[32,878,879],{},"Use GeoParquet 1.1 with bbox covering columns for fastest filtering",[32,881,882,883,885],{},"Set ",[164,884,526],{}," to avoid generating tiles at unnecessarily high zoom levels",[32,887,888],{},"Use zstd compression for best file size and read performance",[32,890,891],{},"For very large files (10 GB+), consider partitioning by region",[893,894,895],"style",{},"html pre.shiki code .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}html pre.shiki code .sBMFI, html code.shiki .sBMFI{--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B}html pre.shiki code .sTEyZ, html code.shiki .sTEyZ{--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8}html pre.shiki code .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .sbssI, html code.shiki .sbssI{--shiki-light:#F76D47;--shiki-default:#F78C6C;--shiki-dark:#F78C6C}html pre.shiki code .sHwdD, html code.shiki .sHwdD{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#546E7A;--shiki-default-font-style:italic;--shiki-dark:#676E95;--shiki-dark-font-style:italic}",{"title":162,"searchDepth":184,"depth":184,"links":897},[898,899,900,904,907,908,913,914],{"id":16,"depth":184,"text":17},{"id":151,"depth":184,"text":152},{"id":269,"depth":184,"text":270,"children":901},[902,903],{"id":274,"depth":204,"text":275},{"id":326,"depth":204,"text":327},{"id":537,"depth":184,"text":538,"children":905},[906],{"id":573,"depth":204,"text":574},{"id":603,"depth":184,"text":604},{"id":620,"depth":184,"text":621,"children":909},[910,911,912],{"id":624,"depth":204,"text":625},{"id":707,"depth":204,"text":708},{"id":760,"depth":204,"text":761},{"id":802,"depth":184,"text":803},{"id":819,"depth":184,"text":820,"children":915},[916],{"id":873,"depth":204,"text":874},"Serve vector tiles directly from GeoParquet files with tileserver-rs","md",{},"\u002Fguides\u002Fgeoparquet",{"title":5,"description":917},"4.guides\u002F12.geoparquet","4mXnH3-vyhzPqoaVaX5Zg7MDEpGuscVxBKrftb0glNQ",1793056239326]