Uma aplicação utilizando Location API e Google Maps
Dados do artigo
Artigo
Neste post eu irei mostrar-lhes uma aplicação interessante com a Location API. O objetivo é obter a posição do dispositivo através de GPS (com a Location API - JSR 179) e desejar a posição com o Google Maps.
A Location API (JSR 179)
A API Location (JSR 179 - pacote opcional) javax.microedition.location visa ajudar o desenvolvimento de aplicativos e serviços baseados em localização para dispositivos com recursos limitados, como telefones celulares. A aplicação deve ser definida para CLDC 2.0 (CLDC 1.0 não suporta o número de ponto flutuante, que a API utiliza para representar coordenadas e outras medidas).
A API do Google Map
Observação: Utilização deste código com a chave livre do Google Maps API infringe os termos do Google [Termos e Condições http://code.google.com/apis/maps/terms.html] (art. 10.8). Você deve comprar uma licença se você quiser utilizar a API do Google Maps, como mostrado neste exemplo.
A API do Google Maps permite-lhe incorporar o Google Maps em suas próprias páginas web com JavaScript. Portanto, vamos apenas usar um web services baseado em REST para obter a imagem do mapa e desenhar na tela do dispositivo. Nós só devemos requisitar o map através do endereçohttp://maps.google.com/staticmap?params
Exemplo
A ideia básica é: (1) obter a posição do GPS e (2) passar a latitude e a longitude para os Web Services REST (URL) do Google Maps, (3) obter a imagem de resposta do servidor no formato de array de bytes. Assim, nosso primeiro passo é mostrado abaixo: O algoritmo abaixo deve ser implementada em uma thread diferente. Caso contrário, a interface do usuário pode ser bloqueada até que a resposta seja finalizada.
Criteria cr = new Criteria();
cr.setHorizontalAccuracy(500);
cr.setPreferredPowerConsumption(Criteria.NO_REQUIREMENT);
LocationProvider provider = null;
Location location = null;
try {
provider = LocationProvider.getInstance(cr);
location = provider.getLocation(120);
provider.setLocationListener(this, -1, 0, 0);
} catch (LocationException e) {
alert = new Alert("Error", "Location API Error", null, AlertType.ERROR);
} catch (InterruptedException e) {
alert = new Alert("Error", "Thread Error", null, AlertType.ERROR);
}
Coordinates c = location.getQualifiedCoordinates();
if(c != null) {
this.lat = c.getLatitude();
this.lon = c.getLongitude();
}
No início do código de exemplo acima, primeiro defini-se alguns critérios para a localização dos serviços de localização GPS. Campos de critérios incluem: precisão o tempo de resposta, a necessidade de altitude e velocidade. Estes campos de critérios irá filtrar a LocationProvider que satisfaça os valores indicados. Depois de obtido um objeto LocationProvider, o aplicativo pode usar esse objeto para obter a localização, em qualquer uma das duas maneiras:
- Invocar um método de forma síncrona para obter um único local.
- Registrar um ouvinte e obter atualizações periódicas, em intervalos definidos.
Os resultados de localização podem ser obtidos com a classe Location. Uma instância desta classe pode disponibilizar algumas informações essenciais, tais como: coordenadas, velocidade e endereço textual (se disponível), e um valor cronológico que indica quando as medições de localização foram feitas.
As coordenadas podem ser representadas em duas classes diferentes:
- Coordenadas: um ponto de latitude e longitude em graus e altitude em metros.
- QualifiedCoordinates: latitude, longitude e altitude, e também uma indicação da sua exactidão, representado como o raio de uma área.
Finalmente, temos as nossos principais informações: latitude (através do método c.getLatitude()) e longitude (através do método c.getLongitude()). Tudo o que temos de fazer agora é abrir uma conexão HTTP com o servidor do Google Maps.
HttpConnection httpConnection = null;
InputStream inputStream = null;
byte[] buffer = null;
try {
httpConnection = (HttpConnection) Connector.open(url);
httpConnection.setRequestMethod(HttpConnection.GET);
is = httpConnection.openInputStream();
int length = (int)httpConnection.getLength();
if(length > 0) {
buffer = new byte[length];
is.read(buffer);
} else {
int c;
ByteArrayOutputStream byteArray = new ByteArrayOutputStream();
while ((c = inputStream.read()) != -1) {
byteArray.write(c);
}
buffer = byteArray.toByteArray();
byteArray.close();
}
} catch(Exception e) {
alert = new Alert("Error", "Falha na conexão", null, AlertType.ERROR);
} finally {
try {
if(inputStream != null)
inputStream !=.close();
if(httpConnection != null)
httpConnection.close();
}
catch(Exception e2) {
alert = new Alert("Error", "Erro de IO!", null, AlertType.ERROR);
}
}
return buffer;
O código acima abre uma conexão HTTP com um determinado URL e recebe a resposta do servidor. Esta URL é um Web Service REST disponibilizado pelo Google Maps, e é como segue:
http://maps.google.com/staticmap?center=lat,lon&zoom=16&size=200x200&maptype=mobile&markers=lat,lon,ref/&key=MAPS_API_KEY
In this URL, we set some parameters for the static image: latitude and longitude, its zoom and its size (200x200), the map type (for mobile application) and a marker plotted based on lat and lon values. In our example, the application got (through GPS positioning) the Federal University of Campina Grande latitude and longitude values.
Nesta URL, define-se alguns parâmetros para a imagem estática: latitude e longitude, o seu zoom e seu tamanho (200x200), o tipo de mapa (para celular) e um marcador de localização com base em valores de lat (latitude) e lon (longitude). No nosso exemplo, a aplicação tem (através de posicionamento GPS) a latitude e a longitude da Universidade Federal de Campina Grande.
A imagem retornada pelo web service (byte[]) é utilizado para desenhar o mapa na tela.
Form f = new Form("Map");
f.append(Image.createImage(buffer, 0, buffer.length))
O resultado é:


ola, sou estudante de mestrado da universidade de osaka, no japao e minha pesquisa eh focada em um estudo comparativo de localizacao por GPS ou WiFi para um barco de turismo em movimento, se essa eh a melhor traducao para [WiFi and GPS location estimation in realtime for river cruise]
isso trabalha com o conceito de "location aware". no meu caso eu proponho um sistema em que um usuario de transporte de barco (munido de um notebook com conexao sem fio) possa saber sua localizacao em tempo real e navegar por conteudo de web referente ao espaco por onde ele esta passando.
estou desenvolvendo um website com toda a informacao ao redor do rio onde passa o barco. uso o API do GoogleMaps para o site (javascript) para o sistema de localizacao por WiFi (estimativa pelo numero de APs existentes ao redor) eu uso um script aberto de uma companhia japonesa chamada PlaceEngine. o codigo esta em Javascript, e o calculo eh feito comunicando com o servidor dessa companhia.
ja para o GPS, uso um simples GPS com entrada USB que pode ser conectada ao computador para transferencia de dados (lat, long). minha duvida eh:
" Existe uma forma no script em que eu possa "extrair" essa informacaso em tempo real para que possa ser vista no meu mapa quer esta no site?" "seria necessario a transferencia desses dados em tempo real pro servidor para que possam ser publicados?"
tentei buscar referencias na web, mas so encontro exemplos em que esses dados sao captados de antemao e depois publicados no servidor que hospeda a home page. se so assim for possivel destroi minha teoria de "tempo real".