Могу ли я перевести файл geo json в растрированные плитки для использования в листовке? - PullRequest
0 голосов
/ 18 июня 2020
• 1000 сгенерированные фрагменты растрового изображения возвращаются клиенту на основе файла geo json вместо предварительно обработанных растровых изображений. Примерно так:
    [HttpGet]
    public IActionResult GetGeoJsonTile(int z, int x, int y)
    {
        var geoJsonFilePath = "C:\\geojsontiles\\coverage-area.geojson";
        var geoJsonObj = JsonConvert.DeserializeObject(File.ReadAllText(geoJsonFilePath));
        Byte[] imageBytes;

        //RASTERIZE ENTIRE GEOJSON TO BITMAP HERE
        //...

        //CROP AND ZOOM RASTERIZED BITMAP TO FIT x,y,z PARAMS
        //...

        return File(imageBytes, "image/png");
    }

Растеризация должна быть довольно простой (я думаю). Но часть, на которой я зацикливаюсь, - это кадрирование и масштабирование. Я понимаю, что файл geo json по сути является векторной картой со ссылками на координаты широты и долготы. Я не понимаю, как эти координаты широты и долготы переводятся в координаты x, y, z, которые вводятся на основе взаимодействия пользователя с картой на стороне клиента. Есть ли способ, которым я могу использовать информацию о широте и долготе внутри файла geo json в сочетании с входными данными x, y, z, чтобы определить, насколько масштабировать и где обрезать выходное растровое изображение?

Кроме того, я понимаю, что листовки (и другие клиенты) напрямую поддерживают файлы geo json. Но для меня это не вариант. Файлы geo json, которые мы используем, очень большие и сложные и вызывают серьезные проблемы с запаздыванием при использовании на клиентских машинах.

1 Ответ

0 голосов
/ 27 июня 2020

Краткий ответ: посмотрите схемы нумерации плиток XYZ и TMS

Если вы используете Leaflet для отображения мозаичной карты, я предполагаю, что вы используете L.tileLayer объект. В этом случае фактические координаты, соответствующие кортежу (x, y, z), задаются «стандартом XYZ» (или стандартом TMS , если вы устанавливаете tms: true, который просто переворачивает ось y.) 1020 *

На крайнем внешнем уровне масштабирования, 0, весь мир может быть отображен в одном фрагменте карты. Каждый уровень масштабирования удваивается в обоих измерениях, поэтому один фрагмент заменяется 4 фрагментами, когда увеличение масштаба. Это означает, что для большинства практических целей достаточно около 22 уровней масштабирования. Используется проекция Web Mercator с пределами широты около 85 градусов.

OpenStreetMap Wiki содержит математические формулы для вычисления соответствующего координатного окна плитки, а также примеры реализаций на нескольких языках программирования, включая C#.

Но посмотрите на использование существующих Решение g

Существует ограниченное количество сценариев ios, в которых "ручное изготовление" кода для резки плитки имеет смысл. Если можете, попробуйте использовать команду gdal2tiles.py из библиотеки GDAL (и сопутствующие ей команды CLI), вызвав ее из своего кода C#. Вы также можете рассмотреть вариант размещения листов непосредственно на отдельном «геопространственном сервере», например Geoserver .

...