GoogleMaps.java
上传用户:hygd004
上传日期:2022-07-01
资源大小:246k
文件大小:5k
源码类别:

J2ME

开发平台:

Java

  1. import java.io.ByteArrayOutputStream; 
  2. import java.io.DataOutputStream; 
  3. import java.io.IOException; 
  4. import java.io.InputStream; 
  5. import java.util.Vector; 
  6. import javax.microedition.io.Connector; 
  7. import javax.microedition.io.HttpConnection; 
  8. import javax.microedition.lcdui.Image; 
  9.  //Download by http://www.codefans.net
  10. public class GoogleMaps { 
  11.     private static final String URL_UNRESERVED =  
  12.         "ABCDEFGHIJKLMNOPQRSTUVWXYZ" +  
  13.         "abcdefghijklmnopqrstuvwxyz" + 
  14.         "0123456789-_.~"; 
  15.     private static final char[] HEX = "0123456789ABCDEF".toCharArray(); 
  16.  
  17.     // these 2 properties will be used with map scrolling methods. You can remove them if not needed 
  18.     public static final int offset = 268435456; 
  19.     public static final double radius = offset / Math.PI; 
  20.  
  21.     private String apiKey = null; 
  22.  
  23.     public GoogleMaps(String key) { 
  24.         apiKey = key; 
  25.     } 
  26.  
  27.     public double[] geocodeAddress(String address) throws Exception { 
  28.         byte[] res = loadHttpFile(getGeocodeUrl(address)); 
  29.         String[] data = split(new String(res, 0, res.length), ','); 
  30.  
  31.         if (data[0].compareTo("200") != 0) { 
  32.             int errorCode = Integer.parseInt(data[0]); 
  33.             throw new Exception("Google Maps Exception: " + getGeocodeError(errorCode)); 
  34.         } 
  35.          
  36.         return new double[] { 
  37.                 Double.parseDouble(data[2]), Double.parseDouble(data[3]) 
  38.         }; 
  39.     } 
  40.  
  41.     public Image retrieveStaticImage(int width, int height, double lat, double lng, int zoom, 
  42.             String format) throws IOException { 
  43.         byte[] imageData = loadHttpFile(getMapUrl(width, height, lng, lat, zoom, format)); 
  44.  
  45.         return Image.createImage(imageData, 0, imageData.length); 
  46.     } 
  47.  
  48.     private static String getGeocodeError(int errorCode) { 
  49.         switch (errorCode) { 
  50.         case 400: 
  51.             return "Bad request"; 
  52.         case 500: 
  53.             return "Server error"; 
  54.         case 601: 
  55.             return "Missing query"; 
  56.         case 602: 
  57.             return "Unknown address"; 
  58.         case 603: 
  59.             return "Unavailable address"; 
  60.         case 604: 
  61.             return "Unknown directions"; 
  62.         case 610: 
  63.             return "Bad API key"; 
  64.         case 620: 
  65.             return "Too many queries"; 
  66.         default: 
  67.             return "Generic error"; 
  68.         } 
  69.     } 
  70.  
  71.     private String getGeocodeUrl(String address) { 
  72.         return "http://maps.google.com/maps/geo?q=" + urlEncode(address) + "&output=csv&key=" 
  73.                 + apiKey; 
  74.     } 
  75.  
  76.     private String getMapUrl(int width, int height, double lng, double lat, int zoom, String format) { 
  77.         return "http://maps.google.com/staticmap?center=" + lat + "," + lng + "&format=" 
  78.                 + format + "&zoom=" + zoom + "&size=" + width + "x" + height + "&key=" + apiKey; 
  79.     } 
  80.  
  81.     private static String urlEncode(String str) { 
  82.         StringBuffer buf = new StringBuffer(); 
  83.         byte[] bytes = null; 
  84.         try { 
  85.             ByteArrayOutputStream bos = new ByteArrayOutputStream(); 
  86.             DataOutputStream dos = new DataOutputStream(bos); 
  87.             dos.writeUTF(str); 
  88.             bytes = bos.toByteArray(); 
  89.         } catch (IOException e) { 
  90.             // ignore 
  91.         } 
  92.         for (int i = 2; i < bytes.length; i++) { 
  93.             byte b = bytes[i]; 
  94.             if (URL_UNRESERVED.indexOf(b) >= 0) { 
  95.                 buf.append((char) b); 
  96.             } else { 
  97.                 buf.append('%').append(HEX[(b >> 4) & 0x0f]).append(HEX[b & 0x0f]); 
  98.             } 
  99.         } 
  100.         return buf.toString(); 
  101.     } 
  102.  
  103.     private static byte[] loadHttpFile(String url) throws IOException { 
  104.         byte[] byteBuffer; 
  105.  
  106.         HttpConnection hc = (HttpConnection) Connector.open(url); 
  107.         System.out.println("loadHttpFile:"+url);
  108.         try { 
  109.             hc.setRequestMethod(HttpConnection.GET); 
  110.             InputStream is = hc.openInputStream(); 
  111.             try { 
  112.                 int len = (int) hc.getLength(); 
  113.                 if (len > 0) { 
  114.                     byteBuffer = new byte[len]; 
  115.                     int done = 0; 
  116.                     while (done < len) { 
  117.                         done += is.read(byteBuffer, done, len - done); 
  118.                     } 
  119.                 } else { 
  120.                     ByteArrayOutputStream bos = new ByteArrayOutputStream(); 
  121.                     byte[] buffer = new byte[512]; 
  122.                     int count; 
  123.                     while ( (count = is.read(buffer)) >= 0 ) { 
  124.                         bos.write(buffer, 0, count); 
  125.                     } 
  126.                     byteBuffer = bos.toByteArray(); 
  127.                 } 
  128.             } finally { 
  129.                 is.close(); 
  130.             } 
  131.         } finally { 
  132.             hc.close(); 
  133.         } 
  134.          
  135.         return byteBuffer; 
  136.     } 
  137.  
  138.     private static String[] split(String s, int chr) { 
  139.         Vector res = new Vector(); 
  140.  
  141.         int curr; 
  142.         int prev = 0; 
  143.  
  144.         while ( (curr = s.indexOf(chr, prev)) >= 0 ) { 
  145.             res.addElement(s.substring(prev, curr)); 
  146.             prev = curr + 1; 
  147.         } 
  148.         res.addElement(s.substring(prev)); 
  149.  
  150.         String[] splitted = new String[res.size()]; 
  151.         res.copyInto(splitted); 
  152.  
  153.         return splitted; 
  154.     } 
  155. }