O Geodjango é uma ferramenta para manipular dados geográficos, através do Django ORM. Ele fornece uma API para determinar a distância entre dois pontos do mapa, acha a área dos polígonos, etc.
Requerimentos:
Nesse artigo vamos utilizar o Django 1.5.1, PostgreSQL 9.1, PostGIS 2 e para executar as bibliotecas é preciso instalar o Psycopg2, que é o adaptador do Postgresql da linguagem Python.
O Postgis é uma extensão do postgresql, que permite o uso de objetos GIS (Geographic information system), armazenando dados espaciais como pontos, linhas e polígonos.
Instalação do Postgresql 9.1 + Psycopg2 no Ubuntu 13.04:
$ sudo apt-get install python-software-properties
$ sudo apt-get install python-dev binutils gdal-bin postgresql-server-dev-all python-setuptoolsInstalação do Postgresql 9.1 + Psycopg2 no Ubuntu 13.04:
$ sudo apt-get install python-software-properties
$ sudo apt-get install build-essential postgresql-9.1 postgresql-server-dev-9.1 libxml2-dev proj libjson0-dev xsltproc docbook-xsl docbook-mathml gettext postgresql-contrib-9.1 postgresql-client-9.1
$ easy_install psycopg2
Instalação do PostGIS 2.0.3 no Ubuntu 13.04:
$ sudo apt-add-repository ppa:sharpie/for-science # To get GEOS 3.3.2
$ sudo apt-add-repository ppa:sharpie/postgis-nightly
ou
$ sudo add-apt-repository ppa:ubuntugis/ubuntugis-unstable
$ sudo apt-get update
$ sudo apt-get install postgresql-9.1-postgis
Novamente no terminal:
$ sudo apt-add-repository ppa:olivier-berten/geo
$ sudo apt-get update
$ sudo apt-get install libgdal-dev libgdal1-dev
Verificamos a versão do geos:
$ geos-config --version
3.3.8
Agora vamos baixar o Postgis 2.0.3:
$ wget -c http://download.osgeo.org/postgis/source/postgis-2.0.3.tar.gz
$ tar xfvz postgis-2.0.3.tar.gz
$ cd postgis-2.0.3/
$ ./configure --prefix=/usr/include/gdal --with-geos=/usr/bin/geos-config --with-pg=/usr/lib/postgresql/9.1/bin/pg_config --with-python --with-gui
Se faltar alguma lib nessa parte, instale manualmente. Agora para terminar:
$ make
$ sudo make install
$ sudo ldconfig
$ sudo make comments-install
$ sudo ln -sf /usr/share/postgresql-common/pg_wrapper /usr/local/bin/shp2pgsql
$ sudo ln -sf /usr/share/postgresql-common/pg_wrapper /usr/local/bin/pgsql2shp
$ sudo ln -sf /usr/share/postgresql-common/pg_wrapper /usr/local/bin/raster2pgsql
Agora vamos criar uma senha para o usuário postgres:
$ sudo passwd postgres
* Digite a senha do usuário.
Depois:
$ sudo -s -u postgres
$ psql
postgres# \password postgres
* Digite a senha do bd.
Agora é preciso criar o template_postgis:
$ sudo -u postgres createdb template_postgis
$ sudo -u postgres psql -d template_postgis -f /usr/share/postgresql/9.1/contrib/postgis-2.0/postgis.sql
$ sudo -u postgres psql -d template_postgis -f /usr/share/postgresql/9.1/contrib/postgis-2.0/spatial_ref_sys.sql
$ sudo -u postgres psql -d template_postgis -f /usr/share/postgresql/9.1/contrib/postgis-2.0/postgis_comments.sql
Opcional:
$ sudo -u postgres psql -d template_postgis -f /usr/share/postgresql/9.1/contrib/postgis-2.0/rtpostgis.sql
$ sudo -u postgres psql -d template_postgis -f /usr/share/postgresql/9.1/contrib/postgis-2.0/raster_comments.sql
Criando um suporte ao topology:
$ sudo -u postgres psql -d template_postgis -f /usr/share/postgresql/9.1/contrib/postgis-2.0/topology.sql
$ sudo -u postgres psql -d template_postgis -f /usr/share/postgresql/9.1/contrib/postgis-2.0/topology_comments.sql
Para verificar se está tudo certinho:
$ su postgres
$ psql template_postgis
template_postgis# SELECT postgis_full_version();
POSTGIS="2.0.3 r11128" GEOS="3.3.8-CAPI-1.7.8" PROJ="Rel. 4.8.0, 6 March 2012" GDAL="GDAL 1.10.0, released 2013/04/24" LIBXML="2.9.0" LIBJSON="UNKNOWN" TOPOLOGY RASTER
(1 row)
Instalação Fedora:
$ sudo yum install python-devel binutils gdal-python python-setuptools
$ sudo yum install postgresql postgresql-server postgrsql-contrib postgresql-devel pgadmin3
$ sudo yum install proj-devel gdal postgis
# easy_install psycopg2
Para instalar o postgis2 faça o download do pacote rpm.
Adicionando na inicialização e iniciando o postgresql:
# postgresql-setup initdb
# systemctl start postgresql.service
# systemctl enable postgresql.service
Criando um novo projeto:
Nesse exemplo, vamos criar uma app para mapear o seu lar (localhost).
$ mkdir localhost; cd localhost$ django-admin.py startproject localhost; cd localhost
$ python manage.py startapp home
Configurando o PostGIS 2.0 no Django:
Para habilitar a funcionalidade espacial, é preciso criar uma extensão do Postgis 2 com o Postgresql 9.1+:
$ createdb <nome db>$ psql <nome db>
> CREATE EXTENSION postgis;
> CREATE EXTENSION postgis_topology;
ou:
$ createdb -E UTF8 template_postgis2
$ createlang -d template_postgis2 plpgsql
$ psql -d postgres -c "UPDATE pg_database SET datistemplate='true' WHERE datname='template_postgis2'"
$ psql -d template_postgis2 -f /usr/share/postgresql/9.1/contrib/postgis-2.0/postgis.sql
$ psql -d template_postgis2 -f /usr/share/postgresql/9.1/contrib/postgis-2.0/spatial_ref_sys.sql
$ psql -d template_postgis2 -f /usr/share/postgresql/9.1/contrib/postgis-2.0/rtpostgis.sql
$ psql -d template_postgis2 -c "GRANT ALL ON geometry_columns TO PUBLIC;"
$ psql -d template_postgis2 -c "GRANT ALL ON geography_columns TO PUBLIC;"
$ psql -d template_postgis2 -c "GRANT ALL ON spatial_ref_sys TO PUBLIC;"
Se não der certo, execute esse shell script.
Depois inicie o postgres e crie um banco de dados espacial, especificando o template_postgis como template:
$ sudo su - postgres
$ createdb -U postgres -T template_postgis -O zeldani homeDepois inicie o postgres e crie um banco de dados espacial, especificando o template_postgis como template:
$ sudo su - postgres
ou
$ createdb <nome db> -T template_postgis2
$ exit
Configure o settings.py do Django, com o banco de dados postgis, nome do banco e usuário criado:
DATABASES = {
'default': {
'ENGINE': 'django.contrib.gis.db.backends.postgis',
'NAME': 'home',
'USER': 'zeldani',
'PASSWORD': '',
'HOST': '',
'PORT': '5432',
}
}
...
INSTALLED_APPS = (
...
'django.contrib.gis',
'home',
)
'default': {
'ENGINE': 'django.contrib.gis.db.backends.postgis',
'NAME': 'home',
'USER': 'zeldani',
'PASSWORD': '',
'HOST': '',
'PORT': '5432',
}
}
...
INSTALLED_APPS = (
...
'django.contrib.gis',
'home',
)
Criando um model para o gis:
# encoding: utf-8
from django.contrib.gis.db import models
class Local(models.Model):
nome = models.CharField(max_length=80, verbose_name=u'Nome')
area = models.MultiPolygonField(srid=4326, verbose_name=u'Área')
objects = models.GeoManager()
def __unicode__(self):
return self.nome
class Meta:
verbose_name = u'Local'
verbose_name_plural = u'Locais'
from django.contrib.gis.db import models
class Local(models.Model):
nome = models.CharField(max_length=80, verbose_name=u'Nome')
area = models.MultiPolygonField(srid=4326, verbose_name=u'Área')
objects = models.GeoManager()
def __unicode__(self):
return self.nome
class Meta:
verbose_name = u'Local'
verbose_name_plural = u'Locais'
É isso ae!! Agora é possível fazer a localização da sua casa no Django, desenhando a área no mapa do open layers. ;)
Troubleshooting:
* Caso ocorra um erro do tipo "BRST FATAL: could not create shared memory segment" na hora do syncdb do Django, faça o seguinte:33554432
Modifique a quantidade do shmmax com o comando:
$ sudo sysctl -w kernel.shmmax=134217728
Para salvar, modifique o arquivo /etc/sysctl.conf adicionando a linha:
# add kernel.shmmax = bytes
kernel.shmmax = 134217728
* Se der algum erro do tipo "could not connect do server" no syncdb do Django, por conflitos de portas, verifique a porta que o postgresql está rodando:
$ ls -lA /var/run/postgresql
total 8
-rw------- 1 postgres postgres 5 Fev 2 15:56 9.1-main.pid
srwxrwxrwx 1 postgres postgres 0 Fev 2 15:56 .s.PGSQL.5432
-rw------- 1 postgres postgres 70 Fev 2 15:56 .s.PGSQL.5432.lock
-rw------- 1 postgres postgres 5 Fev 2 15:56 9.1-main.pid
srwxrwxrwx 1 postgres postgres 0 Fev 2 15:56 .s.PGSQL.5432
-rw------- 1 postgres postgres 70 Fev 2 15:56 .s.PGSQL.5432.lock
Modifique a porta do postgresql no arquivo /etc/postgresql/9.1/main/postgresql.conf
para 5433 e reinicie: # sudo /etc/init.d/postgresql restart. Ou
modifique o settings.py do Django para 5433.
Happy Djangoing!!
* Fontes:
http://yuji.wordpress.com/2011/11/03/postgresql-could-not-create-shared-memory-segment-invalid-argument-shmget/
http://wiki.bitnami.org/Components/Django/GeoDjango_with_PostGIS_Quick_Start_Guide
http://www.saltycrane.com/blog/2010/06/psycopg2-could-not-connect-server-error-ubuntu/
https://docs.djangoproject.com/en/dev/ref/contrib/gis/
http://www.chicagodjango.com/blog/geo-django-quickstart/
http://www.postgresql.org/about/
http://www.webgis.com.br/postgis/
http://opengeo.org/technology/postgis/
http://initd.org/psycopg/
https://docs.djangoproject.com/en/dev/ref/contrib/gis/tutorial/
http://www.acedevs.com/blog/2011/06/30/postgis-geographic-information-systems-for-django/
http://itouchmap.com/latlong.html
http://linfiniti.com/2012/05/installing-postgis-2-0-on-ubuntu/
http://proyectosbeta.net/2013/04/instalar-postgis-2-0-3-en-ubuntu-13-04/
0 comentários:
Postar um comentário