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.

0

2 Answers 2

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()
3
  • 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 :) Mar 8, 2022 at 1: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, 2022 at 17:57
  • I dont know if it is/isnt. This is just the way I use ogr2ogr
    – BERA
    Jul 22, 2022 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

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge that you have read and understand our privacy policy and code of conduct.

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