Faça seu próprio mashup baseado em mapas

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

Há uma grande quantidade de mashups baseados em mapas atualmente. Os mashups exigem serviços que possam ser combinados. Os mashups baseados em localização precisam de serviços que forneçam informações sobre limites. Com os provedores de mapas baseados na Web, é possível criar facilmente um mashup baseado em mapas com investimento de capital mínimo ou nulo. Neste artigo, saiba como criar um serviço de limites KML com base em um ESRI shapefile a ser usado em mashups.

Shyam Sundar Nagarajan, Architect, Cognizant Technology Solutions

Shyam photoShyam Sundar Nagarajan é arquiteto sênior da prática de Seguros da Cognizant Technology Solution. Ele tem mestrado em sistemas de software. Ele é um parceiro SOA certificado pela IBM e Mestre Certificado em Scrum. Suas áreas de interesse são software livre, GIS e mashups.



08/Mar/2010

Introdução

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

GIS— Geographical information systems

KML— Keyhole markup language

Mashup— Um aplicativo híbrido da Web que combina dados de mais de uma fonte em uma experiência integrada

TIGER— Topologically integrated geographic encoding and referencing

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

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

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.


Download

DescriçãoNomeTamanho
Sample codeos-kmlservice-SourceFiles.zip11KB

Recursos

Aprender

Obter produtos e tecnologias

  • Faça download do PostGIS. As versões de número principal têm importantes marcos de funcionalidade (suporte a objetos, indexação espacial, suporte a suporte a servidores de mapas, suporte SRID); versões de número secundário apresentam correções de erros e pequenos aprimoramentos de recursos para a comunidade geral de usuários.
  • Faça download do Apache Tomcat da Apache Software Foundation.
  • Obtenha os ESRI shapefiles de estados do U.S. Census Bureau.
  • Inove em seu próximo projeto de desenvolvimento de software livre com o software de avaliação da IBM, disponível para download ou em DVD.
  • Faça download das versões de avaliação de produtos IBM ou explore as avaliações on-line no IBM SOA Sandbox e use as ferramentas de desenvolvimento de aplicativos e produtos de middleware do DB2®, Lotus®, Rational®, Tivoli® e WebSphere®.

Discutir

Comentários

developerWorks: Conecte-se

Los campos obligatorios están marcados con un asterisco (*).


Precisa de um ID IBM?
Esqueceu seu ID IBM?


Esqueceu sua senha?
Alterar sua senha

Ao clicar em Enviar, você concorda com os termos e condições do developerWorks.

 


A primeira vez que você entrar no developerWorks, um perfil é criado para você. Informações no seu perfil (seu nome, país / região, e nome da empresa) é apresentado ao público e vai acompanhar qualquer conteúdo que você postar, a menos que você opte por esconder o nome da empresa. Você pode atualizar sua conta IBM a qualquer momento.

Todas as informações enviadas são seguras.

Elija su nombre para mostrar



Ao se conectar ao developerWorks pela primeira vez, é criado um perfil para você e é necessário selecionar um nome de exibição. O nome de exibição acompanhará o conteúdo que você postar no developerWorks.

Escolha um nome de exibição de 3 - 31 caracteres. Seu nome de exibição deve ser exclusivo na comunidade do developerWorks e não deve ser o seu endereço de email por motivo de privacidade.

Los campos obligatorios están marcados con un asterisco (*).

(Escolha um nome de exibição de 3 - 31 caracteres.)

Ao clicar em Enviar, você concorda com os termos e condições do developerWorks.

 


Todas as informações enviadas são seguras.


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