今天了解到這邊的LBS應用,一般用的是墨卡托坐標。
也就是商品庫的商品入庫的時候,會根據輸入,使用百度地圖提供的一個API,來轉換成一個墨卡托坐標。
然后用戶流量過來的時候,會帶來歷史坐標,和當前坐標,這個時候,就可以和商品庫里面的坐標來匹配,在某一個范圍內的匹配命中。
具體的墨卡托坐標的解釋,可以看這里:
http://blog.csdn.net/mr_jianrong/article/details/72625811
墨卡托坐標以及 墨卡托坐標轉經緯度
Web墨卡托投影坐標系:
以整個世界范圍,赤道作為標准緯線,本初子午線作為中央經線,兩者交點為坐標原點,向東向北為正,向西向南為負。
X軸:由於赤道半徑為6378137米,則赤道周長為2*PI*r = 20037508.3427892,因此X軸的取值范圍:[-20037508.3427892,20037508.3427892]。
Y軸:由墨卡托投影的公式可知,同時上圖也有示意,當緯度φ接近兩極,即90°時,y值趨向於無窮。這是那些"懶惰的工程師"就把Y軸的取值范圍也限定在[-20037508.3427892,20037508.3427892]之間,搞個正方形。
懶人的好處,眾所周知,事先切好靜態圖片,提高訪問效率雲雲。俺只是告訴你為什么會是這樣子。因此在投影坐標系(米)下的范圍是:最小(-20037508.3427892, -20037508.3427892 )到最大 (20037508.3427892, 20037508.3427892)。
對應的地理坐標系:
按道理,先講地理坐標系才是,比如球體還是橢球體是地理坐標系的事情,和墨卡托投影本關聯不大。簡單來說,投影坐標系(PROJCS)是平面坐標系,以米為單位;而地理坐標系(GEOGCS)是橢球面坐標系,以經緯度為單位。具體可參考《坐標系、坐標參照系、坐標變換、投影變換》。
public Vector2D lonLat2Mercator(Vector2D lonLat)
{
Vector2D mercator = new Vector2D();
double x = lonLat.X * 20037508.34 / 180;
double y = Math.Log(Math.Tan((90 + lonLat.Y) * Math.PI / 360)) / (Math.PI / 180);
y = y * 20037508.34 / 180;
mercator.X = x;
mercator.Y = y;
return mercator;
}
//墨卡托轉經緯度
public Vector2D Mercator2lonLat(Vector2D mercator)
{
Vector2D lonLat = new Vector2D();
double x = mercator.X / 20037508.34 * 180;
double y = mercator.Y / 20037508.34 * 180;
y = 180 / Math.PI * (2 * Math.Atan(Math.Exp(y * Math.PI / 180)) - Math.PI / 2);
lonLat.X = x;
lonLat.Y = y;
return lonLat;
}