×
Namespaces

Variants
Actions
(Difference between revisions)

Archived:J2ME Google Maps API (Português)

From Nokia Developer Wiki
Jump to: navigation, search
hamishwillee (Talk | contribs)
m (Hamishwillee - Bot update - Fix metadata)
hamishwillee (Talk | contribs)
m (Hamishwillee - Fix categories)
Line 1: Line 1:
[[Category:Code Snippet]][[Category:Location]][[Category:Java ME]][[Category:Lang-Portuguese]][[Category:Nokia Belle]][[Category:S60 5th Edition]][[Category:Series 40 Developer Platform 2.0]][[Category:S60 3rd Edition FP2]][[Category:Series 40 Developer Platform 1.0]][[Category:Series 40 Developer Platform 1.1]][[Category:S60 3rd Edition FP1]][[Category:Symbian Anna]][[Category:S60 3rd Edition (initial release)]][[Category:Series 40 6th Edition (initial release)]][[Category:Series 40 6th Edition FP1]][[Category:Symbian^3]]
+
[[Category:Location]][[Category:Java ME]][[Category:Lang-Portuguese]][[Category:Nokia Belle]][[Category:S60 5th Edition]][[Category:Series 40 Developer Platform 2.0]][[Category:S60 3rd Edition FP2]][[Category:Series 40 Developer Platform 1.0]][[Category:Series 40 Developer Platform 1.1]][[Category:S60 3rd Edition FP1]][[Category:Symbian Anna]][[Category:S60 3rd Edition (initial release)]][[Category:Series 40 6th Edition (initial release)]][[Category:Series 40 6th Edition FP1]][[Category:Symbian^3]][[Category:Code Examples]]
 
{{ArticleMetaData <!-- v1.2 -->
 
{{ArticleMetaData <!-- v1.2 -->
 
|sourcecode= [[Media:GoogleMapsMIDletSource.zip]]
 
|sourcecode= [[Media:GoogleMapsMIDletSource.zip]]
Line 305: Line 305:
 
</code>
 
</code>
 
<!-- Translation --> [[en:Google Static Maps API in Java ME]]
 
<!-- Translation --> [[en:Google Static Maps API in Java ME]]
[[Category:Code Examples]]
 

Revision as of 07:12, 14 August 2012

Article Metadata

Exemplo de código
Testado com
Aparelho(s): Nokia X3-02, Nokia 6210N, Nokia 6233, Nokia 701

Compatibilidade
Device(s): since Series 40 6th Edition, since Symbian S60 3rd Edition

Artigo
Tradução:
Por valderind4
Última alteração feita por hamishwillee em 14 Aug 2012

Aqui está uma biblioteca simples para consultar o Google Maps com as seguintes características:

  • Endereços de geocódigos para suas coordenadas geográficas
  • Recuperação de imagens estáticas com tamanho, formato e “zoom” configuráveis.

Para ver um exemplo real desta API, você pode acessar aqui: Java ME Google Maps API sample MIDlet

Contents

Pegue sua própria Google Maps API Key

Para usar o seguinte código, você deverá pegar sua própria Google Maps API Key. Se você não tem uma API Key, você pode seguir as instruções aqui: Como usar os dados do Google Maps em aplicações móveis

Use um servidor Proxy para acessar os serviços do Google Maps

Nota: o tema (uso de proxy) provavelmente não é necessário, mesmo assim o abordaremos.
Quando você obtiver uma Google Maps API key, você insere o endereço e essa chave possibilitará acessar os serviços Google Maps. Por esta razão, você deverá configurar o servidor Proxy neste endereço e este receberá requisições HTTP de seus clientes móveis, remetendo-o para os serviços do Google Maps, que responde de volta.

No código abaixo, você deverá colocar a seguinte requisição:

  • http://www.yourserver.com/error.html requests to http://maps.google.com/maps/geo
  • http://www.yourserver.com/error.html requests to http://maps.google.com/staticmap

Código fonte: classe GoogleMaps

import java.io.ByteArrayOutputStream;
import java.io.InputStream;
 
import javax.microedition.io.Connector;
import javax.microedition.io.HttpConnection;
import javax.microedition.lcdui.Image;
 
public class GoogleMaps
{
String apiKey = null;
 
//estas duas propriedades serão usadas com o método de rolagem dos mapas.Você pode remove-lo se não for necessário.
int offset = 268435456;
double radius = offset / Math.PI;
 
public GoogleMaps(String apiKey)
{
this.apiKey = apiKey;
}
 
public double[] geocodeAddress(String address) throws Exception
{
byte[] res = loadHttpFile(getGeocodeUrl(address));
 
String resString = new String(res, 0, res.length);
 
String[] data = split(resString, ',');
 
if(data[0].compareTo("200") != 0)
{
int errorCode = Integer.parseInt(data[0]);
 
throw new Exception("Google Maps Exception: " + getGeocodeError(errorCode));
}
else
{
return new double[]{
Double.parseDouble(data[2]),
Double.parseDouble(data[3])
};
}
}
public Image retrieveStaticImage(int width, int height, double lat, double lng, int zoom, String format) throws Exception
{
byte[] imageData = loadHttpFile(getMapUrl(width, height, lng, lat, zoom, format));
 
return Image.createImage(imageData, 0, imageData.length);
}
 
String getGeocodeError(int errorCode)
{
switch(errorCode)
{
case 400:
return "Bad request";
case 500:
return "Server error";
case 601:
return "Missing query";
case 602:
return "Unknown address";
case 603:
return "Unavailable address";
case 604:
return "Unknown directions";
case 610:
return "Bad API key";
case 620:
return "Too many queries";
default:
return "Generic error";
}
}
 
String getGeocodeUrl(String address)
{
return "http://maps.google.com/maps/geo?q=" + urlEncode(address)
+ "&output=csv&key=" + apiKey;
}
String getMapUrl(int width, int height, double lng, double lat, int zoom, String format)
{
return "http://maps.google.com/maps/api/staticmap?center=" +
lat + "," + lng + "&format=" + format + "&zoom=" + zoom + "&size=" +
width + "x" + height + "&key=" + apiKey;
}
String urlEncode(String str)
{
StringBuffer buf = new StringBuffer();
char c;
for(int i = 0; i < str.length(); i++)
{
c = str.charAt(i);
if ((c >= '0' && c <= '9')||
(c >= 'A' && c <= 'Z')||
(c >= 'a' && c <= 'z'))
{
buf.append(c);
}
else
{
buf.append("%").append(Integer.toHexString((int) str.charAt(i)));
}
}
return buf.toString();
}
byte[] loadHttpFile(String url) throws Exception
{
HttpConnection hc = null;
 
InputStream is = null;
 
byte[] byteBuffer = null;
 
try
{
hc = (HttpConnection) Connector.open(url);
 
hc.setRequestMethod(HttpConnection.GET);
 
int ch;
 
is = hc.openInputStream();
 
int len = (int)hc.getLength();
 
if(len > 0)
{
byteBuffer = new byte[len];
 
is.read(byteBuffer);
}
else
{
ByteArrayOutputStream bos = new ByteArrayOutputStream();
 
while ((ch = is.read()) != -1)
{
bos.write(ch);
}
byteBuffer = bos.toByteArray();
 
bos.close();
}
}
catch(Exception e)
{
e.printStackTrace();
}
finally
{
try
{
if(is != null)
is.close();
 
if(hc != null)
hc.close();
}
catch(Exception e2)
{
e2.printStackTrace();
}
}
return byteBuffer;
}
static String[] split(String s, int chr)
{
Vector res = new Vector();
 
int curr = 0;
int prev = 0;
 
while((curr = s.indexOf(chr, prev)) >= 0)
{
res.addElement(s.substring(prev, curr));
 
prev = curr + 1;
}
res.addElement(s.substring(prev));
 
String[] splitted = new String[res.size()];
 
res.copyInto(splitted);
 
return splitted;
}
}

Utilidade do método de rolagem para o mapa

Se você necessita de usar rolagem no seu mapa, você precisa calcular o novo centro para sua imagem estática. O método adjust() retornará o novo centro de latitude e longitude do mapa, aceitando os seguintes argumentos:

  • as atuais coordenadas de latitute e longitude
  • o deltaX e deltaY, em pixels, do centro do mapa
  • o nível de zoom


O código original, em JavaScript, está dispónivel em: http://home.provide.net/~bratliff/adjust.js

Nota: para usar o seguinte método, você deverá incluir no seu projeto a biblioteca MicroFloat, disponível em: MicroFloat website

public double[] adjust(double lat, double lng, int deltaX, int deltaY, int z)
{
return new double[]{
XToL(LToX(lat) + (deltaX<<(21-z))),
YToL(LToY(lng) + (deltaY<<(21-z)))
};
}
double LToX(double x)
{
return round(offset + radius * x * Math.PI / 180);
}
 
double LToY(double y)
{
return round(
offset - radius *
Double.longBitsToDouble(MicroDouble.log(
Double.doubleToLongBits(
(1 + Math.sin(y * Math.PI / 180))
/
(1 - Math.sin(y * Math.PI / 180))
)
)) / 2);
}
 
double XToL(double x)
{
return ((round(x) - offset) / radius) * 180 / Math.PI;
}
 
double YToL(double y)
{
return (Math.PI / 2 - 2 * Double.longBitsToDouble(
MicroDouble.atan(
MicroDouble.exp(Double.doubleToLongBits((round(y)-offset)/radius))
)
)) * 180 / Math.PI;
}
double round(double num)
{
double floor = Math.floor(num);
 
if(num - floor >= 0.5)
return Math.ceil(num);
else
return floor;
}

Código fonte: uso simples

J2me google maps.jpg
Para usar esta classe, você primeiramente argumenta-a com sua API key:

GoogleMaps gMap = new GoogleMaps("API_KEY");

Para um endereço em geocódigo, você pode usar o método geocodeAddress():

double[] lanLng = gMap.geocodeAddress("Leicester Square, London");

Para buscar imagem de um mapa:

Image map = gMap.retrieveStaticImage(320, 240, 51.510605, -0.130728, 8, "png32");
115 page views in the last 30 days.

Was this page helpful?

Your feedback about this content is important. Let us know what you think.

 

Thank you!

We appreciate your feedback.

×