powered by simpleCommunicator - 2.0.39     © 2025 Programmizd 02
Форумы / Картография и навигация [закрыт для гостей] / Скопировал данные из OSM в яндекс-карты
8 сообщений из 8, страница 1 из 1
Скопировал данные из OSM в яндекс-карты
    #40139929
Протобуранец
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
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
Скопировал данные из OSM в яндекс-карты
    #40139941
Протобуранец
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
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
Скопировал данные из OSM в яндекс-карты
    #40139942
Протобуранец
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
Сейчас посмотрел, yandex API поддерживают MultyGeometry в java script. Но я-то загружаю kml напрямую в яндекс, чтобы не быть привязанным к какому-то сайту.
...
Рейтинг: 0 / 0
Скопировал данные из OSM в яндекс-карты
    #40139947
Протобуранец
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
Закончил. С Неклиновским районом схитрил, соединил два полигона по мосту.

Карта районов Ростовской области
...
Рейтинг: 0 / 0
Скопировал данные из OSM в яндекс-карты
    #40139951
Протобуранец
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
Скрипт
Спойлер
Код: 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
Скопировал данные из OSM в яндекс-карты
    #40139952
Протобуранец
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
Сперва я пошел на 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
Скопировал данные из OSM в яндекс-карты
    #40139953
Протобуранец
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
В общем, все оказалось сложнее, чем казалось на первый взгляд. Хотя, казалось бы, взял kml в одном сервисе и запихал в другой. Ага.
...
Рейтинг: 0 / 0
Скопировал данные из OSM в яндекс-карты
    #40140040
Протобуранец
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
Создал в дзене публикацию со ссылкой на карту. По ключевым словам эта публикация в яндекс-поиске оказалась на первой странице буквально через несколько часов. Посмотрим, сколько проживет эта карта. Подозреваю, что недолго.
...
Рейтинг: 0 / 0
8 сообщений из 8, страница 1 из 1
Форумы / Картография и навигация [закрыт для гостей] / Скопировал данные из OSM в яндекс-карты
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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