Пропозиція - природній порядок слів у назвах вулиць

Ну так, звичайно, давайте намалюємо все, а потім, коли всі будуть згідні, що більше малювати нема чого, будемо думати про зміни :slight_smile: З боку теорії скажу, що в програмуванні рефакторинг не вважається скінченним процесом, причому доцільно проводити його завжди, коли бачиться зміст :slight_smile:

І як бачите, активних дій масового перейменування від всієї спільноти не потрібно. Це зробить 2-3 людей, які мають в цьому досвід. Від спільноти потрібно лише конструктивно прийняти рішення і в майбутньому слідувати новому, більш природньому, правилу (якщо приймемо).

Ну, якщо нову схему буде прийнято, найлогічнішим буде направити російського бота на територію України.

Але в мене питання. Чи буде цей порядок слів стосуватися українських назв? Чи будуть правила такі ж самі? Мені особисто прописвні правила для російської мови – це щось занадто складне. Хто там пам’ятає про відмінники? То значить, що робота бота буде потрібна постійно.

Крім того, масове перейменування сотень тисяч об’єктів буде потребувати певної підготовки, щоби не викликати питань в DWG.

Взагалі кажучи, основне питання теми - зміна українських назв, правила там доволі нескладні.

Підтримкою імен все одно має займатись бот, як колись робив _sevbot :wink:

Питання щодо name:ru природньо випливає з цієї пропозиції, але розбиратись у правилах російськомовної спільноти теж не обов’язково - після набору словника вони будуть виправлятись чи додаватись автоматично.
name:en у нас наче в порядку, а інші мови потребують когось зі їх знаннями, я це питання залишаю на совість тих, хто буде ті мови заповнювати.

Небольшая поправка:

Раз мы не сокращаем статусные части улиц, то, может быть, не стоит упоминать “сокращения” в правилах? Чтобы не смущать участников.

Звісно, дякую за зауваження

Але ж це відрізняється від правил для російської. Там ще є правила для “Морская улица”.

Тобто, пропонується три набори правил, для української, для російської та англійскої, всі різні, так? Тобто, “вулиця Морська”, “Морская улица”, “Morska Street”, так?

Вірно, зараз я притримуюсь цієї думки, хоча починаючи тему, я хотів зачепити лише українські назви.

Принятие новой схемы подразумевает перетегирование огромного количества линий. Понятно, что это хотя бы на 95% будет сделано ботом.
Нужно ли такие массовые правки согласовывать с DWG?

ребят а мне категорически не нравится новая схема и сама идея так поступить с улицами. если хочется поэксперементировать - давайте начнем с топонимов - озер/рек/водохранилищ и т.д. там полный бардак - ктото хочет пишет река Осиковая, ктото Осиковая река, а ктото просто Осиковая (полагая что тег watrway=river это исключительно реки и добавлять в название ненужно.) ктото террикон шахты №21 “терновая”, ктото террикон шахты “терновая” №21…
с названиями улиц покачто относительный порядок… зачем его ломать? давайте лучше наведем порядок там где его нет - в названиях такого беспорядка уйма!

До нашої спільноти приєднався юний модератор НЯКа Юрий Картограф і одразу ж взявся за зміну назв вулиць, точніше порядку слів в тегах name та name:ru. Нащастя було тільки 4 правки на 3 вулицях. Швиденько відкотив і написав листа йому. :slight_smile:

Обнаружил, что Царичанская РГА начала наносить названия улиц в селах с неправильным порядком слов
https://www.openstreetmap.org/user/%D0%A6%D0%B0%D1%80%D0%B8%D1%87%D0%B0%D0%BD%D1%81%D1%8C%D0%BA%D0%B0%20%D0%A0%D0%94%D0%90

Написал в личку и попросил не делать так со ссылкой на Вики.
А можно как-то автоматизировано поправить всё то, что они поназывали?

Попробую сделать.

upd. Сделал

Вот в этом месте несколько улиц не пофиксились
https://www.openstreetmap.org/way/428721212#map=16/48.9285/34.4878

На http://nadoloni.com/editor/streets є функція Autofix, вона вміє виправляти порядок слів

Хм. Я выбирал улицы с последней правкой от Царичанська РДА.
Есть идеи как довыбрать оставшиеся?
Не хотелось бы по всему квадрату запускать замены - мало ли что можно сломать.

Найти все, где их правка была предпоследней, посмотреть, что выйдет и так далее.

Я делал запрос через Overpass:
http://overpass-turbo.eu/s/hvu
В описании языка нашел только вот это:
http://wiki.openstreetmap.org/wiki/RU:Overpass_API/Overpass_QL#By_user_.28user.2C_uid.29
Похоже, запросов для предпоследней правки нет :frowning:

Остаётся разве что качать все ченжсеты юзера.
Но для этого у меня пока что инструментов нет.

Вторая партия:
http://nrenner.github.io/achavi/?changeset=41036839

Вот код для получения списка линий:

using System;
using System.Collections.Generic;
using System.Net;
using System.Xml;

namespace ConsoleApplication32
{
    class Program
    {
        static void Main(string[] args)
        {
            HashSet<string> chIds = new HashSet<string>();
            HashSet<string> ways = new HashSet<string>();

            bool lastpage = false;
            string lastTime = "2099-01-01";
            while (!lastpage)
            {
                XmlDocument doc1 = new XmlDocument();
                doc1.LoadXml(new WebClient().DownloadString(
                    "http://www.openstreetmap.org/api/0.6/changesets?user=3949783&time=2001-01-01," + lastTime));
                var changesetsList = doc1.DocumentElement.SelectNodes("/osm/changeset");
                lastpage = changesetsList.Count != 100;
                lastTime = (changesetsList[changesetsList.Count - 1] as XmlElement).GetAttribute("created_at");
                foreach (XmlElement changeset in changesetsList)
                    chIds.Add(changeset.GetAttribute("id"));
                Console.Write(".");
            }
            Console.WriteLine();
            Console.WriteLine("Changesets found: " + chIds.Count);

            foreach (string id in chIds)
            {
                string changeSet = new WebClient().DownloadString(
                    "http://www.openstreetmap.org/api/0.6/changeset/" + id + "/download");

                XmlDocument doc2 = new XmlDocument();
                doc2.LoadXml(changeSet);
                foreach (XmlElement way in doc2.DocumentElement.SelectNodes("/osmChange/modify/way"))
                    ways.Add(way.GetAttribute("id"));
                foreach (XmlElement way in doc2.DocumentElement.SelectNodes("/osmChange/create/way"))
                    ways.Add(way.GetAttribute("id"));
                Console.Write(".");
            }
            Console.WriteLine();
            Console.WriteLine(string.Join(", ", ways));
        }
    }
}

Вот код для переименования:

using System.Collections.Generic;
using System.IO;
using System.Text.RegularExpressions;
using System.Xml;

namespace ConsoleApplication31
{
    class Program
    {
        static void RemoveTag(XmlElement osmObj, string tagName)
        {
            foreach (XmlElement tag in osmObj.SelectNodes("tag"))
                if (tag.Attributes["k"].InnerText == tagName)
                {
                    osmObj.RemoveChild(tag);
                    osmObj.SetAttribute("action", "modify");
                    return;
                }
        }

        static void SetTag(XmlElement osmObj, string tagName, string tagValue)
        {
            if (tagValue == null)
            {
                RemoveTag(osmObj, tagName);
                return;
            }

            foreach (XmlElement tag in osmObj.SelectNodes("tag"))
                if (tag.Attributes["k"].InnerText == tagName)
                {
                    if (tag.Attributes["v"].InnerText == tagValue)
                        return;
                    tag.Attributes["v"].InnerText = tagValue;
                    osmObj.SetAttribute("action", "modify");
                    return;
                }
            var newTag = osmObj.OwnerDocument.CreateElement("tag");
            newTag.SetAttribute("k", tagName);
            newTag.SetAttribute("v", tagValue);
            osmObj.AppendChild(newTag);
            osmObj.SetAttribute("action", "modify");
        }

        static string GetTag(XmlElement osmObj, string tagName)
        {
            foreach (XmlElement tag in osmObj.SelectNodes("tag"))
                if (tag.Attributes["k"].InnerText == tagName)
                    return tag.Attributes["v"].InnerText;
            return null;
        }

        List<string> result = new List<string>();

        void Replace(XmlElement way, string tag)
        {
            bool uk = tag != "name:ru";
            string name = GetTag(way, tag);
            if (name == null)
                return;
            string newName = Regex.Replace(name,
                "(?<p1>\\d-й )?(?<p2>" + (uk ? "провулок|вулиця" : "переулок|улица") +
                ") (?<p3>.*)(?<p4>$)", "${p1}${p3} ${p2}${p4}");
            if (name != newName)
            {
                result.Add(name + " -> " + newName);
                SetTag(way, tag, newName);
            }
            else
                result.Insert(0, name + " ->");
        }

        Program()
        {
            XmlDocument doc = new XmlDocument();
            doc.LoadXml(File.ReadAllText("e:\\rda_all.osm"));

            foreach (XmlElement way in doc.DocumentElement.SelectNodes("/osm/way"))
            {
                if (GetTag(way, "highway") != null &&
                    GetTag(way, "name") != null)
                {
                    Replace(way, "name");
                    Replace(way, "name:ru");
                    Replace(way, "name:uk");
                }
            }
            File.WriteAllLines("e:\\result.txt", result);
            doc.Save("e:\\rda_fix.osm");
        }

        static void Main(string[] args)
        {
            new Program();
        }
    }
}

Круто, спасибо.
Думаю, что большая часть пофикшена, а если что-то и осталось, можно будет руками доделать.

Осталось “квартал Слави”.
https://www.openstreetmap.org/#map=18/48.94389/34.48882&layers=H