版权申明:http://yarin.iteye.com/blog/453262
最近在Android的学习中,感觉到Android中使用Google Map Api很强大,于是乎想在J2me上来使用Google Map Api,搜索了一下,果然已经有很多人实现过了。
当然,要使用Google Map Api首先就得申请“Google Maps API Key”。这里就不多说了,不会的点击这里。
同样,早有人实现了,大家也可以查看效果:Java ME Google Maps API sample MIDlet。
截图如下:
下面是J2me中的GoogleMaps类:
import java.io.ByteArrayOutputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.Vector;
import javax.microedition.io.Connector;
import javax.microedition.io.HttpConnection;
import javax.microedition.lcdui.Image;
public class GoogleMaps
{
private static final String URL_UNRESERVED = "ABCDEFGHIJKLMNOPQRSTUVWXYZ" + "abcdefghijklmnopqrstuvwxyz" + "0123456789-_.~";
private static final char[] HEX = "0123456789ABCDEF".toCharArray();
public static final int offset = 268435456;
public static final double radius = offset / Math.PI;
private String apiKey = null;
public GoogleMaps(String key)
{
apiKey = key;
}
public double[] geocodeAddress(String address) throws Exception
{
byte[] res = loadHttpFile(getGeocodeUrl(address));
String[] data = split(new String(res, 0, res.length), ',');
if (data[0].compareTo("200") != 0)
{
int errorCode = Integer.parseInt(data[0]);
throw new Exception("Google Maps Exception: "
+ getGeocodeError(errorCode));
}
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 IOException
{
byte[] imageData = loadHttpFile(getMapUrl(width, height, lng, lat,zoom, format));
return Image.createImage(imageData, 0, imageData.length);
}
private static 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";
}
}
private String getGeocodeUrl(String address)
{
return "http://maps.google.com/maps/geo?q=" + urlEncode(address)
+ "&output=csv&key=" + apiKey;
}
private String getMapUrl(int width, int height, double lng, double lat,
int zoom, String format)
{
return "http://maps.google.com/staticmap?center=" + lat + "," + lng
+ "&format=" + format + "&zoom=" + zoom + "&size=" + width
+ "x" + height + "&key=" + apiKey;
}
private static String urlEncode(String str)
{
StringBuffer buf = new StringBuffer();
byte[] bytes = null;
try
{
ByteArrayOutputStream bos = new ByteArrayOutputStream();
DataOutputStream dos = new DataOutputStream(bos);
dos.writeUTF(str);
bytes = bos.toByteArray();
}
catch (IOException e)
{
}
for (int i = 2; i < bytes.length; i++)
{
byte b = bytes[i];
if (URL_UNRESERVED.indexOf(b) >= 0)
{
buf.append((char) b);
}
else
{
buf.append('%').append(HEX[(b >> 4) & 0x0f]).append(
HEX[b & 0x0f]);
}
}
return buf.toString();
}
private static byte[] loadHttpFile(String url) throws IOException
{
byte[] byteBuffer;
HttpConnection hc = (HttpConnection) Connector.open(url);
System.out.println("loadHttpFile:" + url);
try
{
hc.setRequestMethod(HttpConnection.GET);
InputStream is = hc.openInputStream();
try
{
int len = (int) hc.getLength();
if (len > 0)
{
byteBuffer = new byte[len];
int done = 0;
while (done < len)
{
done += is.read(byteBuffer, done, len - done);
}
}
else
{
ByteArrayOutputStream bos = new ByteArrayOutputStream();
byte[] buffer = new byte[512];
int count;
while ((count = is.read(buffer)) >= 0)
{
bos.write(buffer, 0, count);
}
byteBuffer = bos.toByteArray();
}
}
finally
{
is.close();
}
}
finally
{
hc.close();
}
return byteBuffer;
}
private static String[] split(String s, int chr)
{
Vector res = new Vector();
int curr;
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;
}
}
注意:在使用时,可能需要对一些数据进行转换,可以参考:MicroFloat website。
通过这个类,大家都应该明白如何使用了吧。
首先实例化对象:
GoogleMaps gMap = new GoogleMaps("API_KEY");
通过地址查找坐标:
double[] lanLng = gMap.geocodeAddress("chengdu");
取得指定大小的图片:
Image map = gMap.retrieveStaticImage(240, 320, 51.510605, -0.130728, 8, "png32");
最后将取得的图片绘制出来即可:
g.drawImage(map,(getWidth()-240)/2,(getHeight()-320)/2,0);
就写到这里了,ok!谢谢大家支持!
- 大小: 30.9 KB
分享到:
相关推荐
J2ME API J2ME API J2ME API J2ME API J2ME API
J2ME 中文api以及应用 J2ME 中文api以及应用.rar
J2ME中文版API J2ME中文版API
J2ME API参考文档 提取自WTK22
J2ME中文API J2ME中文API帮助文档
j2me----api j2me----api j2me----api j2me----api j2me----api j2me----api j2me----api j2me----api j2me----api j2me----api
j2me api 中文 j2me api 中文
手册中相应图片、图表、文字的版权归原作者所有。你可以分发本手册的拷贝,但请保证其内容的完整性。www.j2medev.com对于使用本手册造成的任何损失,概不负责。 本手册0.7v 包含如下内容 J2ME Web Services ...
J2ME中文版API,希望大家多多支持!我找了很久才找到的!
j2me中文帮助文档,手机程序开发的帮助文档,手机游戏开发的帮助文档,参考文档
j2me google gis api doc j2me google gis api docj 2me google gis api doc j2me google gis api doc
j2me中文开发文档api 网上很难找到的啊!!!
j2me api中文档适合于手机游戏开发的人员
J2ME使用API,chm格式的,J2ME使用API,chm格式的,J2ME使用API,chm格式的,J2ME使用API,chm格式的,J2ME使用API,chm格式的,J2ME使用API,chm格式的,J2ME使用API,chm格式的,J2ME使用API,chm格式的,J2ME使用...
J2ME API技术手册,里面还有wtk的使用细节描述呢!可是chm格式的,挺方便的
J2ME游戏开发中的地图设计与绘制,解析了用J2ME开发游戏时所需的地图的具体设计与绘制方法
j2me的API文档,在程序开发过程中经常使用到API文档
JAVA ME(J2ME)JDK API 最新版
手机游戏 j2me MapEditor 地图编辑器 !!!!!!!!!!!!!!!!!!!!!
在eclipse中怎样使用j2me 在eclipse中怎样使用j2me 在eclipse中怎样使用j2me