2011-03-31 42 views

回答

7

您可以使用谷歌地圖API查詢Lat Long網基於BST ID(塔)

實例C#:

using System; 
using System.IO; 
using System.Net; 

//---Based on code written by "Neil Young" ([email protected]) 
//---Source: http://maps.alphadex.de/datafiles/fct0e1b11782832f02.cs 
namespace GoogleMaps 
{ 
    class GMM 
    { 
     static byte[] PostData(int MCC, int MNC, int LAC, int CID, 
           bool shortCID) 
     { 
      /* The shortCID parameter follows heuristic experiences: 
      * Sometimes UMTS CIDs are build up from the original GSM CID (lower 4 hex digits) 
      * and the RNC-ID left shifted into the upper 4 digits. 
      */ 
      byte[] pd = new byte[] { 
       0x00, 0x0e, 
       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
       0x00, 0x00, 
       0x00, 0x00, 
       0x00, 0x00, 

       0x1b, 
       0x00, 0x00, 0x00, 0x00, // Offset 0x11 
       0x00, 0x00, 0x00, 0x00, // Offset 0x15 
       0x00, 0x00, 0x00, 0x00, // Offset 0x19 
       0x00, 0x00, 
       0x00, 0x00, 0x00, 0x00, // Offset 0x1f 
       0x00, 0x00, 0x00, 0x00, // Offset 0x23 
       0x00, 0x00, 0x00, 0x00, // Offset 0x27 
       0x00, 0x00, 0x00, 0x00, // Offset 0x2b 
       0xff, 0xff, 0xff, 0xff, 
       0x00, 0x00, 0x00, 0x00 
      }; 

      bool isUMTSCell = ((Int64)CID > 65535); 

      if (isUMTSCell) 
       Console.WriteLine("UMTS CID. {0}", shortCID ? 
        "Using short CID to resolve." : ""); 
      else 
       Console.WriteLine("GSM CID given."); 

      if (shortCID) 
       CID &= 0xFFFF;  /* Attempt to resolve the cell using the 
            GSM CID part */ 

      if ((Int64)CID > 65536) /* GSM: 4 hex digits, UTMS: 6 hex 
            digits */ 
       pd[0x1c] = 5; 
      else 
       pd[0x1c] = 3; 

      pd[0x11] = (byte)((MNC >> 24) & 0xFF); 
      pd[0x12] = (byte)((MNC >> 16) & 0xFF); 
      pd[0x13] = (byte)((MNC >> 8) & 0xFF); 
      pd[0x14] = (byte)((MNC >> 0) & 0xFF); 

      pd[0x15] = (byte)((MCC >> 24) & 0xFF); 
      pd[0x16] = (byte)((MCC >> 16) & 0xFF); 
      pd[0x17] = (byte)((MCC >> 8) & 0xFF); 
      pd[0x18] = (byte)((MCC >> 0) & 0xFF); 

      pd[0x27] = (byte)((MNC >> 24) & 0xFF); 
      pd[0x28] = (byte)((MNC >> 16) & 0xFF); 
      pd[0x29] = (byte)((MNC >> 8) & 0xFF); 
      pd[0x2a] = (byte)((MNC >> 0) & 0xFF); 

      pd[0x2b] = (byte)((MCC >> 24) & 0xFF); 
      pd[0x2c] = (byte)((MCC >> 16) & 0xFF); 
      pd[0x2d] = (byte)((MCC >> 8) & 0xFF); 
      pd[0x2e] = (byte)((MCC >> 0) & 0xFF); 

      pd[0x1f] = (byte)((CID >> 24) & 0xFF); 
      pd[0x20] = (byte)((CID >> 16) & 0xFF); 
      pd[0x21] = (byte)((CID >> 8) & 0xFF); 
      pd[0x22] = (byte)((CID >> 0) & 0xFF); 

      pd[0x23] = (byte)((LAC >> 24) & 0xFF); 
      pd[0x24] = (byte)((LAC >> 16) & 0xFF); 
      pd[0x25] = (byte)((LAC >> 8) & 0xFF); 
      pd[0x26] = (byte)((LAC >> 0) & 0xFF); 

      return pd; 
     } 

     static public string GetLatLng(string[] args) 
     { 
      if (args.Length < 4) 
      { 
       return string.Empty; 
      } 
      string shortCID = ""; /* Default, no change at all */ 
      if (args.Length == 5) 
       shortCID = args[4].ToLower(); 
      try 
      { 
       String url = "http://www.google.com/glm/mmap"; 
       HttpWebRequest req = (HttpWebRequest)WebRequest.Create(
        new Uri(url)); 
       req.Method = "POST"; 

       int MCC = Convert.ToInt32(args[0]); 
       int MNC = Convert.ToInt32(args[1]); 
       int LAC = Convert.ToInt32(args[2]); 
       int CID = Convert.ToInt32(args[3]); 
       byte[] pd = PostData(MCC, MNC, LAC, CID, 
        shortCID == "shortcid"); 

       req.ContentLength = pd.Length; 
       req.ContentType = "application/binary"; 
       Stream outputStream = req.GetRequestStream(); 
       outputStream.Write(pd, 0, pd.Length); 
       outputStream.Close(); 

       HttpWebResponse res = (HttpWebResponse)req.GetResponse(); 
       byte[] ps = new byte[res.ContentLength]; 
       int totalBytesRead = 0; 
       while (totalBytesRead < ps.Length) 
       { 
        totalBytesRead += res.GetResponseStream().Read(
         ps, totalBytesRead, ps.Length - totalBytesRead); 
       } 

       if (res.StatusCode == HttpStatusCode.OK) 
       { 
        short opcode1 = (short)(ps[0] << 8 | ps[1]); 
        byte opcode2 = ps[2]; 
        int ret_code = (int)((ps[3] << 24) | (ps[4] << 16) | 
            (ps[5] << 8) | (ps[6])); 
        if (ret_code == 0) 
        { 
         double lat = ((double)((ps[7] << 24) | (ps[8] << 16) 
            | (ps[9] << 8) | (ps[10])))/1000000; 
         double lon = ((double)((ps[11] << 24) | (ps[12] << 
            16) | (ps[13] << 8) | (ps[14])))/
            1000000; 
         return lat + "|" + lon; 
        } 
        else 
         return string.Empty; 
       } 
       else 
        return string.Empty; 
      } 
      catch (Exception) 
      { 
       return string.Empty; 
      } 
     } 
    } 
} 
+0

感謝你的快速的答案,但我不明白這一點,你能幫我理解這一點嗎,有關這方面的任何閱讀鏈接? – 2011-03-31 15:26:02

+0

此代碼將BTS ID發送到谷歌地圖以獲取GSM塔的位置。相關文章:http://brainwashinc.wordpress.com/2009/06/26/cell-phone-my-location-google-mobile-maps/ – 2011-03-31 15:29:09

+0

非常感謝!它真的幫助...! :) – 2011-04-01 16:01:05