最近想要做一下古建筑物的样本标注,想下载一下rgb影像。。某新地球和xxmap都不能下载17以上(含17)的,急死俺了,只能去github上找一下参考,自己去做一个。这边来说一下自己做的一个思路。
github地址
https://github.com/sadassimov/tiledownload
![](data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAjkAAAD6CAYAAABDCFZeAAAgAElEQVR4nO3dfXAc9Z3n8U+Pxpb8INtgyIMNGINlCylKHEPYIoEk7F1yJg67hy0tLMUlW1xIbZ3vIbnah3BJ2WtVXNlLdiF7d2Qvye5e7R4PTjRmkw0JLEkgdcDybEwUyTKWiSHGIBsby7IeZjQzv/tDGqmn1d3T86CZnvb7VTWlmZ5++EmanvnM9/frbssYYwQAABAxsVo3AAAAYD4QcgAAQCQRcgAAQCTF/Z5cv369FGvQHf8mrvNendSeN7JKGaOL1y5Q7GhKT5+amm/1u2Jamczq0ISlDe+ydHooqyOpajQfAACcS7LZrCzLkmVZkjTzU5IOHTqUN69vyJEkNUqrF2b12KsZHUkaGWO0Imu0XNLg4GBFGw4AAOBl3bp1sh8vZVmWjDF5QceuYHeVSRq9ORnTR1oatKY5pisuXqDfXskBWQAAoLZygcfrQPHCY3IyGX1/X0bp98b1p9fG1XlhVi8OVbSNAAAAgRhjZm7O6U6+3VW5BU69Oan/fmw2LWWzk2poaKhUewEAAEpSVneVc0WcOxAAANRKMTmEQ8gBAEBdcXZZlT4mx2dhAACAsCp8CPk8mMxIp8eysiStWBxTnOE9AACgBLkxOUUPPPZbYSmOn8nqf/9iQj/qTenNYUmWdNFy6d9+YKE+/7Emnb+U3jMAAOAtm80GPvip8HlyHP1dpQac14aO67PffkXffGxCR06mNZYyGksavXLc6Os/TeqT3zyj/mOZItfar+7WVnX3Fz9ff3erWrv71d/dKsuy1Gp/cm+XrK69c9fS3ao5k/u71Tp95kX/29T2E11B5p2+5W2sX92tXUrMNlJdrd3q7+9Wq2Wf3q/u1vz1dO3VzO85c2vtVsE/GwCgKvbt2xfoFjaWZfm2a9++fZ5HPpXD6zByp6KPrirFieGkTvT/Z72/+WfadunD2rXp67pixaCuWDGohQ2TWrfsiJZmD+jHv/h7nRzJ+q4r/8O6XTsPHtTOdo+QkPsg70/o/o7d2tE2d31tOwZkjNGA25OSZ+DJ05mY/mP3adcGqTNh8v4BuemS1NnjfC6hTnWqxzinG5mebVPbn/ldE+qyBZfpX0AD5hZ9Ly/ozK6vL7dhSRt29dm2CQAIk02bNvnewujFF1/UVVd9yDXo7Nu3T1dd9SG9+OKL896OsgYel+vQKz9QMnlSzwxdpZ8du04nJ1bqsd/5uH5+4/W659o/1j9vuUGPfvpf6z9u+IKe/dXTvuvKhRJjjHo63QKF7TawQ23qV/fWXn21Z5tLJWY2NMyp5njZkwsdcytIia527TwoJTrnVnBKtq3HFpRmw0vPtivUod7pasw29ZgeW3CZ/b3adx6cmXpwZ/t0mzptgQgAgNJs2rRJL7zw/Jygkws4L7zwfE0D2rwPPB5NZvXoryb0rV/dr8nMAm2+6Bf6d+v/XsbEdHxslZYtGNaSBSOSpAYrrfiZvUqmP6LGQi3r79ZXenfpwZ7chL3qsvbo5rwPe0l7d6p3d492aK+6enfr5l5L1swMvfqqMeqZXam6Wy1N5YKELKtTPQlJiU7NVts61GOM1NVq6+7pU3dr59RyG3apb2CH2jRVddqqB7WjTeou4W831Z522XKK5Cz72R9Pb3vHgNEO+1qm22HMAXVZX1ZH34BrVQsAgGLZg84LLzwvSaEIOFIVKjlnxsb0i6OtSmfikpFalr2q8cwivfz2VXpg8DYtXTCi10fWTs9t6YL4yzp5tlC3WL+6t+5Ux+6pMOEnsScxXVnZo5t7ts12FyU6pc5bHN02bdoxkHsuIdPXoa90Jma6o/p2bVBnoked6ld/r3259qnljJF5UNqaq6L07vbuBsvTq6+0ulWS2mbXm2tTXheYo5trYIfkHHszXc2ZquJ0KiFb9x7jcgAAFWAPOmEJOFIxIWfDrfrCn/6eLi5yA+lsTLdcNtVHlJX0W+95RpcvH9CmC5/Vtsu+r0uWHtGa5lf16vAGvXF2jc6mlsrIP+T0d2/VzoOdunnbXlt3U6cSed1PU91EnT1Gpq9Pfc4KjyRpT1531ZyxN207NJDwGr3SobaZ/NI3O9h3q/RgLnTcsmc6TOxUr8dacm59sE+33t8+J3jMjEHqTExXlHJtPaC2jl7192tq8PP0cvbuvNzYmw27+tTTKUdIynXnAUC0BD24A9E375WcZYsWaeO7X9WnL/65YpJ+fvS39fLbH5KRdHHzq7r/0Gd0/+Af6MZ/TugvX/4jffuVL2nlEp8V9ndr60z/zTZbJcM5gDfXJbNXXe3tane+wDsTUqJXHX2Ogb6F7OmaGgSsDltAyFVy+rRLO2e31amp9gzsUofvSjvU1jZVtem79X6128bxtO0YmK4gmZmfuba2dUi9B6TEztmqVv7RW3t08/Sg6s4eW+jyPcJq75yg6C7ofABQXZ7jNB03VI59DI7bGJ1aKTwmp+2z+pPPXK1YJqN0OqPf23m1JidTevKfvhVoA8sXW5pY/Gnt/q079dNj1+n/vHKLHjt2nZ743es0klqh/9H3OZ1JLVGDZfS9X/+OvvDxSTUt8M5eiZ3369a+hHrb9wTafn/3l5VQp2NgrpQbw9M2NXhGre29+qprtcfhlh6ZntzyXbq5zx5f2vLHw/T3F90d1LZjQKazW61bu9U5sENt2qudOw8qIWt6sLAlS1MDrnvaO9T75VYlOhIy0/mss6dPu2bG8UxVtjoTRj3qmgp2ObaxQ/mmgmNhQecDAESZ2yBj+xidWnZbFa7kHP6h/vaur+q7/7hfqbEX9ci3vq57v32XBg4fD7yR9Ru26tjE+2RkyZLR8GSzzk4u198d+LzWL/u1YtbUh+V5i+P6zLXv9l1XZ09xg2anum961DldeZjtkdqmmzunu7fcAk6ic6pC0eex4v4+9W6wV3P25nV9de2V1NZWWndQ2w4NzASQbXmHg3cmZg9H1xUdkm5VX882zZw3RxKHkAMAqsHrKCqvo66qrXAlJ3laJ4+fllkxLmUndebEkE4ao3g8+IFZq1Yu00jL17Xh2bfVe+K9Op1s1id//BO9OX6hmhpSsiSdv8TS335miS4+v9I9aLkjlKY++DvzpknKVXn6u9W6tVcdSihxcIN29ZmpMNXfrfunB9S07RiYPRLrQK8OdtyiNvU5jr6akuicqrjM2qBdZf8OkrRVHX1GPQe6ZLVLu3b1amt3pwba9yjRcct0+6bCW06ugHNwZ7usnbnm7CqjPQCASgtD906xrrzySr344ouu1Zpc0Lnyyitr1j1YtWtXbVjTou/8+4y+/vC4HnslrTdG3yNLUmPTYt34/rj+ePNiXXZhcQHne12WuhwnfEk4Dqne1bFTvbvNVHdOf7da23fqoKZCjGnTzMn2pmbvU8+OnvwVtnXq1t72OSFG2qBdfT2S+qYG9PqO5+lXd+vWon63mSW7W9W+U9rVZ9SXaNXO9gF1Jlpl9e6Wme6jauuyZO2UOhM9kvolW/dcf3erZnNN3/TRXnvV1epVogIAVFsYjkQqRaHwsmnTppqOf7KMz9ZbWlpmL+ew/vf1X353Uok//55en67kDA4OlrTRU2ezOjaclWVZWrU8pvOWMModAAD4W7dunZLJpGKx2Jwj5SzL0uHDh/PmD146yarAgd3Bnb80pvetjqt9VQMBJ/TyxxrljTkCACDEgndXjZzR2JINWnvZKo0OT2pi9PQ8NgvhwVFUAID6FDzkvPWUnti3Qdff+l+1MTup//f9v5zHZgEAAJSniIHH72jgB3+hA/84dWhyMUdXAQAAVFtVrkIOAABQbYQcAAAQSYQcAAAQSYQcAAAQSYQcAAAQSWUdInXHnXdXqh0AAAAVRSUHAABEEiEHAABEEiEHAABEEiEHAABEEiEHAABEEiEHAABEUuGQ0/xxfeZrf6KrV9gWWn+z3texZh6bBQAAUJ7C58kZ6dXgG526fP1SPfvsiCRp9WWXK/vKz8ra8AfXry1reVTO9ttv0ue+dFegecPyf4t6mwEA5QtwMsCTOnTwLX14/RWKP/ucJrVKl6xdqGPPD+vdZW78ru8kylwDaqEe/2/12GYAQHkCjck5MXBAo5e169KYpPNatWbZoM6cmeeWAQAAlCHYwOOjvXo13aq1l1pafPl6nf/6QY2YeW4ZAABAGYKFHHNIhw81aO26y7Tm8kv11isDys5Tgwafvreo6c7nB5++1/UWdJ2FtlPqvJVY93y2rVbK/T3nY/ulTAcAhE/AC3QaHTk4oOaPbFbH0iENPjwSfNEirbvmNg0+fa/WXXObJOXdL2X53DqCyC3ntc1CbSn0vN+6S11nWAT5G4fx9/B6vXi11e316TUfAKC2AieVyVf69JubbtHFxx/Wz4aLWbJ4zg8Ie5XG7Xm35f0Ci/2DyW2+UsKIm2KqAUE/ZIvZlnPafH7weoXSegh1zu0FeX35zUu1BwDCIXhUmXhG3/+zp2WMkSlqwdIFqei4BRbJP6h4VYvs66pE0AnS9iDrd/6OzvU77xez7lopFDTt06vRBi9B/q5h/1sDwLmqGlklMOcHeJAPjkIVBL8PpdxPezByW7dXG90el8srtLk9dlu2nDBVTc5qW47b33e+2k5YAYBoC1XIcY5z8AsUXh9G9i4t54eo2zgdvy4d54deqR+KxVQpvNobRC2qIZVUT10/Xq/NevlbA8C5IFQhx8mtO6mUSoZXhca5XnvwqdcPq2LHl1RCoepWkHDqtlyh+ctR6ngpt2n1/HoBgCgLdcgJwu0D1K37o1DlJ8gh6kHHzxQaB1TKWBy3aYWO8KlWaPD7wC+2C62Uo+JKUaluvbBWmgAAdRByCg30dPugL2awstfYkPlQ7GDmoN1jhcYchVHY2lfK36xarxsAQGmCnQywRtzGxASpuORubo9z63ELBvOtGh+KbkeYVUuxoSUsQaeUv1kY2g0A8Be6Sk6hb9SFPlhKHSsRZMBvoe4jL871ljO4uNB23MbkhPUD2e1/Xe2qSKl/s1q1FwAQXKhCTjHfqOd77IbfUVdBl/MLMs4PyXJCSKF1zFeocrahmHXXekxOpf5m1WovAKB4ljHG81KbLS0tyj1tjMm7xeNxXd+1veQNf3D9Wt31nUTJy6NyDj9znz73pbsCzRuW/1vU2wwAmOvxnnuUTCYVi8VkWdbMTYqp+YqL9fKPH8+bP9RjcgAAAApafoE2fKBxzmRCDgAAqG+LF6opNTpnMiEHAADUt0xGmYa5kaZmA4+3335TrTaNMtTj/60e2wwAKMKkUTo+N+TUbOAxAABAMfpeuF/vXjqmffvO5g08bly7Rld1pPR/v/lU3vyhOoQcAADAy6mjwzqRTk0/WqS1N1yuVc0xNSilY08enTM/IQcAANSF9GRWyWRGsVhMUlK/eWJQx+MNarp0ldo+cMGc+Rl4DAAA6sK71p6nq65aNv0oq/TZpMaGx3Xq9VElz2uaMz+VHAAAUBfyu6ts4pbi6eycyVRyAABAXUhPZjUxkZn7REODGjKEHAAAEDWptFILOOMxAACImlOndOT1hXMmhyrkfPdrXww0rZjlKzV/tdtW7nIAAETNqjWt+sgnf1/Xbb7N8UxKJ545OGf+UIUcp+9+7Yu64867PT/oCwWAQs/7rbvUdZaLUAMAgLtjrw3oqUcf0BOP3Bto/lAcXWX/YLcHmzvuvFuS5jyuxHYKTbdvq5RtB6n8uK2zUr8rAADnulCEHOcHu1sFpxIf/s71OwVdvzOUOdfvvB903V7rDRKOAABAvlCEHGf1xl7BsfMKJn6PK9E2Zzu9HrstW0yYChKM6M4CACCYUIQcafbD269q4fzQL6VaklsuaGCxV5SKraAUs51S0bUFAIC7UAw8dqveOINBvQpSjXJTaNB1sesDAOBcE5pKTo5XRcdtvqDjZwoN8C1lLI7bNPuYn6DLF9ouA5EBAChNKEKO1wDj+a7gFBsggnaPec1XbjADAADBha67KqcaXVTVCFNuh8IHnT+HwAMAQPGKqORYumbjQm25wGihyeqhQ2b+WqVgA35LPQuxc73lDC4utB23wFLuIezlLgMAwLkgeMhZFNPHVhk9+0xKT44aJU2DrpnHhjmVeq4Yt/PN+HUxVSLsFFqHW6jyCyte5+Ipt50AAESZZYzxLMm0tLTInNegb3y4QUuzRpmslMpklUpPVXIWXPMfqtlWAABwDnu85x4lk0nFYjFZljVzkyTLsnT48OG8+QtXck6n9bXHMoo1NegPr5aefCKllzLVr+QAAAAUo3DIyUqnxoyMpIykkQmjk2mjeCiOywIAAHAXiqOrAAAAKo2QAwAAIomQAwAAIsk35CyqVisAAAAqzDfkfLK5Ws0AAACoLN9jpH44YnswOqndPzHyPqsOAABAeNTsQPCO1Y212jSQZ/MNW/SNv3mw1s2AC94nUCr2a0g1vgr5Z//g9lpuHhF0X88jRc2//fabdHBwyzy1BpXA+wRKMTQ0VOsmIARCe0q/Fc2LdHpkvKT5Ci1bzDIrmoMPvw7SXsy/u76TqHUTAnFeryz3uJgLuPrNG1TQdXrx2pbb7wYA1RSKkOMVJNym24OEPZg457U/Ljd8eG2zUFsRbaUGiUIXjfULOsUIEjL8focg4cVrWjF/GwCYL6EIOaWEEGfYCBJEgqwnF1b8gkwlAxTqV6kVkCBXni+0HrcqkNdyuef8rmbvtl63sFVseKGCA6CWQhFycvyqIc4wYa/gnB4Zr0glx2td9vW5BSIgKGdI8HscNBzYu7m8thckqNgDCeEEQBSEKuRI/hUUt+nOao49qDgDi/O+s6vLLwy5dYtRxYGbIBWaUsfXOIOIfZ2Ftuec5tV2r3n8fi+6pwCEUehCTtDqiF+1xa1bSfKu/nhVb9y2RSUHhRQaPOx232/8jDMY2YNI0DE1QSo5boHIa51+7QOAsAhVyCmmMuIMJqVUVQqFG7d124MRgQdevIKOfXqpoaBQuLHPl2MPJ36BJ2gVym95t+0DQC2EIuSUe5h2oeWLCUBB11XM4GbUxuDT93o+t+6a2+Z9+0EqOkG6nIIoFHqCVFu82hR0gLRbVxoA1FIoQo4ULIh4BZBiz5NTaju8qjgIp3XX3OYadKoRcPx4hYdyqztevKo4QdcRpPpEVxWAMPK9QGctrGheNOcWdLncT69z57jNnxOk6ykXboppF2rLGWiqHXCCHArud1RUoelBx9rkAkqQCktuvkKHkwdB8AFQS6Gp5NhVYqyL8ygr+7qKrcIUc7JChE+uolPrCo5UOKS4jbcptUsraFDy2o7bUV3FHBUGAJVmLWvW1e9fpgOPn9RYgPlDGXL8jpzymj8XXPwGE7uFmyCDj8vpSkM4hCHgSP5nPnZWTdyWsU8LOg7HT5AjvPwqOl7jcMo5gSAAeGlcFFfqrWGNSrK0SGtvuFyrllqKWZasmDVnfssYY7xW1tLSotzTxpi8Wzwe1/Vd20tuaMfqRi68h4q7r+eRoq5ddfiZ+3Rw8AhXKw4p3idQqqGhIfbrCNr3/H1afHJIr5+KybIatKB5oRpjlhSTLFnqfak/b/5QVnKAUm2//aZaNwEAME8WKqVTb2t6RHFW6bNJZaypCo5lza3k1CzkbL5hi4aGhmq1eUTUwcEjtW4CKoj3CQB21uikzih31FSIu6sAAACKse/H9+j4O0nFYnRXAQCACJnIOw6ocHdV6M6TAwAA4Cbl2ffkjpADAADqQpEZh5ADAACiiZADAAAiiYHHNdCxurHWTUCIbb5hCycxC4D9CH7YjyARcmqGs7jCC+eFCY79CF7YjyDRXQUAACKKkAMAACIpFCHnu1/74swtLMLUFiAI9iMAyBeKkHPHnXfrjjvvrnUz8oStPUAh5exH8xVG2I8A1FIoQg4AAEClhfroqty3yzvuvDvvvts8OYW+Obp9Y7UvY3/ebbpfW4Awc3tt26cV87pmPwJQD4qo5Fi6ZmOjdn+iUX/xiYW69qK5F8KqNPsbca4U73xTtpfog7xZOud1rtOr5F+oLUCY2V+3zoBh3xeCBg72IwD1IHglZ1FMH1tl9OwzKT05apQ0DbpmHhtmF6ZvemFqCxCUW+WmltiPAFRD4ZBzflzf+HCDlmaNMlnpPR9aqOvSWT10qNjLZFUeJW8guFz1JHcfAKKucMg5ndbXHsso1tSgP7xaevKJlF7KVLeS48X+pg3AWzH7CvsVgKgoPCYnK50aMzoxIWUkjUwYnRw3mkhXrhH2c3s47/v9zFVyijk3iNd8XtsP2hag1rxeu5L7vuL1fKkDj+3T2Y8AhIFljPHsd2ppaVHuabM4rv/2UenRR5J6Nm0Uj8d1fdf2qjXUjfMNuV6+gXasbuSaO/A0NDTEhQUDYD+CH/ajaHq85x4lk0nFYjFZljVzkyTLsnT48OG8+UN9CHkhbkd0SN7fCushAAFhwX4EoN7VdciR3N9weRMGysd+BKDe+YacRZLGqtSQc8nmG7ZoaGio1s0A6hr7EYBCfEPOJ5ulH5ypVlPOHfQTA+VjPwJQiG/I+eGI7cHopHb/xMh7mDIAAEB4cIFOAAAQSYQcAAAQSYQcAAAQSYQcAAAQSXV/npx61LG6sdZNQIhtvmELRw4FwH4EP+xHkAg5NcPp6OGFc78Ex34EL+xHkOiuAgAAEUXIAQAAkRSK7iq3i2wCKA77EYCos5oaddG7LL31RkpBzk0cikrOHXfezZsyUKZy9iOvK44DQJgsWrlYyxdnlQ04fyhCDgAAQCFNjVm980ZKkrTiqg3a2NYoKab3XN+ha65aOmf+UHRXecl9u7zjzrvz7rvNk1Pom6zbN1a/deaec07zag8QVoVe18W8ptmPANTCglRSQ2clxaTJ8YwWNDVIimmRJpVetGDO/KGu5NjfGHOleOebsr1EH+SN0jmv3zrd3oTt2+CNGfXC73Vtf20HfU2zHwGohfTZlJLT95MTk1qwaKEsa4GazLhG43NDTqgrOTnVfBN0+8Zpf45vnqhHfq/ram+P/QhAqcbPzo7GSY+llG2Ka2GTFE+NaaRp7glC6yLkeJmvN8vct9DcfSAKqv26Zj8CUGkTaduDsYxSjXHFF8ek0WFNLKyzMTmF2N9Eq7FO55s230JRL4p5vVbitc1+BGA+5B1VNZ5WqqlRTUsaZMZSSrlc6SUUIcdr8GPufu6N0PnYOQ6g1AGTfut0W8bZDiAM/AYRe72u3Z5nPwJQF1IppbRczStiSp1MK9k0dxbLGON5Pp2WlhblnjbG5N3i8biu79o+b20PwvnmWC9vlh2rG7nmDjwNDQ1xYcEA2I/gh/0omh7vuUfJZFKxWEyWtUiXfupiLZvIamT/r3V05Vod+unP8+YPRSWnVF6VHK9vmfUQgICwYD8CEG6TSo43aPHyjN4ek7KL0nPmqOuQI7m/4fImDJSP/QhAuGWUGo9r4cpRJVOSxlNz5qj7kFOPNt+wRUNDQ7VuBlDX2I8AnHq2T08+Z0mSrOHjc54n5NQA/cRA+diPgHPPwoVxbdnyAT32WL9GRsa1YsVi3XjjlXrooZc0PDw2Z/5Qn/EYAAAg55JLVuq55wa1eXOHLrnkAn3qUx/UE08M6MYbN+nSSy+cMz8hBwAA1IXXXz+po0dP6ZFHevXhD7foJz95Sa+99rZ+9KN9+uhHW+fMT8gBAAB1IZWaOoLqzJkx7dnztE6fnuqiOn16VP/wD0/MmZ+QAwAAIomQAwAAIqlmR1d1rHa5yAQAAAidzTds0frL12h4eLi8FTU06o92/3VlGhVATQ8h55TsAACEX72ek4ruKgAAEEmEHAAAEEmEHAAAEEmEHAAAEEm+A4+bJZ3Rhbr2P/2Z3tt/n0Y3fEqXLR3X0K9+pH96+JdVaiIAAAi7/fv3a+PGjbVuRh7fSs6I7f6q9av1m4fu0f09Tym17iatWrlgnpsGAADqwf79+/N+hkXg7qq3f/moXj7yhk4M/lzPHUhqydIl89kuAABQB5zBJkxBJ3DISY7NXsI8mZxQLNYwLw0CAAD1wR5o7F1VYQk6DDwGAABlyQWcuhqTY9e4ePHs/cYmZbOZeWkQAACoH85gE6agEzjkXNDxCb3/0tW6cN2/0tVXNGn07Oh8tgsAAIScV6AJS9AJfO2qN145pks+vV0fXzqhoV/9QMdOTurS+WwZAABAGQKHHPPOc3rofz0pY4yMMYrHa3ptTwAAAF+Bu6ssWfPZDgAAgIri6CoAABBJAfqcTujJ/7ldxpj5bw0AAECFUMkBAACRRMgBAACRRMgBAACRRMgBAACRRMgBAACRRMgBAACRRMgBAACRRMgBAACRRMgBAACRRMgBAACRRMgBAACRRMgBAACRRMgBAACRRMgBAACRRMgBAACRRMgBAACRRMgBAADVkUlWdXPxgnOs2abtn/+YFqUzyqQzSqcnNZlK6qnHH6hC8wAAQGQ0NFZ1c4VDzpuP6oG/+hdZJitjjLLZrEw2q4mJs7rg8iq0EAAAoASFQ05qRKeOj8gYk3eLxwsvCgAAUCuMyQEAAJFEyAEAAJFEyAEAAJFEyAEAAJFEyAEAAJFEyAEAAJFEyAEAAJFEyAEAAJFEyAEAAJFEyAEAAJHkG3Kaq9UKAACACvMNOSPVagUAAECF0V0FAAAiiZADAAAiiZADAAAiiZADAAAiiZADAAAiiZADAAAiKV5wjjXbtP3zH9OidEaZdEbp9KQmU0k99fgDVWgeAABAaQqHnDcf1QN/9S+yTFbGGGWzWZlsVhMTZ3XB5VVoIQAAQAkKd1elRnTq+Jt6+/hbevv4Wzp5Ykgn3z6u5ESqCs0DAABhtX///qKmVxtjcgAAQMmcgSYsAUci5AAAgDLlgk2YAo5EyAEAACXauHHjzH17wLFPryXfgceNjY2SJGOMjDGSpGw2q2w2O/8tAwAAobdx48aqBZxYLKaFCxcqFovJsqyZn5JmfubNP28tAQAA54RcsAlLBSeHkAMAAMoWth6BYQEAAAM8SURBVIAjEXIAAECdyQ2hKYSQAwAAIomQAwAAIqnwZR3myeYbtmhoaKhWmwcAABFXs5Dzjb95sFabBgAA5wC6qwAAQF1xOyeOm8AhJ+gKAQAAqskro1DJAQAAkRQo5NgTEhUdAABQK8XkEN+QQ6ABAABhZL9ulVTBa1fFYvRyAQCA2gjaw1RUWqGyAwAAaqmYLFLwPDnWJTfpjtuv1eJsVpl0RtlMVul0Wo89/Hfav/evNVxWU6Mv3rxk5r61IK0rrhjTJUukYweX6ZenpPTIaA1bV0HL1qrt8ncpZoxM5rhe6z2is1VuQkM8JpPOKr5ymZo1ppMn01Jjk85/T6NLmk9r5LVRJavcRlcNF2hNx2VaKkuWNaahA706MTH1VLx5iZovPquPXJTV2MkmvTS4UCPZ2UUj8/oBgIAsy5rpqsoFHq/gU/hkgG/+TD3feloNMjLGyGSNMsbImAlNxGJSNjtzoSz7BbOcF88KejGtqIkvbpq5byT1H16s4ZZRvXdZkzQhpd+JSEw8c0yvH35HliSZcZ1Np5Wu2sYtNTQ1SLGsrMYFWn7ZMi0+NqyhdEbKjmv4rZTmvvwzSqUzyrqsreoypzX06is6NfVAY+NppTNTT8UXN6lheVrDJxfp+aMNSjflLxqZ1w8ATHMGFnuQyQWcoAqHnPRZvXN8ZOahMWbmJtvGstmsLMuaCTO5Rjkfn2tiDc5/RkxvHl6uNyXFGiI0vik7rjOnx2cfx2JVPD9Bky66bpVWLpSUzSh54rSOvGGm/7ZGk+MecauqbfST0tjpU7bHMeVeFrGGmM68tkzPSlLD3P7lyLx+AMDBbdxN7j3PrYrjljMCXdbBHl68VmR/s81mQ/H9OBSsWIP/8+do+KuspI4+9msdzZtmKQp/Wl4/AM5V9vc3e7jx++kU+NpVuaBj/+nF+e3yXA49Mcv/mzYfUvDD6wfAuciZI9yqOkHe/0q6QKezW6rY0HMusWL+/4Rz+W+Dwnj9ADgXeY3LcXvslz98Q04yOXvsid9AYgYZe0sdfq3WTUAd4/UDAPMUcgptMMggYwIPAAAollt4KVThmTO/IYUAAIAIokMfAABEEiEHAABE0v8Hs20uJ9qzd/gAAAAASUVORK5CYII=)
Web 地图和 XYZ 切片格式
一般在线地图使用共享的方式来呈现地图。大多数地图是通过使用多个 256x256px 光栅图块进行可视化的。通过提供它们的 x、y 和 z 坐标来加载正确的图块。其中 z 对应于当前缩放级别。
例如,可以使用遵循以下模式的 URL 获取openstreetmap:https://tile.openstreetmap.org/{z}/{x}/{y}.png
x、y 和 z 参数是整数.
osm原文:
X goes from 0 (left edge is 180 °W) to 2^zoom − 1 (right edge is 180 °E) Y goes from 0 (top edge is 85.0511 °N) to 2^zoom − 1 (bottom edge is 85.0511 °S) in a Mercator projection
For the curious, the number 85.0511 is the result of arctan(sinh(π)). By using this bound, the entire map becomes a (very large) square.
将纬度和经度转换为对应的瓦片
为了从纬度和经度推导出瓦片名称,必须执行一些操作。
1.计算当前缩放级别的瓦片总数:tile_count = 2^z
2.将 lat 和 lon 重新投影到墨卡托投影 (EPSG:3857)。x = lon
y = log(tan(lat) + sec(lat))
3.变换 x 和 y 值以适应 0 - 1 的范围,并将原点设置为左上角。x = (lon + 180) / 360
y = (1 - (y / π)) / 2
将 x 和 y 乘以图块的数量。
#用于从 WGS84 坐标转换到指定缩放级别的相应图块
def sec(x):
return (1 / cos(x))
def latlon_to_xyz(lat, lon, z):
tile_count = pow(2, z)
x = (lon + 180) / 360
y = (1 - log(tan(radians(lat)) + sec(radians(lat))) / pi) / 2
return (tile_count * x, tile_count * y)
接下来,我们将添加一个新函数,它允许我们获取指定矩形区域/边界框的图块范围.
def bbox_to_xyz(lon_min, lon_max, lat_min, lat_max, z):
x_min, y_max = latlon_to_xyz(lat_min, lon_min, z)
x_max, y_min = latlon_to_xyz(lat_max, lon_max, z)
return(floor(x_min), floor(x_max),
floor(y_min), floor(y_max))
瓦片下载
要下载地图切片,只需发送与切片服务器提供的 URL 规范匹配的 GET 请求。(请遵守规范)
def donwload(tile_source, output_dir, bounding_box, zoom):
lon_min, lat_min, lon_max, lat_max = bounding_box
# Script start:
if not os.path.exists(temp_dir):
os.makedirs(temp_dir)
if not os.path.exists(output_dir):
os.makedirs(output_dir)
x_min, x_max, y_min, y_max = bbox_to_xyz(
lon_min, lon_max, lat_min, lat_max, zoom)
alltiles = (x_max - x_min + 1) * (y_max - y_min + 1)
print(f"总共:{alltiles} 瓦片")
i = 0
for x in range(x_min, x_max + 1):
for y in range(y_min, y_max + 1):
try:
i = i + 1
png_path = fetch_tile(x, y, zoom, tile_source)
print(f"{x},{y} 下载进度{i}/{alltiles}")
georeference_raster_tile(x, y, zoom, png_path)
except OSError:
print(f"错误, failed to get {x},{y}")
pass
print("下载与转换瓦片成功")
print("整合瓦片中请稍后。。。")
merge_tiles(temp_dir + '/*.tif', output_dir + '/out.tif')
print(f"整合完成!输出至{output_dir}/out.tif'")
shutil.rmtree(temp_dir)
地理配准
为了对下载的瓦片进行地理配准,我们首先需要将我们从纬度和经度执行的转换反转为瓦片名称格式。我们需要知道瓷砖四个角中每个角的坐标。然后我们将使用gdal.Translate将图像保存为带有嵌入地理位置数据的 TIFF 文件。
对于纬度转换,我们将使用相同的方法,但添加了一个额外的函数来从墨卡托投影转换回来。
def x_to_lat_edges(x, z):
tile_count = pow(2, z)
unit = 360 / tile_count
lon1 = -180 + x * unit
lon2 = lon1 + unit
return(lon1, lon2)
def tile_edges(x, y, z):
lat1, lat2 = y_to_lat_edges(y, z)
lon1, lon2 = x_to_lon_edges(x, z)
return[lon1, lat1, lon2, lat2]
def georeference_raster_tile(x, y, z, path):
bounds = tile_edges(x, y, z)
filename, extension = os.path.splitext(path)
gdal.Translate(filename + '.tif',
path,
outputSRS='EPSG:4326',
outputBounds=bounds)
for x in range(x_min, x_max + 1):
for y in range(y_min, y_max + 1):
try:
i = i + 1
png_path = fetch_tile(x, y, zoom, tile_source)
print(f"{x},{y} 下载进度{i}/{alltiles}")
georeference_raster_tile(x, y, zoom, png_path)
except OSError:
print(f"错误, failed to get {x},{y}")
pass
将图块合并为tif
由于我们已经包含了对 GDAL 的依赖项,因此我选择也使用 GDAL python 脚本来合并平铺图像。我们将调用gdal_merge.py。
def merge_tiles(input_pattern, output_path):
vrt_path = temp_dir + "/tiles.vrt"
gdal.BuildVRT(vrt_path, glob.glob(input_pattern))
gdal.Translate(output_path, vrt_path)
通过PysimpleGUI封装界面
设置了输出目录,地图级别,下载范围,下载影像,PysimpleGUI的控件通过 key='folder' / values['folder']传输值。
def gui():
layout = [
[sg.FolderBrowse('选择输出文件夹', key='folder', target='file'), sg.Button('开始'), sg.Button('关闭')],
[sg.Text('输出文件夹为:', font=("宋体", 10)), sg.Text('', key='file', size=(50, 1), font=("宋体", 10))],
[sg.Combo(['高德地图', '谷歌地图', 'arcgis地图'], key='tile_source', default_value='高德地图', size=(21, 1)),
sg.Text('下载地图级别'),
sg.InputText(size=(20, 1), key='zoom')],
[sg.Text('lng_min'), sg.InputText(size=(19, 1), key='lng_min'), sg.Text('lat_min'),
sg.InputText(size=(19, 1), key='lat_min')],
[sg.Text('lng_max'), sg.InputText(size=(19, 1), key='lng_max'), sg.Text('lat_max'),
sg.InputText(size=(19, 1), key='lat_max')],
[sg.Output(size=(70, 5), font=("宋体", 10))]
]
window = sg.Window('在线地图下载器 -_-', layout, font=("宋体", 10), default_element_size=(50, 1), icon='./proj/earth.ico')
while True:
event, values = window.read()
if event in (None, '关闭'): # 如果用户关闭窗口或点击`关闭`
break
if event == '开始':
if values['tile_source'] == '高德地图':
tile_source = 'https://webst01.is.autonavi.com/appmaptile?style=6&x={x}&y={y}&z={z}'
elif values['tile_source'] == '谷歌地图':
tile_source = 'http://www.google.cn/maps/vt?lyrs=s@189&gl=cn&x={x}&y={y}&z={z}'
elif values['tile_source'] == 'arcgis地图':
tile_source = 'https://server.arcgisonline.com/ArcGIS/rest/services/World_Imagery/MapServer/tile/{z}/{y}/{x}'
output = values['folder']
lng_min = int(values['lng_min'])
lat_min = int(values['lat_min'])
lng_max = int(values['lng_max'])
lat_max = int(values['lat_max'])
zoom = int(values['zoom'])
donwload(tile_source, output, [lng_min, lat_min, lng_max, lat_max], zoom)
github地址
https://github.com/sadassimov/tiledownload
Web 地图和 XYZ 切片格式
一般在线地图使用共享的方式来呈现地图。大多数地图是通过使用多个 256x256px 光栅图块进行可视化的。通过提供它们的 x、y 和 z 坐标来加载正确的图块。其中 z 对应于当前缩放级别。
例如,可以使用遵循以下模式的 URL 获取openstreetmap:https://tile.openstreetmap.org/{z}/{x}/{y}.png
x、y 和 z 参数是整数.
osm原文:
X goes from 0 (left edge is 180 °W) to 2^zoom − 1 (right edge is 180 °E) Y goes from 0 (top edge is 85.0511 °N) to 2^zoom − 1 (bottom edge is 85.0511 °S) in a Mercator projection
For the curious, the number 85.0511 is the result of arctan(sinh(π)). By using this bound, the entire map becomes a (very large) square.
将纬度和经度转换为对应的瓦片
为了从纬度和经度推导出瓦片名称,必须执行一些操作。
1.计算当前缩放级别的瓦片总数:tile_count = 2^z
2.将 lat 和 lon 重新投影到墨卡托投影 (EPSG:3857)。x = lon
y = log(tan(lat) + sec(lat))
3.变换 x 和 y 值以适应 0 - 1 的范围,并将原点设置为左上角。x = (lon + 180) / 360
y = (1 - (y / π)) / 2
将 x 和 y 乘以图块的数量。
#用于从 WGS84 坐标转换到指定缩放级别的相应图块
def sec(x):
return (1 / cos(x))
def latlon_to_xyz(lat, lon, z):
tile_count = pow(2, z)
x = (lon + 180) / 360
y = (1 - log(tan(radians(lat)) + sec(radians(lat))) / pi) / 2
return (tile_count * x, tile_count * y)
接下来,我们将添加一个新函数,它允许我们获取指定矩形区域/边界框的图块范围.
def bbox_to_xyz(lon_min, lon_max, lat_min, lat_max, z):
x_min, y_max = latlon_to_xyz(lat_min, lon_min, z)
x_max, y_min = latlon_to_xyz(lat_max, lon_max, z)
return(floor(x_min), floor(x_max),
floor(y_min), floor(y_max))
瓦片下载
要下载地图切片,只需发送与切片服务器提供的 URL 规范匹配的 GET 请求。(请遵守规范)
def donwload(tile_source, output_dir, bounding_box, zoom):
lon_min, lat_min, lon_max, lat_max = bounding_box
# Script start:
if not os.path.exists(temp_dir):
os.makedirs(temp_dir)
if not os.path.exists(output_dir):
os.makedirs(output_dir)
x_min, x_max, y_min, y_max = bbox_to_xyz(
lon_min, lon_max, lat_min, lat_max, zoom)
alltiles = (x_max - x_min + 1) * (y_max - y_min + 1)
print(f"总共:{alltiles} 瓦片")
i = 0
for x in range(x_min, x_max + 1):
for y in range(y_min, y_max + 1):
try:
i = i + 1
png_path = fetch_tile(x, y, zoom, tile_source)
print(f"{x},{y} 下载进度{i}/{alltiles}")
georeference_raster_tile(x, y, zoom, png_path)
except OSError:
print(f"错误, failed to get {x},{y}")
pass
print("下载与转换瓦片成功")
print("整合瓦片中请稍后。。。")
merge_tiles(temp_dir + '/*.tif', output_dir + '/out.tif')
print(f"整合完成!输出至{output_dir}/out.tif'")
shutil.rmtree(temp_dir)
地理配准
为了对下载的瓦片进行地理配准,我们首先需要将我们从纬度和经度执行的转换反转为瓦片名称格式。我们需要知道瓷砖四个角中每个角的坐标。然后我们将使用gdal.Translate将图像保存为带有嵌入地理位置数据的 TIFF 文件。
对于纬度转换,我们将使用相同的方法,但添加了一个额外的函数来从墨卡托投影转换回来。
def x_to_lat_edges(x, z):
tile_count = pow(2, z)
unit = 360 / tile_count
lon1 = -180 + x * unit
lon2 = lon1 + unit
return(lon1, lon2)
def tile_edges(x, y, z):
lat1, lat2 = y_to_lat_edges(y, z)
lon1, lon2 = x_to_lon_edges(x, z)
return[lon1, lat1, lon2, lat2]
def georeference_raster_tile(x, y, z, path):
bounds = tile_edges(x, y, z)
filename, extension = os.path.splitext(path)
gdal.Translate(filename + '.tif',
path,
outputSRS='EPSG:4326',
outputBounds=bounds)
for x in range(x_min, x_max + 1):
for y in range(y_min, y_max + 1):
try:
i = i + 1
png_path = fetch_tile(x, y, zoom, tile_source)
print(f"{x},{y} 下载进度{i}/{alltiles}")
georeference_raster_tile(x, y, zoom, png_path)
except OSError:
print(f"错误, failed to get {x},{y}")
pass
将图块合并为tif
由于我们已经包含了对 GDAL 的依赖项,因此我选择也使用 GDAL python 脚本来合并平铺图像。我们将调用gdal_merge.py。
def merge_tiles(input_pattern, output_path):
vrt_path = temp_dir + "/tiles.vrt"
gdal.BuildVRT(vrt_path, glob.glob(input_pattern))
gdal.Translate(output_path, vrt_path)
通过PysimpleGUI封装界面
设置了输出目录,地图级别,下载范围,下载影像,PysimpleGUI的控件通过 key='folder' / values['folder']传输值。
def gui():
layout = [
[sg.FolderBrowse('选择输出文件夹', key='folder', target='file'), sg.Button('开始'), sg.Button('关闭')],
[sg.Text('输出文件夹为:', font=("宋体", 10)), sg.Text('', key='file', size=(50, 1), font=("宋体", 10))],
[sg.Combo(['高德地图', '谷歌地图', 'arcgis地图'], key='tile_source', default_value='高德地图', size=(21, 1)),
sg.Text('下载地图级别'),
sg.InputText(size=(20, 1), key='zoom')],
[sg.Text('lng_min'), sg.InputText(size=(19, 1), key='lng_min'), sg.Text('lat_min'),
sg.InputText(size=(19, 1), key='lat_min')],
[sg.Text('lng_max'), sg.InputText(size=(19, 1), key='lng_max'), sg.Text('lat_max'),
sg.InputText(size=(19, 1), key='lat_max')],
[sg.Output(size=(70, 5), font=("宋体", 10))]
]
window = sg.Window('在线地图下载器 -_-', layout, font=("宋体", 10), default_element_size=(50, 1), icon='./proj/earth.ico')
while True:
event, values = window.read()
if event in (None, '关闭'): # 如果用户关闭窗口或点击`关闭`
break
if event == '开始':
if values['tile_source'] == '高德地图':
tile_source = 'https://webst01.is.autonavi.com/appmaptile?style=6&x={x}&y={y}&z={z}'
elif values['tile_source'] == '谷歌地图':
tile_source = 'http://www.google.cn/maps/vt?lyrs=s@189&gl=cn&x={x}&y={y}&z={z}'
elif values['tile_source'] == 'arcgis地图':
tile_source = 'https://server.arcgisonline.com/ArcGIS/rest/services/World_Imagery/MapServer/tile/{z}/{y}/{x}'
output = values['folder']
lng_min = int(values['lng_min'])
lat_min = int(values['lat_min'])
lng_max = int(values['lng_max'])
lat_max = int(values['lat_max'])
zoom = int(values['zoom'])
donwload(tile_source, output, [lng_min, lat_min, lng_max, lat_max], zoom)
以上就是“Python教程:Python+gdal制作一个简单的地图下载!”的详细内容,想要了解更多Python教程欢迎持续关注编程学习网。
扫码二维码 获取免费视频学习资料
- 本文固定链接: http://www.phpxs.com/post/11782/
- 转载请注明:转载必须在正文中标注并保留原文链接
- 扫码: 扫上方二维码获取免费视频资料
查 看2022高级编程视频教程免费获取