Geometrias Shapely e relações espaciais

Trabalhando com Dados Geoespaciais em Python

Dani Arribas-Bel

Geographic Data Science Lab (University of Liverpool)

Valores escalares de geometria

cities = geopandas.read_file("ne_110m_populated_places.shp")
cities.head()
           name                                      geometry
0  Vatican City   POINT (12.45338654497177 41.90328217996012)
1    San Marino     POINT (12.44177015780014 43.936095834768)
2         Vaduz   POINT (9.516669472907267 47.13372377429357)
3       Lobamba  POINT (31.19999710971274 -26.46666746135247)
4    Luxembourg   POINT (6.130002806227083 49.61166037912108)
brussels = cities.loc[170, 'geometry']
print(brussels)
POINT (4.33137074969045 50.83526293533032)
Trabalhando com Dados Geoespaciais em Python

Valores escalares de geometria

brussels = cities.loc[170, 'geometry']
print(brussels)
POINT (4.33137074969045 50.83526293533032)
type(brussels)
shapely.geometry.point.Point
Trabalhando com Dados Geoespaciais em Python

O pacote Shapely em Python

type(brussels)
shapely.geometry.point.Point

Shapely

  • Pacote Python para manipular e analisar objetos geométricos
  • Fornece os objetos Point, LineString e Polygon
  • GeoSeries (coluna "geometry" do GeoDataFrame) é composta por objetos shapely
Trabalhando com Dados Geoespaciais em Python

Objetos de geometria

Acessando de um GeoDataFrame:

brussels = cities.loc[170, 'geometry']
paris = cities.loc[235, 'geometry']
belgium = countries.loc[countries['name'] == 'Belgium', 'geometry'].squeeze()
france = countries.loc[countries['name'] == 'France', 'geometry'].squeeze()
uk = countries.loc[countries['name'] == 'United Kingdom', 'geometry'].squeeze()

Criando manualmente:

from shapely.geometry import Point
p = Point(1, 2)
print(p)
POINT (1 2)
Trabalhando com Dados Geoespaciais em Python

Métodos espaciais

A área de uma geometria:

belgium.area
3.8299974609075753

A distância entre 2 geometrias:

brussels.distance(paris)
2.8049127723186214

E muito mais! (ex.: centroid, simplify, ...)

Trabalhando com Dados Geoespaciais em Python

Relações espaciais

geopandas.GeoSeries([belgium, france, uk, paris,  brussels, line]).plot()

Trabalhando com Dados Geoespaciais em Python

Relações espaciais

belgium.contains(brussels)
True
france.contains(brussels)
False
brussels.within(belgium)
True
belgium.touches(france)
True
line.intersects(france)
True
line.intersects(uk)
False
Trabalhando com Dados Geoespaciais em Python

Vamos praticar!

Trabalhando com Dados Geoespaciais em Python

Preparing Video For Download...