地图瓦片始取程序

from urllib import request
import re
import urllib.request
import os
import random
import math
import time
import threading
agents = [
     'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/60.0.3112.101 Safari/537.36',
    'Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US) AppleWebKit/532.5 (KHTML, like Gecko) Chrome/4.0.249.0 Safari/532.5',
    'Mozilla/5.0 (Windows; U; Windows NT 5.2; en-US) AppleWebKit/532.9 (KHTML, like Gecko) Chrome/5.0.310.0 Safari/532.9',
    'Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US) AppleWebKit/534.7 (KHTML, like Gecko) Chrome/7.0.514.0 Safari/534.7',
    'Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US) AppleWebKit/534.14 (KHTML, like Gecko) Chrome/9.0.601.0 Safari/534.14',
    'Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US) AppleWebKit/534.14 (KHTML, like Gecko) Chrome/10.0.601.0 Safari/534.14',
    'Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US) AppleWebKit/534.20 (KHTML, like Gecko) Chrome/11.0.672.2 Safari/534.20", "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/534.27 (KHTML, like Gecko) Chrome/12.0.712.0 Safari/534.27',     'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/535.1 (KHTML, like Gecko) Chrome/13.0.782.24 Safari/535.1']


# 经纬度反算切片行列号 3857坐标系
def deg2num(lat_deg, lon_deg, zoom):
    #lat_deg,纬度
    #lon_deg,经度
    lat_rad = math.radians(lat_deg)#将角度转化为弧度
    n = 2.0 ** zoom#2的zoom次方,瓦片个数
    xtile = int((lon_deg + 180.0) / 360.0 * n)
    ytile = int((1.0 - math.log(math.tan(lat_rad) + (1 / math.cos(lat_rad))) / math.pi) / 2.0 * n)
    return (xtile, ytile)

# 经纬度反算切片行列号
def deg2num2(la,lo,zoom):
    if la>90:
        la=89
    if lo>180:
        lo=179
    y = math.ceil((90-la)/(180/(2**zoom)))-1
    x = math.ceil((lo+180)/(360/(2**zoom)))-1
    return x,y


# 下载图片
def getimg(Tpath, Spath, x, y):
    print(Spath)
    Spath_dir = "/mnt/m3/tilemap/17/"+str(x)
    if not os.path.exists(Spath_dir):
        os.mkdir(Spath_dir)
    try:
        f = open(Spath, 'wb')
        req = urllib.request.Request(Tpath)
        req.add_header('User-Agent', random.choice(agents))  # 换用随机的请求头
        pic = urllib.request.urlopen(req, timeout=60)

        f.write(pic.read())
        f.close()
        print(str(x) + '_' + str(y) + '下载成功')
    except Exception:
        with open("/usr/local/program/project/map_pachong/failed","a") as f:
            f.writelines(str(x)+'_'+str(y)+'下载失败')
        print(str(x) + '_' + str(y) + '下载失败,重试')
        getimg(Tpath, Spath, x, y)



def main_main(lefttop,rightbottom):
    start_time = time.time()
    num = 0
    for x in range(lefttop[0], rightbottom[0]):
        for y in range(lefttop[1], rightbottom[1]):
            # tilepath = "http://t3.tianditu.gov.cn/DataServer?T=cva_w&x=" + str(x) + "&y=" + str(y) + "&l=" + str(zoom)
            tilepath = "http://mt3.google.cn/vt/lyrs=r&scale=2&hl=zh-CN&gl=cn&x="+str(x)+"&y="+str(y)+"&z="+str(zoom)+"&s=Galil"
            print(tilepath)
            # 天地图的url 可以换成谷歌地图的
            getimg(tilepath, os.path.join("/mnt/m3/tilemap/17/",str(x)+"/"+str(y)+".png"), x, y)
    #        num+=1
    #       if num>100:
    #            break
    #   if num>100:
    #       break
    end_time = time.time()

    print('完成',end_time-start_time)


if __name__=="__main__":
    path = r"/mnt/m3/tilemap/17"
    if not os.path.exists(path):
        os.mkdir(path)

    # # zoom = 15  # 下载切片的zoom

    # lefttop = deg2num(38.507126, 113.605620, zoom)  # 下载切片的左上角角点
    # rightbottom = deg2num(34.011111, 122.989999, zoom)
    #
    # print(str(lefttop[0]))
    # print(str(rightbottom[0]))
    # print(str(lefttop[1]))
    # print(str(rightbottom[1]))
    # print("共" + str(lefttop[0] - rightbottom[0]))
    # print("共" + str(lefttop[1] - rightbottom[1]))

    # duan_num=2
    # duan_0 = int((rightbottom[0]-lefttop[0] )/duan_num)
    # duan_1 = int((rightbottom[1]-lefttop[1] ) / duan_num)
    # t1 = threading.Thread(target=main_main,args=(lefttop,(lefttop[0]+duan_0,lefttop[1]+duan_1)))
    # t2 = threading.Thread(target=main_main,args=((lefttop[0]+duan_0,lefttop[1]+duan_1),rightbottom))
    zoom = 17
    start=(106898,50323)
    end = (110315,52354)
    # start=(1000,3000)
    # end = (2500,9999)
    xiancheng_num=2
    start=(106898,50323)
    end = (110315,52354)
    duan = int((end[1]-start[1])/xiancheng_num)
    
    #建立线程
    ll=[]
    for i in range(xiancheng_num-1):
        para = ((start[0],start[1]+i*duan),(end[0],start[1]+(i+1)*duan-1))
        print(para)
        t = threading.Thread(target=main_main,args=para)
        ll.append(t)
    para = ((start[0], start[1] + (i+1) * duan), end)
    t = threading.Thread(target=main_main, args=para)
    ll.append(t)
    print(para)


    for i in ll:
        i.start()
    for i in ll:
        i.join()
    print("finish")


    # x,y = deg2num(38.507126, 113.605620,zoom)
    # tilepath = "http://mt3.google.cn/vt/lyrs=r&scale=2&hl=zh-CN&gl=cn&x="+str(x)+"&y="+str(y)+"&z="+str(zoom)+"&s=Galil"
    # getimg(tilepath, os.path.join(path, str(x) + "_" + str(y) + ".png"), x, y)

本想通过多线程分块始取,但不知哪里出了问题,以上部分程序始取存在问题,只始取了一半瓦片。没办法,只好进行手动始取操作。

from urllib import request
import re
import urllib.request
import os
import random
import math
import time
import threading
agents = [
     'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/60.0.3112.101 Safari/537.36',
    'Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US) AppleWebKit/532.5 (KHTML, like Gecko) Chrome/4.0.249.0 Safari/532.5',
    'Mozilla/5.0 (Windows; U; Windows NT 5.2; en-US) AppleWebKit/532.9 (KHTML, like Gecko) Chrome/5.0.310.0 Safari/532.9',
    'Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US) AppleWebKit/534.7 (KHTML, like Gecko) Chrome/7.0.514.0 Safari/534.7',
    'Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US) AppleWebKit/534.14 (KHTML, like Gecko) Chrome/9.0.601.0 Safari/534.14',
    'Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US) AppleWebKit/534.14 (KHTML, like Gecko) Chrome/10.0.601.0 Safari/534.14',
    'Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US) AppleWebKit/534.20 (KHTML, like Gecko) Chrome/11.0.672.2 Safari/534.20", "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/534.27 (KHTML, like Gecko) Chrome/12.0.712.0 Safari/534.27',     'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/535.1 (KHTML, like Gecko) Chrome/13.0.782.24 Safari/535.1']

def getimg(Tpath, Spath, x, y):
    print(Spath)
    Spath_dir = "/mnt/m3/tilemap/17/"+str(x)
    if not os.path.exists(Spath_dir):
        os.mkdir(Spath_dir)
    try:
        f = open(Spath, 'wb')
        req = urllib.request.Request(Tpath)
        req.add_header('User-Agent', random.choice(agents))  # 换用随机的请求头
        pic = urllib.request.urlopen(req, timeout=60)

        f.write(pic.read())
        f.close()
        print(str(x) + '_' + str(y) + '下载成功')
    except Exception:
        with open("/usr/local/program/project/map_pachong/failed","a") as f:
            f.writelines(str(x)+'_'+str(y)+'下载失败')
        print(str(x) + '_' + str(y) + '下载失败,重试')
        getimg(Tpath, Spath, x, y)

def main_main(lefttop,rightbottom):
    start_time = time.time()
    num = 0
    for x in range(lefttop[0], rightbottom[0]):
        for y in range(lefttop[1], rightbottom[1]):
            # tilepath = "http://t3.tianditu.gov.cn/DataServer?T=cva_w&x=" + str(x) + "&y=" + str(y) + "&l=" + str(zoom)
            tilepath = "http://mt3.google.cn/vt/lyrs=r&scale=2&hl=zh-CN&gl=cn&x="+str(x)+"&y="+str(y)+"&z="+str(zoom)+"&s=Galil"
            print(tilepath)
            # 天地图的url 可以换成谷歌地图的
            getimg(tilepath, os.path.join("/mnt/m3/tilemap/17/",str(x)+"/"+str(y)+".png"), x, y)

if __name__=="__main__":
    path = r"/mnt/m3/tilemap/17"
    if not os.path.exists(path):
        os.mkdir(path)

    zoom = 17
    # start=(106898,51337)
    # end = (110315,52354)
    # start=(1000,3000)
    # end = (2500,9999)
    xiancheng_num=2
    start=(106898,51337)
    end = (110315,52354)
    main_main(start,end)
    # duan = int((end[1]-start[1])/xiancheng_num)
    # # 建立线程
    # ll = []
    # for i in range(xiancheng_num - 1):
    #     para = ((start[0], start[1] + i * duan), (end[0], start[1] + (i + 1) * duan - 1))
    #     print(para)
    #     t = threading.Thread(target=main_main, args=para)
    #     ll.append(t)
    # para = ((start[0], start[1] + (i + 1) * duan), end)
    # t = threading.Thread(target=main_main, args=para)
    # ll.append(t)
    # print(para)

    # for i in ll:
    #     i.start()
    # for i in ll:
    #     i.join()
    # print("finish")
    ```
    
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值