Conteúdo


Faça seu próprio mashup baseado em mapas

Crie um serviço KML com base em dados ESRI shapefile

Comments

Mashups baseados em mapas são onipresentes atualmente, em grande parte porque os serviços que podem ser combinados estão amplamente disponíveis. Para um mashup baseado em mapas, são necessários serviços que fornecem limites cartográficos. O U.S. Census Bureau divulga dados sobre limites de estados, condados e códigos postais no formato ESRI (Environmental Systems Research Institute) shapefile. Neste artigo, saiba como criar um serviço simples para fornecer arquivos KML com base em ESRI shapefiles usando software livre.

Tecnologia e produtos de software

Há muitas ferramentas e produtos, tanto comerciais quanto de software livre, que você pode usar para trabalhar com dados espaciais e criar mashups. O exemplo deste artigo usa software livre: PostGIS como banco de dados, biblioteca GeoTools Java™, biblioteca de mapas OpenLayers e Apache Tomcat como servidor de aplicativos.

PostGIS
Uma extensão espacial do banco de dados relacional de software livre PostgresSQL. O PostGIS suporta tipos e funções de dados espaciais, conforme descrito pelo padrão OpenGIS Simple Features Specification para SQL.
GeoTools
Uma biblioteca Java para realizar a manipulação de dados espaciais. O GeoTools inclui:
  • Suporte para vários formatos de dados espaciais (como ESRI shapefile, Geography Markup Language (GML), MapInfo Interchange Format (MIF)) e transformações espaciais.
  • O Java Topology Suite (JTS), da Vivid Solutions, que define classes Java para representar dados espaciais.

A solução de exemplo usa o GeoTools para transformações espaciais e o JTS para converter os dados do objeto binário grande (BLOB) do banco de dados para uma geometria.

OpenLayers
Uma biblioteca de mapas em JavaScript de software livre que permite adicionar mapas dinâmicos a páginas da Web. É possível sobrepor marcadores, linhas e polígonos a mapas de base. O exemplo deste artigo usa o recurso do OpenLayers de adicionar uma camada sobre um mapa de base de um arquivo KML.
Apache Tomcat
Um contêiner servlet e J2EE JSP de software livre usado no exemplo para implantar o serviço.

Faça o download do código de exemplo usado neste artigo. Consulte Recursos para saber quais softwares foram usados no exemplo.

Preparação

Esta seção explica como se preparar para criar o aplicativo de exemplo deste artigo.

Arquitetura lógica

A Figura 1 mostra a arquitetura lógica da solução de exemplo.

Figura 1. Arquitetura lógica
Image showing logical architecture
Image showing logical architecture

Dados de limites

O U.S. Census Bureau usa o formato e o banco de dados Topologically Integrated Geographic Encoding and Referencing (TIGER) para descrever e publicar atributos de território como estradas, prédios, rios, lagos e zonas do censo. O banco de dados TIGER inclui um conjunto de dados com os limites cartográficos de estados, condados, cidades e códigos postais. Esse conjunto de dados está no formato ESRI shapefile (consulte Recursos). O exemplo usa os limites estaduais no formato ESRI shapefile.

Obtendo os dados

O U.S Census Bureau fornece um conjunto de dados de limites estaduais nos formatos ARC/INFO Export (.e00), ARC/INFO Ungenerate e ESRI shapefile (.shp). Este artigo usa o formato ESRI shapefile. Os limites estaduais estão disponíveis para cada estado individualmente e há um shapefile que inclui todos os limites estaduais. O exemplo usa o shapefile para todos os estados (st99_d00_shp.zip).

Descompacte o conteúdo do arquivo st99_d00_shp.zip para obter o shapefile st99_d00.shp e os arquivos associados (st99_d00.shx e st99_d00.dbf).

Importando os dados para o PostGIS

O PostGIS não fornece um utilitário para importar dados diretamente no formato ESRI shapefile para o banco de dados (como o IBM® DB2® faz). É necessário executar um processo em duas etapas para importar dados para o PostGIS:

  1. O PostGIS fornece a ferramenta shp2pgsql, que permite converter ESRI shapefiles em instruções INSERT adequadas para SQL. Para usar essa ferramenta para criar um arquivo com instruções SQL INSERT com base no shapefile, use o comando shp2pgsql st99_d00.shp testdb.state_bounds > statebounds.sql. Esse comando, sem opções de linha de comando, pressupõe o valor padrão -1 para o SRS ID. Isso é adequado para os objetivos deste artigo, já que você usará o GeoTools para projeções reversas e não os recursos do banco de dados para transformações de coordenadas.
  2. Depois de confirmar que o banco de dados foi iniciado, execute o comando psql para executar o script.

Por padrão, o arquivo SQL criado pela ferramenta shp2pgsql conterá table create e a instrução para adicionar a coluna de geometria à tabela. É possível usar várias opções de linha de comando da ferramenta para não criar a tabela. (Consulte Recursos para obter informações sobre a documentação do PostGIS.)

Validando a importação

É possível validar o processo de importação usando uma ferramenta de administração, como pgAdmin III, ou executando instruções SQL SELECT na tabela. É possível experimentar funções do PostGIS, como AsText() e AsBinary(), na coluna de geometria para confirmar que a importação foi bem-sucedida.

O aplicativo

O aplicativo para criar o KML com base nos dados importados será um servlet J2EE. Esse servlet:

  • Receberá o código FIPS de estado com entrada.
  • Consultará o banco de dados.
  • Executará a transformação de coordenadas.
  • Criará um KML com base nos dados.

Informações sobre os dados

Os dados importados para o banco de dados podem ter mais de uma linha para um determinado código FIPS de estado. Talvez existam várias áreas não contíguas de território que formem um determinado estado. Por exemplo, o estado do Alasca compreende várias ilhas. Para manter a simplicidade do seu aplicativo, selecionaremos apenas a porção de território com a maior área.

Consultando o banco de dados e lendo a geometria

Os dados geográficos podem ser representados em dois formatos: Well Known Binary (WKB) e Well Known Text (WKT). O PostGIS fornece as funções AsBinary() e AsText() para converter a coluna de geometria para representações WKB e WKT dos dados, respectivamente. A instrução SQL para consultar os dados está na Listagem 1.

Listagem 1. Consulta para recuperar o limite estadual no formato WKB
String stateBoundsSql = "SELECT AsBinary(the_geom), name FROM state_bounds WHERE 
   state = '"	+ stateCd + "' ORDER BY area DESC LIMIT 1";

A biblioteca do GeoTools inclui o Java Topology Suite (JTS), que tem a classe WKBReader para converter representações de geometria WKB em objetos Java que representam a geometria. Você o usará para converter os dados de limite de estado em um objeto Java MultiPolygon, que é outra classe JTS. A Listagem 2 mostra um exemplo.

Listagem 2. Leia a geometria para um objeto Java JTS
WKBReader wkbRead = new WKBReader();
Geometry geom = wkbRead.read(resultSet.getBytes(1));
MultiPolygon multiPolygon = (MultiPolygon) geom;

Transformações de coordenadas

Os dados importados do U.S. Census Bureau estão em um sistema de referência espacial baseado no North American Datum 1983 (NAD83). Ele usa uma aproximação elipsoide para a Terra. Bibliotecas de mapas baseadas na Web, como OpenLayers, Google Maps e Microsoft® Bing, são todas baseadas nos dados do World Geodetic System (WGS). Para simplificar os cálculos envolvidos na exibição de dados no mapa baseado na Web, essas bibliotecas pressupõem uma Terra esférica, não elipsoide. Portanto, os dados precisam ser transformados para poderem ser sobrepostos aos mapas baseados na Web. É possível usar as funções de transformação fornecidas pela biblioteca do GeoTools, conforme mostrado na Listagem 3.

Listagem 3. Criar um objeto de transformação
String SOURCE_WKT = "GEOGCS[\"GCS_North_American_1983\",DATUM[\"D_North_American_1983\",
   SPHEROID[\"GRS_1980\",6378137.0,298.257222101]],PRIMEM[\"Greenwich\",0.0],UNIT[
   \"Degree\",0.0174532925199433]], AXIS[\"Latitude\",NORTH]]";

String TARGET_WKT = "GEOGCS[\"WGS 84\",DATUM[\"World Geodetic System 1984\",SPHEROID[
   \"WGS 84\", 6378137.0, 298.257223563, AUTHORITY[\"EPSG\",\"7030\"]],AUTHORITY[\"EPSG\",
   \"6326\"]],PRIMEM[\"Greenwich\", 0.0,AUTHORITY[\"EPSG\",\"8901\"]],UNIT[\"degree\",
     0.017453292519943295],AXIS[\"Geodetic latitude\", NORTH],AXIS[\"Geodetic longitude\",
    EAST],AUTHORITY[\"EPSG\",\"4326\"]]";

CRSFactory crsFactory = FactoryFinder.getCRSFactory(null);
CoordinateReferenceSystem sourceCRS = crsFactory
					.createFromWKT(SOURCE_WKT);
CoordinateReferenceSystem targetCRS = crsFactory
					.createFromWKT(TARGET_WKT);
Hints hint = new Hints(Hints.LENIENT_DATUM_SHIFT, true);
CoordinateOperationFactory coFactory = FactoryFinder.getCoordinateOperationFactory(hint);
CoordinateOperation co = coFactory.createOperation(sourceCRS,targetCRS);
MathTransform transform = co.getMathTransform();

Depois que você tiver o objeto para executar as transformações de coordenadas, passe pares de coordenadas para transformá-los, um de cada vez. A Listagem 4 mostra um exemplo.

Listagem 4. Transformar as coordenadas
Coordinate[] coordinates = multiPolygon.getCoordinates();
for (int i = 0; i < coordinates.length; i++) {
	Coordinate coordinate = coordinates[i];
	double x = coordinate.x;
	double y = coordinate.y;
	DirectPosition point = new GeneralDirectPosition(x, y);
	point = transform.transform(point, point);
	double lat = point.getOrdinate(0);
	double lng = point.getOrdinate(1);
..
}

Criando o KML

Agora que as coordenadas estão transformadas, é necessário apenas usá-las para construir um documento KML. (Consulte Recursos para obter informações sobre a documentação do KML.) Um documento KML para representar dados poligonais tem o layout mostrado abaixo.

Listagem 5. Exemplo de KML para representar dados poligonais
<?xml version="1.0" encoding="UTF-8"?>
<kml xmlns="http://earth.google.com/kml/2.0">
	<Document>
		<Placemark>
			<MultiGeometry>
				<Style>
					<PolyStyle>
						<color>66FF0000</color>
						<colorMode>normal</colorMode>
						<fill>1</fill>
						<outline>0</outline>
					</PolyStyle>
				</Style>
				<Polygon>
					<LinearRing>
						<coordinates>-109.045,36.99,0
							-109.0451,36.967,0
							-109.0452,36.968,0
							-109.0452,36.958,0
							-109.045,36.99,0
						</coordinates>
					</LinearRing>
				</Polygon>
			</MultiGeometry>
		</Placemark>
	</Document>
</kml>

Para manter a simplicidade do código deste artigo, não usaremos um analisador XML ou um JAXB para criar o documento KML. Você criará o KML anexando cadeias de caracteres, conforme mostrado na Listagem 6.

Listagem 6. Criar um documento KML
String kmlHeader = "<?xml version=\"1.0\" encoding=\"UTF-8\"?><kml
    xmlns=\"http://earth.google.com/kml/2.0\"><Document><Placemark><MultiGeometry>
<Style><PolyStyle>
   <color>66FF0000</color><colorMode>normal</colorMode><fill>1</fill>
<outline>0</outline></PolyStyle></Style><Polygon><LinearRing><coordinates>";
String kmlFooter = "</coordinates></LinearRing></Polygon></MultiGeometry></Placemark>
   </Document></kml>";
String kmlBody = "";
for (int i = 0; i < coordinates.length; i++) {
	..
	double lat = point.getOrdinate(0);
	double lng = point.getOrdinate(1);
	kmlBody += lng + "," + lat + "," + 0 + "\n";
}

Visualizando o KML

O serviço para fornecer um documento KML que descreve o limite de um estado está pronto. A próxima etapa é criar uma página da Web que usará esse serviço para exibir o limite em um mapa usando o OpenLayers.

Listagem 7. O JavaScript usará o serviço KML para sobrepor a forma no mapa
map.addLayer(new OpenLayers.Layer.GML("KML",
 "http://localhost:8080/OpenKML/StateKml?stateCd=04", 
   {
	format: OpenLayers.Format.KML, 
	formatOptions: {
	extractStyles: true, 
	extractAttributes: true,
	maxDepth: 2
   }
}));

A Figura 2 abaixo mostra a sobreposição KML do Arizona usando o OpenLayer sobre um mapa base do Metacarta.

Figura 2. A sobreposição do KML no mapa do OpenLayers
Image showing KML overlay on                     OpenLayers map
Image showing KML overlay on OpenLayers map

Conclusão

Com mashups, as empresas podem aproveitar o potencial de todos os tipos de dados. Agora é possível conferir aos usuários a capacidade de criar aplicativos situacionais por uma fração do custo dos paradigmas tradicionais de desenvolvimento de aplicativos.

Os mashups de inteligência de localização e os mashups baseados em mapas são categorias populares de mashups. Com o advento dos provedores de mapas baseados na Web, agora é fácil criar mashups baseados em mapas com investimento de capital mínimo ou nulo. Neste artigo, você aprendeu a usar software livre para criar um serviço de limites KML com base em um ESRI shapefile que pode ser usado em mashups.


Recursos para download


Temas relacionados


Comentários

Acesse ou registre-se para adicionar e acompanhar os comentários.

static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=80
Zone=Software livre
ArticleID=472364
ArticleTitle=Faça seu próprio mashup baseado em mapas
publish-date=03082010