[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"blog-\u002Fblog\u002Fplss-section-boundaries-as-geojson-polygons-using-parcel-geometry-in-postgis-qgis-and-arcgis":3},{"id":4,"title":5,"body":6,"cover":303,"date":304,"description":305,"draft":306,"extension":307,"meta":308,"navigation":163,"path":311,"seo":312,"stem":313,"tags":314,"__hash__":319},"blog\u002Fblog\u002Fplss-section-boundaries-as-geojson-polygons-using-parcel-geometry-in-postgis-qgis-and-arcgis.md","PLSS Section Boundaries as GeoJSON Polygons: Parcel Geometry in PostGIS, QGIS, and ArcGIS",{"type":7,"value":8,"toc":296},"minimark",[9,13,16,21,24,52,55,59,74,77,81,95,102,106,117,205,211,231,238,242,261,276,279,292],[10,11,12],"p",{},"You have a table of wells, each tagged with a PLSS legal description, and you need to know which wells fall inside a federal lease boundary. So you convert every description to a point and run a spatial join. The join returns nothing useful, because a point sits at the center of a section and tells you nothing about where the section's edges are. A well near a section line, an ownership boundary that cuts diagonally across a quarter section, an area calculation for a partial tract: none of these work when the only geometry you have is a single coordinate.",[10,14,15],{},"This is the gap between a centroid point and a polygon. Most PLSS converters return the point, because a point is cheap to estimate from a formula. Township America returns the actual BLM survey boundary of the described parcel as a full GeoJSON polygon, for both sections and quarter sections. That difference is what makes spatial analysis possible. This post walks through retrieving those PLSS GeoJSON polygon boundaries and using them in PostGIS, QGIS, and ArcGIS.",[17,18,20],"h2",{"id":19},"why-a-centroid-point-fails-for-gis-overlays","Why a centroid point fails for GIS overlays",[10,22,23],{},"A centroid is a summary, not a boundary. For overlay and intersection work, the summary throws away exactly the information you need.",[25,26,27,40,46],"ul",{},[28,29,30,34,35,39],"li",{},[31,32,33],"strong",{},"Spatial joins misfire near edges."," ",[36,37,38],"code",{},"ST_Intersects"," against a point tests whether one location falls inside another polygon. A well 50 feet inside a section line and a well 50 feet outside it can both round to the same centroid distance, so a point-based join cannot tell you which side of a lease boundary a feature sits on.",[28,41,42,45],{},[31,43,44],{},"Area is unavailable."," A point has no area. If you need to know how much of a section overlaps a floodplain, a habitat zone, or a unit boundary, you need the polygon and its vertices.",[28,47,48,51],{},[31,49,50],{},"Clipping and dissolve operations have nothing to clip."," Overlay tools in QGIS and ArcGIS operate on geometry. Feed them points and you get points back, not the intersected shapes you were after.",[10,53,54],{},"Sections are not uniform 640-acre squares either. Survey error, curvature corrections, and government lots along the north and west township boundaries make real section geometry irregular. A formula-estimated point assumes the ideal grid. The survey polygon reflects what the BLM plat actually recorded, which is the shape your analysis has to respect.",[17,56,58],{"id":57},"what-polygon-output-means-here","What \"polygon output\" means here",[10,60,61,62,65,66,69,70,73],{},"When you request a section such as Section 14, Township 4 North, Range 5 East, 6th Principal Meridian, the response includes a GeoJSON ",[36,63,64],{},"Feature"," whose ",[36,67,68],{},"geometry"," is a ",[36,71,72],{},"Polygon",". The coordinate ring traces the surveyed corners of the section rather than a bounding box drawn around a center point. Quarter sections work the same way: request the northeast quarter of that section and you get the polygon for that aliquot part, down to the 1\u002F256 aliquot (about 2.5 acres). Every parcel is calculated from official BLM survey data across 30+ PLSS states and 37 principal meridians.",[10,75,76],{},"Because the output is standard GeoJSON, it drops straight into any tool that reads the format. The rest of this post assumes you have a Feature or FeatureCollection in hand.",[17,78,80],{"id":79},"retrieving-polygon-boundaries-from-the-api","Retrieving polygon boundaries from the API",[10,82,83,84,89,90,94],{},"For a single parcel, call the lookup endpoint with the legal description and ask for polygon geometry. For a set of descriptions, use the batch endpoint, which accepts up to 100 records per request and returns coordinates and GeoJSON polygon boundaries as structured JSON in one pass. Sending 100 descriptions in one call, instead of 100 separate calls, is the difference between a pipeline step that finishes in seconds and one that hammers the API in a loop. See the ",[85,86,88],"a",{"href":87},"\u002Fapi","API reference"," for the exact request shape and authentication, and the ",[85,91,93],{"href":92},"\u002Fhow-to\u002Fbatch-convert-plss-descriptions","batch conversion guide"," for the file-upload path in the web app.",[10,96,97,98,101],{},"A batch response is a FeatureCollection you can save directly to ",[36,99,100],{},"sections.geojson",". Each feature carries the geometry plus the legal description you sent, so you can join results back to your source records by that identifier.",[17,103,105],{"id":104},"loading-polygon-geometry-into-postgis","Loading polygon geometry into PostGIS",[10,107,108,109,112,113,116],{},"With a GeoJSON file in hand, load the geometry and index it before you run any joins. Assuming your well data already lives in a ",[36,110,111],{},"wells"," table with a ",[36,114,115],{},"geom"," column, create a table for the section polygons and insert each feature:",[118,119,124],"pre",{"className":120,"code":121,"language":122,"meta":123,"style":123},"language-sql shiki shiki-themes material-theme-lighter github-light github-dark","CREATE TABLE sections (\n  id serial PRIMARY KEY,\n  legal_desc text,\n  geom geometry(Polygon, 4326)\n);\n\nINSERT INTO sections (legal_desc, geom)\nVALUES (\n  'Sec 14 T4N R5E 6th PM',\n  ST_GeomFromGeoJSON('{\"type\":\"Polygon\",\"coordinates\":[[[...]]]}')\n);\n\nCREATE INDEX sections_geom_idx ON sections USING GIST (geom);\n","sql","",[36,125,126,134,140,146,152,158,165,171,177,183,189,194,199],{"__ignoreMap":123},[127,128,131],"span",{"class":129,"line":130},"line",1,[127,132,133],{},"CREATE TABLE sections (\n",[127,135,137],{"class":129,"line":136},2,[127,138,139],{},"  id serial PRIMARY KEY,\n",[127,141,143],{"class":129,"line":142},3,[127,144,145],{},"  legal_desc text,\n",[127,147,149],{"class":129,"line":148},4,[127,150,151],{},"  geom geometry(Polygon, 4326)\n",[127,153,155],{"class":129,"line":154},5,[127,156,157],{},");\n",[127,159,161],{"class":129,"line":160},6,[127,162,164],{"emptyLinePlaceholder":163},true,"\n",[127,166,168],{"class":129,"line":167},7,[127,169,170],{},"INSERT INTO sections (legal_desc, geom)\n",[127,172,174],{"class":129,"line":173},8,[127,175,176],{},"VALUES (\n",[127,178,180],{"class":129,"line":179},9,[127,181,182],{},"  'Sec 14 T4N R5E 6th PM',\n",[127,184,186],{"class":129,"line":185},10,[127,187,188],{},"  ST_GeomFromGeoJSON('{\"type\":\"Polygon\",\"coordinates\":[[[...]]]}')\n",[127,190,192],{"class":129,"line":191},11,[127,193,157],{},[127,195,197],{"class":129,"line":196},12,[127,198,164],{"emptyLinePlaceholder":163},[127,200,202],{"class":129,"line":201},13,[127,203,204],{},"CREATE INDEX sections_geom_idx ON sections USING GIST (geom);\n",[10,206,207,208,210],{},"The GiST index is what keeps ",[36,209,38],{}," fast once the table grows. Now the spatial join returns what the point version could not:",[118,212,214],{"className":120,"code":213,"language":122,"meta":123,"style":123},"SELECT w.api_number, s.legal_desc\nFROM wells w\nJOIN sections s ON ST_Intersects(w.geom, s.geom);\n",[36,215,216,221,226],{"__ignoreMap":123},[127,217,218],{"class":129,"line":130},[127,219,220],{},"SELECT w.api_number, s.legal_desc\n",[127,222,223],{"class":129,"line":136},[127,224,225],{},"FROM wells w\n",[127,227,228],{"class":129,"line":142},[127,229,230],{},"JOIN sections s ON ST_Intersects(w.geom, s.geom);\n",[10,232,233,234,237],{},"This tells you which section each well actually falls inside, edges included. To measure how much of a section overlaps another layer, use ",[36,235,236],{},"ST_Area(ST_Intersection(...))"," with a projected coordinate system so the result comes back in real units rather than degrees.",[17,239,241],{"id":240},"using-geojson-output-in-qgis-and-arcgis","Using GeoJSON output in QGIS and ArcGIS",[10,243,244,245,248,249,252,253,256,257,260],{},"In QGIS, drag the ",[36,246,247],{},".geojson"," file onto the canvas or use ",[31,250,251],{},"Layer > Add Layer > Add Vector Layer",". The sections render as filled polygons. To confirm the geometry, open the attribute table and add a field with the expression ",[36,254,255],{},"$area",", or reproject to a state plane or UTM zone first so the area reads in square meters or acres you can check against the nominal section size. When you need a deliverable, use ",[31,258,259],{},"Export > Save Features As"," to write the layer out to Shapefile or DXF for a CAD handoff.",[10,262,263,264,267,268,271,272,275],{},"In ArcGIS Pro, run the ",[31,265,266],{},"JSON To Features"," geoprocessing tool (it reads GeoJSON) to bring the polygons in as a feature class, then use ",[31,269,270],{},"Pairwise Intersect"," or ",[31,273,274],{},"Clip"," to overlay them against parcels, leases, or hazard layers. Because the input is true polygon geometry, these overlay tools produce the intersected shapes and attributes you expect.",[10,277,278],{},"Structured exports (CSV, KML, Shapefile, GeoJSON, and DXF) and the batch endpoint are Business plan features, with the metered API available on the Build, Scale, and Enterprise tiers for pipeline use. If your work is spatial analysis rather than one-off lookups, that is the plan that carries the geometry you need.",[10,280,281,282,286,287,291],{},"Start from a section you already know, pull its polygon, and load it into whichever tool you run first. Once the boundary is in your database instead of a point, the overlays, spatial joins, and area calculations that were returning empty results start returning answers. For the well-screening and unit-analysis workflows this feeds directly into, see how operators use it in ",[85,283,285],{"href":284},"\u002Findustries\u002Foil-and-gas","oil and gas",", and review the ",[85,288,290],{"href":289},"\u002Fguides\u002Ftownship-range-system","township and range system"," if you want a refresher on how the descriptions map to geometry.",[293,294,295],"style",{},"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);}",{"title":123,"searchDepth":136,"depth":136,"links":297},[298,299,300,301,302],{"id":19,"depth":136,"text":20},{"id":57,"depth":136,"text":58},{"id":79,"depth":136,"text":80},{"id":104,"depth":136,"text":105},{"id":240,"depth":136,"text":241},"\u002Fimages\u002Fblog\u002Fplss-section-boundaries-as-geojson-polygons-using-parcel-geometry-in-postgis-qgis-and-arcgis\u002Fcover.webp","2026-08-28T10:00:00Z","Pull real PLSS GeoJSON polygon boundaries, not centroid points, and use section geometry in PostGIS, QGIS, and ArcGIS for overlays and spatial joins.",false,"md",{"author":309,"category":310},"Township America","guides","\u002Fblog\u002Fplss-section-boundaries-as-geojson-polygons-using-parcel-geometry-in-postgis-qgis-and-arcgis",{"title":5,"description":305},"blog\u002Fplss-section-boundaries-as-geojson-polygons-using-parcel-geometry-in-postgis-qgis-and-arcgis",[315,316,317,318],"geojson","postgis","gis","plss","6-nYtF2koWXvYMHClmP2KR4B8SPYM6f12wULV1fUjEo"]