[{"data":1,"prerenderedAt":1595},["ShallowReactive",2],{"page-\u002Fguides\u002Fogc-api-features":3},{"id":4,"title":5,"body":6,"description":1588,"extension":1589,"meta":1590,"navigation":211,"path":1591,"seo":1592,"stem":1593,"__hash__":1594},"content\u002F4.guides\u002F14.ogc-api-features.md","OGC API Features",{"type":7,"value":8,"toc":1574},"minimark",[9,20,25,150,154,161,308,311,319,323,326,345,367,372,394,398,401,444,451,457,460,538,544,548,551,612,664,669,675,717,721,732,923,933,944,948,951,1000,1005,1415,1419,1425,1456,1467,1471,1474,1480,1484,1570],[10,11,12,13,19],"p",{},"tileserver-rs speaks the ",[14,15,5],"a",{"href":16,"rel":17},"https:\u002F\u002Fogcapi.ogc.org\u002Ffeatures\u002F",[18],"nofollow"," standard end-to-end. Any PostgreSQL table with a PostGIS geometry column automatically becomes an OGC collection — usable directly from QGIS, ArcGIS, FME, or any OGC client.",[21,22,24],"h2",{"id":23},"what-you-get","What you get",[26,27,28,44],"table",{},[29,30,31],"thead",{},[32,33,34,38,41],"tr",{},[35,36,37],"th",{},"Capability",[35,39,40],{},"Feature",[35,42,43],{},"Endpoint",[45,46,47,66,86,102,128],"tbody",{},[32,48,49,57,60],{},[50,51,52,56],"td",{},[53,54,55],"strong",{},"Core"," (OGC Part 1)",[50,58,59],{},"List \u002F get features as GeoJSON",[50,61,62],{},[63,64,65],"code",{},"GET \u002Fogc\u002Fcollections\u002F{id}\u002Fitems",[32,67,68,74,81],{},[50,69,70,73],{},[53,71,72],{},"CRS"," (OGC Part 2)",[50,75,76,77,80],{},"Reprojection on demand (PostGIS ",[63,78,79],{},"ST_Transform",")",[50,82,83],{},[63,84,85],{},"?crs=…&bbox-crs=…",[32,87,88,94,97],{},[50,89,90,93],{},[53,91,92],{},"Filter"," (OGC Part 3)",[50,95,96],{},"CQL2 text + JSON, safe from SQL injection",[50,98,99],{},[63,100,101],{},"?filter=…&filter-lang=…",[32,103,104,110,113],{},[50,105,106,109],{},[53,107,108],{},"Transactions"," (OGC Part 4)",[50,111,112],{},"Create \u002F replace \u002F update \u002F delete",[50,114,115,118,119,118,122,118,125],{},[63,116,117],{},"POST",", ",[63,120,121],{},"PUT",[63,123,124],{},"PATCH",[63,126,127],{},"DELETE \u002Fitems[\u002F{id}]",[32,129,130,136,139],{},[50,131,132,135],{},[53,133,134],{},"Schemas"," (OGC Part 5)",[50,137,138],{},"JSON Schema metadata",[50,140,141,118,144,118,147],{},[63,142,143],{},"\u002Fqueryables",[63,145,146],{},"\u002Fsortables",[63,148,149],{},"\u002Fschema",[21,151,153],{"id":152},"quick-start","Quick Start",[10,155,156,157,160],{},"Point tileserver-rs at a PostGIS database in ",[63,158,159],{},"config.toml",":",[162,163,168],"pre",{"className":164,"code":165,"language":166,"meta":167,"style":167},"language-toml shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","[postgres]\nconnection_string = \"postgresql:\u002F\u002Fuser:pass@localhost:5432\u002Fgis\"\n\n[[postgres.tables]]\nid = \"cities\"\nschema = \"public\"\ntable = \"cities\"\ngeometry_column = \"geom\"\n# Opt-in: enable write operations (POST\u002FPUT\u002FPATCH\u002FDELETE) for this table\nwritable = true\n","toml","",[63,169,170,186,206,213,230,245,260,274,289,296],{"__ignoreMap":167},[171,172,175,179,183],"span",{"class":173,"line":174},"line",1,[171,176,178],{"class":177},"sMK4o","[",[171,180,182],{"class":181},"sBMFI","postgres",[171,184,185],{"class":177},"]\n",[171,187,189,193,196,199,203],{"class":173,"line":188},2,[171,190,192],{"class":191},"sTEyZ","connection_string ",[171,194,195],{"class":177},"=",[171,197,198],{"class":177}," \"",[171,200,202],{"class":201},"sfazB","postgresql:\u002F\u002Fuser:pass@localhost:5432\u002Fgis",[171,204,205],{"class":177},"\"\n",[171,207,209],{"class":173,"line":208},3,[171,210,212],{"emptyLinePlaceholder":211},true,"\n",[171,214,216,219,221,224,227],{"class":173,"line":215},4,[171,217,218],{"class":177},"[[",[171,220,182],{"class":181},[171,222,223],{"class":191},".",[171,225,226],{"class":181},"tables",[171,228,229],{"class":177},"]]\n",[171,231,233,236,238,240,243],{"class":173,"line":232},5,[171,234,235],{"class":191},"id ",[171,237,195],{"class":177},[171,239,198],{"class":177},[171,241,242],{"class":201},"cities",[171,244,205],{"class":177},[171,246,248,251,253,255,258],{"class":173,"line":247},6,[171,249,250],{"class":191},"schema ",[171,252,195],{"class":177},[171,254,198],{"class":177},[171,256,257],{"class":201},"public",[171,259,205],{"class":177},[171,261,263,266,268,270,272],{"class":173,"line":262},7,[171,264,265],{"class":191},"table ",[171,267,195],{"class":177},[171,269,198],{"class":177},[171,271,242],{"class":201},[171,273,205],{"class":177},[171,275,277,280,282,284,287],{"class":173,"line":276},8,[171,278,279],{"class":191},"geometry_column ",[171,281,195],{"class":177},[171,283,198],{"class":177},[171,285,286],{"class":201},"geom",[171,288,205],{"class":177},[171,290,292],{"class":173,"line":291},9,[171,293,295],{"class":294},"sHwdD","# Opt-in: enable write operations (POST\u002FPUT\u002FPATCH\u002FDELETE) for this table\n",[171,297,299,302,304],{"class":173,"line":298},10,[171,300,301],{"class":191},"writable ",[171,303,195],{"class":177},[171,305,307],{"class":306},"sfNiH"," true\n",[10,309,310],{},"Start the server, then browse to:",[162,312,317],{"className":313,"code":315,"language":316,"meta":167},[314],"language-text","http:\u002F\u002Flocalhost:8080\u002Fogc               # landing page\nhttp:\u002F\u002Flocalhost:8080\u002Fogc\u002Fconformance   # conformance classes\nhttp:\u002F\u002Flocalhost:8080\u002Fogc\u002Fcollections   # collection list\n","text",[63,318,315],{"__ignoreMap":167},[21,320,322],{"id":321},"core-read-operations","Core read operations",[10,324,325],{},"Every PostGIS table becomes a collection with a TileJSON 3.0-ish metadata document:",[162,327,331],{"className":328,"code":329,"language":330,"meta":167,"style":167},"language-bash shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","curl http:\u002F\u002Flocalhost:8080\u002Fogc\u002Fcollections\u002Fcities\u002Fitems?limit=3\n","bash",[63,332,333],{"__ignoreMap":167},[171,334,335,338,341],{"class":173,"line":174},[171,336,337],{"class":181},"curl",[171,339,340],{"class":201}," http:\u002F\u002Flocalhost:8080\u002Fogc\u002Fcollections\u002Fcities\u002Fitems?limit=",[171,342,344],{"class":343},"sbssI","3\n",[10,346,347,348,351,352,118,355,358,359,362,363,366],{},"Returns a GeoJSON ",[63,349,350],{},"FeatureCollection"," with ",[63,353,354],{},"numberMatched",[63,356,357],{},"numberReturned",", and ",[63,360,361],{},"next","\u002F",[63,364,365],{},"prev"," pagination links.",[10,368,369],{},[53,370,371],{},"Query parameters:",[373,374,375,382,388],"ul",{},[376,377,378,381],"li",{},[63,379,380],{},"bbox=minx,miny,maxx,maxy"," — spatial filter (4 or 6 values, per spec)",[376,383,384,387],{},[63,385,386],{},"limit=N"," — max features (default 10)",[376,389,390,393],{},[63,391,392],{},"offset=N"," — pagination offset",[21,395,397],{"id":396},"coordinate-reference-systems","Coordinate reference systems",[10,399,400],{},"Request output in any CRS your PostGIS install supports:",[162,402,404],{"className":328,"code":403,"language":330,"meta":167,"style":167},"# Web Mercator output\ncurl 'http:\u002F\u002Flocalhost:8080\u002Fogc\u002Fcollections\u002Fcities\u002Fitems?crs=http:\u002F\u002Fwww.opengis.net\u002Fdef\u002Fcrs\u002FEPSG\u002F0\u002F3857'\n\n# British National Grid\ncurl 'http:\u002F\u002Flocalhost:8080\u002Fogc\u002Fcollections\u002Fcities\u002Fitems?crs=http:\u002F\u002Fwww.opengis.net\u002Fdef\u002Fcrs\u002FEPSG\u002F0\u002F27700'\n",[63,405,406,411,424,428,433],{"__ignoreMap":167},[171,407,408],{"class":173,"line":174},[171,409,410],{"class":294},"# Web Mercator output\n",[171,412,413,415,418,421],{"class":173,"line":188},[171,414,337],{"class":181},[171,416,417],{"class":177}," '",[171,419,420],{"class":201},"http:\u002F\u002Flocalhost:8080\u002Fogc\u002Fcollections\u002Fcities\u002Fitems?crs=http:\u002F\u002Fwww.opengis.net\u002Fdef\u002Fcrs\u002FEPSG\u002F0\u002F3857",[171,422,423],{"class":177},"'\n",[171,425,426],{"class":173,"line":208},[171,427,212],{"emptyLinePlaceholder":211},[171,429,430],{"class":173,"line":215},[171,431,432],{"class":294},"# British National Grid\n",[171,434,435,437,439,442],{"class":173,"line":232},[171,436,337],{"class":181},[171,438,417],{"class":177},[171,440,441],{"class":201},"http:\u002F\u002Flocalhost:8080\u002Fogc\u002Fcollections\u002Fcities\u002Fitems?crs=http:\u002F\u002Fwww.opengis.net\u002Fdef\u002Fcrs\u002FEPSG\u002F0\u002F27700",[171,443,423],{"class":177},[10,445,446,447,450],{},"Responses include a ",[63,448,449],{},"Content-Crs"," header so clients know what they got:",[162,452,455],{"className":453,"code":454,"language":316,"meta":167},[314],"Content-Crs: \u003Chttp:\u002F\u002Fwww.opengis.net\u002Fdef\u002Fcrs\u002FEPSG\u002F0\u002F3857>\n",[63,456,454],{"__ignoreMap":167},[10,458,459],{},"Collection metadata advertises supported CRSs and the storage CRS:",[162,461,465],{"className":462,"code":463,"language":464,"meta":167,"style":167},"language-json shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","{\n  \"crs\": [\n    \"http:\u002F\u002Fwww.opengis.net\u002Fdef\u002Fcrs\u002FOGC\u002F1.3\u002FCRS84\",\n    \"http:\u002F\u002Fwww.opengis.net\u002Fdef\u002Fcrs\u002FEPSG\u002F0\u002F4326\"\n  ],\n  \"storageCrs\": \"http:\u002F\u002Fwww.opengis.net\u002Fdef\u002Fcrs\u002FOGC\u002F1.3\u002FCRS84\"\n}\n","json",[63,466,467,472,489,502,511,516,533],{"__ignoreMap":167},[171,468,469],{"class":173,"line":174},[171,470,471],{"class":177},"{\n",[171,473,474,477,481,484,486],{"class":173,"line":188},[171,475,476],{"class":177},"  \"",[171,478,480],{"class":479},"spNyl","crs",[171,482,483],{"class":177},"\"",[171,485,160],{"class":177},[171,487,488],{"class":177}," [\n",[171,490,491,494,497,499],{"class":173,"line":208},[171,492,493],{"class":177},"    \"",[171,495,496],{"class":201},"http:\u002F\u002Fwww.opengis.net\u002Fdef\u002Fcrs\u002FOGC\u002F1.3\u002FCRS84",[171,498,483],{"class":177},[171,500,501],{"class":177},",\n",[171,503,504,506,509],{"class":173,"line":215},[171,505,493],{"class":177},[171,507,508],{"class":201},"http:\u002F\u002Fwww.opengis.net\u002Fdef\u002Fcrs\u002FEPSG\u002F0\u002F4326",[171,510,205],{"class":177},[171,512,513],{"class":173,"line":232},[171,514,515],{"class":177},"  ],\n",[171,517,518,520,523,525,527,529,531],{"class":173,"line":247},[171,519,476],{"class":177},[171,521,522],{"class":479},"storageCrs",[171,524,483],{"class":177},[171,526,160],{"class":177},[171,528,198],{"class":177},[171,530,496],{"class":201},[171,532,205],{"class":177},[171,534,535],{"class":173,"line":262},[171,536,537],{"class":177},"}\n",[10,539,540,541,543],{},"Identity transforms are elided — if you request data in the storage CRS, no ",[63,542,79],{}," runs.",[21,545,547],{"id":546},"cql2-filter-expressions","CQL2 filter expressions",[10,549,550],{},"Filter features with the OGC Common Query Language 2 (CQL2), in either text or JSON form.",[162,552,554],{"className":328,"code":553,"language":330,"meta":167,"style":167},"# Text: simple equality\ncurl \"http:\u002F\u002Flocalhost:8080\u002Fogc\u002Fcollections\u002Fcities\u002Fitems?filter=country='Brazil'\"\n\n# Text: numeric range + boolean\ncurl \"http:\u002F\u002Flocalhost:8080\u002Fogc\u002Fcollections\u002Fcities\u002Fitems?filter=population%20%3E%2010000000%20AND%20is_capital%3Dtrue\"\n\n# JSON form\ncurl \"http:\u002F\u002Flocalhost:8080\u002Fogc\u002Fcollections\u002Fcities\u002Fitems?filter-lang=cql2-json&filter=%7B%22op%22%3A%22%3D%22%2C%22args%22%3A%5B%7B%22property%22%3A%22country%22%7D%2C%22Brazil%22%5D%7D\"\n",[63,555,556,561,572,576,581,592,596,601],{"__ignoreMap":167},[171,557,558],{"class":173,"line":174},[171,559,560],{"class":294},"# Text: simple equality\n",[171,562,563,565,567,570],{"class":173,"line":188},[171,564,337],{"class":181},[171,566,198],{"class":177},[171,568,569],{"class":201},"http:\u002F\u002Flocalhost:8080\u002Fogc\u002Fcollections\u002Fcities\u002Fitems?filter=country='Brazil'",[171,571,205],{"class":177},[171,573,574],{"class":173,"line":208},[171,575,212],{"emptyLinePlaceholder":211},[171,577,578],{"class":173,"line":215},[171,579,580],{"class":294},"# Text: numeric range + boolean\n",[171,582,583,585,587,590],{"class":173,"line":232},[171,584,337],{"class":181},[171,586,198],{"class":177},[171,588,589],{"class":201},"http:\u002F\u002Flocalhost:8080\u002Fogc\u002Fcollections\u002Fcities\u002Fitems?filter=population%20%3E%2010000000%20AND%20is_capital%3Dtrue",[171,591,205],{"class":177},[171,593,594],{"class":173,"line":247},[171,595,212],{"emptyLinePlaceholder":211},[171,597,598],{"class":173,"line":262},[171,599,600],{"class":294},"# JSON form\n",[171,602,603,605,607,610],{"class":173,"line":276},[171,604,337],{"class":181},[171,606,198],{"class":177},[171,608,609],{"class":201},"http:\u002F\u002Flocalhost:8080\u002Fogc\u002Fcollections\u002Fcities\u002Fitems?filter-lang=cql2-json&filter=%7B%22op%22%3A%22%3D%22%2C%22args%22%3A%5B%7B%22property%22%3A%22country%22%7D%2C%22Brazil%22%5D%7D",[171,611,205],{"class":177},[10,613,614,615,118,617,118,620,118,623,118,626,118,629,118,632,118,635,118,638,118,641,118,644,118,647,118,650,653,654,118,657,118,660,663],{},"Supported operators: ",[63,616,195],{},[63,618,619],{},"\u003C>",[63,621,622],{},"\u003C",[63,624,625],{},"\u003C=",[63,627,628],{},">",[63,630,631],{},">=",[63,633,634],{},"LIKE",[63,636,637],{},"BETWEEN … AND …",[63,639,640],{},"IN (…)",[63,642,643],{},"IS NULL",[63,645,646],{},"AND",[63,648,649],{},"OR",[63,651,652],{},"NOT",", spatial ops (",[63,655,656],{},"S_INTERSECTS",[63,658,659],{},"S_WITHIN",[63,661,662],{},"S_CONTAINS",", …).",[665,666,668],"h3",{"id":667},"sql-injection-defence","SQL injection defence",[10,670,671,672,160],{},"CQL2 translates to raw PostgreSQL SQL, so tileserver-rs applies ",[53,673,674],{},"two defences",[676,677,678,702],"ol",{},[376,679,680,683,684,687,688,691,692,118,695,698,699,223],{},[53,681,682],{},"Property allow-list"," — every ",[63,685,686],{},"Expr::Property"," in the parsed AST is checked against the table's actual column list from ",[63,689,690],{},"information_schema.columns",". References to ",[63,693,694],{},"pg_catalog.pg_shadow",[63,696,697],{},"information_schema.*",", or any non-existing column return ",[53,700,701],{},"HTTP 400",[376,703,704,707,708,118,711,714,715,223],{},[53,705,706],{},"Round-trip canonicalisation gate"," — parsed CQL2 is re-serialised and compared to the input (normalising parens\u002Fwhitespace\u002Fcase). Any trailing garbage (",[63,709,710],{},"; DROP TABLE …",[63,712,713],{},"--"," comments) causes a mismatch and ",[53,716,701],{},[21,718,720],{"id":719},"write-operations-crud","Write operations (CRUD)",[10,722,723,724,727,728,731],{},"Opt-in per table. Add ",[63,725,726],{},"writable = true"," to the ",[63,729,730],{},"[[postgres.tables]]"," entry:",[162,733,735],{"className":328,"code":734,"language":330,"meta":167,"style":167},"# Create a feature (expects application\u002Fgeo+json body)\ncurl -X POST http:\u002F\u002Flocalhost:8080\u002Fogc\u002Fcollections\u002Fcities\u002Fitems \\\n  -H 'Content-Type: application\u002Fgeo+json' \\\n  -d '{\"type\":\"Feature\",\"geometry\":{\"type\":\"Point\",\"coordinates\":[-46.63,-23.55]},\"properties\":{\"name\":\"São Paulo\",\"country\":\"Brazil\",\"population\":12330000,\"is_capital\":false,\"elevation_m\":760}}'\n# → 201 Created, Location: \u002Fogc\u002Fcollections\u002Fcities\u002Fitems\u002F18\n\n# Full replace (PUT)\ncurl -X PUT http:\u002F\u002Flocalhost:8080\u002Fogc\u002Fcollections\u002Fcities\u002Fitems\u002F18 \\\n  -H 'Content-Type: application\u002Fgeo+json' -d '{…}'\n# → 204 No Content\n\n# Partial merge (PATCH, RFC 7396 merge-patch)\ncurl -X PATCH http:\u002F\u002Flocalhost:8080\u002Fogc\u002Fcollections\u002Fcities\u002Fitems\u002F18 \\\n  -H 'Content-Type: application\u002Fmerge-patch+json' \\\n  -d '{\"properties\":{\"population\":99999999}}'\n# → 204 No Content\n\n# Delete\ncurl -X DELETE http:\u002F\u002Flocalhost:8080\u002Fogc\u002Fcollections\u002Fcities\u002Fitems\u002F18\n# → 204 No Content\n",[63,736,737,742,758,773,785,790,794,799,813,833,838,843,849,863,877,889,894,899,905,918],{"__ignoreMap":167},[171,738,739],{"class":173,"line":174},[171,740,741],{"class":294},"# Create a feature (expects application\u002Fgeo+json body)\n",[171,743,744,746,749,752,755],{"class":173,"line":188},[171,745,337],{"class":181},[171,747,748],{"class":201}," -X",[171,750,751],{"class":201}," POST",[171,753,754],{"class":201}," http:\u002F\u002Flocalhost:8080\u002Fogc\u002Fcollections\u002Fcities\u002Fitems",[171,756,757],{"class":191}," \\\n",[171,759,760,763,765,768,771],{"class":173,"line":208},[171,761,762],{"class":201},"  -H",[171,764,417],{"class":177},[171,766,767],{"class":201},"Content-Type: application\u002Fgeo+json",[171,769,770],{"class":177},"'",[171,772,757],{"class":191},[171,774,775,778,780,783],{"class":173,"line":215},[171,776,777],{"class":201},"  -d",[171,779,417],{"class":177},[171,781,782],{"class":201},"{\"type\":\"Feature\",\"geometry\":{\"type\":\"Point\",\"coordinates\":[-46.63,-23.55]},\"properties\":{\"name\":\"São Paulo\",\"country\":\"Brazil\",\"population\":12330000,\"is_capital\":false,\"elevation_m\":760}}",[171,784,423],{"class":177},[171,786,787],{"class":173,"line":232},[171,788,789],{"class":294},"# → 201 Created, Location: \u002Fogc\u002Fcollections\u002Fcities\u002Fitems\u002F18\n",[171,791,792],{"class":173,"line":247},[171,793,212],{"emptyLinePlaceholder":211},[171,795,796],{"class":173,"line":262},[171,797,798],{"class":294},"# Full replace (PUT)\n",[171,800,801,803,805,808,811],{"class":173,"line":276},[171,802,337],{"class":181},[171,804,748],{"class":201},[171,806,807],{"class":201}," PUT",[171,809,810],{"class":201}," http:\u002F\u002Flocalhost:8080\u002Fogc\u002Fcollections\u002Fcities\u002Fitems\u002F18",[171,812,757],{"class":191},[171,814,815,817,819,821,823,826,828,831],{"class":173,"line":291},[171,816,762],{"class":201},[171,818,417],{"class":177},[171,820,767],{"class":201},[171,822,770],{"class":177},[171,824,825],{"class":201}," -d",[171,827,417],{"class":177},[171,829,830],{"class":201},"{…}",[171,832,423],{"class":177},[171,834,835],{"class":173,"line":298},[171,836,837],{"class":294},"# → 204 No Content\n",[171,839,841],{"class":173,"line":840},11,[171,842,212],{"emptyLinePlaceholder":211},[171,844,846],{"class":173,"line":845},12,[171,847,848],{"class":294},"# Partial merge (PATCH, RFC 7396 merge-patch)\n",[171,850,852,854,856,859,861],{"class":173,"line":851},13,[171,853,337],{"class":181},[171,855,748],{"class":201},[171,857,858],{"class":201}," PATCH",[171,860,810],{"class":201},[171,862,757],{"class":191},[171,864,866,868,870,873,875],{"class":173,"line":865},14,[171,867,762],{"class":201},[171,869,417],{"class":177},[171,871,872],{"class":201},"Content-Type: application\u002Fmerge-patch+json",[171,874,770],{"class":177},[171,876,757],{"class":191},[171,878,880,882,884,887],{"class":173,"line":879},15,[171,881,777],{"class":201},[171,883,417],{"class":177},[171,885,886],{"class":201},"{\"properties\":{\"population\":99999999}}",[171,888,423],{"class":177},[171,890,892],{"class":173,"line":891},16,[171,893,837],{"class":294},[171,895,897],{"class":173,"line":896},17,[171,898,212],{"emptyLinePlaceholder":211},[171,900,902],{"class":173,"line":901},18,[171,903,904],{"class":294},"# Delete\n",[171,906,908,910,912,915],{"class":173,"line":907},19,[171,909,337],{"class":181},[171,911,748],{"class":201},[171,913,914],{"class":201}," DELETE",[171,916,917],{"class":201}," http:\u002F\u002Flocalhost:8080\u002Fogc\u002Fcollections\u002Fcities\u002Fitems\u002F18\n",[171,919,921],{"class":173,"line":920},20,[171,922,837],{"class":294},[10,924,925,926,929,930,223],{},"All values are bound as parameterised queries (",[63,927,928],{},"$N"," placeholders) — no string interpolation of user data. Geometries go through ",[63,931,932],{},"ST_GeomFromGeoJSON",[10,934,935,936,939,940,943],{},"Tables with ",[63,937,938],{},"writable = false"," (the default) return ",[53,941,942],{},"HTTP 405 Method Not Allowed"," on any mutation verb.",[21,945,947],{"id":946},"schema-introspection","Schema introspection",[10,949,950],{},"Introspect collection structure without reading data:",[162,952,954],{"className":328,"code":953,"language":330,"meta":167,"style":167},"# Filterable columns\ncurl http:\u002F\u002Flocalhost:8080\u002Fogc\u002Fcollections\u002Fcities\u002Fqueryables\n\n# Sortable columns (excludes jsonb + array columns that pg can't ORDER BY)\ncurl http:\u002F\u002Flocalhost:8080\u002Fogc\u002Fcollections\u002Fcities\u002Fsortables\n\n# Full GeoJSON Feature schema ($ref to geojson.org for the geometry shape)\ncurl http:\u002F\u002Flocalhost:8080\u002Fogc\u002Fcollections\u002Fcities\u002Fschema\n",[63,955,956,961,968,972,977,984,988,993],{"__ignoreMap":167},[171,957,958],{"class":173,"line":174},[171,959,960],{"class":294},"# Filterable columns\n",[171,962,963,965],{"class":173,"line":188},[171,964,337],{"class":181},[171,966,967],{"class":201}," http:\u002F\u002Flocalhost:8080\u002Fogc\u002Fcollections\u002Fcities\u002Fqueryables\n",[171,969,970],{"class":173,"line":208},[171,971,212],{"emptyLinePlaceholder":211},[171,973,974],{"class":173,"line":215},[171,975,976],{"class":294},"# Sortable columns (excludes jsonb + array columns that pg can't ORDER BY)\n",[171,978,979,981],{"class":173,"line":232},[171,980,337],{"class":181},[171,982,983],{"class":201}," http:\u002F\u002Flocalhost:8080\u002Fogc\u002Fcollections\u002Fcities\u002Fsortables\n",[171,985,986],{"class":173,"line":247},[171,987,212],{"emptyLinePlaceholder":211},[171,989,990],{"class":173,"line":262},[171,991,992],{"class":294},"# Full GeoJSON Feature schema ($ref to geojson.org for the geometry shape)\n",[171,994,995,997],{"class":173,"line":276},[171,996,337],{"class":181},[171,998,999],{"class":201}," http:\u002F\u002Flocalhost:8080\u002Fogc\u002Fcollections\u002Fcities\u002Fschema\n",[10,1001,1002,1003,160],{},"Returns JSON Schema 2020-12 documents with per-column types derived from ",[63,1004,690],{},[162,1006,1008],{"className":462,"code":1007,"language":464,"meta":167,"style":167},"{\n  \"$schema\": \"https:\u002F\u002Fjson-schema.org\u002Fdraft\u002F2020-12\u002Fschema\",\n  \"$id\": \"http:\u002F\u002Flocalhost:8080\u002Fogc\u002Fcollections\u002Fcities\u002Fqueryables\",\n  \"type\": \"object\",\n  \"properties\": {\n    \"name\":        { \"type\": \"string\",                    \"title\": \"name\" },\n    \"country\":     { \"type\": \"string\",                    \"title\": \"country\" },\n    \"population\":  { \"type\": [\"integer\", \"null\"],         \"title\": \"population\" },\n    \"is_capital\":  { \"type\": \"boolean\",                   \"title\": \"is_capital\" },\n    \"founded_year\":{ \"type\": [\"integer\", \"null\"],         \"title\": \"founded_year\" },\n    \"elevation_m\": { \"type\": [\"number\", \"null\"],          \"title\": \"elevation_m\" }\n  }\n}\n",[63,1009,1010,1014,1034,1054,1074,1088,1139,1185,1246,1293,1347,1406,1411],{"__ignoreMap":167},[171,1011,1012],{"class":173,"line":174},[171,1013,471],{"class":177},[171,1015,1016,1018,1021,1023,1025,1027,1030,1032],{"class":173,"line":188},[171,1017,476],{"class":177},[171,1019,1020],{"class":479},"$schema",[171,1022,483],{"class":177},[171,1024,160],{"class":177},[171,1026,198],{"class":177},[171,1028,1029],{"class":201},"https:\u002F\u002Fjson-schema.org\u002Fdraft\u002F2020-12\u002Fschema",[171,1031,483],{"class":177},[171,1033,501],{"class":177},[171,1035,1036,1038,1041,1043,1045,1047,1050,1052],{"class":173,"line":208},[171,1037,476],{"class":177},[171,1039,1040],{"class":479},"$id",[171,1042,483],{"class":177},[171,1044,160],{"class":177},[171,1046,198],{"class":177},[171,1048,1049],{"class":201},"http:\u002F\u002Flocalhost:8080\u002Fogc\u002Fcollections\u002Fcities\u002Fqueryables",[171,1051,483],{"class":177},[171,1053,501],{"class":177},[171,1055,1056,1058,1061,1063,1065,1067,1070,1072],{"class":173,"line":215},[171,1057,476],{"class":177},[171,1059,1060],{"class":479},"type",[171,1062,483],{"class":177},[171,1064,160],{"class":177},[171,1066,198],{"class":177},[171,1068,1069],{"class":201},"object",[171,1071,483],{"class":177},[171,1073,501],{"class":177},[171,1075,1076,1078,1081,1083,1085],{"class":173,"line":232},[171,1077,476],{"class":177},[171,1079,1080],{"class":479},"properties",[171,1082,483],{"class":177},[171,1084,160],{"class":177},[171,1086,1087],{"class":177}," {\n",[171,1089,1090,1092,1095,1097,1099,1102,1104,1106,1108,1110,1112,1115,1117,1120,1123,1126,1128,1130,1132,1134,1136],{"class":173,"line":247},[171,1091,493],{"class":177},[171,1093,1094],{"class":181},"name",[171,1096,483],{"class":177},[171,1098,160],{"class":177},[171,1100,1101],{"class":177},"        {",[171,1103,198],{"class":177},[171,1105,1060],{"class":343},[171,1107,483],{"class":177},[171,1109,160],{"class":177},[171,1111,198],{"class":177},[171,1113,1114],{"class":201},"string",[171,1116,483],{"class":177},[171,1118,1119],{"class":177},",",[171,1121,1122],{"class":177},"                    \"",[171,1124,1125],{"class":343},"title",[171,1127,483],{"class":177},[171,1129,160],{"class":177},[171,1131,198],{"class":177},[171,1133,1094],{"class":201},[171,1135,483],{"class":177},[171,1137,1138],{"class":177}," },\n",[171,1140,1141,1143,1146,1148,1150,1153,1155,1157,1159,1161,1163,1165,1167,1169,1171,1173,1175,1177,1179,1181,1183],{"class":173,"line":262},[171,1142,493],{"class":177},[171,1144,1145],{"class":181},"country",[171,1147,483],{"class":177},[171,1149,160],{"class":177},[171,1151,1152],{"class":177},"     {",[171,1154,198],{"class":177},[171,1156,1060],{"class":343},[171,1158,483],{"class":177},[171,1160,160],{"class":177},[171,1162,198],{"class":177},[171,1164,1114],{"class":201},[171,1166,483],{"class":177},[171,1168,1119],{"class":177},[171,1170,1122],{"class":177},[171,1172,1125],{"class":343},[171,1174,483],{"class":177},[171,1176,160],{"class":177},[171,1178,198],{"class":177},[171,1180,1145],{"class":201},[171,1182,483],{"class":177},[171,1184,1138],{"class":177},[171,1186,1187,1189,1192,1194,1196,1199,1201,1203,1205,1207,1210,1212,1215,1217,1219,1221,1224,1226,1229,1232,1234,1236,1238,1240,1242,1244],{"class":173,"line":276},[171,1188,493],{"class":177},[171,1190,1191],{"class":181},"population",[171,1193,483],{"class":177},[171,1195,160],{"class":177},[171,1197,1198],{"class":177},"  {",[171,1200,198],{"class":177},[171,1202,1060],{"class":343},[171,1204,483],{"class":177},[171,1206,160],{"class":177},[171,1208,1209],{"class":177}," [",[171,1211,483],{"class":177},[171,1213,1214],{"class":201},"integer",[171,1216,483],{"class":177},[171,1218,1119],{"class":177},[171,1220,198],{"class":177},[171,1222,1223],{"class":201},"null",[171,1225,483],{"class":177},[171,1227,1228],{"class":177},"],",[171,1230,1231],{"class":177},"         \"",[171,1233,1125],{"class":343},[171,1235,483],{"class":177},[171,1237,160],{"class":177},[171,1239,198],{"class":177},[171,1241,1191],{"class":201},[171,1243,483],{"class":177},[171,1245,1138],{"class":177},[171,1247,1248,1250,1253,1255,1257,1259,1261,1263,1265,1267,1269,1272,1274,1276,1279,1281,1283,1285,1287,1289,1291],{"class":173,"line":291},[171,1249,493],{"class":177},[171,1251,1252],{"class":181},"is_capital",[171,1254,483],{"class":177},[171,1256,160],{"class":177},[171,1258,1198],{"class":177},[171,1260,198],{"class":177},[171,1262,1060],{"class":343},[171,1264,483],{"class":177},[171,1266,160],{"class":177},[171,1268,198],{"class":177},[171,1270,1271],{"class":201},"boolean",[171,1273,483],{"class":177},[171,1275,1119],{"class":177},[171,1277,1278],{"class":177},"                   \"",[171,1280,1125],{"class":343},[171,1282,483],{"class":177},[171,1284,160],{"class":177},[171,1286,198],{"class":177},[171,1288,1252],{"class":201},[171,1290,483],{"class":177},[171,1292,1138],{"class":177},[171,1294,1295,1297,1300,1302,1305,1307,1309,1311,1313,1315,1317,1319,1321,1323,1325,1327,1329,1331,1333,1335,1337,1339,1341,1343,1345],{"class":173,"line":298},[171,1296,493],{"class":177},[171,1298,1299],{"class":181},"founded_year",[171,1301,483],{"class":177},[171,1303,1304],{"class":177},":{",[171,1306,198],{"class":177},[171,1308,1060],{"class":343},[171,1310,483],{"class":177},[171,1312,160],{"class":177},[171,1314,1209],{"class":177},[171,1316,483],{"class":177},[171,1318,1214],{"class":201},[171,1320,483],{"class":177},[171,1322,1119],{"class":177},[171,1324,198],{"class":177},[171,1326,1223],{"class":201},[171,1328,483],{"class":177},[171,1330,1228],{"class":177},[171,1332,1231],{"class":177},[171,1334,1125],{"class":343},[171,1336,483],{"class":177},[171,1338,160],{"class":177},[171,1340,198],{"class":177},[171,1342,1299],{"class":201},[171,1344,483],{"class":177},[171,1346,1138],{"class":177},[171,1348,1349,1351,1354,1356,1358,1361,1363,1365,1367,1369,1371,1373,1376,1378,1380,1382,1384,1386,1388,1391,1393,1395,1397,1399,1401,1403],{"class":173,"line":840},[171,1350,493],{"class":177},[171,1352,1353],{"class":181},"elevation_m",[171,1355,483],{"class":177},[171,1357,160],{"class":177},[171,1359,1360],{"class":177}," {",[171,1362,198],{"class":177},[171,1364,1060],{"class":343},[171,1366,483],{"class":177},[171,1368,160],{"class":177},[171,1370,1209],{"class":177},[171,1372,483],{"class":177},[171,1374,1375],{"class":201},"number",[171,1377,483],{"class":177},[171,1379,1119],{"class":177},[171,1381,198],{"class":177},[171,1383,1223],{"class":201},[171,1385,483],{"class":177},[171,1387,1228],{"class":177},[171,1389,1390],{"class":177},"          \"",[171,1392,1125],{"class":343},[171,1394,483],{"class":177},[171,1396,160],{"class":177},[171,1398,198],{"class":177},[171,1400,1353],{"class":201},[171,1402,483],{"class":177},[171,1404,1405],{"class":177}," }\n",[171,1407,1408],{"class":173,"line":845},[171,1409,1410],{"class":177},"  }\n",[171,1412,1413],{"class":173,"line":851},[171,1414,537],{"class":177},[21,1416,1418],{"id":1417},"using-with-qgis-arcgis-fme","Using with QGIS \u002F ArcGIS \u002F FME",[10,1420,1421,1422,160],{},"Any OGC Features-compliant client can connect to ",[63,1423,1424],{},"\u002Fogc",[373,1426,1427,1436,1444],{},[376,1428,1429,1432,1433],{},[53,1430,1431],{},"QGIS",": Browser panel → WFS \u002F OGC API - Features → add ",[63,1434,1435],{},"http:\u002F\u002Flocalhost:8080\u002Fogc",[376,1437,1438,1441,1442],{},[53,1439,1440],{},"ArcGIS Pro",": Catalog → Connections → OGC API Features → ",[63,1443,1435],{},[376,1445,1446,1449,1450,1453,1454],{},[53,1447,1448],{},"FME",": ",[63,1451,1452],{},"OGCAPIFeaturesConnector"," reader, base URL ",[63,1455,1435],{},[10,1457,1458,1459,1461,1462,362,1464,223],{},"QGIS and ArcGIS natively round-trip the feature editing workflow when ",[63,1460,726],{}," — users draw\u002Fedit features in the GIS client and tileserver-rs applies the changes via ",[63,1463,124],{},[63,1465,1466],{},"DELETE",[21,1468,1470],{"id":1469},"interactive-api-reference","Interactive API reference",[10,1472,1473],{},"Scalar docs render all OGC endpoints with try-it-now interactivity at:",[162,1475,1478],{"className":1476,"code":1477,"language":316,"meta":167},[314],"http:\u002F\u002Flocalhost:8080\u002F_openapi\n",[63,1479,1477],{"__ignoreMap":167},[21,1481,1483],{"id":1482},"specifications","Specifications",[26,1485,1486,1496],{},[29,1487,1488],{},[32,1489,1490,1493],{},[35,1491,1492],{},"Spec",[35,1494,1495],{},"Link",[45,1497,1498,1510,1522,1534,1546,1558],{},[32,1499,1500,1503],{},[50,1501,1502],{},"Part 1 – Core",[50,1504,1505],{},[14,1506,1509],{"href":1507,"rel":1508},"https:\u002F\u002Fdocs.ogc.org\u002Fis\u002F17-069r4\u002F17-069r4.html",[18],"OGC 17-069r4",[32,1511,1512,1515],{},[50,1513,1514],{},"Part 2 – CRS",[50,1516,1517],{},[14,1518,1521],{"href":1519,"rel":1520},"https:\u002F\u002Fdocs.ogc.org\u002Fis\u002F18-058\u002F18-058.html",[18],"OGC 18-058",[32,1523,1524,1527],{},[50,1525,1526],{},"Part 3 – Filter",[50,1528,1529],{},[14,1530,1533],{"href":1531,"rel":1532},"https:\u002F\u002Fdocs.ogc.org\u002Fis\u002F19-079r2\u002F19-079r2.html",[18],"OGC 19-079r2",[32,1535,1536,1539],{},[50,1537,1538],{},"Part 4 – Create-Replace-Delete",[50,1540,1541],{},[14,1542,1545],{"href":1543,"rel":1544},"https:\u002F\u002Fdocs.ogc.org\u002FDRAFTS\u002F20-002.html",[18],"OGC 20-002",[32,1547,1548,1551],{},[50,1549,1550],{},"Part 5 – Schemas",[50,1552,1553],{},[14,1554,1557],{"href":1555,"rel":1556},"https:\u002F\u002Fdocs.ogc.org\u002FDRAFTS\u002F23-058.html",[18],"OGC 23-058",[32,1559,1560,1563],{},[50,1561,1562],{},"CQL2",[50,1564,1565],{},[14,1566,1569],{"href":1567,"rel":1568},"https:\u002F\u002Fdocs.ogc.org\u002Fis\u002F21-065\u002F21-065.html",[18],"OGC 21-065",[1571,1572,1573],"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 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}html pre.shiki code .sfNiH, html code.shiki .sfNiH{--shiki-light:#FF5370;--shiki-default:#FF9CAC;--shiki-dark:#FF9CAC}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 .spNyl, html code.shiki .spNyl{--shiki-light:#9C3EDA;--shiki-default:#C792EA;--shiki-dark:#C792EA}",{"title":167,"searchDepth":188,"depth":188,"links":1575},[1576,1577,1578,1579,1580,1583,1584,1585,1586,1587],{"id":23,"depth":188,"text":24},{"id":152,"depth":188,"text":153},{"id":321,"depth":188,"text":322},{"id":396,"depth":188,"text":397},{"id":546,"depth":188,"text":547,"children":1581},[1582],{"id":667,"depth":208,"text":668},{"id":719,"depth":188,"text":720},{"id":946,"depth":188,"text":947},{"id":1417,"depth":188,"text":1418},{"id":1469,"depth":188,"text":1470},{"id":1482,"depth":188,"text":1483},"Serve PostGIS tables as OGC API Features collections — CRS, CQL2 filter, transactions, JSON Schema.","md",{},"\u002Fguides\u002Fogc-api-features",{"title":5,"description":1588},"4.guides\u002F14.ogc-api-features","fUsV7xSH0g7P4NEWdnlZtDLsgXGX7LVeiqFmRMgwUcE",1793056239431]