`
zou_12345
  • 浏览: 8838 次
  • 性别: Icon_minigender_1
  • 来自: 上海
最近访客 更多访客>>
社区版块
存档分类
最新评论

J2ME Google 地圖 API

    博客分类:
  • j2me
阅读更多
這裡有一個簡單的函式庫來查詢Google地圖,它有下面的功能:

地理編碼定址到其地理座標
擷取給定尺寸、格式及畫面遠近的靜態圖片
這個API有一個實例,你可以在這裡檢查:Java ME Google Maps API sample MIDlet

Contents [hide]
1 取得你自己的Google地圖API Key
2 使用代理伺服器來存取Google地圖服務
3 原始碼:GoogleMaps 類別
4 地圖捲動的使用方法
5 原始碼:範例使用


取得你自己的Google地圖API Key
注意:用免費的Google地圖API Key的程式使用會違反Google的條款和條件 (10.8節),假如你想要使用Google地圖API在上面的範例中,你應該購買企業許可證。

要使用下面的程式碼,你應該取得你自己的Google地圖API Key,假如你沒有API key,你只能照著下面的操作:如何在手機應用程式中使用Google地圖資料

使用代理伺服器來存取Google地圖服務
注意:這個主題(代理的使用)可能不需要,我們仍然探討一下..
當你註冊取得Google地圖API key時,你可以輸入位址,這個位址使用那個key能夠存取地圖服務,因此,你應該設定代理伺服器在那個位址上,這樣就能從你的行動用戶端收到HTTP請求,轉發給Google地圖服務,收回Google的回饋反應。

在下面的程式碼裡你應該發送下面的請求:

http://www.yourserver.com/geo 請求 http://maps.google.com/maps/geo
http://www.yourserver.com/staticmap 請 http://maps.google.com/staticmap
原始碼: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();      // these 2 properties will be used with map scrolling methods. You can remove them if not needed     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) {             // ignore         }         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);         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;     } }
地圖捲動的使用方法
假如你需要捲動你的地圖,你將需要對你的靜態圖片計算一個新的中心,下面的adjust()方法傳回新的地圖中心的經緯度,接受以下的參數:

目前中心的經度及緯度座標
新地圖中心的deltaX及deltaY像素值
新地圖畫面遠近程度

原來的程式碼是用JavaScript寫的,可以在:http://www.polyarc.us/adjust.js下載

注意:如果你使用的是CLDP 1.0的話,要使用下面的方法,你必須將MicroFloat函式庫可在這裡下載:MicroFloat網站含括到你的專案裡,現在在CLDP 1.1已經支援float及double了!

public double[] adjust(double lat, double lng, int deltaX, int deltaY, int z){ return new double[]{ XToL(LToX(lng) + (deltaX<<(21-z))), YToL(LToY(lat) + (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;}
原始碼:範例使用

要使用這個類別,首先先用你的API金鑰:

GoogleMaps gMap = new GoogleMaps("API_KEY");
要地理編碼一個地址,你可以使用geocodeAddress()方法:

double[] lanLng = gMap.geocodeAddress("中壢市永泰街129號");
要擷取地圖圖像:

Image map = gMap.retrieveStaticImage(320, 240, 51.510605, -0.130728, 8, "png32");
分享到:
评论

相关推荐

    j2me google gis api doc

    在J2ME环境下,这个API的使用极大地拓宽了移动设备上GIS应用的可能性,使得开发者可以构建出与谷歌地图服务无缝对接的移动应用。 J2ME谷歌GIS API文档是开发者在使用该API时的重要参考资料,它包含了详细的接口说明...

    J2ME获取Google地图

    在本文中,我们将深入探讨如何在J2ME环境下获取并展示Google地图,包括卫星图像、混合图像以及自然地形。 首先,我们需要了解J2ME的基本框架。J2ME主要由Profile和Configuration组成,其中MIDP(Mobile Information...

    j2me编程Google地图实现经代码

    总结来说,利用J2ME开发Google地图应用需要理解J2ME的基础、熟悉Google Maps API、掌握GPS数据处理以及优化技巧。通过实践,你可以创建出功能丰富的手机导航应用,为用户提供便捷的定位和导航服务。

    j2me的Google地图及源程序

    **总之,"j2me的Google地图及源程序"是一个关于如何在 J2ME 平台上实现 Google Maps 功能的项目,涉及到 Java 语言、网络编程、图形渲染等多个技术领域。对于想要学习 J2ME 开发或移动地图应用开发的开发者来说,这...

    全球定位系统启用谷歌地图手机项目包括J2ME的手机源和源代码

    学习这个项目可以帮助开发者了解如何在有限的资源下构建高效、实用的GPS应用,同时也提供了一个很好的平台来实践J2ME编程和谷歌地图API的整合。此外,对于那些希望扩展功能,比如添加路线规划、兴趣点搜索或离线地图...

    j2me手机高级编程

    开发者可以结合地图服务提供商(如Google Maps或OpenStreetMap)的API,为手机用户提供导航和位置服务。 4. **播放器**:J2ME的Media API(JSR-135)允许开发音频和视频播放器。开发者可以控制媒体播放、暂停、停止...

    j2me手机端Google map最简单实现

    4. **Google Maps API for Mobile**:Google提供了适用于移动设备的Map API,包括J2ME版本。这个API允许你在应用程序中嵌入地图,进行搜索、导航等操作。你需要注册一个API密钥,以便在应用中合法地使用Google Maps...

    j2me在线天气预报

    在J2ME中,可以集成第三方地图服务提供商的SDK,如谷歌地图API,来实现地图显示和位置搜索。用户可以通过输入城市名或者选择地图上的特定位置来获取天气信息。 天气预报数据的获取通常依赖于调用外部天气API。这些...

    学士论文 Google Maps on mobile devices with j2me

    系统设计阶段将确定软件架构、数据结构以及与外部服务(如 Google 地图 API)的交互方式。 ##### 5.6 系统实施 本阶段涉及编码实现、调试以及优化。将利用 J2ME 提供的各种 API 来实现地图显示、缩放和平移等功能...

    Sample J2ME code for GPS

    这通常涉及到HTTP通信和XML解析,例如使用Google Maps API或其他在线地图服务。 7. **性能和电池寿命** GPS应用需要谨慎处理,因为它可能会消耗大量电池并影响设备性能。因此,定位更新应按需进行,并在不使用时...

    J2ME景点查询源代码

    公交信息查询可能涉及到地图API的集成,如OpenStreetMap或Google Maps的JSR-135(Java Location Technology API)。通过调用API,程序能够查询公交线路,计算换乘方案,并在屏幕上呈现路径。 7. **性能优化** ...

    j2me.rar

    "Google.zip"可能与Google API的集成有关,展示了如何在J2ME中利用网络服务,例如搜索、地图或其他Google提供的接口。 "iFeedBack.zip"可能是一个反馈系统,涉及用户交互和数据上报,这对于理解用户行为和改进应用...

    J2ME 定位 GPS 导航

    4. **路径规划**: 利用第三方地图服务API(如Google Maps API)或其他算法,根据当前位置计算到达目标的最佳路线。 5. **用户界面显示**: 在设备屏幕上实时更新地图,显示当前位置、目标点以及推荐的导航路线。 6. *...

    J2ME城市地理查询系统毕业设计

    3. **地图渲染**:系统可能通过解析地理信息数据,使用自定义的图形库在移动设备上绘制地图,或者集成第三方地图API,如Google Maps API,实现地图展示和缩放功能。 4. **查询算法**:为了快速响应用户的查询请求,...

    dituTest.rar_动态地图

    1. 地图数据获取:这通常通过与地图服务提供商(如Google Maps、高德地图或百度地图)的API交互完成,获取地图的切片图片和相关的地理信息。 2. 地图渲染:开发者需要编写代码将这些切片图片正确地排列在屏幕上,...

    电子地图应用设计.pdf

    此外,开发者还可以利用互联网公司提供的免费地图API,如Google Maps API、百度地图API等,来快速构建地图功能,但同时要注意引用和版权问题,确保在开发文档中明确标注借鉴之处。 在特别要求方面,例如针对教育...

    电子地图应用设计-姜晓刚.docx

    在技术实现上,开发者可以选择各种编程语言,并利用现有的电子地图API,如Google Maps API、百度地图API等。这些API提供了丰富的地图数据和功能,如定位、路线规划、地理编码等,帮助开发者快速构建应用。同时,应用...

    j2me_Polish_GPS_CODE.zip_GPS编程_Java_

    4. **地图集成**:如果项目涉及到显示地图,可能使用了第三方的地图服务API,如Google Maps API for Mobile,或者更可能的是,J2ME Polish提供的地图组件。 5. **定位服务管理**:确保GPS服务在需要时开启,并在不...

Global site tag (gtag.js) - Google Analytics