2014年10月16日 星期四

GPS 中國地圖偏移 情報更新

隔了兩年, 網上流傳了偏移量的計算方法, C#及JAVA原代碼也提供了, 並且有部份人編寫了一個較詳盡的解釋, 特此備註.


Ref:
GCJ-02 (火星坐標) 轉 BD-09 (百度坐標) 的算法
http://www.xcoder.cn/html/mobile/iOS/2013/0315/2394.html

eviltransform.cs (WGS-84 地球坐標轉 GCJ-02 火星坐標的C#代碼)
https://on4wp7.codeplex.com/SourceControl/changeset/view/21483#353936

英文詳盡解釋
http://www.sinosplice.com/life/archives/2013/07/16/a-more-complete-ios-solution-to-the-china-gps-offset-problem

Eviltransform.cs
//
// Copyright (C) 1000 - 9999 Somebody Anonymous
// NO WARRANTY OR GUARANTEE
//

using System;

namespace Navi
{
    class EvilTransform
    {
        const double pi = 3.14159265358979324;

        //
        // Krasovsky 1940
        //
        // a = 6378245.0, 1/f = 298.3
        // b = a * (1 - f)
        // ee = (a^2 - b^2) / a^2;
        const double a = 6378245.0;
        const double ee = 0.00669342162296594323;

        //
        // World Geodetic System ==> Mars Geodetic System
        public static void transform(double wgLat, double wgLon, out double mgLat, out double mgLon)
        {
            if (outOfChina(wgLat, wgLon))
            {
                mgLat = wgLat;
                mgLon = wgLon;
                return;
            }
            double dLat = transformLat(wgLon - 105.0, wgLat - 35.0);
            double dLon = transformLon(wgLon - 105.0, wgLat - 35.0);
            double radLat = wgLat / 180.0 * pi;
            double magic = Math.Sin(radLat);
            magic = 1 - ee * magic * magic;
            double sqrtMagic = Math.Sqrt(magic);
            dLat = (dLat * 180.0) / ((a * (1 - ee)) / (magic * sqrtMagic) * pi);
            dLon = (dLon * 180.0) / (a / sqrtMagic * Math.Cos(radLat) * pi);
            mgLat = wgLat + dLat;
            mgLon = wgLon + dLon;
        }

        static bool outOfChina(double lat, double lon)
        {
            if (lon < 72.004 || lon > 137.8347)
                return true;
            if (lat < 0.8293 || lat > 55.8271)
                return true;
            return false;
        }

        static double transformLat(double x, double y)
        {
            double ret = -100.0 + 2.0 * x + 3.0 * y + 0.2 * y * y + 0.1 * x * y + 0.2 * Math.Sqrt(Math.Abs(x));
            ret += (20.0 * Math.Sin(6.0 * x * pi) + 20.0 * Math.Sin(2.0 * x * pi)) * 2.0 / 3.0;
            ret += (20.0 * Math.Sin(y * pi) + 40.0 * Math.Sin(y / 3.0 * pi)) * 2.0 / 3.0;
            ret += (160.0 * Math.Sin(y / 12.0 * pi) + 320 * Math.Sin(y * pi / 30.0)) * 2.0 / 3.0;
            return ret;
        }

        static double transformLon(double x, double y)
        {
            double ret = 300.0 + x + 2.0 * y + 0.1 * x * x + 0.1 * x * y + 0.1 * Math.Sqrt(Math.Abs(x));
            ret += (20.0 * Math.Sin(6.0 * x * pi) + 20.0 * Math.Sin(2.0 * x * pi)) * 2.0 / 3.0;
            ret += (20.0 * Math.Sin(x * pi) + 40.0 * Math.Sin(x / 3.0 * pi)) * 2.0 / 3.0;
            ret += (150.0 * Math.Sin(x / 12.0 * pi) + 300.0 * Math.Sin(x / 30.0 * pi)) * 2.0 / 3.0;
            return ret;
        }
    }
}

2013年4月13日 星期六

套件重量 (2014)

單車套件重量常常成為比較價錢及性能的著眼點, 但一般成車很少會提及套件佔車重既成份及比例, 今次出於好奇, 上網搵了一些資料, 比較一下:

Campagnolo

Campagnolo
Super Record
Campagnolo
Record
Campagnolo
Chorus
Campagnolo
Athena
Crankset 585a 627 667 644b
BB Cups 45 46 46 72
Shift Lever 330 337 337 360
Rear Derailleur 155 172 186 209
Front Derailleur 72 74 76 92
Chain 239 239 255 255
Cassette 177 201 230 230
Brake Calipers 272 278 299 306
Group Weight in g 1875 1974 2096 2168
Group Weight in lb 4.13 4.35 4.62 4.78
a The Super Record group was weighed with the titanium crankset option.
b The Athena group was weighed with the carbon crankset and shift levers.

Shimano


Shimano Shimano Shimano Shimano Shimano Shimano
Dura Ace Di2 7970 Dura Ace 9000 Dura Ace 7900 Ultegra
6800
Ultegra 6700 105 5700
Crankset 636 636 636 694 737 834
BB Cups  89 67 89 76 102 102
Shift Lever 459 363 448 419 490 492
Rear Derailleur  225 160 166 193 209 232
Front Derailleur  124 67 67 86 89 112
Chain 249 248 249 260 280 291
Cassette 163 163 163 226 204 205
Brake Calipers 293 294 293 340 330 356
Battery + Loom  137c n/a n/a n/a n/a n/a
Group Weight in g  2375 1998 2111 2294 2441 2624
Group Weight in lb  5.23 4.4 4.65 5.05 5.38 5.78

c The Di2 system requires a battery and electrical cables which cannot be cut shorter. Together the battery and cables weigh 217g for 'medium' length. Typically the weight of standard shift cables would be 80g so we have added 137g to the weight of the Di2 group to take into account this difference.

SRAM

2012 SRAM SRAM  SRAM SRAM
 Red Force
BB30/GXP
Rival Apex
Crankset (GXP) 655 676 739 890
BB Cups (GXP) 105 115 115 inc above
Crankset (BB30) 630 645 n/a n/a
Bearings (BB30) 51 52 n/a n/a
Shift Lever 280 303 340 344
Rear Derailleur  153 178 188 190
Front Derailleur  58 88 88 89
Chain 257 257 277 277
Cassette 155 210 210 210
Brake Calipers 265 280 287 308
BB30 Group in g  1849 2013 2244 2308
BB30 Group in lb 4.07 4.43 4.94 5.08
GXP Group in g  1928 2107 n/a n/a
GXP Group in lb  4.25 4.64 n/a n/a





2014 SRAM SRAM  SRAM SRAM
 Red Force
BB30/GXP
Rival Apex
Crankset (GXP) 605 718 739 890
BB Cups (GXP) 105 115 115 inc above
Crankset (BB30) 555 710 n/a n/a
Bearings (BB30) 51 52 n/a n/a
Shift Lever 280 307 340 344
Rear Derailleur  143 166 188 190
Front Derailleur  76 77 88 89
Chain 250 250 277 277
Cassette 155 241 210 210
Brake Calipers 254 278 287 308
BB30 Group in g  1764 2081 2244 2308
BB30 Group in lb 3.89 4.58 4.94 5.08
GXP Group in g  1868 2152 n/a n/a
GXP Group in lb  4.11 4.74 n/a n/a

Ref: http://www.totalcycling.com/component-weights.html

2012年12月23日 星期日

單車騎行訓練

收集了一些訓練要訣, 作參考...

1.單車時代 - 單車訓練行程 Q&A

請將你的每週訓練日程寄給我們,我們的駐站職業車手 & 網站總編李.羅傑斯 (Lee Rodgers) 將提供您關於每週訓練計畫的建議。
車手: 蓋文.迪克森 (Gavin Dixon),39歲,東京
職業: MBA 顧問
騎乘年數: 4,大多為旅遊及休閒性質,但想開始參加比賽
有受傷? 無
日程:
週一: 休息
週二: 早上 9點到晚上 6點工作
週三: 下午 3點到晚上 9點工作
週四: 下午 3點到晚上 9點工作
週五: 下午 3點到晚上 9點工作
週六: 上午9點到晚上 6點工作
週日: 休息
單車通勤? 是的,ㄧ週五天 28公里來回
平常休息日: 週二
目標: 三月開始的環行公路賽 (Criterium)。還有減重! 
建議日程
第一件事當然是進行良好的耐力 (Base)訓練,通常是以 LSD (Long Slow Distance)長程慢速訓練為主。每週大致上進行兩次 120公里至 200公里慢步調的騎乘訓練。但你必須考慮你的目標為何。因為如果你只準備參加 30公里至 50公里的環行公路賽,何必進行 200公里的訓練? 如果你計畫參加更長的賽程,間歇性的進行 120公里以上的訓練是有助益的。但如果你並無此意,或是不喜歡坐在坐墊上超過四小時,就不需勉強自己。又或許你喜歡長距離訓練,但你只有參加 30公里的環行公路賽,這樣你也不需保留大量的體力。你所需要的則是爆發力及恢復力。 
你可以找到很多關於維持特定心率區間 (heart rate zone)的文獻。計算最大心跳的公式為: 220-年齡=最大心跳。而許多年來,騎車時公認燃燒脂肪的最佳區間為維持最大心跳的 60-70%。
但最近的科學報告對此ㄧ看法提出質疑。報告指出,如果想減去脂肪,最好的方式是盡力訓練。各項實驗顯示在速度穩定的騎乘中進行短暫的全力衝刺,其效果要比維持最大心跳的 60-70%還要好。 
適度的休息對於進步也是相當重要的。你至少需要兩天的休息,特別是對於年近 40的上班族來說。職業車手會這麼說,質量重於數量。實際上,大多數的車手訓練密度遠甚於此。費雷瑞 (Oscar Freire)得過三次世界冠軍,但他每週只進行 15-18小時的訓練-而其他多數職業車手訓練時數則逼近 30。所以,如果你當天有排訓練,但出發後卻感覺疲累,還是回家好好休息吧。相同的,如果你當天預定休息ㄧ天,但你覺得狀況很好,進行訓練也是無妨。 
記得,訓練是可以有彈性的。 
ㄧ個典型的訓練周期應該像ㄧ個金字塔。長距離訓練居中,較費力的間歇訓練次之,而開始及結束時則以熱身及緩和運動為主。這是大略的時程。雖然可能不適合你的時間,但我建議盡量依此進行訓練。  
我的整體訓練建議: 
第一天:進行30-40公里的訓練,盡量放鬆,保持穩定的節奏 (保持穩定的節奏的意思代表不需要為了求快而破壞自己的呼吸!)。
第二天:間歇訓練 (intervals)- 雖然可能有點無趣,但除了使用室內訓練台沒有其他更好的方式了。你可以參考 www.thesufferfest.com ,網站上有相當棒的訓練影片。不管是公路訓練或是訓練台,我都會建議 4段 3分鐘 8-9 PRE的間歇訓練,以5分鐘的休息時間為間隔。 (PRE=Perceived Rate of Exertion; 自感費力程度;10 為最大值)。剛開始你可能會感覺相當痛苦,但盡量以三週內左右增加為 5至 6次為目標。 (如果有時間的話,將間歇訓練加進一段50公里至 60公里的騎乘訓練中)
在頭三週後,可開始加入一分鐘的間歇訓練,休息時間為 1分鐘。環行公路賽基本上是ㄧ連串的衝刺,因此進行大量衝刺並利用時間回復體力的能力是相當重要的。試著在 3分鐘的間歇中加進 1分鐘的訓練 。然後,在比賽開始前ㄧ個月,僅需進行 1分鐘的間歇訓練,最多 20回。雖然相當辛苦,但可模擬環行公路賽中必須的衝刺。
第三天:中程訓練,可試著爬坡、單程衝刺、攻頂等。基本上,就是享受騎車的樂趣。你可以進行 80公里或是 180公里,決定權在你。請不要因為騎乘時間過長,而讓自己三、四天 毫無體力。你參加的是環行公路賽,不是環法賽! 
第四天:計時賽訓練。開始先進行幾次衝刺,然後維持比一般騎乘時稍快的速 度,看看你能維持多久。理想狀況下,你應該要進行 15-20公里的訓練,然後為自己計時,數週後你將發現自己速度漸漸變快,這是相當好的鼓勵。大多數人都忽略了計時賽訓練的重要性,但長時間維持高速的能 力,其實是贏得比賽的關鍵。(共 40-60公里)
第五天:輕鬆地騎車,享受ㄧ下大自然。如果你感覺狀況真的很好,可以作點衝刺訓練或是在距離較短的坡段進行高速騎乘。如果感覺普通,就維持輕鬆的步調就好。如果你覺得疲累,就再休息ㄧ天吧。
第六天:休息ㄧ天
第七天:團體騎乘或比賽。 
間歇訓練是讓你進步的重點,但切記不要勉強自己,間歇訓練是難熬的,因此你必須有足夠的動力。如果你覺得缺乏這樣的動力,就不要強迫自己,因為間歇訓練必須徹底執行才能發揮效果。如果你覺得自己狀況不是很好,就不要勉強自己吧。 
比賽開始前,檢查ㄧ下比賽路線。盡量找ㄧ條與比賽路線相似的路進行訓練,如果比賽路線在你家附近,你便可以直接在比賽路線上訓練。算ㄧ下賽程總共有多少彎 道,然後乘以圈數,這樣你就知道自己必須衝刺幾次了。進行環行公路賽時,距離不是最重要的考慮因素,而是整場比賽中必須衝刺的次數。
祝好運! 希望對你有幫助!

2012年9月23日 星期日

GPS 中國地圖偏移量快速尋找方法

上一編GPS紀綠中國路線時偏移說到需要為路線紀錄做偏移修正, 但又如何得出偏移量呢?


尋找偏移量的方法:
1. 先在地圖裏找一個地點做參考點, 一般我會使用兩條主幹道 (e.g. S字的省道)的交匯點作準.
2. 在Google map的"Map View"裏, 用cursor指著交匯點中心, 右按滑鼠, 按"這裏有什麼?" 之後就會如下圖所示, 出現該地點的經緯道.
S358及錦江路交匯點的座標為22.799525, 113.801404
3. 在Google map的"Satellite View"裏, 用cursor指著同一位置 (注意, 位置是有少少不同的, 這就是為何使用幹道作參考點, 在Satellite View裏幹道較為明顯容易標示) 右按滑鼠, 按"這裏有什麼?"

衛星圖沒有任何街道標記, 唯有用地形及街道的形狀辨認出同一位置



把兩個數值算一算, 就可以得出了偏移量. 這次這個位置得出了-0.0029,0.0050 這個約數.


注意:
  1. 在此再說明一次, 地圖偏移這現象於不同地區不同省分是不同程度的. 這種"線性修正"只適合一小個區域, 太大片的區域會出現不同程度的偏差.
  2. Google map是指maps.google.com.hk, 請勿使用內地的ditu.google.com.hk. 內地版是已經修正的, 無法求出偏移量.

GPS紀綠中國路線時偏移

很多回內地騎單車的朋友, 也喜歡使用GPS logger把騎車行程紀綠下來. 一來很多騎行是別人帶隊, 自己回家後總希望把路線重溫一次, 也希望把路線分享給朋友, 讓朋友可以依路線再去玩.

GPS logger很容易買到, 亦有不同的硬件可以做到, 例如:
- Holux 245
- iPhone 2/3G/4GS+GPS紀綠行程軟件 (e.g. Endomondo)
- 大部份既Android電話+GPS紀綠行程軟件 (e.g. Everytrail, GPS Essentials)
- Garmin Edge 500 / 800

但不少內地騎行的朋友發現,紀錄後的路線古古怪怪的, 總是和地圖有些偏差:
Fig. 1 GPS紀綠路線與地圖偏移 (From Everytrail)

紅色線偏離了幹道, 非常不合理吧?

不同討論區對此現象有不同說法, 有人表示此乃中國對地圖進行了加密處理, 對不同地方的地圖與GPS座標故意做成偏移, 以達到軍事保密的目的........亦有人認為只是內地測量地圖的方法與美國等其它國家不同, 在座標轉換時出現了偏差.....

甚麼理由也好, 但需要想辦法修正. Holux 245附送的eztour軟件已經內置修正, 最簡單.
但就如我使用Motorola DEFY (Android 2.3.7 CM7) + GPS Essential就沒有那麼幸福了, 需要自己動手修正.

自己動手修正你需要:
1. gpsinfoshare GPS座標修正軟體 (到google找, 很容易找到)
2. GPS路線紀錄檔案 (我習慣使用GPX 1.1格式)
3. 偏移量 (廣東省用 緯-0.0029/經0.0046就滿足一般需要. 下一編文章會再談如何算出來)

1: gpsinfoshare的界面

2: gpsinfoshare支持的檔案格式, 揀一個

3: 載入GPX檔案(由你的GPS logger提供), 再選擇經緯度手動補償, 廣東省內跟上圖輸入已可以
 最後輸出檔案, 再匯入到一般地圖軟件或路線分享網站 (e.g. Google earth, Everytrail, 等等)就可以.

修正完成後:
Fig. 2 修正完成

注意, 跟據網上不同論壇綜合說法, 內地不同地方的偏移量是有不同的. 以上介紹的"線性修正" 只適用於較為小的區域 (e.g. 於某一省內). 如路線紀錄為穿洲過省, 很大可能無法做一個完美的修正.

Ref:
Garmin 糾偏地圖
http://bbs.dospy.com/thread-12401348-1-164-1.html

修正前:
http://www.everytrail.com/fullscreen.php?trip_id=1781023&code=75fee9cfabd654f0f4379375b1ba642e

修正後:
http://www.everytrail.com/fullscreen.php?trip_id=1684471&code=82eb82a8f6a2d577225acd5631b3c4e2


2012年6月10日 星期日

Campagnolo 8速卡式飛輪變9速

單車發展那麼多年, 後輪飛輪由6速 - 7速 - 8速發展至今天11速, 經歷了很多改變:
- 旋式飛輪發展至卡式飛輪 (Traditional Freehub vs Cassette Cluster)
- 飛輪間距 (Sprocket Pitch)
- 鍊條闊度 (Chain Spacing)
- 開口距離 (Over-Locknut Dimension, O.L.D.)


當中很多規格的改變, 引伸了很多兼容/零件匹配等問題, 非三言兩語可以講清, 有機會再詳述.

今天要講的是Campagnolo 8速(下稱Campy 8速) 變"Shimano 9速"的方法.
為何我要這樣改裝呢?
1. 我的單車使用Shimano 9速系統, 但原有Spinergy Rev-X的尾輪為Campy 8速飛輪
2. Spinergy Rev-X已經停產多年, 無辦法再配"飛輪hub"了.
3. Spinergy Rev-X為一體成形碳鈴, 無法"織鈴" (Custom Wheel Build)

先看下表.  Shimano及Campagnolo的飛輪間距是不同的, 亦是兩家轉波把手 (或指撥)不能兼容的原因.

Fig.1 Shimano及Campagnolo飛輪間距

Cassette or Freewheel  Sprocket Pitch (mm)  Code
All modern 5 and 6-speed  5.5 S5/6
All standard 7-speed  5 S7
Campagnolo 8-speed  5 C8
Shimano 8-speed  4.8 S8
Campagnolo 9-speed  4.55 C9
Shimano 9-speed  4.35 S9
Campagnolo 10-speed  4.15 C10
Shimano 10-speed  3.95 S10
Campagnolo 11-speed  3.85 C11

由上表可見, Campy 8速為5mm, Shimano 9速為4.35mm. 要怎樣改呢?
答案就是把cog與cog之間的spacer改薄就可以了.


Cog. Campy 8sp Thickness "Campy-Shimano 9sp" Thickness
9
1.9
spacer
2.44
8 1.9 1.9
spacer 3.1 2.44
7 1.9 1.9
spacer 3.1 2.44
6 1.9 1.9
spacer 3.1 2.44
5 1.9 1.9
spacer 3.1 2.44
4 1.9 1.9
spacer 3.1 2.44
3 1.9 1.9
spacer 3.1 2.44
2 1.9 1.9
spacer 3.1 2.44
1 1.9 1.9
Sum of thickness 36.9 36.62


去那裏找2.44mm厚的spacer? 我去野牛單車買Miche為Campy 10速的spacer就有了.很便宜, HKD$5一個. 買8個, 會員有9折, 幾十蚊就有.

至於第9片26齒的cog, 我唯有忍痛用HKD$4xx於Chain Reaction Cycle買多一套8速Campy ExaDrive 8速飛輪.


左手面為Campy 8sp spacer, 右手面為Miche for Campy 10sp spacer


Campy 8sp spacer實測厚3.18mm

Miche for Campy 10sp spacer實測厚2.53mm

完成圖.  雖然有少少誤差, 但安裝後一齊正常. 留意第9片26齒閃令令, 新的一樣.




Ref:

http://www.ctc.org.uk/cyclists-library/components/transmission-gears/derailleur-gears/shimergo
http://branfordbike.com/articles/cassettes-and-cogs-pg60.htm
http://sheldonbrown.com/cribsheet-spacing.shtml
http://www.ctc.org.uk/desktopdefault.aspx?tabid=3946