29 de abr de 2013

Mapeando com o GeoDjango



    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-setuptools
$ 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 home
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',

) 




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'

   É 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:
$ sudo cat /proc/sys/kernel/shmmax/
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
 
    
   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