Ребятушки всем Привет.
Прилетела задачка написать локальный картографический сервер Google Maps. Короче суть такая. Есть сетевое приложение, которому нужны карты от Google. Это приложение работает в закрытой корпоративной сети без доступа в интернет. Задача сводиться к тому, чтобы выкачать кэш карт нужного участка, а уже потом поднять Tile Server внутри корпоративной сети и раздавать карты всем желающим.
Писать будем на Python. На итого просто парсим Get запрос от приложения и отдаем Tile карты в ответ на запрос. Приложение уже само клеит Tiles и формирует карты.
Принцип работы сервера и параметров запроса будет подходить для любого приложения которому нужны локальные карты. Я буду использовать сервер для Диспетчерской консоли TRBONet. Вкратце это ПО для ведения переговоров в радиосети с ПК и отображения местоположения радиостанций стандарта DMR на карте. Конечно это не все возможности этого ПО, но сейчас они нас не очень интересуют. Более подробную информацию можно почитать на сайте TRBONet или у официальных партнеров в Беларуси, Friendly LLC
Подымать буду на Flask ибо он из коробки поддерживает локальный сервер из коробки. Для тестирования этого вполне хватит. Для того чтобы парсить Get запрос будем использовать стандартную библиотеку Request.
Вот листинг всего сервера.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
from flask import Flask from flask import send_file from flask import request app = Flask(__name__) @app.route("/") def index(): return "Local Map Server" @app.route('/image', methods=['GET']) def query_strings(): args1 = request.args['z'] args2 = request.args['x'] args3 = request.args['y'] file = ("Google_Map_Cache\\" + "{}\\{}\\") .format(args1,args2) return send_file(file + args3 + ".png") if __name__ == "__main__": app.run(host='127.0.0.1', port=4567) |
Разберемся немного в коде. Для начала необходимо разобраться как именно формируется get запрос. А выглядит он очень просто. http://127.0.0.1:4567/image?z={z}&x={x}&y={y} Это немного модифицированный параметр стандартного запроса к Tile серверу. Стандартный выглядит так, на примере OpenstreetMap. http://tile.openstreetmap.org/{z}/{x}/{y}.png Где z это уровень зумма, х и y координаты плитки. Но т.к мы делаем свой сервер, можно позволить себе отойти от правил и формировать свой запрос.
Рассмотрим декоратор, который обрабатывает get запрос и в ответ на него отдает файл плитки в формате png 256*256 пикс.
1 2 3 4 5 6 7 8 |
@app.route('/image', methods=['GET']) def query_strings(): args1 = request.args['z'] args2 = request.args['x'] args3 = request.args['y'] file = ("Google_Map_Cache\\" + "{}\\{}\\") .format(args1,args2) return send_file(file + args3 + ".png") |
В итоге когда мы делаем запрос http://127.0.0.1:4567/image?z={z}&x={x}&y={y} Модуль Request создает массив и уже из этого массива достаем нужные нам значения записывая их в переменные args*. Для примера вот так получаем значение зумма args1 = request.args[‘z’]
Т.к. все файлы tile лежат по папкам в зависимости от уровня зума и их координат, то в переменную file, передаем значение x,y,z и получаем полный путь до конечного файла плитки. И уже потом функцией return send_file(file + args3 + «.png») Возвращаем файл плитки. Ну а дальше происходит магия. Софт сам склеивает карту.
Кстати протестировать, что все работает можно в обычном браузере. Вводим get запрос, где указываем конкретные значения z, x , y и видим плитку с конкретными координатами.
Друзья. Если вам понравилась эта статья, поделитесь ей в социальных сетях. Обязательно напишите комментарий если у вас возникли вопросы. Мне важно ваше мнение. У нас есть групповой чат в Telegram, где вы можете оперативно задать вопрос и узнать о последних новостях. И поддержите проект монеткой.
При копировании материалов сайта ссылка на источник обязательна!