Reading and Writing Vector Data with OGR

Similar documents
EDINA Workshop: Creating a Campus Map and Displaying it in OpenLayers

Oracle Spatial Users Conference

MicroStation. FDO Reader USER S MANUAL. [Företagets adress]

Using ESRI data in Autodesk ISD Products

GRASS. Geographic Resources Analysis Support System Current versions. Related software

Data Interoperability An Introduction

World Premium Points of Interest Getting Started Guide

FME Extension for ArcGIS

The new GRASS 5.1 vector architecture

Feature Enhancements by Release

Implementing Web GIS Solutions

OPEN SOURCE SOLUTIONS FOR SURVEYORS

World Premium Points of Interest Getting Started Guide

World Premium Points of Interest Getting Started Guide

PYTHON. Scripting for ArcGIS. writeoutput = Inputfc = ar. .ext.{) OUtpUt fc =.. Paul A. Zandbergen. axcpy random. .arcpy, Describe (' is.

Esri s ArcGIS Enterprise. Today s Topics. ArcGIS Enterprise. IT4GIS Keith T. Weber, GISP GIS Director ISU GIS Training and Research Center

Introduction to Open Source GIS

Store and Manage Data in a DBMS With ArcView Database Access. Presented By: Andrew Arana & Canserina Kurnia

FME / ArcGIS 9 Data Interoperability Extension

Leveraging SAP HANA and ArcGIS. Melissa Jarman Eugene Yang

Using Python and GDAL to Split Multipart SOUNDG Lat/Long/Depth from NOAA S-57 ENC Files into KML Files for use with GIS Software

Python Scripting: Michael Potts, GISP. Geodatabase Administrator.

Introduction to ArcSDE 8. John Calkins

An Introduction to Data Interoperability

Accessing Data Where it Lives

Introduction to Geodatabase and Spatial Management in ArcGIS. Craig Gillgrass Esri

A Practical Guide to Using QGIS

LSGI 521: Principles of GIS. Lecture 5: Spatial Data Management in GIS. Dr. Bo Wu

Geocoding Address Data

Esri s Spatial Database Engine. Today s Topics. ArcSDE. A spatial database engine that works on

SQLite vs. MongoDB for Big Data

8 Querying and Selecting Data

Who are we? Randal Hale. Nathan Saylor. GIS Coordinator for Hardin Co. Owner of North River Geographic Systems. Consultant. Owner of Saylor Mapping

Adopting the Appropriate GIS Web Service Technologies

Working with Attribute Data and Clipping Spatial Data. Determining Land Use and Ownership Patterns associated with Streams.

Cross-Platform GIS Solutions through SuperGIS Desktop. Ava Lai Sr. Support Engineer Supergeo Technologies Inc.

SAMPLE CHAPTER. Chris Garrard MANNING

Using Python with ArcGIS

Geography 281 Mapmaking with GIS Project One: Exploring the ArcMap Environment

Introduction to ArcCatalog

Key Terms. Attribute join Target table Join table Spatial join

FDO Data Access Technology How to add new data sources with Third Party and Open Source FDO Providers

FDO Data Access Technology at a Glance

Editing Versioned Geodatabases : An Introduction

What s New in Desktop 10.1

Geography 281 Mapmaking with GIS Project One: Exploring the ArcMap Environment

Contents. Introduction to OGR

Introduction to ArcGIS Server 10.1

Web Map Servers. Mark de Blois. Septembre 2016

Leveraging OGC Services in ArcGIS Server

Object modeling and geodatabases. GEOG 419: Advanced GIS

Geocoding Address Data

Open Source Software: What and Why?

AutoCAD Map 3D and ESRI ArcSDE

ArcGIS for Server Michele Lundeen

TRAINING GUIDE. Data Quality Tools for GIS and Lucity Spatial

GIS Exercise 10 March 30, 2018 The USGS NCGMP09v11 tools

Making Yield Contour Maps Using John Deere Data

TABLES, ANATOMY OF A TABLE

Search & Rescue Map Specifications and Production Workflows

PISCES Installation and Getting Started 1

PostgreSQL/PostGIS: Interaction with Other Applications

Python: Getting Started. Ben

2 CARTALINX OPERATION MANUAL

[ ]..,ru. GeoServer Beginner's Guide. open source^ software server. Share and edit geospatial data with this open source.

National Geospatial Data Repository Centralised or Distributed?

if row1.parcelid == row2.parcelid: print row.shape.area

Chapter 7. Joining Maps to Other Datasets in QGIS

Vector Data. James Frew ESM 263 Winter

From data source to data view: A practical guide to uploading spatial data sets into MapX

Geospatial Data Abstraction Library

Implementing a Hybrid Approach to ArcGIS. Philip McNeilly and Margaret Jen

Using the Geodatabase

Annotation/Labeling Workshop. Tim Rankin Pat Dolan

Introduction to GDAL/OGR

Speaker notes. Who am I?

ESRI China (Hong Kong) Limited

ArcGIS Online: Managing Data. Jeremy Bartley Sentha Sivabalan

Using 2001 Census Data in ArcView 3.3 with Census Data from the CHASS Census Analyzer and Statistics Canada Digital Cartographic Files

hereby recognizes that Timotej Verbovsek has successfully completed the web course 3D Analysis of Surfaces and Features Using ArcGIS 10

Data Acquisition using Mashup and 3-D Technology. Matt Rahr College of Agriculture and Life Sciences University of Arizona

Using these user input and other predefined settings, the script then generates the txt2dbf script and another bash script that are executed later.

Leveraging OGC Services in ArcGIS Server. Satish Sankaran Yingqi Tang

TatukGIS Editor 2.0 Review

Exercise 8B: Writing Data to a Feature Class with an Insert Cursor

TatukGIS Editor. Introduction

CS Programming Languages: Python

Creating Great Labels Using Maplex

Combine Yield Data From Combine to Contour Map Ag Leader

Tutorial. Exporting Geodata E X P O R T I N G. Exporting Geodata. with. TNTmips and TNTedit. page 1

Esri Support for Geospatial Standards

GIS Data Preparation and Conversion for the Web

PostgreSQL/PostGIS: Introduction

A Second Look at DEM s

Using Python in ArcGIS Oli Helm May 2, 2013

Agenda. 1. Brief History of PHP. 2. Getting started. 3. Examples

Geometry Operations: OGR and GEOS

MySQL for Windows. Tak Auyeung. September 7, 2003

Files on disk are organized hierarchically in directories (folders). We will first review some basics about working with them.

Python Getting Started

Transcription:

Reading and Writing Vector Data with OGR Open Source RS/GIS Python Week 1 OS Python week 1: Reading & writing vector data [1]

Pros Why use open source? Affordable for individuals or small companies Very helpful developers and fast bug fixes Can use something other than Windows You can impress people! Cons Doesn t have the built in geoprocessor Smaller user community OS Python week 1: Reading & writing vector data [2]

Open Source RS/GIS modules OGR Simple Features Library Vector data access Part of GDAL GDAL Geospatial Data Abstraction Library Raster data access Used by commercial software like ArcGIS Really C++ library, but Python bindings exist OS Python week 1: Reading & writing vector data [3]

Numeric Related modules Sophisticated array manipulation (extremely useful for raster data!) This is the one we ll be using in class NumPy Next generation of Numeric Some of you might use this one if you work at home OS Python week 1: Reading & writing vector data [4]

Other modules http://www.gispython.org/ hosts Python Cartographic Library looks like great stuff, but I haven't used it OS Python week 1: Reading & writing vector data [5]

Development environments FWTools Includes Python, Numeric, GDAL and OGR modules, along with other fun tools Just a suite of tools, not an IDE I like to use Crimson Editor, but this means no debugging tools PythonWin Have to install Numeric, GDAL and OGR individually OS Python week 1: Reading & writing vector data [6]

Documentation Python: http://www.python.org/doc/ GDAL: http://www.gdal.org/, gdal.py, gdalconst.py (in the fwtools/pymod folder) OGR: http://www.gdal.org/ogr/, ogr.py Numeric: http://numpy.scipy.org/#older_array NumPy: http://numpy.scipy.org/ OS Python week 1: Reading & writing vector data [7]

OGR Supports many different vector formats ESRI formats such as shapefiles, personal geodatabases and ArcSDE Other software such as MapInfo, GRASS, Microstation Open formats such as TIGER/Line, SDTS, GML, KML Databases such as MySQL, PostgreSQL, Oracle Spatial, Informix, ODBC OS Python week 1: Reading & writing vector data [8]

From http://www.gdal.org/ogr/ogr_formats.html Format Name Code Creation Georeferencing Compiled by default Arc/Info Binary Coverage AVCBin No Yes Yes Arc/Info.E00(ASCII) Coverage AVCE00 No Yes Yes Atlas BNA BNA Yes No Yes Comma Separated Value (.csv) CSV Yes No Yes DODS/OPeNDAP DODS No Yes No, needs libdap ESRI Personal GeoDatabase PGeo No Yes No, needs ODBC library ESRI ArcSDE SDE No Yes No, needs ESRI SDE ESRI Shapefile ESRI Shapefile Yes Yes Yes FMEObjects Gateway FMEObjects Gateway No Yes No, needs FME GeoJSON GeoJSON No Yes Yes Géoconcept Export Geoconcept Yes Yes Yes GeoRSS GeoRSS Yes Yes Yes (read support needs libexpat) GML GML Yes Yes Yes (read support needs Xerces) GMT GMT Yes Yes Yes GPX GPX Yes Yes Yes (read support needs libexpat) GRASS GRASS No Yes No, needs libgrass Informix DataBlade IDB Yes Yes No, needs Informix DataBlade INTERLIS Interlis 1 and "Interlis 2" Yes Yes Yes (INTERLIS model reading needs ili2c.jar) INGRES INGRES Yes No No, needs INGRESS KML KML Yes No Yes (read support needs libexpat) Mapinfo File MapInfo File Yes Yes Yes Microstation DGN DGN Yes No Yes Memory Memory Yes Yes Yes MySQL MySQL No No No, needs MySQL library Oracle Spatial OCI Yes Yes No, needs OCI library ODBC ODBC No Yes No, needs ODBC library OGDI Vectors OGDI No Yes No, needs OGDI library PostgreSQL PostgreSQL Yes Yes No, needs PostgreSQL library S-57 (ENC) S57 No Yes Yes SDTS SDTS No Yes Yes SQLite SQLite Yes No No, needs libsqlite3 UK.NTF UK. NTF No Yes Yes U.S. Census TIGER/Line TIGER No Yes Yes VRT - Virtual Datasource VRT No Yes Yes X-Plane/Flighgear aeronautical datxplane No Yes Yes OS Python week 1: Reading & writing vector data [9]

Available formats The version we use in class doesn t support everything on the previous slide To see available formats use this command from the FWTools shell: ogrinfo --formats Same syntax if using a shell other than FWTools and the gdal & ogr utilities are in your path otherwise provide the full path to ogrinfo OS Python week 1: Reading & writing vector data [10]

Detour: Module methods Some methods in modules do not rely on a pre-existing object just on the module itself gp = arcgisscripting.create() driver = ogr.getdriverbyname('esri Shapefile') Some methods rely on pre-existing objects dsc = gp.describe('landcover') ds = driver.open('c:/test.shp') OS Python week 1: Reading & writing vector data [11]

With FWTools: import ogr Importing OGR With an OSGeo distribution: from osgeo import ogr Handle both cases like this: try: from osgeo import ogr except: import ogr OS Python week 1: Reading & writing vector data [12]

OGR data drivers A driver is an object that knows how to interact with a certain data type (such as a shapefile) Need an appropriate driver in order to read or write data (need it explicitly for write) Use the Code from slide 9 to get the desired driver OS Python week 1: Reading & writing vector data [13]

Might as well grab the driver for read operations so it is available for writing 1. Import the OGR module 2. Use ogr.getdriverbyname(<driver_code>) import ogr driver = ogr.getdriverbyname('esri Shapefile') OS Python week 1: Reading & writing vector data [14]

Opening a DataSource The Driver Open() method returns a DataSource object Open(<filename>, <update>) where <update> is 0 for read-only, 1 for writeable fn = 'f:/data/classes/python/data/sites.shp' datasource = driver.open(fn, 0) if datasource is None: print 'Could not open ' + fn sys.exit(1) #exit with an error code OS Python week 1: Reading & writing vector data [15]

Detour: Working directory Usually need to specify entire path for filenames Instead, set working directory with os.chdir(<directory_path>) Similar to gp.workspace import ogr, sys, os os.chdir('f:/data/classes/python/data') driver = ogr.getdriverbyname('esri Shapefile') datasource = driver.open('sites.shp', 0) OS Python week 1: Reading & writing vector data [16]

Opening a layer (shapefile) Use GetLayer(<index>) on a DataSource to get a Layer object <index> is always 0 and optional for shapefiles <index> is useful for other data types such as GML, TIGER layer = datasource.getlayer() layer = datasource.getlayer(0) OS Python week 1: Reading & writing vector data [17]

Getting info about the layer Get the number of features in the layer numfeatures = layer.getfeaturecount() print 'Feature count: ' + str(numfeatures) print 'Feature count:', numfeatures Get the extent as a tuple (sort of a nonmodifiable list) extent = layer.getextent() print 'Extent:', extent print 'UL:', extent[0], extent[3] print 'LR:', extent[1], extent[2] OS Python week 1: Reading & writing vector data [18]

Getting features If we know the FID (offset) of a feature, we can use GetFeature(<index>) on the Layer feature = layer.getfeature(0) Or we can loop through all of the features feature = layer.getnextfeature() while feature: # do something here feature = layer.getnextfeature() layer.resetreading() #need if looping again OS Python week 1: Reading & writing vector data [19]

Getting a feature s attributes Feature objects have a GetField(<name>) method which returns the value of that attribute field There are variations, such as GetFieldAsString(<name>) and GetFieldAsInteger(<name>) id = feature.getfield('id') id = feature.getfieldasstring('id') OS Python week 1: Reading & writing vector data [20]

Getting a feature s geometry Feature objects have a method called GetGeometryRef() which returns a Geometry object (could be Point, Polygon, etc) Point objects have GetX() and GetY() methods geometry = feature.getgeometryref() x = geometry.getx() y = geometry.gety() OS Python week 1: Reading & writing vector data [21]

Destroying objects For memory management purposes we need to make sure that we get rid of things such as features when done with them feature.destroy() Also need to close DataSource objects when done with them datasource.destroy() OS Python week 1: Reading & writing vector data [22]

# script to count features # import modules import ogr, os, sys # set the working directory os.chdir('f:/data/classes/python/data') # get the driver driver = ogr.getdriverbyname('esri Shapefile') # open the data source datasource = driver.open('sites.shp', 0) if datasource is None: print 'Could not open file' sys.exit(1) # get the data layer layer = datasource.getlayer() # loop through the features and count them cnt = 0 feature = layer.getnextfeature() while feature: cnt = cnt + 1 feature.destroy() feature = layer.getnextfeature() print 'There are ' + str(cnt) + ' features' # close the data source datasource.destroy() OS Python week 1: Reading & writing vector data [23]

Review: Text file I/O To open a text file Set working directory or include full path Mode is 'r' for reading, 'w' for writing, 'a' for appending file = open(<filename>, <mode>) file = open('c:/data/myfile.txt', 'w') file = open(r'c:\data\myfile.txt', 'w') To close a file when done with it: file.close() OS Python week 1: Reading & writing vector data [24]

To read a file one line at a time: for line in file: print line To write a line to a file, where the string ends with a newline character: file.write('this is my line.\n') OS Python week 1: Reading & writing vector data [25]

Assignment 1a Read coordinates and attributes from a shapefile Loop through the points in sites.shp Write out id, x & y coordinates, and cover type for each point to a text file, one point per line Hint: The two attribute fields in the shapefile are called "id" and "cover" Turn in your code and the output text file OS Python week 1: Reading & writing vector data [26]

Writing data 1. Get or create a writeable layer 2. Add fields if necessary 3. Create a feature 4. Populate the feature 5. Add the feature to the layer 6. Close the layer OS Python week 1: Reading & writing vector data [27]

Getting a writeable layer Open an existing DataSource for writing and get the layer out of it fn = 'f:/data/classes/python/data/sites.shp' datasource = driver.open(fn, 1) if datasource is None: print 'Could not open ' + fn sys.exit(1) #exit with an error code layer = datasource.getlayer(0) OS Python week 1: Reading & writing vector data [28]

Creating a writeable layer Create a new DataSource and Layer 1. CreateDataSource(<filename>) on a Driver object the file cannot already exist! 2. CreateLayer(<name>, geom_type=<ogrwkbgeometrytype>, [srs]) on a DataSource object ds = driver.createdatasource('test.shp') layer = ds.createlayer('test', geom_type=ogr.wkbpoint) OS Python week 1: Reading & writing vector data [29]

Checking if a datasource exists Use the exists(<filename>) method in the os.path module Use DeleteDataSource(<filename>) on a Driver object to delete it (this causes an error if the file does not exist) import os if os.path.exists('test.shp'): driver.deletedatasource('test.shp') OS Python week 1: Reading & writing vector data [30]

Adding fields Cannot add fields to non-empty shapefiles Shapefiles need at least one attribute field Need a FieldDefn object first Copy one from an existing feature with GetFieldDefnRef(<field_index>) or GetFieldDefnRef(<field_name>) fielddefn = feature.getfielddefnref(0) fielddefn = feature.getfielddefnref('id') OS Python week 1: Reading & writing vector data [31]

Or create a new FieldDefn with FieldDefn(<field_name>, <OGRFieldType>), where the field name has a 12-character limit flddef = ogr.fielddefn('id', ogr.oftinteger) If it is a string field, set the width fielddefn = ogr.fielddefn('id', ogr.oftstring) fielddefn.setwidth(4) OS Python week 1: Reading & writing vector data [32]

Now create a field on the layer using the FieldDefn object and CreateField(<FieldDefn>) layer.createfield(fielddefn) OS Python week 1: Reading & writing vector data [33]

Creating new features Need a FeatureDefn object first Get it from the layer after adding any fields featuredefn = layer.getlayerdefn() Now use the FeatureDefn object to create a new Feature object feature = ogr.feature(featuredefn) OS Python week 1: Reading & writing vector data [34]

Set the geometry for the new feature feature.setgeometry(point) Set the attributes with SetField(<name>, <value>) feature.setfield('id', 23) Write the feature to the layer layer.createfeature(feature) Make sure to close the DataSource with Destroy() at the end so things get written OS Python week 1: Reading & writing vector data [35]

# script to copy first 10 points in a shapefile # import modules, set the working directory, and get the driver import ogr, os, sys os.chdir('f:/data/classes/python/data') driver = ogr.getdriverbyname('esri Shapefile') # open the input data source and get the layer inds = driver.open('sites.shp', 0) if inds is None: print 'Could not open file' sys.exit(1) inlayer = inds.getlayer() # create a new data source and layer if os.path.exists('test.shp'): driver.deletedatasource('test.shp') outds = driver.createdatasource('test.shp') if outds is None: print 'Could not create file' sys.exit(1) outlayer = outds.createlayer('test', geom_type=ogr.wkbpoint) # use the input FieldDefn to add a field to the output fielddefn = inlayer.getfeature(0).getfielddefnref('id') outlayer.createfield(fielddefn) OS Python week 1: Reading & writing vector data [36]

# get the FeatureDefn for the output layer featuredefn = outlayer.getlayerdefn() # loop through the input features cnt = 0 infeature = inlayer.getnextfeature() while infeature: # create a new feature outfeature = ogr.feature(featuredefn) outfeature.setgeometry(infeature.getgeometryref()) outfeature.setfield('id', infeature.getfield('id')) # add the feature to the output layer outlayer.createfeature(outfeature) # destroy the features infeature.destroy() outfeature.destroy() # increment cnt and if we have to do more then keep looping cnt = cnt + 1 if cnt < 10: infeature = inlayer.getnextfeature() else: break # close the data sources inds.destroy() outds.destroy() OS Python week 1: Reading & writing vector data [37]

Assignment 1b Copy selected features from one shapefile to another Create a new point shapefile and add an ID field Loop through the points in sites.shp If the cover attribute for a point is trees then write that point out to the new shapefile Turn in your code and a screenshot of the new shapefile being displayed OS Python week 1: Reading & writing vector data [38]