轉兩篇有關google map的文章

來源:互聯網
上載者:User

 早就聽說google map的api已經公開了但一直沒時間看,今天看了兩篇這方面的文章,覺得不錯,理解了一些

第一篇: [原始碼]如何在你的程式中使用Google地圖資源
原文地址:http://bbs.msproject.cn/default.aspx?g=posts&t=205

[翻譯]
Pascal Buirey著How Google Map Works

[開發環境]

本例開發語言C#,不過可以應用到任何一種語言

[簡介]

本文分析了Google地圖是如何工作的,並指明tile(翻譯成階磚,也就是相同的方格子)是如何編碼的。Google Map採用了發送一個簡單的URL能夠擷取的tile。本文將解釋如何通過地理經度和緯度編製出擷取對應tile的URL。

[Tile編碼]

Google地圖提供了兩個不同的演算法編碼Tile的位置。

Google地圖中,一個Tile的URL一般是這樣的:http://mt1.google.com/mt?n=404&v=w2.12&x=130&y=93&zoom=9,x和y是Tile的座標(緯度經度),以及一個顯示比例尺度。顯示比例(zoom factor )從17(全部顯示fully zoomed out)到0(最大精度)。當這個比例是17的時候,整個地球顯示在一個Tile中,x=0且y=0;當是16,地球被分成2×2部分,0<=x<=1,0<=y<=1。所以,我們假設zoom factor是z,那麼水平和垂直的Tile總數是2^(17-z)。

[用緯度、經度和顯示比例發現一個Tile的演算法]

Code:

//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 和 mt3.

[Tile大小]

每個Tile是256×256的png圖片

[衛星映像]

衛星映像的編碼是不一樣的,它的URL一般如此:http://kh0.google.com/kh?n=404&v=8&t=trtqtt,其中t參數編碼了映像的位置,t長度表明zoom的層級。

要想看到全球,設定t為t;下一顯示層級,Tile被分成4個象限,順時針依次是:q,r,s和t;要想看哪個象限,就把這個字元附到t的後面就可以了。例如:t=tq,代表左上的象限。依次類推……

演算法如下:

Code:

//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 和 kh3.

[Tile大小]

每個Tile是256×256的jpg 圖片

[墨卡托投影(Mercator projection)]

因為墨卡托投影,上面的演算法必須要修正;在墨卡托投影中,兩條並行線之間的距離不是衡定的,因此,一個Tile描繪的角度依賴於垂直位置。

下面的代碼根據緯度計算垂直位置:

Code:

/**<summary>Get the vertical tile number from a latitude
using Mercator projection formula</summary>*/
        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。

[保護]

Google 地圖使用了一個保護機制,以保證伺服器的品質。如果一個IP的請求次數過多,它會被加到黑名單,並提示一個很友好的訊息:(

Quote:

Google Error

We're sorry... ... but your query looks similar to automated requests from a computer virus or spyware application. To protect our users, we can't process your request right now. We'll restore your access as quickly as possible, so try again soon. In the meantime, if you suspect that your computer or network has been infected, you might want to run a virus checker or spyware remover to make sure that your systems are free of viruses and other spurious software. We apologize for the inconvenience, and hope we'll see you again on Google.

To avoid being blacklisted, developers should use a caching mechanism if possible...

[例子]

全球圖片的URL,http://kh0.google.com/kh?n=404&v=8&t=t

4個對應的象限如下:(注意,4個伺服器的名字進行Server Load Balancer)

http://kh0.google.com/kh?n=404&v=8&t=tq
http://kh1.google.com/kh?n=404&v=8&t=tr
http://kh2.google.com/kh?n=404&v=8&t=ts
http://kh3.google.com/kh?n=404&v=8&t=tt

(處理了一下4幅映像合并到一個)

附件:/Files/dotnetdoor/GoogleMapCs.rar

第二篇:[原始碼]如何在你的程式中使用Google地圖資源(二) - 地區名稱對應地理座標
原文地址:http://bbs.msproject.cn/default.aspx?g=posts&t=223

[翻譯]
Pascal Buirey著How Google Map Works (part2): The geocoder

如何使用Google Geocoder擷取地區名稱對應的地理座標

[簡介]

在發現如何通過地理座標獲得圖片之後(任何在你的程式中使用Google地圖資源 ××連結××),我想研究下一個Google地圖的功能:geocoder。Geocoder是一個服務,允許你通過一個地區的名稱獲得其所在地理座標(經度緯度)。本文將向你解釋這些。

[URL請求]

為了向Google請求座標,你需要構建Google能夠認識的"問題"。這個"問題"URL可以表述成下面的樣子:

Code:

http://maps.google.com/maps?output=kml&q=我的街道名稱

http://maps.google.com/maps 將會把你的請求提交給Geocoder服務,其中的output=kml參數,告訴Google給一個簡單的可理解的回答,q=my_street_name 參數表明你需要哪個地方的資訊。

[Google的答案]

我發現了兩個可能的答案:如果地區名稱很精確,Google會發給你它的座標。如果Google需要進一步精確位置,它會發給你一個地區名稱的列表,然後你必須挑選清單裡的確定值,再次請求。最終的答案的XML檔案如下:

Code:

<?xml version="1.0" encoding="UTF-8"?>
<kml xmlns="http://earth.google.com/kml/2.0">
<Placemark>
    <name>New York, NY</name>
    <address>New York, NY</address>
    <styleUrl>root://styleMaps#default+nicon=0x304+hicon=0x314</styleUrl>
    <Point>
        <coordinates>-74.007130,40.714490,0</coordinates>
    </Point>
    <LookAt>
        <longitude>-74.007130</longitude>
        <latitude>40.714490</latitude>
        <range>64586.917969</range>
    </LookAt>
</Placemark>
</kml>

如果Google需要更精確的名稱,得到的XML會是:

Code:

<?xml version="1.0" encoding="UTF-8"?>
<kml xmlns="http://earth.google.com/kml/2.0">
<Folder>
<name>Did you mean:</name>
<open></open>
<Placemark>
    <name>Paris, Lamar, Texas, United States</name>
    <address>Paris, Lamar, Texas, United States</address>
    <styleUrl>root://styleMaps#default+nicon=0x304+hicon=0x314</styleUrl>
</Placemark>
<Placemark>
    <name>Paris, Henry, Tennessee, United States</name>
    <address>Paris, Henry, Tennessee, United States</address>
    <styleUrl>root://styleMaps#default+nicon=0x304+hicon=0x314</styleUrl>
</Placemark>
<Placemark>
    <name>Paris, Edgar, Illinois, United States</name>
    <address>Paris, Edgar, Illinois, United States</address>
    <styleUrl>root://styleMaps#default+nicon=0x304+hicon=0x314</styleUrl>
</Placemark>
<Placemark>
    <name>Paris, Bourbon, Kentucky, United States</name>
    <address>Paris, Bourbon, Kentucky, United States</address>
    <styleUrl>root://styleMaps#default+nicon=0x304+hicon=0x314</styleUrl>
</Placemark>
<Placemark>
    <name>Paris, Logan, Arkansas, United States</name>
    <address>Paris, Logan, Arkansas, United States</address>
    <styleUrl>root://styleMaps#default+nicon=0x304+hicon=0x314</styleUrl>
</Placemark>
<Placemark>
    <name>Paris, Monroe, Missouri, United States</name>
    <address>Paris, Monroe, Missouri, United States</address>
    <styleUrl>root://styleMaps#default+nicon=0x304+hicon=0x314</styleUrl>
</Placemark>
<Placemark>
    <name>Paris, Mecosta, Michigan, United States</name>
    <address>Paris, Mecosta, Michigan, United States</address>
    <styleUrl>root://styleMaps#default+nicon=0x304+hicon=0x314</styleUrl>
</Placemark>
<Placemark>
    <name>Paris, Bear Lake, Idaho, United States</name>
    <address>Paris, Bear Lake, Idaho, United States</address>
    <styleUrl>root://styleMaps#default+nicon=0x304+hicon=0x314</styleUrl>
</Placemark>
<Placemark>
    <name>Paris, Stark, Ohio, United States</name>
    <address>Paris, Stark, Ohio, United States</address>
    <styleUrl>root://styleMaps#default+nicon=0x304+hicon=0x314</styleUrl>
</Placemark>
<Placemark>
    <name>Paris, Lafayette, Mississippi, United States</name>
    <address>Paris, Lafayette, Mississippi, United States</address>
    <styleUrl>root://styleMaps#default+nicon=0x304+hicon=0x314</styleUrl>
</Placemark>
</Folder>
</kml>

本文中的例子是採用C#寫的允許於.NET Framework。

附件:
/Files/dotnetdoor/GoogleGeocoder.rar

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.