版权申明: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中的Google Maps,你需要了解以下几个关键知识点: 1. **J2ME基础知识**:理解J2ME的基本架构,包括MIDP(Mobile Information Device Profile)和CLDC(Connected Limited Device Configuration)...
3. **电子地图浏览**:在J2ME中实现地图应用,通常会用到JSR-179(Location API),它提供了获取地理位置、计算路线、显示地图图层的能力。开发者可以结合地图服务提供商(如Google Maps或OpenStreetMap)的API,为...
公交信息查询可能涉及到地图API的集成,如OpenStreetMap或Google Maps的JSR-135(Java Location Technology API)。通过调用API,程序能够查询公交线路,计算换乘方案,并在屏幕上呈现路径。 7. **性能优化** ...
3. **地图渲染**:系统可能通过解析地理信息数据,使用自定义的图形库在移动设备上绘制地图,或者集成第三方地图API,如Google Maps API,实现地图展示和缩放功能。 4. **查询算法**:为了快速响应用户的查询请求,...
2. **地图源多样性**:支持多种在线地图服务,如OpenStreetMap、Bing Maps、Google Maps(需额外许可)等,同时也支持离线地图包。 3. **丰富的API**:osmdroid提供了一套丰富的Java API,使得开发者可以方便地添加...
Android平台上的语音服务和Google Map API的使用也非常重要,它们增强了应用的功能性。同时,Android提供了丰富的API来访问摄像头、传感器等硬件,使得开发者能够充分利用设备的硬件功能。 Widget的开发是Android的...
·在android中如何使用语音服务和 google map api?android如何访问摄像头、传感器等硬件的api? ·如何进行widget开发?如何用各种android组件来打造漂亮的ui界面? ·android如何解析xml数据?又如何提高...
10.2 GPS轨迹记录器——利用LocationListener在地图上画图并换算距离 10.3 女性贴身看护——AlarmManager.DatePicker.TimePicker 10.4 手机QRCode二维条形码生成器——Canvas与SurfaceHolder绘图 10.5 AndroidQRCode...
43. **库存管理系统、电子商务产品管理子系统、基于 GoogleMap 的个性化体验**:关注库存控制、商品管理和服务个性化。 44. **银行信贷风险控制系统、DSS 软件项目文件管理系统、学生学籍管理系统**:涉及金融风险...