3

I have been trying to figure out how to execute ogr2ogr to convert files in Python script. I got it to work in Jupyter notebook within ArcGIS Pro and in the terminal but not in Python scripts. Here's the code I used in the notebook.

import os,arcpy,shutil
from osgeo import ogr

abspath=os.path.abspath abspath = os.path.abspath("file") dname = os.path.dirname(abspath) os.chdir(dname)

ProjectFolder=dname

arcpy.env.workspace=ProjectFolder arcpy.env.overwriteOutput = True

! ogr2ogr siteboundary.shp Boundary.TAB

print("Conversion done,your file is located in "+ProjectFolder)

I searched a lot on how to use ogr commands in python script but had no luck. So I exported the notebook to a python script which was this.

import os,arcpy,shutil
from osgeo import ogr
from IPython import get_ipython

abspath=os.path.abspath abspath = os.path.abspath(file) dname = os.path.dirname(abspath) os.chdir(dname)

ProjectFolder=dname

arcpy.env.workspace=ProjectFolder arcpy.env.overwriteOutput = True

get_ipython().System("! ogr2ogr siteboundary.shp boundary.geojson")

print("Conversion done, your file is located in "+ProjectFolder)

But this script is giving me a 'NoneType' error

"Traceback (most recent call last): File "S:\TOOLS\Scripts.test\CT429_ContamCertificates_GIS\Untitled1.py", line 24, in get_ipython().System("! ogr2ogr siteboundary.shp boundary.geojson") AttributeError: 'NoneType' object has no attribute 'System'"

So, I looked up nonetype error for system, found a really good resource "Any idea why IPython.get_ipython() is returning None?" but it's not working for me.

How can I do this?

I need this so that my team can run the Python scripts from the folder itself as that's more convenient.

PolyGeo
  • 65,136
  • 29
  • 109
  • 338

2 Answers2

1

I usually use subprocess to execute ogr2ogr.exe in windows cmd/terminal.

From geojson to shape:

import subprocess

command = [r"C:\OSGeo4W\bin\ogr2ogr.exe", r"C:\GIS\data\lan.shp", r"C:\GIS\data\lan.geojson"]

output, error = subprocess.Popen( command, universal_newlines=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE).communicate()

BERA
  • 72,339
  • 13
  • 72
  • 161
  • 1
    Thank you so much, this works. I changed the command to this 'command= [r"S:\TOOLS\Scripts.test\ogr2ogr.exe", "siteboundary.shp", "geojson.json"]' It works! Yes, I even changed the location of ogr2ogr.exe file to a relative location that is accessible by my team as well, and it works :) – Muppidi Sahaja Reddy Mar 08 '22 at 01:54
  • I still find it strange how the ogr2ogr functionality isn't available via the python library. We must be missing something? – Theo F Jul 22 '22 at 17:57
  • I dont know if it is/isnt. This is just the way I use ogr2ogr – BERA Jul 22 '22 at 18:08
0

This is how I did it (for fgb):

from osgeo import gdal
shpin = 'shpin.shp'
gdal.UseExceptions()
src_shp = gdal.OpenEx(shpin)

ds=gdal.VectorTranslate( 'abc.fgb', src_shp, options='-f "FlatGeobuf"' )

del ds

All credit goes to these two threads:

Using ogr2ogr to convert GML to shapefile in Python?

gdal.VectorTranslate returns empty object

esperluette
  • 101
  • 1