Openwrt, 自由和代價, 人家說翻牆


最近除了看 GPS 定位在火星座標的疑問, 另外就是翻牆. 這位朋友的文筆很不錯, 而且很先進, 看看怎樣從萬里長城內探頭去看外面的世界.

http://softwaredownload.gitbooks.io/openwrt-fanqiang/

http://softwaredownload.gitbooks.io/openwrt-fanqiang/content/

為了不要讓人看到一頭霧水, 簡單介紹來兩個名詞, 中國特有的 (廢話, 明明是中文, 當然中國特有的).

火星座標 –

GPS 是全球定位系統, 美國的民用/軍用系統, 天上的衛星隨時都發射無線電訊號, 地面握有 GPS 定位裝置的人 (例如2014年很多的智慧手機), 可以接收訊號, 然後就知道自己身在的地球上某個位置, 用地球的經緯度表示, 加上 MAPPING (地圖), 就知道身在哪個國家/省/縣/市/街道/門牌等. 但是在中國, 如果不是用外國發行的地圖, 收到座標再套到中國的行政地圖, 顯示的街道/門牌等是錯誤的, 錯得可遠可近, 沒譜. 原因是每0.1度的位置, 中國的行政地圖隨機加上偏移, 所以你站的位置不是地圖上顯示的位置, 因為套用了一套中國特有的座標偏置, 民間稱為 “火星座標". 地表的經緯度 0.00001度, 又可以表示成 0度0分0.36秒, 距離大約1米, 所以每0.1度給她加上秘密的偏移量, 你就沒轍了. 解決辦法很簡單, 用外國出品的地圖, 或只買中國國家認可發行的地圖, 兩個都不會錯, 除了一個是中文, 一個是外文.

另外火星座標糾偏的方法, 有人做了一個比較徹底的方案, 看看, 還沒驗證過

http://blog.csdn.net/gf771115/article/details/26576525


copy-
http://www.tufangbian.com/bbs/viewthread.php?tid=68

中國地圖經緯度偏移修正算法完美解決方案
經緯度, 中國, 算法, 地圖, 方案
中國地圖和衛星圖都存則偏移量,這個是由中國規劃局,確定的,一個偏移算法,實際上是沒有什麼特殊規律的,他的生成算法是有規律,不過這個規律你我都很難拿到,那我們怎麼解決這個偏差呢,畢竟做地圖開發的都存在衛星圖和地圖的切換,誰不想讓切換以後的地圖對上呢!後來我發現google的地圖服務,ditu.gogle開始的都沒有偏差,maps.google開頭的服務就有偏差,我就開始查找google的取偏移量算法,事前我還是圖破解google手機版本的數據,沒有成功,估計是使用了自己的壓縮或加密算法,最後也沒有找到規律,後來才嘗試破解web版本的不過web版本的接口我對於js不是特別熟悉,所以本次破解放棄了分析源代碼的步驟,而是直接採用排除法那就是把地圖部分訪問的全部地址,一個接一個封殺掉,查找那個氣偏移做用的網址 http://ditu.google.cn/maps/vp?spn=0.0,0.0&z=18&vp=39.111195,117.148067 最後找到了就是這個,記住每次測試用清理瀏覽器緩存哦,使用fixfox的fildder和adblock就夠了 然後就是 分析每次返回內容的規律,黃天不負有心人啊,我總算是搞定了,下面是我整理的接口

Google 中國地圖偏移接口



1.      接口地址:http://ditu.google.cn/maps/vp?spn=0.0,0.0&z=18&vp=39.111195,117.148067



(註:.cn和.com都可以,我用國內服務器就會選擇.cn用美國服務器就會選擇.com)

2.      返回內容中的有效部分:

3.      (39.111195, 117.148067, 18, [9, -2, 18, -4, 37, -8, 74, -16, 149, -33, 298, -67, 596, -135, 1193, -270])4.      Spn參數暫時未知實際意義,但是需要上發spn參數,任意兩個小數用逗號分開

Vp參數緯經度值,用逗號分隔,z參數為地圖縮放級別,無實際意義

5.      取回的部分中有效數字為[9, -2, 18, -4, 37, -8, 74, -16, 149, -33, 298, -67, 596, -134, 1192, -268]這個數組總共有8組數字,每兩個為一組,分為別從11級到18級的地圖和衛星圖的偏移像素數量,我們前一組數字精確的等於後一組數字除二,我們為了得到最精確的偏移,故選擇第18級的偏移量1193,-270,1193為x方向上精度的偏移像素,-270為y方向上維度偏移像素

6.      經緯度的偏移轉換我們需要江經緯度39.111195,117.148067轉化為18級像素值25620917 和 55392414,然後分別加上偏移量-270,1193,然後再轉化為經緯度39.11231854918217 和117.15446412563324,即位偏移後的經緯度



以上是我花了2個小時完成的google偏移接口的破解,後來公司要求,把google的偏移數據全部弄下來,以防止gogle更換服務接口,我現在採用的是每隔0.01個經緯度,取一次偏移量,數據存入bdb,中國的總數據量  千萬條級別,我用了兩天的時間已經完成了三分之一中國的爬取,當然我用了三台服務器,總數據量估計在1個G一下,是可以接受的範圍,精度可以保證最大級別18級地圖,偏差小於5個像素






public static boolean getOffset(HttpClient httpClient, int lat, int lng) {

StringBuilder url = new StringBuilder();

url.append("http://ditu.google.com/maps/vp?");

url.append("spn=0.0,0.0&z=18&vp=");

url.append(lat / 100D);

url.append(",");

url.append(lng / 100D);

String urlStr = url.toString();

GetMethod method = new GetMethod(urlStr);

try {

int status = httpClient.executeMethod(method);

if (status == 200) {

byte[] bs = method.getResponseBody();

String js = new String(bs, "utf-8");

int x = js.lastIndexOf("[");

int y = js.lastIndexOf("]");

if (x > 0 && y > 0) {

String text = js.substring(x + 1, y);

int b = text.lastIndexOf(",");

int a = text.lastIndexOf(",", b - 1);

if (a > 0 && b > 0) {

String offsetPixX = text.substring(a + 2, b);

String offsetPixY = text.substring(b + 2);

OffsetBean offset = new OffsetBean();

offset.setLng(lng);

offset.setLat(lat);

offset.setOffset_x(Integer.parseInt(offsetPixX));

offset.setOffset_y(Integer.parseInt(offsetPixY));

OffsetBDB offsetBDB = OffsetBDB.getInstance();

offsetBDB.putOffset(offset);

return true;

}

} else {

logger.error("error 1:  lat:" + lat + "\tlng:" + lng);

}

} else {

logger.error("error 2:  lat:" + lat + "\tlng:" + lng);

}

} catch (Exception e) {

e.printStackTrace();

} finally {

method.releaseConnection();

}

return false;

}





有不明白的地方可以聯繫我



nibaogang@163.com



熱心解答,做程序的互相幫助



本文來自CSDN博客,轉載請標明出處:http://blog.csdn.net/dongmeng110/archive/2009/10/31/4750380.aspx

另外有人做了一個放在 GIT, eviltransform
https://github.com/googollee/eviltransform
http://www.v2ex.com/t/127033

翻牆 –

中國有萬里長城, 據說古代中國很多朝代因抵北入侵而使用鐵腕耗血所建, 目的是抵北方外族入侵. 現代的 INTERNET , 因為無國界, 但是很多國家對外來的資訊有所禁忌, 所以在中國是不允許連接 YOUTUBE 等外在資訊的, 因此把這些資訊排除掉, 不能連接訪問, 若你是外國的人, 進入中過後, 想看 YOUTUBE 是不行的, 因為存在一個阻隔, 連接失敗, 民間稱這個阻隔是 “資訊上的萬里長城", 如你硬要看, 那就等同要跨越這個萬里長城, 簡稱 “翻牆". 這樣就要身手敏捷, 能力超強, 需要有一些本領.

review:

之前學習過的 Openwrt, https://xiaolaba.wordpress.com/2014/07/14/openwrt-extroot-and-usb-drive/

廣告

發表迴響

在下方填入你的資料或按右方圖示以社群網站登入:

WordPress.com Logo

您的留言將使用 WordPress.com 帳號。 登出 / 變更 )

Twitter picture

您的留言將使用 Twitter 帳號。 登出 / 變更 )

Facebook照片

您的留言將使用 Facebook 帳號。 登出 / 變更 )

Google+ photo

您的留言將使用 Google+ 帳號。 登出 / 變更 )

連結到 %s