Polígonos, pontos e outras geometrias no Shapely (GIS)
2016-05-27 – GruPy-SP @ CTNovatec 1/34
Danilo de Jesus da Silva Bellini | @danilobellini | facebook.com/djsbellini | github.com/danilobellini
Polígonos, pontos e outras
geometrias no Shapely
(GIS)
IPython Notebook (Jupyter) do “Hands On” da apresentação:
https://github.com/danilobellini/notebooks/blob/master/2017-05-27_Shapely.ipynb
Polígonos, pontos e outras geometrias no Shapely (GIS)
2016-05-27 – GruPy-SP @ CTNovatec 2/34
Danilo de Jesus da Silva Bellini | @danilobellini | facebook.com/djsbellini | github.com/danilobellini
Danilo J. S. Bellini
● Engenheiro eletricista
(Poli-USP)
● Bacharel em música
(ECA-USP)
● Mestre em ciência da
computação (IME-USP)
– Processamento de sinais
● Engenheiro eletricista
(Poli-USP)
● Bacharel em música
(ECA-USP)
● Mestre em ciência da
computação (IME-USP)
– Processamento de sinais
● FLOSS developer
– Projetos: AudioLazy,
Dose, PyScanPrev,
pytest-doctest-custom,
fractal, pyturing, …
– Contribuições: IPython,
watchdog, py.test,
openModeller, …
● FLOSS developer
– Projetos: AudioLazy,
Dose, PyScanPrev,
pytest-doctest-custom,
fractal, pyturing, …
– Contribuições: IPython,
watchdog, py.test,
openModeller, …
● https://github.com/danilobellini
● https://bitbucket.org/danilobellini
● https://br.linkedin.com/in/danilo-j-s-bellini-66a96310
● https://ericstk.wordpress.com/2014/10/16
● https://github.com/danilobellini
● https://bitbucket.org/danilobellini
● https://br.linkedin.com/in/danilo-j-s-bellini-66a96310
● https://ericstk.wordpress.com/2014/10/16
Polígonos, pontos e outras geometrias no Shapely (GIS)
2016-05-27 – GruPy-SP @ CTNovatec 3/34
Danilo de Jesus da Silva Bellini | @danilobellini | facebook.com/djsbellini | github.com/danilobellini
GIS
Sistema de Informação
Geográfica
Polígonos, pontos e outras geometrias no Shapely (GIS)
2016-05-27 – GruPy-SP @ CTNovatec 4/34
Danilo de Jesus da Silva Bellini | @danilobellini | facebook.com/djsbellini | github.com/danilobellini
O que é GIS?
● Geographic Information
System
● Informação espacial
(dados
georeferenciados)
– Local onde fotos foram
tiradas
– Posição do celular no
cálculo de rotas
– Limites de uma imagem
de satélite
– …
● Geographic Information
System
● Informação espacial
(dados
georeferenciados)
– Local onde fotos foram
tiradas
– Posição do celular no
cálculo de rotas
– Limites de uma imagem
de satélite
– …
● Hardware
(GPS)
– Celular
– Satélite
– Veículo
– …
● Hardware
(GPS)
– Celular
– Satélite
– Veículo
– …
● Software
– Desktop (e.g. QGIS)
– DaaS (Data as a Service)
● OpenStreetMap
– DBMS espacial
●
Software
– Desktop (e.g. QGIS)
– DaaS (Data as a Service)
● OpenStreetMap
– DBMS espacial
https://en.wikipedia.org/
wiki/List_of_GIS_software
Polígonos, pontos e outras geometrias no Shapely (GIS)
2016-05-27 – GruPy-SP @ CTNovatec 5/34
Danilo de Jesus da Silva Bellini | @danilobellini | facebook.com/djsbellini | github.com/danilobellini
Datum e elipsóide geodésico
● Padrão de facto: WGS84 (EPSG:4326)
– World Geodetic System 1984
– Elipsóide
●
Raio equatorial (a): 6.378,137 km
● Inverso do achatamento (1/f): 298,257223563
●
Raio polar (b): aproximadamente 6.356,752 km
– http://epsg.io/4326
– Geográfico (coordenadas esféricas / não-projetado)
●
Longitude e latitude em graus
● Datum nacional: SIRGAS 2000 (EPSG:4674)
– Elipsóide GRS 1980 (mesmo raio equatorial, 1/f = 298,257222101)
– Equivalente ao WGS84 (não há conversão): http://epsg.io/4674
● Padrão de facto: WGS84 (EPSG:4326)
– World Geodetic System 1984
– Elipsóide
● Raio equatorial (a): 6.378,137 km
●
Inverso do achatamento (1/f): 298,257223563
● Raio polar (b): aproximadamente 6.356,752 km
– http://epsg.io/4326
– Geográfico (coordenadas esféricas / não-projetado)
●
Longitude e latitude em graus
● Datum nacional: SIRGAS 2000 (EPSG:4674)
– Elipsóide GRS 1980 (mesmo raio equatorial, 1/f = 298,257222101)
– Equivalente ao WGS84 (não há conversão): http://epsg.io/4674
f =
a−b
a
Polígonos, pontos e outras geometrias no Shapely (GIS)
2016-05-27 – GruPy-SP @ CTNovatec 6/34
Danilo de Jesus da Silva Bellini | @danilobellini | facebook.com/djsbellini | github.com/danilobellini
Imagens e projeções
● Matriciais 2D (raster)
– Pixels!
– JPG, PNG, TIFF, …
● Projeção
– 3D → 2D
– Cônica, cilíndrica,
plana
– e.g. UTM (Universal
Transversa de
Mercator)
● Matriciais 2D (raster)
– Pixels!
– JPG, PNG, TIFF, …
● Projeção
– 3D → 2D
– Cônica, cilíndrica,
plana
– e.g. UTM (Universal
Transversa de
Mercator)
● Vetoriais
– Geometrias!
● Polígonos
● Pontos
● Retas
– Descrição matemática
– SVG, Fontes, …
● Informação espacial
– Componente vetorial
● Vetoriais
– Geometrias!
● Polígonos
● Pontos
● Retas
– Descrição matemática
– SVG, Fontes, …
● Informação espacial
– Componente vetorial
Polígonos, pontos e outras geometrias no Shapely (GIS)
2016-05-27 – GruPy-SP @ CTNovatec 7/34
Danilo de Jesus da Silva Bellini | @danilobellini | facebook.com/djsbellini | github.com/danilobellini
Exemplos de aplicações
● Matricial (raster)
– Classificação de
regiões
– Reconhecimento de
padrões
– Mensurar intensidades
– Probabilidades /
estimativas
– Índices de
sensoriamento remoto
● Matricial (raster)
– Classificação de
regiões
– Reconhecimento de
padrões
– Mensurar intensidades
– Probabilidades /
estimativas
– Índices de
sensoriamento remoto
● Vetorial
– Distâncias, tamanhos
e áreas
● Qual projeção?
● Qual métrica?
– Pertinência /
intersecções
– Caminhos / estradas /
rotas
● Waze, Google Maps,
…
● Vetorial
– Distâncias, tamanhos
e áreas
● Qual projeção?
● Qual métrica?
– Pertinência /
intersecções
– Caminhos / estradas /
rotas
● Waze, Google Maps,
…
Polígonos, pontos e outras geometrias no Shapely (GIS)
2016-05-27 – GruPy-SP @ CTNovatec 8/34
Danilo de Jesus da Silva Bellini | @danilobellini | facebook.com/djsbellini | github.com/danilobellini
Geometrias
Polígonos, pontos e outras geometrias no Shapely (GIS)
2016-05-27 – GruPy-SP @ CTNovatec 9/34
Danilo de Jesus da Silva Bellini | @danilobellini | facebook.com/djsbellini | github.com/danilobellini
Shapely
● Shapely
– Análise e manipulação de geometrias
– https://github.com/Toblerity/Shapely
– http://toblerity.org/shapely/manual.html
– Instalação: pip install shapely
– Utiliza a GEOS via ctypes
– Possui integração com o Jupyter
– BSD de 3 cláusulas
● GEOS (Geometry Engine, Open Source)
– Adaptação do JTS (Java Topology Suite) para C++
– Biblioteca utilizada pelo PostGIS
– LGPL
● Shapely
– Análise e manipulação de geometrias
– https://github.com/Toblerity/Shapely
– http://toblerity.org/shapely/manual.html
– Instalação: pip install shapely
– Utiliza a GEOS via ctypes
– Possui integração com o Jupyter
– BSD de 3 cláusulas
● GEOS (Geometry Engine, Open Source)
– Adaptação do JTS (Java Topology Suite) para C++
– Biblioteca utilizada pelo PostGIS
– LGPL
Polígonos, pontos e outras geometrias no Shapely (GIS)
2016-05-27 – GruPy-SP @ CTNovatec 10/34
Danilo de Jesus da Silva Bellini | @danilobellini | facebook.com/djsbellini | github.com/danilobellini
Módulo shapely.geometry
●
Geometrias
– Ponto (Point)
– LineString
– Polígono (Polygon)
– Polígono com buraco
●
Distância (distance)
●
Área (area)
● Centróide (centroid)
●
Dilatação
– “Buffer” (método buffer)
● Erosão
– “Buffer negativo”
●
Geometrias
– Ponto (Point)
– LineString
– Polígono (Polygon)
– Polígono com buraco
● Distância (distance)
● Área (area)
● Centróide (centroid)
● Dilatação
– “Buffer” (método buffer)
● Erosão
– “Buffer negativo”
Sintaxe para os polígonos:
Polygon(exterior [interior1,
Interior2, ...])
Cada parâmetro “exterior” e “interior” é uma
lista de pontos ou tuplas com as coordenadas
que será convertida em uma LinearRing
(LineString fechada)
Polígonos, pontos e outras geometrias no Shapely (GIS)
2016-05-27 – GruPy-SP @ CTNovatec 11/34
Danilo de Jesus da Silva Bellini | @danilobellini | facebook.com/djsbellini | github.com/danilobellini
Polígonos
● OGC (Open Geospatial Consortium) exige:
– Sentido anti-horário no exterior
– Sentido horário no interior (buracos)
● Precisam ser fechados!
– O Shapely fecha para você ;)
● Validade
– Auto-intersecção
● Pontos repetidos
● Deveria ser um MultiPolygon?
● Correção com buffer(0)
– Nem sempre funciona…
– Método is_valid
● OGC (Open Geospatial Consortium) exige:
– Sentido anti-horário no exterior
– Sentido horário no interior (buracos)
● Precisam ser fechados!
– O Shapely fecha para você ;)
● Validade
– Auto-intersecção
●
Pontos repetidos
●
Deveria ser um MultiPolygon?
● Correção com buffer(0)
– Nem sempre funciona…
– Método is_valid
Polígonos, pontos e outras geometrias no Shapely (GIS)
2016-05-27 – GruPy-SP @ CTNovatec 12/34
Danilo de Jesus da Silva Bellini | @danilobellini | facebook.com/djsbellini | github.com/danilobellini
Coleções
● Construção a partir de um iterável com os
objetos a serem unificados
● Método geoms
– Iterável para acesso às geometrias que compõe a
coleção
● Construção a partir de um iterável com os
objetos a serem unificados
● Método geoms
– Iterável para acesso às geometrias que compõe a
coleção
Polígonos, pontos e outras geometrias no Shapely (GIS)
2016-05-27 – GruPy-SP @ CTNovatec 13/34
Danilo de Jesus da Silva Bellini | @danilobellini | facebook.com/djsbellini | github.com/danilobellini
Predicados e operações com
geometrias
Polígonos, pontos e outras geometrias no Shapely (GIS)
2016-05-27 – GruPy-SP @ CTNovatec 14/34
Danilo de Jesus da Silva Bellini | @danilobellini | facebook.com/djsbellini | github.com/danilobellini
Predicados unários (métodos)
● has_z
– Há terceira coordenada? (pontos tridimensionais)
● is_ccw
– Is it Counter-ClockWise? (É anti-horário?)
● is_empty
– É vazio?
– Todas as geometrias podem ser vazias
● is_ring
– É fechado (em anel)?
● has_z
– Há terceira coordenada? (pontos tridimensionais)
● is_ccw
– Is it Counter-ClockWise? (É anti-horário?)
● is_empty
– É vazio?
– Todas as geometrias podem ser vazias
● is_ring
– É fechado (em anel)?
Polígonos, pontos e outras geometrias no Shapely (GIS)
2016-05-27 – GruPy-SP @ CTNovatec 15/34
Danilo de Jesus da Silva Bellini | @danilobellini | facebook.com/djsbellini | github.com/danilobellini
União, intersecção e diferença
● Métodos óbvios...
– union
– intersection
– difference
● União de múltiplos objetos ou de uma coleção
– shapely.ops.cascade_union
● Feito para unir instâncias de Polygon
– shapely.ops.unary_union
● União de geometrias em geral
● Métodos óbvios...
– union
– intersection
– difference
● União de múltiplos objetos ou de uma coleção
– shapely.ops.cascade_union
● Feito para unir instâncias de Polygon
– shapely.ops.unary_union
● União de geometrias em geral
Polígonos, pontos e outras geometrias no Shapely (GIS)
2016-05-27 – GruPy-SP @ CTNovatec 16/34
Danilo de Jesus da Silva Bellini | @danilobellini | facebook.com/djsbellini | github.com/danilobellini
Diferença simétrica e convex hull
● Método symmetric_difference
– Diferença entre a união e a intersecção das geometrias
● Método convex_hull
– Menor polígono convexo que contém todas as geometrias da
coleção
– Também aplicável a uma geometria só
● Método envelope
– Similar ao convex_hull, mas resulta em um retângulo
● Método symmetric_difference
– Diferença entre a união e a intersecção das geometrias
● Método convex_hull
– Menor polígono convexo que contém todas as geometrias da
coleção
– Também aplicável a uma geometria só
● Método envelope
– Similar ao convex_hull, mas resulta em um retângulo
Polígonos, pontos e outras geometrias no Shapely (GIS)
2016-05-27 – GruPy-SP @ CTNovatec 17/34
Danilo de Jesus da Silva Bellini | @danilobellini | facebook.com/djsbellini | github.com/danilobellini
Predicados binários
● Métodos:
– almost_equals
– equals
– contains
– crosses
– disjoint
– intersects
– touches
– within
● Métodos:
– almost_equals
– equals
– contains
– crosses
– disjoint
– intersects
– touches
– within
● Há um predicado
unário relativo a
cruzamentos:
is_simple
(geometria não cruza
consigo própria)
● A fronteira é usada
internamente
– Método boundary
● Baseado no DE-9IM
● Há um predicado
unário relativo a
cruzamentos:
is_simple
(geometria não cruza
consigo própria)
● A fronteira é usada
internamente
– Método boundary
● Baseado no DE-9IM
Polígonos, pontos e outras geometrias no Shapely (GIS)
2016-05-27 – GruPy-SP @ CTNovatec 18/34
Danilo de Jesus da Silva Bellini | @danilobellini | facebook.com/djsbellini | github.com/danilobellini
DE-9IM
● Dimensionally Extended Nine-Intersection Model
● Define o significado de diversos “verbos” (predicados
binários)
– O que significa “intersecciona”, “cruza”, “contém”?
– Avalia a dimensionalidade da intersecção entre:
● Interior
● Fronteira
● Exterior
de cada geometria (3x3 valores)
● Método relate devolve a matriz 3x3 do DE-9IM como
uma string de 9 caracteres
– Dígitos com o número de dimensões ou “F” significando “Falso”
● Dimensionally Extended Nine-Intersection Model
● Define o significado de diversos “verbos” (predicados
binários)
– O que significa “intersecciona”, “cruza”, “contém”?
– Avalia a dimensionalidade da intersecção entre:
● Interior
● Fronteira
● Exterior
de cada geometria (3x3 valores)
● Método relate devolve a matriz 3x3 do DE-9IM como
uma string de 9 caracteres
– Dígitos com o número de dimensões ou “F” significando “Falso”
Polígonos, pontos e outras geometrias no Shapely (GIS)
2016-05-27 – GruPy-SP @ CTNovatec 19/34
Danilo de Jesus da Silva Bellini | @danilobellini | facebook.com/djsbellini | github.com/danilobellini
Formatos vetoriais e
integração com outros
sistemas
Polígonos, pontos e outras geometrias no Shapely (GIS)
2016-05-27 – GruPy-SP @ CTNovatec 20/34
Danilo de Jesus da Silva Bellini | @danilobellini | facebook.com/djsbellini | github.com/danilobellini
WKT e WKB
● Well-Known Text and Binary
● Módulos shapely.wkt e shapely.wkb
– Funções de load e dump como no módulo json
● Métodos wkt, wkb e wkb_hex
– String com a geometria nesses formatos, para
integração com outros sistemas
● O “print” das geometrias nos mostra o WKT
– Método __str__(self) devolve self.wkt
● Well-Known Text and Binary
● Módulos shapely.wkt e shapely.wkb
– Funções de load e dump como no módulo json
● Métodos wkt, wkb e wkb_hex
– String com a geometria nesses formatos, para
integração com outros sistemas
● O “print” das geometrias nos mostra o WKT
– Método __str__(self) devolve self.wkt
Polígonos, pontos e outras geometrias no Shapely (GIS)
2016-05-27 – GruPy-SP @ CTNovatec 21/34
Danilo de Jesus da Silva Bellini | @danilobellini | facebook.com/djsbellini | github.com/danilobellini
GeoJSON
● Especificação para arquivos JSON contendo a
geometria
● Único arquivo: evita quebras em múltiplos
arquivos como ocorre no ESRI Shapefile
(arquivos shp, dbf, shx, prj)
● CRS (sistema de coordenadas de referência)
padrão: WGS84
● Definição em http://geojson.org/
● Crie o seu próprio GeoJSON em WGS82:
http://geojson.io/
● Especificação para arquivos JSON contendo a
geometria
● Único arquivo: evita quebras em múltiplos
arquivos como ocorre no ESRI Shapefile
(arquivos shp, dbf, shx, prj)
● CRS (sistema de coordenadas de referência)
padrão: WGS84
● Definição em http://geojson.org/
● Crie o seu próprio GeoJSON em WGS82:
http://geojson.io/
Polígonos, pontos e outras geometrias no Shapely (GIS)
2016-05-27 – GruPy-SP @ CTNovatec 22/34
Danilo de Jesus da Silva Bellini | @danilobellini | facebook.com/djsbellini | github.com/danilobellini
GeoJSON: Feature e
FeatureCollection
● O “type” do objeto do GeoJSON pode ser o de
uma geometria, “Feature” ou “FeatureCollection”
● FeatureCollection é uma coleção de Features
– Pode ser vazia:
{“type”: “FeatureCollection”,
“features”: []}
● Feature é uma geometria com propriedades
– Contém um objeto “geometry” e um objeto “properties”
– As propriedades são [meta]dados associados à
geometria (e.g. nome, data de coleta, id, etc.)
● O “type” do objeto do GeoJSON pode ser o de
uma geometria, “Feature” ou “FeatureCollection”
● FeatureCollection é uma coleção de Features
– Pode ser vazia:
{“type”: “FeatureCollection”,
“features”: []}
● Feature é uma geometria com propriedades
– Contém um objeto “geometry” e um objeto “properties”
– As propriedades são [meta]dados associados à
geometria (e.g. nome, data de coleta, id, etc.)
Polígonos, pontos e outras geometrias no Shapely (GIS)
2016-05-27 – GruPy-SP @ CTNovatec 23/34
Danilo de Jesus da Silva Bellini | @danilobellini | facebook.com/djsbellini | github.com/danilobellini
GeoJSON: bbox e crs
● Campos opcionais do GeoJSON
– bbox (Bounding box)
● Par de coordenadas que, no dado sistema de coordenadas,
define um retângulo que contém a geometria
– crs (Coordinate Reference System)
● Objeto que identifica o sistema de coordenadas, e.g. o WGS84
(padrão) pode ser explicitamente identificado com:
"crs": {"type": "name",
"properties": {"name":
"urn:ogc:def:crs:OGC:1.3:CRS84"}}
● Pode aparecer apenas uma vez, e apenas no objeto “raiz” do
arquivo GeoJSON
● Podem ser do tipo “name” ou “link” (confuso!)
● http://wiki.geojson.org/Rethinking_CRS
● Campos opcionais do GeoJSON
– bbox (Bounding box)
● Par de coordenadas que, no dado sistema de coordenadas,
define um retângulo que contém a geometria
– crs (Coordinate Reference System)
● Objeto que identifica o sistema de coordenadas, e.g. o WGS84
(padrão) pode ser explicitamente identificado com:
"crs": {"type": "name",
"properties": {"name":
"urn:ogc:def:crs:OGC:1.3:CRS84"}}
● Pode aparecer apenas uma vez, e apenas no objeto “raiz” do
arquivo GeoJSON
● Podem ser do tipo “name” ou “link” (confuso!)
● http://wiki.geojson.org/Rethinking_CRS
Polígonos, pontos e outras geometrias no Shapely (GIS)
2016-05-27 – GruPy-SP @ CTNovatec 24/34
Danilo de Jesus da Silva Bellini | @danilobellini | facebook.com/djsbellini | github.com/danilobellini
__geo_interface__
● Padrão de interface de informação espacial
para objetos Python
– Método deve devolver dicionários com geometrias
ou features GeoJSON-like
● Definição é do próprio Sean Gillies, criador do
Shapely:
– https://gist.github.com/sgillies/2217756
● Facilita interação entre diferentes bibliotecas
geoespaciais do Python
● Padrão de interface de informação espacial
para objetos Python
– Método deve devolver dicionários com geometrias
ou features GeoJSON-like
● Definição é do próprio Sean Gillies, criador do
Shapely:
– https://gist.github.com/sgillies/2217756
● Facilita interação entre diferentes bibliotecas
geoespaciais do Python
Polígonos, pontos e outras geometrias no Shapely (GIS)
2016-05-27 – GruPy-SP @ CTNovatec 25/34
Danilo de Jesus da Silva Bellini | @danilobellini | facebook.com/djsbellini | github.com/danilobellini
Mais sobre __geo_interface__
● Função shapely.geometry.shape
– Cria uma geometria do Shapely a partir de um
objeto com essa interface geo ou um dicionário do
Python (e.g. o resultado de json.load)
● Função shapely.geometry.mapping
– Devolve a __geo_interface__ do objeto
● Entrada/saída são apenas geometrias no
Shapely
– Feature e FeatureCollection necessitam de
adaptações para usar com o Shapely
● Função shapely.geometry.shape
– Cria uma geometria do Shapely a partir de um
objeto com essa interface geo ou um dicionário do
Python (e.g. o resultado de json.load)
● Função shapely.geometry.mapping
– Devolve a __geo_interface__ do objeto
● Entrada/saída são apenas geometrias no
Shapely
– Feature e FeatureCollection necessitam de
adaptações para usar com o Shapely
Polígonos, pontos e outras geometrias no Shapely (GIS)
2016-05-27 – GruPy-SP @ CTNovatec 26/34
Danilo de Jesus da Silva Bellini | @danilobellini | facebook.com/djsbellini | github.com/danilobellini
Numpy
● Entradas para os
construtores das
classes do Shapely
são iteráveis
– Arrays do Numpy
também são, logo...
● __array_interface__
– Permite a conversão
para arrays do Numpy
● Entradas para os
construtores das
classes do Shapely
são iteráveis
– Arrays do Numpy
também são, logo...
● __array_interface__
– Permite a conversão
para arrays do Numpy
● Possuem
__array_interface__:
– LineString
– LinearRing
– Point
● numpy.asarray
– Acesso direto ao
conteúdo dos objetos,
sem cópia
● Possuem
__array_interface__:
– LineString
– LinearRing
– Point
● numpy.asarray
– Acesso direto ao
conteúdo dos objetos,
sem cópia
Polígonos, pontos e outras geometrias no Shapely (GIS)
2016-05-27 – GruPy-SP @ CTNovatec 27/34
Danilo de Jesus da Silva Bellini | @danilobellini | facebook.com/djsbellini | github.com/danilobellini
Algoritmo de Douglas-
Peucker
Polígonos, pontos e outras geometrias no Shapely (GIS)
2016-05-27 – GruPy-SP @ CTNovatec 28/34
Danilo de Jesus da Silva Bellini | @danilobellini | facebook.com/djsbellini | github.com/danilobellini
Simplificação VS suavização
● Simplificação
– Remoção de pontos
– Diminuição do tamanho dos arquivos
● Suavização
– Remoção de “pontas” e “cantos”
– Arredondamento
– Aumento do número de pontos
● Não há splines (polinômios) ou outras formas de
interpolação não-linear
● Simplificação
– Remoção de pontos
– Diminuição do tamanho dos arquivos
● Suavização
– Remoção de “pontas” e “cantos”
– Arredondamento
– Aumento do número de pontos
● Não há splines (polinômios) ou outras formas de
interpolação não-linear
Polígonos, pontos e outras geometrias no Shapely (GIS)
2016-05-27 – GruPy-SP @ CTNovatec 29/34
Danilo de Jesus da Silva Bellini | @danilobellini | facebook.com/djsbellini | github.com/danilobellini
Douglas-Peucker
● Algoritmo de simplificação de LineString
– Aplicável a polígonos
● 1 LineString fechado exterior
● N LineString fechados interior
● Dependência do ponto inicial na descrição do polígono
– Implementado na GEOS, método “simplify” no Shapely
● Recursivo
– Seja P o ponto mais distante da reta r que liga os 2 pontos
extremos A e B da LineString
● distância(P, r) < tolerância
– O resultado é a própria reta r (pontos entre A e B são removidos)
● Caso contrário: “split” em P!
– Resultado: união do algoritmo de Douglas-Peucker aplicado nas LineStrings de A até P
e de P até B
● Algoritmo de simplificação de LineString
– Aplicável a polígonos
● 1 LineString fechado exterior
● N LineString fechados interior
● Dependência do ponto inicial na descrição do polígono
– Implementado na GEOS, método “simplify” no Shapely
● Recursivo
– Seja P o ponto mais distante da reta r que liga os 2 pontos
extremos A e B da LineString
● distância(P, r) < tolerância
– O resultado é a própria reta r (pontos entre A e B são removidos)
● Caso contrário: “split” em P!
– Resultado: união do algoritmo de Douglas-Peucker aplicado nas LineStrings de A até P
e de P até B
Polígonos, pontos e outras geometrias no Shapely (GIS)
2016-05-27 – GruPy-SP @ CTNovatec 30/34
Danilo de Jesus da Silva Bellini | @danilobellini | facebook.com/djsbellini | github.com/danilobellini
Considerações finais
Polígonos, pontos e outras geometrias no Shapely (GIS)
2016-05-27 – GruPy-SP @ CTNovatec 31/34
Danilo de Jesus da Silva Bellini | @danilobellini | facebook.com/djsbellini | github.com/danilobellini
Unidades e
distorções
● Qual a unidade?
– Distâncias
– Áreas
– Ângulos
● Longlat
– Em coordenadas esféricas, os valores não significam distância e área
pois os dados não são planares
● Projeção (e.g. Mercator, Peters, Albers, etc.)
– O sistema de coordenadas especifica a unidade de medida
● e.g. metros na UTM 22 sul http://epsg.io/32722
– Distorções em alguma das medidas
● Área na projeção de Mercator, comparação da Africa e Groenlândia obtida em:
http://www.pratham.name/mercator-projection-africa-vs-greenland.html
● Qual a unidade?
– Distâncias
– Áreas
– Ângulos
● Longlat
– Em coordenadas esféricas, os valores não significam distância e área
pois os dados não são planares
● Projeção (e.g. Mercator, Peters, Albers, etc.)
– O sistema de coordenadas especifica a unidade de medida
● e.g. metros na UTM 22 sul http://epsg.io/32722
– Distorções em alguma das medidas
● Área na projeção de Mercator, comparação da Africa e Groenlândia obtida em:
http://www.pratham.name/mercator-projection-africa-vs-greenland.html
Polígonos, pontos e outras geometrias no Shapely (GIS)
2016-05-27 – GruPy-SP @ CTNovatec 32/34
Danilo de Jesus da Silva Bellini | @danilobellini | facebook.com/djsbellini | github.com/danilobellini
Especificação
● Não há splines nesses padrões! Apenas retas…
● Tipos, nomes e especificação das geometrias e
dos operadores
– Originalmente definidos pela OGC
– ISO/IEC 13249-3:2016 – Information technology –
Database languages – SQL multimedia and
application packages – Part 3: Spatial
– ISO 19162:2015 – Geographic information – Well-
known text representation of coordinate reference
systems
● Não há splines nesses padrões! Apenas retas…
● Tipos, nomes e especificação das geometrias e
dos operadores
– Originalmente definidos pela OGC
– ISO/IEC 13249-3:2016 – Information technology –
Database languages – SQL multimedia and
application packages – Part 3: Spatial
– ISO 19162:2015 – Geographic information – Well-
known text representation of coordinate reference
systems
Polígonos, pontos e outras geometrias no Shapely (GIS)
2016-05-27 – GruPy-SP @ CTNovatec 33/34
Danilo de Jesus da Silva Bellini | @danilobellini | facebook.com/djsbellini | github.com/danilobellini
Fundo dos slides feito com:
audiolazy
shapely
rasterio
numpy
matplotlib
Polígonos, pontos e outras geometrias no Shapely (GIS)
2016-05-27 – GruPy-SP @ CTNovatec 34/34
Danilo de Jesus da Silva Bellini | @danilobellini | facebook.com/djsbellini | github.com/danilobellini
FIM!
Dúvidas?
As imagens presentes
nos slides anteriores
foram obtidas do
Wikipedia, da
documentação do
Shapely e do
OpenStreetMap,
exceto quando
explícito em contrário

(2017-05-27) [Grupy-SP] Polígonos, pontos e outras geometrias no Shapely (GIS)

  • 1.
    Polígonos, pontos eoutras geometrias no Shapely (GIS) 2016-05-27 – GruPy-SP @ CTNovatec 1/34 Danilo de Jesus da Silva Bellini | @danilobellini | facebook.com/djsbellini | github.com/danilobellini Polígonos, pontos e outras geometrias no Shapely (GIS) IPython Notebook (Jupyter) do “Hands On” da apresentação: https://github.com/danilobellini/notebooks/blob/master/2017-05-27_Shapely.ipynb
  • 2.
    Polígonos, pontos eoutras geometrias no Shapely (GIS) 2016-05-27 – GruPy-SP @ CTNovatec 2/34 Danilo de Jesus da Silva Bellini | @danilobellini | facebook.com/djsbellini | github.com/danilobellini Danilo J. S. Bellini ● Engenheiro eletricista (Poli-USP) ● Bacharel em música (ECA-USP) ● Mestre em ciência da computação (IME-USP) – Processamento de sinais ● Engenheiro eletricista (Poli-USP) ● Bacharel em música (ECA-USP) ● Mestre em ciência da computação (IME-USP) – Processamento de sinais ● FLOSS developer – Projetos: AudioLazy, Dose, PyScanPrev, pytest-doctest-custom, fractal, pyturing, … – Contribuições: IPython, watchdog, py.test, openModeller, … ● FLOSS developer – Projetos: AudioLazy, Dose, PyScanPrev, pytest-doctest-custom, fractal, pyturing, … – Contribuições: IPython, watchdog, py.test, openModeller, … ● https://github.com/danilobellini ● https://bitbucket.org/danilobellini ● https://br.linkedin.com/in/danilo-j-s-bellini-66a96310 ● https://ericstk.wordpress.com/2014/10/16 ● https://github.com/danilobellini ● https://bitbucket.org/danilobellini ● https://br.linkedin.com/in/danilo-j-s-bellini-66a96310 ● https://ericstk.wordpress.com/2014/10/16
  • 3.
    Polígonos, pontos eoutras geometrias no Shapely (GIS) 2016-05-27 – GruPy-SP @ CTNovatec 3/34 Danilo de Jesus da Silva Bellini | @danilobellini | facebook.com/djsbellini | github.com/danilobellini GIS Sistema de Informação Geográfica
  • 4.
    Polígonos, pontos eoutras geometrias no Shapely (GIS) 2016-05-27 – GruPy-SP @ CTNovatec 4/34 Danilo de Jesus da Silva Bellini | @danilobellini | facebook.com/djsbellini | github.com/danilobellini O que é GIS? ● Geographic Information System ● Informação espacial (dados georeferenciados) – Local onde fotos foram tiradas – Posição do celular no cálculo de rotas – Limites de uma imagem de satélite – … ● Geographic Information System ● Informação espacial (dados georeferenciados) – Local onde fotos foram tiradas – Posição do celular no cálculo de rotas – Limites de uma imagem de satélite – … ● Hardware (GPS) – Celular – Satélite – Veículo – … ● Hardware (GPS) – Celular – Satélite – Veículo – … ● Software – Desktop (e.g. QGIS) – DaaS (Data as a Service) ● OpenStreetMap – DBMS espacial ● Software – Desktop (e.g. QGIS) – DaaS (Data as a Service) ● OpenStreetMap – DBMS espacial https://en.wikipedia.org/ wiki/List_of_GIS_software
  • 5.
    Polígonos, pontos eoutras geometrias no Shapely (GIS) 2016-05-27 – GruPy-SP @ CTNovatec 5/34 Danilo de Jesus da Silva Bellini | @danilobellini | facebook.com/djsbellini | github.com/danilobellini Datum e elipsóide geodésico ● Padrão de facto: WGS84 (EPSG:4326) – World Geodetic System 1984 – Elipsóide ● Raio equatorial (a): 6.378,137 km ● Inverso do achatamento (1/f): 298,257223563 ● Raio polar (b): aproximadamente 6.356,752 km – http://epsg.io/4326 – Geográfico (coordenadas esféricas / não-projetado) ● Longitude e latitude em graus ● Datum nacional: SIRGAS 2000 (EPSG:4674) – Elipsóide GRS 1980 (mesmo raio equatorial, 1/f = 298,257222101) – Equivalente ao WGS84 (não há conversão): http://epsg.io/4674 ● Padrão de facto: WGS84 (EPSG:4326) – World Geodetic System 1984 – Elipsóide ● Raio equatorial (a): 6.378,137 km ● Inverso do achatamento (1/f): 298,257223563 ● Raio polar (b): aproximadamente 6.356,752 km – http://epsg.io/4326 – Geográfico (coordenadas esféricas / não-projetado) ● Longitude e latitude em graus ● Datum nacional: SIRGAS 2000 (EPSG:4674) – Elipsóide GRS 1980 (mesmo raio equatorial, 1/f = 298,257222101) – Equivalente ao WGS84 (não há conversão): http://epsg.io/4674 f = a−b a
  • 6.
    Polígonos, pontos eoutras geometrias no Shapely (GIS) 2016-05-27 – GruPy-SP @ CTNovatec 6/34 Danilo de Jesus da Silva Bellini | @danilobellini | facebook.com/djsbellini | github.com/danilobellini Imagens e projeções ● Matriciais 2D (raster) – Pixels! – JPG, PNG, TIFF, … ● Projeção – 3D → 2D – Cônica, cilíndrica, plana – e.g. UTM (Universal Transversa de Mercator) ● Matriciais 2D (raster) – Pixels! – JPG, PNG, TIFF, … ● Projeção – 3D → 2D – Cônica, cilíndrica, plana – e.g. UTM (Universal Transversa de Mercator) ● Vetoriais – Geometrias! ● Polígonos ● Pontos ● Retas – Descrição matemática – SVG, Fontes, … ● Informação espacial – Componente vetorial ● Vetoriais – Geometrias! ● Polígonos ● Pontos ● Retas – Descrição matemática – SVG, Fontes, … ● Informação espacial – Componente vetorial
  • 7.
    Polígonos, pontos eoutras geometrias no Shapely (GIS) 2016-05-27 – GruPy-SP @ CTNovatec 7/34 Danilo de Jesus da Silva Bellini | @danilobellini | facebook.com/djsbellini | github.com/danilobellini Exemplos de aplicações ● Matricial (raster) – Classificação de regiões – Reconhecimento de padrões – Mensurar intensidades – Probabilidades / estimativas – Índices de sensoriamento remoto ● Matricial (raster) – Classificação de regiões – Reconhecimento de padrões – Mensurar intensidades – Probabilidades / estimativas – Índices de sensoriamento remoto ● Vetorial – Distâncias, tamanhos e áreas ● Qual projeção? ● Qual métrica? – Pertinência / intersecções – Caminhos / estradas / rotas ● Waze, Google Maps, … ● Vetorial – Distâncias, tamanhos e áreas ● Qual projeção? ● Qual métrica? – Pertinência / intersecções – Caminhos / estradas / rotas ● Waze, Google Maps, …
  • 8.
    Polígonos, pontos eoutras geometrias no Shapely (GIS) 2016-05-27 – GruPy-SP @ CTNovatec 8/34 Danilo de Jesus da Silva Bellini | @danilobellini | facebook.com/djsbellini | github.com/danilobellini Geometrias
  • 9.
    Polígonos, pontos eoutras geometrias no Shapely (GIS) 2016-05-27 – GruPy-SP @ CTNovatec 9/34 Danilo de Jesus da Silva Bellini | @danilobellini | facebook.com/djsbellini | github.com/danilobellini Shapely ● Shapely – Análise e manipulação de geometrias – https://github.com/Toblerity/Shapely – http://toblerity.org/shapely/manual.html – Instalação: pip install shapely – Utiliza a GEOS via ctypes – Possui integração com o Jupyter – BSD de 3 cláusulas ● GEOS (Geometry Engine, Open Source) – Adaptação do JTS (Java Topology Suite) para C++ – Biblioteca utilizada pelo PostGIS – LGPL ● Shapely – Análise e manipulação de geometrias – https://github.com/Toblerity/Shapely – http://toblerity.org/shapely/manual.html – Instalação: pip install shapely – Utiliza a GEOS via ctypes – Possui integração com o Jupyter – BSD de 3 cláusulas ● GEOS (Geometry Engine, Open Source) – Adaptação do JTS (Java Topology Suite) para C++ – Biblioteca utilizada pelo PostGIS – LGPL
  • 10.
    Polígonos, pontos eoutras geometrias no Shapely (GIS) 2016-05-27 – GruPy-SP @ CTNovatec 10/34 Danilo de Jesus da Silva Bellini | @danilobellini | facebook.com/djsbellini | github.com/danilobellini Módulo shapely.geometry ● Geometrias – Ponto (Point) – LineString – Polígono (Polygon) – Polígono com buraco ● Distância (distance) ● Área (area) ● Centróide (centroid) ● Dilatação – “Buffer” (método buffer) ● Erosão – “Buffer negativo” ● Geometrias – Ponto (Point) – LineString – Polígono (Polygon) – Polígono com buraco ● Distância (distance) ● Área (area) ● Centróide (centroid) ● Dilatação – “Buffer” (método buffer) ● Erosão – “Buffer negativo” Sintaxe para os polígonos: Polygon(exterior [interior1, Interior2, ...]) Cada parâmetro “exterior” e “interior” é uma lista de pontos ou tuplas com as coordenadas que será convertida em uma LinearRing (LineString fechada)
  • 11.
    Polígonos, pontos eoutras geometrias no Shapely (GIS) 2016-05-27 – GruPy-SP @ CTNovatec 11/34 Danilo de Jesus da Silva Bellini | @danilobellini | facebook.com/djsbellini | github.com/danilobellini Polígonos ● OGC (Open Geospatial Consortium) exige: – Sentido anti-horário no exterior – Sentido horário no interior (buracos) ● Precisam ser fechados! – O Shapely fecha para você ;) ● Validade – Auto-intersecção ● Pontos repetidos ● Deveria ser um MultiPolygon? ● Correção com buffer(0) – Nem sempre funciona… – Método is_valid ● OGC (Open Geospatial Consortium) exige: – Sentido anti-horário no exterior – Sentido horário no interior (buracos) ● Precisam ser fechados! – O Shapely fecha para você ;) ● Validade – Auto-intersecção ● Pontos repetidos ● Deveria ser um MultiPolygon? ● Correção com buffer(0) – Nem sempre funciona… – Método is_valid
  • 12.
    Polígonos, pontos eoutras geometrias no Shapely (GIS) 2016-05-27 – GruPy-SP @ CTNovatec 12/34 Danilo de Jesus da Silva Bellini | @danilobellini | facebook.com/djsbellini | github.com/danilobellini Coleções ● Construção a partir de um iterável com os objetos a serem unificados ● Método geoms – Iterável para acesso às geometrias que compõe a coleção ● Construção a partir de um iterável com os objetos a serem unificados ● Método geoms – Iterável para acesso às geometrias que compõe a coleção
  • 13.
    Polígonos, pontos eoutras geometrias no Shapely (GIS) 2016-05-27 – GruPy-SP @ CTNovatec 13/34 Danilo de Jesus da Silva Bellini | @danilobellini | facebook.com/djsbellini | github.com/danilobellini Predicados e operações com geometrias
  • 14.
    Polígonos, pontos eoutras geometrias no Shapely (GIS) 2016-05-27 – GruPy-SP @ CTNovatec 14/34 Danilo de Jesus da Silva Bellini | @danilobellini | facebook.com/djsbellini | github.com/danilobellini Predicados unários (métodos) ● has_z – Há terceira coordenada? (pontos tridimensionais) ● is_ccw – Is it Counter-ClockWise? (É anti-horário?) ● is_empty – É vazio? – Todas as geometrias podem ser vazias ● is_ring – É fechado (em anel)? ● has_z – Há terceira coordenada? (pontos tridimensionais) ● is_ccw – Is it Counter-ClockWise? (É anti-horário?) ● is_empty – É vazio? – Todas as geometrias podem ser vazias ● is_ring – É fechado (em anel)?
  • 15.
    Polígonos, pontos eoutras geometrias no Shapely (GIS) 2016-05-27 – GruPy-SP @ CTNovatec 15/34 Danilo de Jesus da Silva Bellini | @danilobellini | facebook.com/djsbellini | github.com/danilobellini União, intersecção e diferença ● Métodos óbvios... – union – intersection – difference ● União de múltiplos objetos ou de uma coleção – shapely.ops.cascade_union ● Feito para unir instâncias de Polygon – shapely.ops.unary_union ● União de geometrias em geral ● Métodos óbvios... – union – intersection – difference ● União de múltiplos objetos ou de uma coleção – shapely.ops.cascade_union ● Feito para unir instâncias de Polygon – shapely.ops.unary_union ● União de geometrias em geral
  • 16.
    Polígonos, pontos eoutras geometrias no Shapely (GIS) 2016-05-27 – GruPy-SP @ CTNovatec 16/34 Danilo de Jesus da Silva Bellini | @danilobellini | facebook.com/djsbellini | github.com/danilobellini Diferença simétrica e convex hull ● Método symmetric_difference – Diferença entre a união e a intersecção das geometrias ● Método convex_hull – Menor polígono convexo que contém todas as geometrias da coleção – Também aplicável a uma geometria só ● Método envelope – Similar ao convex_hull, mas resulta em um retângulo ● Método symmetric_difference – Diferença entre a união e a intersecção das geometrias ● Método convex_hull – Menor polígono convexo que contém todas as geometrias da coleção – Também aplicável a uma geometria só ● Método envelope – Similar ao convex_hull, mas resulta em um retângulo
  • 17.
    Polígonos, pontos eoutras geometrias no Shapely (GIS) 2016-05-27 – GruPy-SP @ CTNovatec 17/34 Danilo de Jesus da Silva Bellini | @danilobellini | facebook.com/djsbellini | github.com/danilobellini Predicados binários ● Métodos: – almost_equals – equals – contains – crosses – disjoint – intersects – touches – within ● Métodos: – almost_equals – equals – contains – crosses – disjoint – intersects – touches – within ● Há um predicado unário relativo a cruzamentos: is_simple (geometria não cruza consigo própria) ● A fronteira é usada internamente – Método boundary ● Baseado no DE-9IM ● Há um predicado unário relativo a cruzamentos: is_simple (geometria não cruza consigo própria) ● A fronteira é usada internamente – Método boundary ● Baseado no DE-9IM
  • 18.
    Polígonos, pontos eoutras geometrias no Shapely (GIS) 2016-05-27 – GruPy-SP @ CTNovatec 18/34 Danilo de Jesus da Silva Bellini | @danilobellini | facebook.com/djsbellini | github.com/danilobellini DE-9IM ● Dimensionally Extended Nine-Intersection Model ● Define o significado de diversos “verbos” (predicados binários) – O que significa “intersecciona”, “cruza”, “contém”? – Avalia a dimensionalidade da intersecção entre: ● Interior ● Fronteira ● Exterior de cada geometria (3x3 valores) ● Método relate devolve a matriz 3x3 do DE-9IM como uma string de 9 caracteres – Dígitos com o número de dimensões ou “F” significando “Falso” ● Dimensionally Extended Nine-Intersection Model ● Define o significado de diversos “verbos” (predicados binários) – O que significa “intersecciona”, “cruza”, “contém”? – Avalia a dimensionalidade da intersecção entre: ● Interior ● Fronteira ● Exterior de cada geometria (3x3 valores) ● Método relate devolve a matriz 3x3 do DE-9IM como uma string de 9 caracteres – Dígitos com o número de dimensões ou “F” significando “Falso”
  • 19.
    Polígonos, pontos eoutras geometrias no Shapely (GIS) 2016-05-27 – GruPy-SP @ CTNovatec 19/34 Danilo de Jesus da Silva Bellini | @danilobellini | facebook.com/djsbellini | github.com/danilobellini Formatos vetoriais e integração com outros sistemas
  • 20.
    Polígonos, pontos eoutras geometrias no Shapely (GIS) 2016-05-27 – GruPy-SP @ CTNovatec 20/34 Danilo de Jesus da Silva Bellini | @danilobellini | facebook.com/djsbellini | github.com/danilobellini WKT e WKB ● Well-Known Text and Binary ● Módulos shapely.wkt e shapely.wkb – Funções de load e dump como no módulo json ● Métodos wkt, wkb e wkb_hex – String com a geometria nesses formatos, para integração com outros sistemas ● O “print” das geometrias nos mostra o WKT – Método __str__(self) devolve self.wkt ● Well-Known Text and Binary ● Módulos shapely.wkt e shapely.wkb – Funções de load e dump como no módulo json ● Métodos wkt, wkb e wkb_hex – String com a geometria nesses formatos, para integração com outros sistemas ● O “print” das geometrias nos mostra o WKT – Método __str__(self) devolve self.wkt
  • 21.
    Polígonos, pontos eoutras geometrias no Shapely (GIS) 2016-05-27 – GruPy-SP @ CTNovatec 21/34 Danilo de Jesus da Silva Bellini | @danilobellini | facebook.com/djsbellini | github.com/danilobellini GeoJSON ● Especificação para arquivos JSON contendo a geometria ● Único arquivo: evita quebras em múltiplos arquivos como ocorre no ESRI Shapefile (arquivos shp, dbf, shx, prj) ● CRS (sistema de coordenadas de referência) padrão: WGS84 ● Definição em http://geojson.org/ ● Crie o seu próprio GeoJSON em WGS82: http://geojson.io/ ● Especificação para arquivos JSON contendo a geometria ● Único arquivo: evita quebras em múltiplos arquivos como ocorre no ESRI Shapefile (arquivos shp, dbf, shx, prj) ● CRS (sistema de coordenadas de referência) padrão: WGS84 ● Definição em http://geojson.org/ ● Crie o seu próprio GeoJSON em WGS82: http://geojson.io/
  • 22.
    Polígonos, pontos eoutras geometrias no Shapely (GIS) 2016-05-27 – GruPy-SP @ CTNovatec 22/34 Danilo de Jesus da Silva Bellini | @danilobellini | facebook.com/djsbellini | github.com/danilobellini GeoJSON: Feature e FeatureCollection ● O “type” do objeto do GeoJSON pode ser o de uma geometria, “Feature” ou “FeatureCollection” ● FeatureCollection é uma coleção de Features – Pode ser vazia: {“type”: “FeatureCollection”, “features”: []} ● Feature é uma geometria com propriedades – Contém um objeto “geometry” e um objeto “properties” – As propriedades são [meta]dados associados à geometria (e.g. nome, data de coleta, id, etc.) ● O “type” do objeto do GeoJSON pode ser o de uma geometria, “Feature” ou “FeatureCollection” ● FeatureCollection é uma coleção de Features – Pode ser vazia: {“type”: “FeatureCollection”, “features”: []} ● Feature é uma geometria com propriedades – Contém um objeto “geometry” e um objeto “properties” – As propriedades são [meta]dados associados à geometria (e.g. nome, data de coleta, id, etc.)
  • 23.
    Polígonos, pontos eoutras geometrias no Shapely (GIS) 2016-05-27 – GruPy-SP @ CTNovatec 23/34 Danilo de Jesus da Silva Bellini | @danilobellini | facebook.com/djsbellini | github.com/danilobellini GeoJSON: bbox e crs ● Campos opcionais do GeoJSON – bbox (Bounding box) ● Par de coordenadas que, no dado sistema de coordenadas, define um retângulo que contém a geometria – crs (Coordinate Reference System) ● Objeto que identifica o sistema de coordenadas, e.g. o WGS84 (padrão) pode ser explicitamente identificado com: "crs": {"type": "name", "properties": {"name": "urn:ogc:def:crs:OGC:1.3:CRS84"}} ● Pode aparecer apenas uma vez, e apenas no objeto “raiz” do arquivo GeoJSON ● Podem ser do tipo “name” ou “link” (confuso!) ● http://wiki.geojson.org/Rethinking_CRS ● Campos opcionais do GeoJSON – bbox (Bounding box) ● Par de coordenadas que, no dado sistema de coordenadas, define um retângulo que contém a geometria – crs (Coordinate Reference System) ● Objeto que identifica o sistema de coordenadas, e.g. o WGS84 (padrão) pode ser explicitamente identificado com: "crs": {"type": "name", "properties": {"name": "urn:ogc:def:crs:OGC:1.3:CRS84"}} ● Pode aparecer apenas uma vez, e apenas no objeto “raiz” do arquivo GeoJSON ● Podem ser do tipo “name” ou “link” (confuso!) ● http://wiki.geojson.org/Rethinking_CRS
  • 24.
    Polígonos, pontos eoutras geometrias no Shapely (GIS) 2016-05-27 – GruPy-SP @ CTNovatec 24/34 Danilo de Jesus da Silva Bellini | @danilobellini | facebook.com/djsbellini | github.com/danilobellini __geo_interface__ ● Padrão de interface de informação espacial para objetos Python – Método deve devolver dicionários com geometrias ou features GeoJSON-like ● Definição é do próprio Sean Gillies, criador do Shapely: – https://gist.github.com/sgillies/2217756 ● Facilita interação entre diferentes bibliotecas geoespaciais do Python ● Padrão de interface de informação espacial para objetos Python – Método deve devolver dicionários com geometrias ou features GeoJSON-like ● Definição é do próprio Sean Gillies, criador do Shapely: – https://gist.github.com/sgillies/2217756 ● Facilita interação entre diferentes bibliotecas geoespaciais do Python
  • 25.
    Polígonos, pontos eoutras geometrias no Shapely (GIS) 2016-05-27 – GruPy-SP @ CTNovatec 25/34 Danilo de Jesus da Silva Bellini | @danilobellini | facebook.com/djsbellini | github.com/danilobellini Mais sobre __geo_interface__ ● Função shapely.geometry.shape – Cria uma geometria do Shapely a partir de um objeto com essa interface geo ou um dicionário do Python (e.g. o resultado de json.load) ● Função shapely.geometry.mapping – Devolve a __geo_interface__ do objeto ● Entrada/saída são apenas geometrias no Shapely – Feature e FeatureCollection necessitam de adaptações para usar com o Shapely ● Função shapely.geometry.shape – Cria uma geometria do Shapely a partir de um objeto com essa interface geo ou um dicionário do Python (e.g. o resultado de json.load) ● Função shapely.geometry.mapping – Devolve a __geo_interface__ do objeto ● Entrada/saída são apenas geometrias no Shapely – Feature e FeatureCollection necessitam de adaptações para usar com o Shapely
  • 26.
    Polígonos, pontos eoutras geometrias no Shapely (GIS) 2016-05-27 – GruPy-SP @ CTNovatec 26/34 Danilo de Jesus da Silva Bellini | @danilobellini | facebook.com/djsbellini | github.com/danilobellini Numpy ● Entradas para os construtores das classes do Shapely são iteráveis – Arrays do Numpy também são, logo... ● __array_interface__ – Permite a conversão para arrays do Numpy ● Entradas para os construtores das classes do Shapely são iteráveis – Arrays do Numpy também são, logo... ● __array_interface__ – Permite a conversão para arrays do Numpy ● Possuem __array_interface__: – LineString – LinearRing – Point ● numpy.asarray – Acesso direto ao conteúdo dos objetos, sem cópia ● Possuem __array_interface__: – LineString – LinearRing – Point ● numpy.asarray – Acesso direto ao conteúdo dos objetos, sem cópia
  • 27.
    Polígonos, pontos eoutras geometrias no Shapely (GIS) 2016-05-27 – GruPy-SP @ CTNovatec 27/34 Danilo de Jesus da Silva Bellini | @danilobellini | facebook.com/djsbellini | github.com/danilobellini Algoritmo de Douglas- Peucker
  • 28.
    Polígonos, pontos eoutras geometrias no Shapely (GIS) 2016-05-27 – GruPy-SP @ CTNovatec 28/34 Danilo de Jesus da Silva Bellini | @danilobellini | facebook.com/djsbellini | github.com/danilobellini Simplificação VS suavização ● Simplificação – Remoção de pontos – Diminuição do tamanho dos arquivos ● Suavização – Remoção de “pontas” e “cantos” – Arredondamento – Aumento do número de pontos ● Não há splines (polinômios) ou outras formas de interpolação não-linear ● Simplificação – Remoção de pontos – Diminuição do tamanho dos arquivos ● Suavização – Remoção de “pontas” e “cantos” – Arredondamento – Aumento do número de pontos ● Não há splines (polinômios) ou outras formas de interpolação não-linear
  • 29.
    Polígonos, pontos eoutras geometrias no Shapely (GIS) 2016-05-27 – GruPy-SP @ CTNovatec 29/34 Danilo de Jesus da Silva Bellini | @danilobellini | facebook.com/djsbellini | github.com/danilobellini Douglas-Peucker ● Algoritmo de simplificação de LineString – Aplicável a polígonos ● 1 LineString fechado exterior ● N LineString fechados interior ● Dependência do ponto inicial na descrição do polígono – Implementado na GEOS, método “simplify” no Shapely ● Recursivo – Seja P o ponto mais distante da reta r que liga os 2 pontos extremos A e B da LineString ● distância(P, r) < tolerância – O resultado é a própria reta r (pontos entre A e B são removidos) ● Caso contrário: “split” em P! – Resultado: união do algoritmo de Douglas-Peucker aplicado nas LineStrings de A até P e de P até B ● Algoritmo de simplificação de LineString – Aplicável a polígonos ● 1 LineString fechado exterior ● N LineString fechados interior ● Dependência do ponto inicial na descrição do polígono – Implementado na GEOS, método “simplify” no Shapely ● Recursivo – Seja P o ponto mais distante da reta r que liga os 2 pontos extremos A e B da LineString ● distância(P, r) < tolerância – O resultado é a própria reta r (pontos entre A e B são removidos) ● Caso contrário: “split” em P! – Resultado: união do algoritmo de Douglas-Peucker aplicado nas LineStrings de A até P e de P até B
  • 30.
    Polígonos, pontos eoutras geometrias no Shapely (GIS) 2016-05-27 – GruPy-SP @ CTNovatec 30/34 Danilo de Jesus da Silva Bellini | @danilobellini | facebook.com/djsbellini | github.com/danilobellini Considerações finais
  • 31.
    Polígonos, pontos eoutras geometrias no Shapely (GIS) 2016-05-27 – GruPy-SP @ CTNovatec 31/34 Danilo de Jesus da Silva Bellini | @danilobellini | facebook.com/djsbellini | github.com/danilobellini Unidades e distorções ● Qual a unidade? – Distâncias – Áreas – Ângulos ● Longlat – Em coordenadas esféricas, os valores não significam distância e área pois os dados não são planares ● Projeção (e.g. Mercator, Peters, Albers, etc.) – O sistema de coordenadas especifica a unidade de medida ● e.g. metros na UTM 22 sul http://epsg.io/32722 – Distorções em alguma das medidas ● Área na projeção de Mercator, comparação da Africa e Groenlândia obtida em: http://www.pratham.name/mercator-projection-africa-vs-greenland.html ● Qual a unidade? – Distâncias – Áreas – Ângulos ● Longlat – Em coordenadas esféricas, os valores não significam distância e área pois os dados não são planares ● Projeção (e.g. Mercator, Peters, Albers, etc.) – O sistema de coordenadas especifica a unidade de medida ● e.g. metros na UTM 22 sul http://epsg.io/32722 – Distorções em alguma das medidas ● Área na projeção de Mercator, comparação da Africa e Groenlândia obtida em: http://www.pratham.name/mercator-projection-africa-vs-greenland.html
  • 32.
    Polígonos, pontos eoutras geometrias no Shapely (GIS) 2016-05-27 – GruPy-SP @ CTNovatec 32/34 Danilo de Jesus da Silva Bellini | @danilobellini | facebook.com/djsbellini | github.com/danilobellini Especificação ● Não há splines nesses padrões! Apenas retas… ● Tipos, nomes e especificação das geometrias e dos operadores – Originalmente definidos pela OGC – ISO/IEC 13249-3:2016 – Information technology – Database languages – SQL multimedia and application packages – Part 3: Spatial – ISO 19162:2015 – Geographic information – Well- known text representation of coordinate reference systems ● Não há splines nesses padrões! Apenas retas… ● Tipos, nomes e especificação das geometrias e dos operadores – Originalmente definidos pela OGC – ISO/IEC 13249-3:2016 – Information technology – Database languages – SQL multimedia and application packages – Part 3: Spatial – ISO 19162:2015 – Geographic information – Well- known text representation of coordinate reference systems
  • 33.
    Polígonos, pontos eoutras geometrias no Shapely (GIS) 2016-05-27 – GruPy-SP @ CTNovatec 33/34 Danilo de Jesus da Silva Bellini | @danilobellini | facebook.com/djsbellini | github.com/danilobellini Fundo dos slides feito com: audiolazy shapely rasterio numpy matplotlib
  • 34.
    Polígonos, pontos eoutras geometrias no Shapely (GIS) 2016-05-27 – GruPy-SP @ CTNovatec 34/34 Danilo de Jesus da Silva Bellini | @danilobellini | facebook.com/djsbellini | github.com/danilobellini FIM! Dúvidas? As imagens presentes nos slides anteriores foram obtidas do Wikipedia, da documentação do Shapely e do OpenStreetMap, exceto quando explícito em contrário