Generic selectors
Exact matches only
Search in title
Search in content
Post Type Selectors
podcast
Filter by Categories
ArcGIS Pro
GDAL
GeoJson
Map
Map Tools
Maps
postgis
Python
QGIS
Uncategorized

Loading spatial data into PostGIS

How to load spatial data into PostGIS

In this article, we will explore different ways to load spatial data into a PostGIS database. PostGIS is a powerful spatial database extension for PostgreSQL that allows for storing, indexing, and querying of spatial data. It is widely used in the GIS industry as well as in other fields such as transportation, utilities, and environmental management.

https://mapscaping.com/podcast/spatial-sql-gis-without-the-gis/

We will begin by discussing how to load data using command line tools such as shp2pgsql and ogr2ogr, which can convert shapefiles and CSV files into SQL statements that can be used to create and populate a PostGIS-enabled table in a PostgreSQL database. We will also look at how to load data using GUI tools such as QGIS and pgAdmin, which provide a more user-friendly interface for loading data into PostGIS. Finally, we will explore how to use programming languages such as Python and how to use libraries such as psycopg2 to connect to the database and load data.

By the end of this article, you will have a solid understanding of the different ways to load spatial data into a PostGIS database and be able to choose the method that best fits your needs.

https://mapscaping.com/podcast/postgresql-an-open-source-geospatial-database-for-gis-practitioners/

How to load a shapefile into PostGIS using Shp2pgsql

One common way to load a shapefile into PostGIS is to use the command line tool shp2pgsql. This tool converts a shapefile into SQL statements that can be used to create and populate a PostGIS-enabled table in a PostgreSQL database. Here is an example of how to use shp2pgsql to load a shapefile called “myfile.shp” into a PostGIS table called “mytable” in a database called “mydb”:

  1. Open a command prompt or terminal window.
  2. Connect to your PostgreSQL database by typing the following command and enter the password when prompted:
psql -U [username] -d mydb

Convert the shapefile to SQL statements using shp2pgsql command

shp2pgsql -s [SRID] -I -D -W [encoding] myfile.shp mytable | psql -U [username] -d mydb
  • -s [SRID] is the spatial reference system identifier (SRID) for the shapefile’s coordinates.
  • -I creates a spatial index on the geometry column
  • -D use this option to add a PostGIS “dump” file format to the output file.
  • -W [encoding] specifies the encoding of the input shapefile.
  • myfile.shp is the name of the shapefile you want to load.
  • mytable is the name of the PostGIS table you want to create.
  • psql -U [username] -d mydb pipes the output of shp2pgsql into the psql command, which loads the data into the specified PostgreSQL database.

Once the command is executed you should see the shapefile loaded into the table in the specified database. Alternatively, you can also use GUI tools such as QGIS or pgAdmin to load shapefiles into PostGIS, which may be more user-friendly for some users.

How to load a shapefile into PostGIS using Ogr2OGR

When using ogr2ogr to load a shapefile into a PostGIS database, you have two options:

  1. Create the table first: You can create an empty table in the database with the same name as the shapefile (without the .shp extension) and add the necessary columns (e.g. primary key, geometry column) before loading the data. This allows you to define the table structure and any constraints before loading the data.
  2. Let ogr2ogr create the table for you: You can use the -nln option to specify the table name and ogr2ogr will create the table and the necessary columns (e.g. primary key, geometry column) for you.

So, you don’t need to create the table first, but you may want to do so in order to have more control over the table structure and constraints.

In the step-by-step guide that I provided you, I suggested creating the table first, but you can also use the -nln option and ogr2ogr will create the table and the necessary columns for you.

Here are examples of the ogr2ogr command for each option:

Creating the table first:

psql -U [username] -d mydb -c "CREATE TABLE mytable (gid serial primary key); SELECT AddGeometryColumn ('mytable','geom',4326,'POINT',2);"

Then use ogr2ogr to load data into the table:

ogr2ogr -f "PostgreSQL" -update -append  PG:"dbname='mydb' host='localhost' port='5432' user='username' password='password'" myfile.shp -nlt PROMOTE_TO_MULTI -nln mytable -sql "SELECT *, ST_Transform(wkb_geometry,4326) as geom FROM myfile"

Letting ogr2ogr create the table for you:

ogr2ogr -f “PostgreSQL” PG:”dbname=’mydb’ host=’localhost’ port=’5432′ user=’username’ password=’password'” myfile.shp -nln mytable -s_srs EPSG:4326 -t_srs EPSG:4326

In the first option, I created the table with a primary key and geometry column, then used ogr2ogr to load the shapefile data into the table and update the geometry column using the ST_Transform function. In the second option, I let ogr2ogr create the table and the necessary columns (e.g. primary key, geometry column) for me, and also specified the source and target spatial reference system using the -s_srs and -t_srs options.

Please note that these commands are examples, and you may need to adjust them according to your environment and shapefile properties.

You can also add indexes, constraints, and other database features after loading the data, depending on your use case.

How to load a shapefile into PostGIS using QGIS

QGIS is a free and open-source GIS software that provides a user-friendly interface for loading shapefiles into a PostGIS database. Here is a step-by-step guide on how to load a shapefile into a PostGIS database using QGIS:

  1. Open QGIS and connect to your PostGIS database by going to Layer > New > New Vector Layer > Database.
  2. Fill in the necessary information for the connection, such as the host, port, database name, username and password.
  3. Click on the button “Test Connect” to check if the connection is successful.
  4. Once the connection is established, you will be prompted to select the schema and the table. If the table does not exist yet, you can create a new table by clicking on the “New” button.
  5. After creating the table or selecting an existing one, you will be prompted to define the primary key, and the geometry column. You can also specify the spatial reference system.
  6. Once the table is created, you can load the shapefile by going to Layer > Add Layer > Add Vector Layer.
  7. Select the shapefile you want to load and click Open.
  8. In the “Import Vector Layer” dialog box, specify the options such as the target table and the geometry column.
  9. Click OK to load the shapefile into the PostGIS table.

Alternatively, you can also use the DB Manager plugin to load shapefiles into PostGIS, which provides a more advanced interface for working with databases in QGIS.

Please note that this is a general guide and the steps may vary slightly depending on the version of QGIS you are using.

How to import a CSV file into PostGIS using Python?

There are several ways to import a CSV file into a PostGIS database using Python. One popular method is to use the psycopg2 library, which provides a Python interface to interact with PostgreSQL databases, including PostGIS. Here is an example of how to use psycopg2 to import a CSV file called “myfile.csv” into a PostGIS table called “mytable” in a database called “mydb”:

  1. First, you need to install psycopg2 library by running pip install psycopg2
  2. Next, you need to connect to your PostgreSQL database using psycopg2.connect() function.
import psycopg2

conn = psycopg2.connect(
    host="host",
    port=port,
    user="user",
    password="password",
    database="mydb"
)

Create a cursor object to execute SQL commands

cur = conn.cursor()

Create the table in the database if it does not exist

cur.execute("CREATE TABLE IF NOT EXISTS mytable (id serial primary key, name varchar, geom geometry);")

Use the COPY command to load the data from the CSV file into the PostGIS table

with open('myfile.csv', 'r') as f:
    cur.copy_from(f, 'mytable', sep=',')

Commit the transaction and close the cursor and connection

conn.commit()
cur.close()
conn.close()

This example assumes that the CSV file has a header row and the first column in the CSV file is the primary key and the second is a geometry column in WKT format. You may need to adjust the code according to your file structure, table structure and connection details.

Alternatively, you can use other libraries such as pandas to read the CSV file and insert the data into the PostGIS table using SQL statements.

How to import a CSV file into PostGIS using Ogr2ogr

you can use the ogr2ogr command line tool to import a CSV file into a PostGIS database. The ogr2ogr tool can handle various file formats, including CSV, and can be used to load data into a PostGIS table. Here is an example of how to use ogr2ogr to import a CSV file called “myfile.csv” into a PostGIS table called “mytable” in a database called “mydb”:

  1. Open a command prompt or terminal window.
  2. Connect to your PostgreSQL database by typing the following command and enter the password when prompted:
psql -U [username] -d mydb

Create a new table in the database with the same name as the CSV file (without the .csv extension)

CREATE TABLE mytable (gid serial primary key, name varchar, geom geometry);

Use ogr2ogr to load the CSV file into the table, by specifying the path to the CSV file, the name of the table and the options for the geometry column

ogr2ogr -f "PostgreSQL" -lco GEOMETRY_NAME=geom -lco FID=gid PG:"dbname='mydb' host='localhost' port='5432' user='username' password='password'" myfile.csv -nln mytable -oo X_POSSIBLE_NAMES=longitude* -oo Y_POSSIBLE_NAMES=latitude*

Yes, you can use the ogr2ogr command line tool to import a CSV file into a PostGIS database. The ogr2ogr tool can handle various file formats, including CSV, and can be used to load data into a PostGIS table. Here is an example of how to use ogr2ogr to import a CSV file called “myfile.csv” into a PostGIS table called “mytable” in a database called “mydb”:

  1. Open a command prompt or terminal window.
  2. Connect to your PostgreSQL database by typing the following command and enter the password when prompted:
Copy codepsql -U [username] -d mydb
  1. Create a new table in the database with the same name as the CSV file (without the .csv extension)
Copy codeCREATE TABLE mytable (gid serial primary key, name varchar, geom geometry);
  1. Use ogr2ogr to load the CSV file into the table, by specifying the path to the CSV file, the name of the table and the options for the geometry column
Copy codeogr2ogr -f "PostgreSQL" -lco GEOMETRY_NAME=geom -lco FID=gid PG:"dbname='mydb' host='localhost' port='5432' user='username' password='password'" myfile.csv -nln mytable -oo X_POSSIBLE_NAMES=longitude* -oo Y_POSSIBLE_NAMES=latitude*
  • -f "PostgreSQL" specifies that the output format should be in PostgreSQL
  • -lco GEOMETRY_NAME=geom specifies the name of the geometry column
  • -lco FID=gid specifies the name of the primary key
  • PG:"dbname='mydb' host='localhost' port='5432' user='username' password='password'" specifies the connection string to the PostgreSQL database
  • myfile.csv is the name of the CSV file you want to load
  • -nln mytable specifies that the data should be loaded into a table called “mytable”
  • -oo X_POSSIBLE_NAMES=longitude* -oo Y_POSSIBLE_NAMES=latitude* specifies the name of the columns that contains the x,y coordinates

Please note that this command assumes that the CSV file has a header row, the first column is the primary key and the second and the third columns are the x,y coordinates in the WGS 84 reference system (longitude, latitude). You may need to adjust the command according to your file structure, table structure and connection details.

Summary

In this article, we have discussed various methods to load spatial data into a PostGIS database. We have covered using command line tools such as shp2pgsql and ogr2ogr, loading data using GUI tools such as QGIS and pgAdmin and using programming languages such as Python and libraries like psycopg2 to connect to the database and load data. We have also discussed the pros and cons of each method and provided examples of how to use them. By the end of this article, readers should have a solid understanding of the different ways to load spatial data into a PostGIS database and be able to choose the method that best fits their needs.

About the Author
I'm Daniel O'Donohue, the voice and creator behind The MapScaping Podcast ( A podcast for the geospatial community ). With a professional background as a geospatial specialist, I've spent years harnessing the power of spatial to unravel the complexities of our world, one layer at a time.