Гость
Форумы / Картография и навигация [закрыт для гостей] / Скопировал данные из OSM в яндекс-карты / 8 сообщений из 8, страница 1 из 1
07.02.2025, 20:45
    #40139929
Протобуранец
Модератор форума
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Скопировал данные из OSM в яндекс-карты
https://yandex.ru/maps/?ll=41.548448,47.791967&mode=usermaps&source=constructorLink&um=constructor:c67a3f3bb882d63ec2799107d5b632acced56b61c8172308680ed40de7f35788&z=7.36

Смешно, конечно. Но надоело искать карту административного деления каждый раз, когда надо посмотреть, где какой район.

Недоделано. Нет четырех районов, три района хватаются из соседних областей (одинаковые названия), а один район состоит из двух кусоков (multigeometry), а яндекс это не понимает. Еще не знаю, как буду это решать. Ну и красоту надо будет навести.

Внимание! Финальный вариант карты вот в этом посте 40139947.
...
Изменено: 10.02.2025, 18:11 - Протобуранец
Рейтинг: 0 / 0
09.02.2025, 17:35
    #40139941
Протобуранец
Модератор форума
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Скопировал данные из OSM в яндекс-карты
pasted_image.jpg
Карта без Неклиновского района

Пока не знаю, что делать с районом, который состоит из двух полигонов. Он разделен рекой Миус. Можно объединить их по мосту, но это только руками. Тогда автоматизации не будет. А можно сделать два Неклиновских района, что тоже нехорошо, может путаницу в пользователя вызвать.

А так, то, что есть на этом этапе, полностью автоматизировано скриптом PowerShell. Скорее всего, он будет применим к другим областям.

Со скриптом пришлось повозиться, иногда всплывают нежданчики. Например, невсегда можно выбрать элемент XML для последующего удаления вот так
Код: PowerShell
1.
$dscr = $nd.SelectSingleNode("//description");
или вот так
Код: PowerShell
1.
$dscr = $nd.description;
Зато можно вот так:
Код: PowerShell
1.
2.
3.
$NodeToRemove = $nd.GetElementsByTagName("description")[0];

if ($NodeToRemove -ne $null){$nd.RemoveChild($NodeToRemove)};
Лишний раз убедился, что любую политическую карту можно раскрасить четырьмя цветами [:smile]
...
Рейтинг: 0 / 0
09.02.2025, 18:42
    #40139942
Протобуранец
Модератор форума
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Скопировал данные из OSM в яндекс-карты
Сейчас посмотрел, yandex API поддерживают MultyGeometry в java script. Но я-то загружаю kml напрямую в яндекс, чтобы не быть привязанным к какому-то сайту.
...
Рейтинг: 0 / 0
10.02.2025, 18:09
    #40139947
Протобуранец
Модератор форума
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Скопировал данные из OSM в яндекс-карты
Закончил. С Неклиновским районом схитрил, соединил два полигона по мосту.

Карта районов Ростовской области
...
Рейтинг: 0 / 0
11.02.2025, 11:41
    #40139951
Протобуранец
Модератор форума
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Скопировал данные из OSM в яндекс-карты
Скрипт
Спойлер
Код: PowerShell
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
$PSDefaultParameterValues['*:Encoding'] = 'utf8';

$template = New-Object xml;
$template.Load("$PSScriptRoot\rostov_region.xml");

$region_text = $template.kml.Document.Placemark.ExtendedData.Data.InnerText;

function FindNode([string]$name) {

    $dt = $xml.LastChild.FirstChild;

    foreach ($lnd in $dt.ChildNodes) {

        if ($lnd.Name -eq "Placemark") {

            foreach ($nnd in $lnd.ChildNodes) {

                if ($nnd.Name -eq "uname") {

                    $nm = $nnd.InnerText;

                    if ($nm -eq $name) {

                        $exd = $lnd.ExtendedData;

                        $nnd = $exd.Data | where-object name -eq "addr:region";

                        if ($nnd.InnerText -like $region_text) {

                            return $lnd;

                        }

                    }

                }

            }

        }
    }
}

$xml = [xml](Get-Content "$PSScriptRoot\export2.kml");
$out = [xml](Get-Content "$PSScriptRoot\auto.kml");

$names = @(Get-Content -Path "$PSScriptRoot\names.txt");

for ($i = $names.Count - 1; $i -gt -1; $i--) {

    $nd = FindNode -name $names[$i];

    if ($nd -ne $null){

        $mg = $nd.MultiGeometry;

        if ($mg -ne $null) {

            $os = [System.String]::concat($names[$i]," - mg");

        } else {

            $NodeToRemove = $nd.GetElementsByTagName("description")[0];

            if ($NodeToRemove -ne $null){$nd.RemoveChild($NodeToRemove)};

            $nm = $names[$i];

            $nd.InnerXml += "<description>$nm</description>";

            $os = $names[$i];

            $NodeToExport = $out.ImportNode($nd, $true);

            [void]$out.LastChild.FirstChild.AppendChild($NodeToExport);

            $os = $names[$i];

        }

    } else {

        $os = [System.String]::concat($names[$i]," - not found");

    }
    Write-Output $os;

}

$out.Save("$PSScriptRoot\done.kml");
...
Рейтинг: 0 / 0
11.02.2025, 11:42
    #40139952
Протобуранец
Модератор форума
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Скопировал данные из OSM в яндекс-карты
Сперва я пошел на https://overpass-turbo.eu, выделил прямоугольник, ограничивающий область интересов и скачал данные без какой-то фильтрации. Получилось 40 МБ. Решил, что буду сам все фильтровать и контролировать на месте. И не ошибся. В данных там полный бардак.

Дальше список мелочей, которые надо учитывать в работе.

1. xml обработчик PowerShell не понимает элементов с именем name. Мало того, что он не может к ним обратиться по "name", он их игнорирует при перечислении.

Поэтому kml все равно надо открыть в текстовом редакторе и заменить "name>" на "uname>". И потом в дальнейшем придется править его неоднократно. В качестве редактора подходят Notepad++ или VSCode.

2. Яндекс не сортирует объекты по алфавиту, а формирует список в порядке, обратном записям в kml.

Поэтому мне показалось правильным создать отдельный список районов и искать нужные элементы xml по списку.

3. Яндекс не позволяет загружать объекты по одному. Только одним файлом все сразу.

4. Яндекс присваивает имена объектов беря их из ноды description. Ее может не быть в файле, или она может быть заполнена чем-то посторонним.

5. Элемента с принадлежностью района к области может не быть. Но он нужен, чтобы отличать одноименные районы соседних областей.
Код: XML
1.
2.
3.
<Data name="addr:region">
  <value>Ростовская область</value>
</Data>
... продолжение следует ...
...
Рейтинг: 0 / 0
11.02.2025, 11:44
    #40139953
Протобуранец
Модератор форума
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Скопировал данные из OSM в яндекс-карты
В общем, все оказалось сложнее, чем казалось на первый взгляд. Хотя, казалось бы, взял kml в одном сервисе и запихал в другой. Ага.
...
Рейтинг: 0 / 0
14.02.2025, 23:17
    #40140040
Протобуранец
Модератор форума
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Скопировал данные из OSM в яндекс-карты
Создал в дзене публикацию со ссылкой на карту. По ключевым словам эта публикация в яндекс-поиске оказалась на первой странице буквально через несколько часов. Посмотрим, сколько проживет эта карта. Подозреваю, что недолго.
...
Рейтинг: 0 / 0
Форумы / Картография и навигация [закрыт для гостей] / Скопировал данные из OSM в яндекс-карты / 8 сообщений из 8, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]