5
5
"compress/gzip"
6
6
"database/sql"
7
7
"fmt"
8
- "io/ioutil"
8
+ "io"
9
+ "math"
9
10
"net/http"
10
11
"os"
11
12
"path/filepath"
@@ -23,10 +24,10 @@ import (
23
24
pb "gopkg.in/cheggaaa/pb.v1"
24
25
)
25
26
26
- //MBTileVersion mbtiles版本号
27
+ // MBTileVersion mbtiles版本号
27
28
const MBTileVersion = "1.2"
28
29
29
- //Task 下载任务
30
+ // Task 下载任务
30
31
type Task struct {
31
32
ID string
32
33
Name string
@@ -52,7 +53,7 @@ type Task struct {
52
53
outformat string
53
54
}
54
55
55
- //NewTask 创建下载任务
56
+ // NewTask 创建下载任务
56
57
func NewTask (layers []Layer , m TileMap ) * Task {
57
58
if len (layers ) == 0 {
58
59
return nil
@@ -92,7 +93,7 @@ func NewTask(layers []Layer, m TileMap) *Task {
92
93
return & task
93
94
}
94
95
95
- //Bound 范围
96
+ // Bound 范围
96
97
func (task * Task ) Bound () orb.Bound {
97
98
bound := orb.Bound {Min : orb.Point {1 , 1 }, Max : orb.Point {- 1 , - 1 }}
98
99
for _ , layer := range task .Layers {
@@ -103,7 +104,7 @@ func (task *Task) Bound() orb.Bound {
103
104
return bound
104
105
}
105
106
106
- //Center 中心点
107
+ // Center 中心点
107
108
func (task * Task ) Center () orb.Point {
108
109
layer := task .Layers [len (task .Layers )- 1 ]
109
110
bound := orb.Bound {Min : orb.Point {1 , 1 }, Max : orb.Point {- 1 , - 1 }}
@@ -113,7 +114,7 @@ func (task *Task) Center() orb.Point {
113
114
return bound .Center ()
114
115
}
115
116
116
- //MetaItems 输出
117
+ // MetaItems 输出
117
118
func (task * Task ) MetaItems () map [string ]string {
118
119
b := task .Bound ()
119
120
c := task .Center ()
@@ -136,7 +137,7 @@ func (task *Task) MetaItems() map[string]string {
136
137
return data
137
138
}
138
139
139
- //SetupMBTileTables 初始化配置MBTile库
140
+ // SetupMBTileTables 初始化配置MBTile库
140
141
func (task * Task ) SetupMBTileTables () error {
141
142
142
143
if task .File == "" {
@@ -205,7 +206,7 @@ func (task *Task) playFun() {
205
206
task .play <- struct {}{}
206
207
}
207
208
208
- //SavePipe 保存瓦片管道
209
+ // SavePipe 保存瓦片管道
209
210
func (task * Task ) savePipe () {
210
211
for tile := range task .savingpipe {
211
212
err := saveToMBTile (tile , task .db )
@@ -219,7 +220,7 @@ func (task *Task) savePipe() {
219
220
}
220
221
}
221
222
222
- //SaveTile 保存瓦片
223
+ // SaveTile 保存瓦片
223
224
func (task * Task ) saveTile (tile Tile ) error {
224
225
// defer task.wg.Done()
225
226
err := saveToFiles (tile , task )
@@ -229,7 +230,7 @@ func (task *Task) saveTile(tile Tile) error {
229
230
return nil
230
231
}
231
232
232
- //tileFetcher 瓦片加载器
233
+ // tileFetcher 瓦片加载器
233
234
func (task * Task ) tileFetcher (mt maptile.Tile , url string ) {
234
235
start := time .Now ()
235
236
defer task .tileWG .Done () //结束该瓦片请求
@@ -240,21 +241,44 @@ func (task *Task) tileFetcher(mt maptile.Tile, url string) {
240
241
prep := func (t maptile.Tile , url string ) string {
241
242
url = strings .Replace (url , "{x}" , strconv .Itoa (int (t .X )), - 1 )
242
243
url = strings .Replace (url , "{y}" , strconv .Itoa (int (t .Y )), - 1 )
244
+ maxY := int (math .Pow (2 , float64 (t .Z ))) - 1
245
+ url = strings .Replace (url , "{-y}" , strconv .Itoa (maxY - int (t .Y )), - 1 )
243
246
url = strings .Replace (url , "{z}" , strconv .Itoa (int (t .Z )), - 1 )
244
247
return url
245
248
}
246
249
tile := prep (mt , url )
247
- resp , err := http .Get (tile )
250
+ client := & http.Client {
251
+ CheckRedirect : func (req * http.Request , via []* http.Request ) error {
252
+ // 自定义重定向的行为
253
+ return http .ErrUseLastResponse // 使用最后一个响应
254
+ },
255
+ }
256
+ req , err := http .NewRequest ("GET" , tile , nil )
257
+ if err != nil {
258
+ fmt .Println ("创建请求失败:" , err )
259
+ return
260
+ }
261
+
262
+ req .Header .Set ("User-Agent" , "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36" )
263
+ // req.Header.Set("Origin", "https://map.tianditu.gov.cn")
264
+ req .Header .Set ("Referer" , "https://jiangsu.tianditu.gov.cn" )
265
+ resp , err := client .Do (req )
248
266
if err != nil {
249
- log . Errorf ( "fetch :%s error, details: %s ~" , tile , err )
267
+ fmt . Println ( "发送请求失败:" , err )
250
268
return
251
269
}
252
270
defer resp .Body .Close ()
271
+ // resp, err := http.Get(tile)
272
+ // if err != nil {
273
+ // log.Errorf("fetch :%s error, details: %s ~", tile, err)
274
+ // return
275
+ // }
276
+ // defer resp.Body.Close()
253
277
if resp .StatusCode != 200 {
254
278
log .Errorf ("fetch %v tile error, status code: %d ~" , tile , resp .StatusCode )
255
279
return
256
280
}
257
- body , err := ioutil .ReadAll (resp .Body )
281
+ body , err := io .ReadAll (resp .Body )
258
282
if err != nil {
259
283
log .Errorf ("read %v tile error ~ %s" , mt , err )
260
284
return
@@ -294,7 +318,7 @@ func (task *Task) tileFetcher(mt maptile.Tile, url string) {
294
318
log .Infof ("tile(z:%d, x:%d, y:%d), %dms , %.2f kb, %s ...\n " , mt .Z , mt .X , mt .Y , cost , float32 (len (body ))/ 1024.0 , tile )
295
319
}
296
320
297
- //DownloadZoom 下载指定层级
321
+ // DownloadZoom 下载指定层级
298
322
func (task * Task ) downloadLayer (layer Layer ) {
299
323
bar := pb .New64 (layer .Count ).Prefix (fmt .Sprintf ("Zoom %d : " , layer .Zoom )).Postfix ("\n " )
300
324
// bar.SetRefreshRate(time.Second)
@@ -334,7 +358,7 @@ func (task *Task) downloadLayer(layer Layer) {
334
358
bar .FinishPrint (fmt .Sprintf ("Task %s Zoom %d finished ~" , task .ID , layer .Zoom ))
335
359
}
336
360
337
- //Download 开启下载任务
361
+ // Download 开启下载任务
338
362
func (task * Task ) Download () {
339
363
//g orb.Geometry, minz int, maxz int
340
364
task .Bar = pb .New64 (task .Total ).Prefix ("Task : " ).Postfix ("\n " )
0 commit comments