O site OpenStreetMap Data disponibiliza camadas dos continentes, oceano, entre outras. Estas informações são bastante utilizadas em qualquer mapa como base, mas dependendo do caso, ter a camada completa não é interessante.

Por isso, vamos ensinar como você pode baixar esse dado e realizar o recorte (clipe) apenas da informação que deseja. Neste exemplo vamos utilizar o arquivo de oceano para poder explicar como realizar o procedimento.

Baixe o arquivo de polígonos do oceano completo, que está disponível em http://openstreetmapdata.com/data/water-polygons

Importe o arquivo em uma base de dados PostgreSQL, com o nome ocean_all, para que possamos recortar no tamanho desejado no banco de dados:

shp2pgsql -s 4326 -I -D water_polygons.shp ocean_all | osm psql

Para realizar o recorte da tabela ocean_all você deve utilizar o SQL descrito abaixo. Para você entender melhor, ele primeiro calcula a extensão da área de trabalho (extent), em seguida, usa essa medida para o recorte da tabela completa (com dados de todo o mundo), criando uma nova tabela denominada ocean, apenas com os dados locais.

CREATE TABLE ocean AS
WITH bounds AS (
  SELECT ST_SetSRID(ST_Extent(way)::geometry,4326) AS geom
  FROM planet_osm_line
  )
SELECT 1 AS id, ST_Intersection(b.geom, o.geom) AS geom
FROM bounds b, ocean_all o
WHERE ST_Intersects(b.geom, o.geom);

Note que utilizei informações da tabela planet_osm_line, esta tabela encontra-se no post “Publicando mapa com dados do OpenStreetMap (Parte 1)” deste blog.

Caso você não tenha esta tabela, você pode usar uma outra que tenha o extent da região selecionada ou criar o polígono em hora de execução e substitui o trecho abaixo:

ST_Extent(way)::geometry

Por:

SELECT ST_GeomFromText('POLYGON((-71.1776585052917 42.3902909739571,-71.1776820268866 42.3903701743239,
-71.1776063012595 42.3903825660754,-71.1775826583081 42.3903033653531,-71.1776585052917 42.3902909739571))');

Lembrando que as coordenadas tem que ser substituídas pelas coordenadas que representam a sua área de influência.