Installing PostGIS on Ubuntu 10.04 Server
Update Jan 19, 2012
I have an existing django app I have been working on. I want to now move from the sqlite dev database I have been using to a postGIS data. I am on the same machine as I used to preform the steps below so the libraries should already be installed. Also I do not need to rerun the template script.
I first create a database for my app named dev_bb
createdb -T template_postgis dev_bb
Then I source my vertualenv and try to syncdb and get the following error.
File "/home/wilblack/virtualenvs/bb_env/lib/python2.6/site-packages/django/db/backends/postgresql_psycopg2/base.py", line 24, in raise ImproperlyConfigured("Error loading psycopg2 module: %s" % e) django.core.exceptions.ImproperlyConfigured: Error loading psycopg2 module: No module named psycopg2
It looks like python cannot see psycopg2 because it is installed outside the virtualenv. Pip to the rescue. A simple
pip install psycopg2and I’m back in business.
I just got done installing PostGIS 8.4 on my Ubuntu 10.04 Server. apt-get makes this process very simple.
Step 1: Install postgresql, psycopg2, and postgis
PostGIS runs on top of PostgreSQL so you need to install it first. Psycops is how Python and PostGres talk.
sudo apt-get install postgresql sudo apt-get install python-psycopg2 # only do this is you are NOT use a virtualenv sudo apt-get install postgresql-8.4-postgis
Troubleshooting
If you get an error that looks like:
Downloading/unpacking psycopg2==2.4.4 (from -r requirements/project.txt (line 19)) Running setup.py egg_info for package psycopg2 Error: pg_config executable not found. Please add the directory containing pg_config to the PATH or specify the full executable path with the option: python setup.py build_ext --pg-config /path/to/pg_config build ... or with the pg_config option in 'setup.cfg'. Complete output from command python setup.py egg_info: running egg_info writing pip-egg-info/psycopg2.egg-info/PKG-INFO writing top-level names to pip-egg-info/psycopg2.egg-info/top_level.txt writing dependency_links to pip-egg-info/psycopg2.egg-info/dependency_links.txt warning: manifest_maker: standard file '-c' not found Error: pg_config executable not found. Please add the directory containing pg_config to the PATH or specify the full executable path with the option: python setup.py build_ext --pg-config /path/to/pg_config build ... or with the pg_config option in 'setup.cfg'. ---------------------------------------- Command python setup.py egg_info failed with error code 1
You just need to install libpq-dev and python-dev (see this blog post from goshawk’s digital nest.)
sudo apt-get install libpq-dev python-dev
If you can’t find psycops2:
Note: when doing this in a virtualenv I was unable to see pyscopg2 because I had already installed it in my main python dist-apackages. So I had to use
export PYTHONPATH=/usr/lib/python2.6/dist-packages/
in order for
python manage.py ogrinspect
to work with geodjango.
I used this to add a user with my local user name
sudo -u postgres createuser --superuser $USER
Then I assigned my user a password
sudo -u postgres psql postgres=# \password USERNAME
Set the postgres user password
Log in to the template1 database off PostgreSQL as the postgres user.
sudo -u postgres psql template1
Once you are in psql set the password with the following line of code
ALTER USER postgres with encrypted password 'your_password';
Step 2: Make a User and Database for your application
I used a user with the same name as the database. To create a postgres user and database using the same name.
createuser myuser createdb myuser
Now the problem is that Django cannot use this account to access the database becuase by default PostgreSQL authentication system is set to “ident”. You need to edit pg_hba.conf to change this. To get around this added a line like
local all all trust
I tried it with the last column as “password” and “md5″ but neither one worked. You can read more about the authentication settings here. With that fixed I was able to run a manage.py syncdb once my Django setting.py file was properly configured.
Create the “template_postgis” template
From here I got the create_template_postgis-debian.sh script to create the template_postgis specific to Ubuntu. I downloaded this to a directory on the same machine as postgres server. I gave the postgres user executable permissions to the script and ran it.
./create_template_postgis-debian.sh
After that, create a geo-spatial database using the postgres account
createdb -T template_postgis deleteme1
Set-up and configuration of pgAdmin III
In order to pgadmin III working on my local machine to me remote postgresql server I had to edit two fiels on the server, /etc/postgresql/8.4/main/postgresql.conf and pg_hba.conf.
In postgresql.conf I had to change the line
#listen_addresses = 'localhost'
to
listen_addresses = '*'
Then in pg_hba.conf I added the line
host all all xxx.xxx.xxx.y/y trust
to the end of the file, here my xxx.xxx.xxx.y is the IP address of the client machine.
11/12/2011 Update
I had some problems creating the postGIS template. Namely when I ran
./create_template_postgis-debian.sh createdb: database creation failed: ERROR: new encoding (UTF8) is incompatible with the encoding of the template database (SQL_AASCII) HINT: Use the same encoding as in the template database, or use template0 as template.
Then based on this blog http://jacobian.org/writing/pg-encoding-ubuntu/ I recreated the cluster with the UTF-* encoding
pg_dropcluster --stop 8.4 main pg_createcluster --start -e UTF-8 8.4 main
Then to get this running in Django I made an psql user named after my system username
createuser --createdb wilblack
Page 1 of 2 | Next page