close
Google Map新功能 幫你找人
Google定4日推出Google Map的新功能Latitude(緯度),讓行動通訊裝置的使用者可以透過簡單設定,即時將自己的所在位置分享給家人或朋友。
Google定4日推出Google Map的新功能Latitude(緯度),讓行動通訊裝置的使用者可以透過簡單設定,即時將自己的所在位置分享給家人或朋友。

Google Map在2007年就已經推出行動裝置版的「目前位置查詢」功能,讓使用者利用手機查到自己的位置;Latitude功能則進一步擴大Google Map的服務範圍。

Google產品經理李伊表示:「新功能讓Google Map增添社交用途、也更為有趣。」

不過新功能也可能引發侵犯隱私顧慮。Google的解決方式是,每個使用者都必須以手動方式開啟Latitude 功能,而關閉或限制其他人的權限也更容易。使用者也能自行決定誰能看到他的所在位置。

李伊說,Google保證不會保存使用者移動過程的任何資訊;只有最後一個紀錄到的地點會存放在Google的電腦中。

Latitude目前的服務範圍包括美國及其他26個國家。如果搭配全球定位系統(GPS),Latitude的誤差值能縮小到幾公尺內,使用一般手機基地台定位,誤差則可能達到幾公里;不想被「鎖定」的人可以選擇只顯示所在城市。

Google Map的新功能很類似Loopt公司已經推出的服務;該公司的追蹤服務已有100多種手機能使用。

黑莓機及搭配Symbian軟體或微軟Windows Mobile 系統的行動裝置,現在已經可以使用Google Latitude ;部分使用Google Android作業軟體的T-1智慧型手機也能使用。

未來,蘋果的iPhone及iTouch也可以使用。對沒有手機的人,Google也將推出個人電腦版的Latitude。

Google目前還沒有針對Latitude的廣告服務;但分析師認為,針對消費者所在位置的行銷宣傳將會大受歡迎。

【國際新聞組/美聯社舊金山4日電/聯合晚報】

 

導航理論基礎 揭密Google Map的工作原理

  我分析了google map的工作原理,特別是如何進行tiles編碼。Google map使用預著色tiles,可以通過一個簡單的url地址實現。這篇文章將解釋如何從地理坐標(經緯度)建立tile的url地址。


Map tile編碼

  Google map使用兩種算法對tile的位置進行編碼。

  對於Google map,tile的url地址類似於:http://mt1.google.com/mt?n=404&v=w2.12&x=130& amp;y=93&zoom=9使用x和y來設置tile坐標和放大因子。放大因子從17(完全縮小)到0(最大比例)。當放大因子為17時,整 個地球在一個tile中顯示,此時x=0 ,y=0;放大因子為16時,地球被分為2x2部分,這時0<=x<=1 且0<=y<=1。每放大一次,每個tile被分為4個部分。因此,當放大因子為z時,顯示的水平和垂直tile個數為2^(17-z)。


算法:尋找經緯度和放大因子


//correct the latitude to go from 0 (north) to 180 (south),
// instead of 90(north) to -90(south)
latitude=90-latitude;

//correct the longitude to go from 0 to 360
longitude=180+longitude;

//find tile size from zoom level
double latTileSize=180/(pow(2,(17-zoom)));
double longTileSize=360/(pow(2,(17-zoom)));

//find the tile coordinates
int tilex=(int)(longitude/longTileSize);
int tiley=(int)(latitude/latTileSize);


  事實上,這個算法只是理論上的,覆蓋的地帶還無法和整個地球匹配。


  服務器:
  Google使用4台服務器維持加載。分別是mt0, mt1, mt2 and mt3。


  顯示位置:
  每個tile為256x256 的.png格式的圖像。


  對於衛星影像,編碼方式有點不同


  Tile的url地址類似於http://kh0.google.com/kh?n=404&v=8&t=trtqtt,其中參數t對影像的位置進行編碼。參數的長度表示縮放級別。


  t=t時,可觀察整個地球,只有一個tile表示地球。下一個放大級別是,該tile被分為4個像限,從左上順時針開始分別是'q' 'r' 's' 和 't'。在你觀察的影像那個像限後添加字母,就可以看見下一級象限。比如,'t=tq'時,給出't' 影像的左上象限。依次類推,可以表示每個縮放級別…


算法:尋找經緯度和放大因子


 Collapse
//initialise the variables;
double xmin=-180;
double xmax=180;
double ymin=-90;
double ymax=90;
double xmid=0;
double ymid=0;

string location=t;

//google use a latitude divided by 2;
double halflat = latitude / 2;
for (int i = 0; i < zoom; i++)
    {
        xmoy = (xmax + xmin) / 2;
        ymoy = (ymax + ymin) / 2;
        if (halflat > ymoy) //upper part (q or r)
            {
            ymin = ymoy;
            if (longitude < xmoy)
            { /*q*/
                location+= q;
                xmax = xmoy;
            }
            else
            {/*r*/
                location+= r;
                xmin = xmoy;
            }
        }
        else //lower part (t or s)
        {
            ymax = ymoy;
            if (longitude < xmoy)
            { /*t*/
                location+= t;
                xmax = xmoy;
            }
            else
            {/*s*/
                location+= s;
                xmin = xmoy;
            }
        }
    }
//here, the location should contains the string corresponding to the tile...


  同樣,這個算法也是理論上的,覆蓋地帶還無法和整個地球匹配。

  服務器:
  Google使用4台服務器維持加載。分別是kh0, kh1, kh2 and kh3。

  顯示位置:
  每個tile為256x256 的.jpg格式圖像。

  墨卡托投影

  由於在顯示時使用了墨卡托投影,因此上述的算法需要進行修改。在墨卡托投影中,兩條緯線間的距離不一定相等,所以描述tile的角度依據它的垂直位置。


以下代碼為從tile的緯度位置計算的tile的垂直個數

 Collapse
/**

Get the vertical tile number from a latitude using mercator ptrojection formula*/
        private int getMercatorLatitude(double lati)
        {
            double maxlat = Math.PI;

            double lat = lati;
           
            if (lat > 90) lat = lat - 180;
            if (lat < -90) lat = lat + 180;

            // conversion degre=>radians
            double phi = Math.PI * lat / 180;

            double res;
            //double temp = Math.Tan(Math.PI / 4 - phi / 2);
            //res = Math.Log(temp);
            res = 0.5 * Math.Log((1 + Math.Sin(phi)) / (1 - Math.Sin(phi)));
            double maxTileY = Math.Pow(2, zoom);
            int result = (int)(((1 - res / maxlat) / 2) * (maxTileY));

            return (result);
        }


  覆蓋地帶:

  理論上,緯度範圍應該是-90度到90度,但事實上,由於墨卡托投影使得兩級無窮大,覆蓋的地帶小於-90 到 90。實際最大的緯度可通過公式Y = 1/2((1+sin(lat))/(1-sin(lat)))求得,其中PI =3.1415926。


  保護:
  Google map使用保護機制維持高質量服務。如果某個用戶要求太多,Google map將添加它的IP地址到黑名單,並發送一條有意思的消息:

  Google Error
  我們很抱歉... ...您的查詢像病毒或黑客應用程序的自動化請求。為了保護我們的用戶,現在無法處理您的請求。我們將盡快恢復您的訪問,所以請重新試試。同時,如果您懷 疑您的計算機或網絡被感染了,可以清除病毒。為給您帶來的不便表示歉意,希望能在Google上再一次見到您。

  為了避免被列入黑名單,開發員應該使用隱藏機制…

  很有趣吧?

  這裡有個用C#寫的簡單代碼:

  1. GoogleMapSample
  2. GoogleMapSample
  3. 原始碼 : GPSMap.zip

註:Google map 改變了地圖的參數v,當我寫這篇文章時,v為2.12,但現在變為2.43。我覺得這個有點像版本號或其它什麼的。


 

arrow
arrow
    全站熱搜
    創作者介紹
    創作者 Bluelove1968 的頭像
    Bluelove1968

    藍色情懷

    Bluelove1968 發表在 痞客邦 留言(1) 人氣()