152海岸線子列表
3797動態簡化後總座標點
468目前單條最大點數
34 KBGGB 檔案大小
目標與成果
| 需求 | 做法 |
|---|---|
| 可旋轉的 3D 地球儀 | 使用 GeoGebra 3D 視圖,球面以 Sphere(O, r) 建立。 |
| 經緯度線 | 避免 Sequence(Curve(...)) 不渲染,改用經緯度列表 + GeoPoint + Polyline。 |
| 兩自由點與最短路徑 | P = Point(globe)、Q = Point(globe),路徑用 CircularArc(O, Pdraw, Qdraw)。 |
| 近似世界地圖 | 使用 Natural Earth 1:50m coastline 真實海岸線資料,轉成球面 polyline。 |
| 代數區簡潔 | 全部海岸線收在單一 coastCoords list of list,透過外層 Zip 一次生成。 |
目前版本保留
GeoPoint(<point>, <radius>) 自製工具作為語意化轉換工具:輸入 (longitude, latitude) 與半徑,輸出球面 3D 點。製作流程
1. 建立球面
定義 r、drawR、球心 O 與 globe = Sphere(O, r)。
2. 建立 GeoPoint
把經緯度點轉為球面 3D 點,避免主構圖中反覆展開三角公式。
3. 處理海岸線
讀入 Natural Earth 50m coastline,切開日期變更線,做 Douglas-Peucker 簡化。
4. 批次繪圖
用 coastCoords 保存所有海岸線,再用 Zip 一次生成全部 polyline。
5. 修正可見性
線條繪在 drawR 外層;經緯線也改用 Polyline,避免 3D Curve list 不顯示。
| 處理項目 | 方法 | 理由 |
|---|---|---|
| 點數分配 | 依海岸線長度動態分配 | 大洲輪廓保留較多細節,小島避免過度細緻。 |
| 視圖設定 | 開啟 Algebra + 3D Graphics | GeoGebra 檔案開啟時直接可見繪圖區。 |
| 最短距離 | theta = Angle(P, O, Q),真實距離可用 6371 * theta | 優先使用 GeoGebra 原生命令,避免手寫 dot product。 |
核心指令
目前核心指令節錄
r = 3.5
drawR = r * 1.04
globe = Sphere(O, r)
latitudeCoords = Sequence(Sequence((lambda, phi), lambda, -180, 180, 10), phi, -latMax, latMax, latStep)
longitudeCoords = Sequence(Sequence((lambda, phi), phi, -90, 90, 10), lambda, -180, 165, lonStep)
latitudeLines = Zip(Polyline(Zip(GeoPoint(C, drawR), C, coords)), coords, latitudeCoords)
longitudeLines = Zip(Polyline(Zip(GeoPoint(C, drawR), C, coords)), coords, longitudeCoords)
coastCoords = {{(180, 68.9834), (170.161, 69.6266), (170.538, 68.8254), (166.82, 69.4996), (161.566, 68.9052), (160.911, 69.6063), (159.912, 70.5061), (152.509, 70.8345), (150.668, 71.4552), (150.017, 71.8957), (145.189, 71.6958), (145.759, 72.2259), (146.832, 72.2954), (144.169, 72.2588), (141.079, 72.5869), (139.359, 71.9514), (137.918, 71.3841), (137.94, 71.1334), (132.654, 71.926), (128.843, 71.6635), (129.21, 71.9169), (129.284, 72.092), (129.25, 72.7052), (124.541, 73.7513), (123.622, 73.1 ... }
coastlines = Zip(Polyline(Zip(GeoPoint(C, drawR), C, coords)), coords, coastCoords)
theta = Angle(P, O, Q)
greatCirclePath = CircularArc(O, Pdraw, Qdraw)
d_{PQ} = r * theta| 物件 | 意義 |
|---|---|
coastCoords | 所有海岸線的 list of list,每個子列表是一條海岸線的經緯度點。 |
coastlines | 外層 Zip 逐條取出海岸線,內層 Zip 將經緯度轉成球面點,再以 Polyline 繪製。 |
latitudeLines / longitudeLines | 以同樣的列表轉換方式建立,避開 Curve list 渲染問題。 |
greatCirclePath | 使用 CircularArc 表示兩點間的大圓弧。 |
GeoPoint 的數學意義
若 C=(longitude, latitude),半徑為 drawR,則轉換為:
X = drawR cos(latitude) cos(longitude) Y = drawR cos(latitude) sin(longitude) Z = drawR sin(latitude)
角度會乘上 pi / 180 轉成弧度。
參考資料與來源
| 資料 | 用途 | 來源 |
|---|---|---|
| Natural Earth 1:50m Physical Vectors - Coastline | 世界海岸線與主要島嶼輪廓 | Natural Earth 1:50m Physical Vectors |
| Natural Earth Terms of Use | 確認資料授權 | Natural Earth Terms of Use |
| QuickMapTools Coastline 說明 | 確認 coastline dataset 屬性與尺度 | QuickMapTools Coastline |
Natural Earth 官方條款頁說明其 raster 與 vector map data 為 public domain;QuickMapTools 的 coastline 頁面也描述 coastline dataset 是 Natural Earth/NACIS 維護的 public domain vector layer。
注意事項與踩坑紀錄
3D 視圖 ID:本機 GeoGebra Classic 開檔時,需使用可見的 3D Graphics View 設定;錯誤的 view id 會開成設定面板或空白區域。
Curve list 問題:
Sequence(Curve(...)) 的代數物件可能存在但 3D 視圖不渲染。因此經緯線改用 Polyline。線條半徑:海岸線、經緯線與最短路徑畫在
drawR,略大於球半徑 r,避免被半透明球面遮住。後續可調參數:
SIMPLIFY_EPSILON_DEGREES 控制海岸線簡化程度;動態點數預算控制大洲與小島細節分配。