Is there a means in ogr2ogr to "clip out" one shapefile from another?

I know ogr2ogr -clipsrc B.shp out.shp A.shp will remove any part of A.shp that is NOT in B.shp.

Is there an ogr2ogr command to remove any part of A.shp that intersects with B.shp?

I have seen this called "reverse clip", "clip out", "erase" (ArcMap), or "difference".

Note: this question is about ogr2ogr, the command line tool, NOT the OGR library, which requires programming.

  • Is your copy of GDAL compiled with sqlite/spatialite support? – SaultDon Apr 1 '16 at 18:57
  • I don't believe so. – Tom West Apr 2 '16 at 20:28

Using GDAL >= 1.10.0 compiled with SQLite and SpatiaLite:

ogr2ogr difference.shp a.shp -dialect SQLite -sql "SELECT ST_Difference(a.geometry, b.geometry) AS geometry FROM a, 'b.shp'.b"
| improve this answer | |
  • 2
    It doesn't work in my case ogr2ogr -f "ESRI Shapefile" out.shp road.shp -dialect sqlite -sql "select ST_Diffrence(road.geometry, seg_buff.geometry) from road, 'seg_buff.shp'.seg_buff and this gives me no such column: seg_buff.geometry' I do not understand why this gives me that error – Pil Kwon Oct 14 '18 at 13:30
  • @PilKwon See my edit to Shadab's answer – Alex Hajnal Nov 18 '19 at 16:42

Try using this command:

ogr2ogr -clipsrc B.shp out.shp A.shp -clipsrclayer B
| improve this answer | |
  • 1
    Could you please provide some extra explanations, citations or other useful information to make this answer better? – Piskr Aug 21 '19 at 12:53
  • Apologies, I have misunderstood the question, – Ashok Vanam Aug 25 '19 at 12:39
  • The answer for the question is to do a "Difference" operation which can be done in QGIS Python API, PostGIS. Also as explained by Shadab. – Ashok Vanam Aug 25 '19 at 12:41

Try this,

ogr2ogr -f "ESRI Shapefile" out.shp road.shp \ -dialect sqlite -sql "\ select ST_Diffrence(road.geometry, seg_buff.geometry) \ from road, 'seg_buff.shp'.seg_buff seg_buff \ "

Putting an extra seg_buff at the end makes the query work.

This extra word is needed because ogr2ogr only automatically generates SQL table names for files passed to it directly. When specifying an additional file from within the SQL statement you must supply an arbitrary table name1 to refer to it elsewhere in the SQL statement. In this instance:

 The shapefile
 |             The table within the shapefile
 |             |        The name we're going to use to refer to the
 |             |        table elsewhere in the SQL statement
 |             |        |
 ------------  -------- --------
'seg_buff.shp'.seg_buff seg_buff 

1 The supplied table name doesn't have to match the filename (or its contained table). For example, the following works as well:

ogr2ogr -f "ESRI Shapefile" out.shp road.shp \ -dialect sqlite -sql "\ select ST_Diffrence(road.geometry, foo.geometry) \ from road, 'seg_buff.shp'.seg_buff foo \ "

In either example, out.shp will contain only the parts of road.shp that are not contained within seg_buff.shp.

| improve this answer | |
  • 3
    This answer could be improved by explaining why this might work or by providing citations. – Kingfisher Aug 21 '19 at 12:42

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.