Вопросы по новому валидатору данных OSM

Это тема для написания кода валидаторов. Кто имеет какой-то опыт программирования - добро пожаловать!

Здесь обсуждаются инструменты, подходы, особенность данных в ОСМ, алгоритмы - все вопросы возникающие в момент создания валидатора данных в ОСМ.

1 Like

Я никогда ранее не работал с PostgreSQL, поэтому имею много простых вопросов. Я буду задавать вопросы в этой теме. Буду мониторить ответы и пробовать сам. Вполне возможно что я найду ответ в доках раньше чем в теме. Если разберусь раньше - напишу об этом. Но если я отвечу не правильно - поправьте меня!

1 Like

Вопрос 1

Какой утилитой нужно пользоваться чтобы закачать в PostgreSQL/PostGIS данные ОСМ? Я использую osm2pgsql. Это лучший тул или что-то есть ещё получше?

Я использовал такую строку. Нужно её написать иначе для валидатора?

osm2pgsql --database gis_osm --user someuser --host localhost --port 5432 --schema public --verbose --latlong --style /tmp/atd.style --slim /tmp/russia-latest.osm.pbf

Файл atd.style я пока ещё не менял. По нему будет следующий вопрос.

Когда я запустил то получил странную ошибку?

image

Может кто-то знает? К сожалению сайт osm2pgsql.org от меня недоступен … Сообщает об ошибках.

Я так понимаю что ошибка не принципиальная, но лучше её исправить.

Это он предупреждает, что используется устаревший способ импорта. Сейчас там на Lua перешли. Можно в целом игнорировать, если импорт по-старому работает.

2 Likes

Вопрос 2

Для валидатора нужны специальные данные. Поэтому я буду делать atd.style файл. Использую default.style. Я ещё не понимаю как будет работать, но на первый взгляд всё просто.

Но помимо default.style существует style.lua . И его содержимое напоминает default.style.

Можно ли его игнорировать или style.lua будет нужен? Для чего он нужен?

Ещё раз повторю, к сожалению сайт osm2pgsql.org от меня недоступен. Сообщает об ошибках.

Через Google я нашёл описание lua. Я не знаю языка Lua, его хотя бы как минимум изучить надо.

Кто реально использует lua файлы? Чем они принципиально лучше просто style? Или для валидатора не нужно супер-свойств lua?

lua-скрипт - это “средний уровень импорта”.

Раньше было, что на вход в функцию “импорт_точки” ты получал сырые данные ОСМ, как-то их, как тебе надо обрабатывал: удалял какие-то поля, или добавлял нужные. И затем возвращал этот модифицированный объект, а osm2pgsql его уже вставляла в таблицу planet_point.

Новый подход изменился, теперь и вставкой в таблицы управляешь ты. Т.е. тебе приходит полигон building. Ты его сам вставляешь в таблицу со зданиями. А в таблицу с адресами ты например вставляешь центроид дома или там полюс недоступности. В итоге это даёт больше гибкости на этапе импорта, а не крутить мега-запросы для рендера из одной единой таблицы planet-polygon

1 Like

Я так понимаю что мне всё-таки нужно писать Lua файл а не править style.

Например, мне для населённых пунктов нужно выбрать не только те, в которых есть place = * а только такие:

place=city, place=town, place=village, place=hamlet, place=isolated_dwelling, place=locality

Эту проверку уже не вписать в style файл?

Более того, place=locality нужно включать только, когда в нём есть oktmo:user! Это заброшенный НП, но который тянется в документах. А иначе эта точка не имеет никакого отношения к населённым пунктам, их десятки тысяч!

Я правильно понимаю? Тогда возникают следующие вопросы.

Вопрос 3

Что такое Lua? Где можно о нём узнать? Может быть есть какие-то простые книги? Какие IDE есть с Lua? Я не привык писать в текстовом редакторе :)

Вопрос 4

А где есть примеры по написанию программ нужных в ОСМ? Всё-таки Lua не предназначен только для ОСМ, скорее всего идеальное знания Lua будут не нужно.

Функции

function filter_tags_way (keyvalues, numberofkeys)

function filter_tags_relation_member (keyvalues, keyvaluemembers, roles, membercount)

придуманы просто так, назвали так а могли по-другому? Или osm2pgsql считает что такие функция должна быть в файле и ожидает от них вполне конкретные результаты? Где это посмотреть?

Ещё раз напишу - адрес https://osm2pgsql.org/ у меня не доступен как и много других :( А доступа к ВПН у меня нету (не спрашивайте почему).

P.S. Если что, у меня нет доступа :frowning:

-- For documentation of Lua tag transformations see
Osm2pgsql v2 Manual - osm2pgsql

Если что, вот код который работает сейчас в валидаторе :slight_smile:

checkATD(e)
 ; -----------------------------------------------------------------------------
 ; Проверяет является ли объект с данными атрибутами элементом АТД
 ; -----------------------------------------------------------------------------
 S posel="",atd="",type="",loc="",objname="",idx2=1
 F  S idx2=$O(DATA(idx2)) Q:idx2=""  D
 . S datastr=DATA(idx2)
 . I '$F(datastr,"<tag ") Q
 . K W
 . S W("k")=$TR($$parseVal(datastr,"k")," ","`")
 . S W("v")=$$parseVal(datastr,"v")
 . I W("k")="place" D
 .. I W("v")="city" S posel=1
 .. I W("v")="town" S posel=1
 .. I W("v")="village" S posel=1
 .. I W("v")="hamlet" S posel=1
 .. I W("v")="isolated_dwelling" S posel=1
 .. I W("v")="locality" I loc<1 S loc=loc+1		// locality не есть НП
 . I W("k")="type" I W("v")="boundary" S type=1
 . I W("k")="admin_level" S atd=$S(W("v")=2:1,W("v")=3:1,W("v")=4:1,W("v")=5:1,W("v")=6:1,W("v")=8:1,W("v")=9:1,1:"")
 . I W("k")="oktmo:user" S loc=(loc\1)+0.1		// oktmo:user признак locality
 . //I W("k")="okato:user" S loc=(loc\1)+0.1		// okato:user признак locality - временно
 . I W("k")="name" S objname=W("v")
 I $D(^INOSTR(e))>0 I $G(^INOSTR(e))=objname Q 0		// Объект с таким именем числится как иностранный
 I $D(^INOATD(e))>0 I $G(^INOATD(e))=objname Q 0		// Объект с таким именем числится как нерегулярный объект
 I type="" S atd=""		// Объект не являющийся отношением с типом boundary не является регулярным объектом АТД
 I loc>1.0 S posel=1	// locality с oktmo:user
 Q posel_"."_atd

Может вы куда-нибудь напишите про эту проблемы? Что в форуме есть интересная тема.

Просто у меня не доступа в Телеграм. Я не знаю какими ещё средствами пользуется молодёжь.

Зато на выходе будет новый, классный валидатор :slight_smile:

1 Like

Луа – это скриптовой язык программирования, придуманный даже раньше Питона. Используется главным образом в играх (для написания скриптов персонажей).

Самые простые книги, вероятно, типа такой: https://www.ozon.ru/product/roblox-igray-programmiruy-i-sozdavay-svoi-miry-koryagin-andrey-vladimirovich-elektronnaya-kniga-935656198/?at=1i6k1OZMW_OB7kY7xksa2qSkgHLwXc_n&sh=L6vgTjRYAw

Еще можно просто DeepSeek спрашивать.

Скажи, чем Lua отличается от Python?

1 Like

Osm2pgsql v1 Manual - osm2pgsql.pdf (2,8 МБ)
Osm2pgsql v2 Manual - osm2pgsql.pdf (2,8 МБ)

Самое смешное в том что мы посмотрели и решили купить в Озоне почти эту книгу (другое издание но того же автора).

Это же книга которая касается Roblox. Самой любимой игре в нашей семье :)

1 Like

Да, спасибо! Хорошо что 2 варианта. У одного есть одни плюсы, у другого другие.

Теперь буду наверное пару дней читать мануал :)

Но ссылку на форум молодёжи дать стоит ;)

1 Like

Так, я может пропустил чего из соседней темы. А есть план что вообще нужно затащить в базу и что потом с ними делать?

У меня опыта немного в OSM в постгресе, но osm2pgsql как будто по большей части нужен для osm-carto и nominatim. А для всякого необычного приходится писать свои скрипты, которые нужные данные отфильтровывают и куда-то загоняют

2 Likes

Про oktmo:user практически никто не знает и каждый раз приходится искать эти новоиспечённые локалити. Желательно, чтобы новый валидатор это сочетание поддерживал.

Однозначно. Вот минимальный пример для теста:

local srid = 4326
local tables = {}

-- Создаём табличку для точек
tables.osm_node = osm2pgsql.define_table({
  name = 'osm_node',
  ids = { type = 'node', id_column = 'id' },
  columns = {
    { column = 'tags', type = 'hstore' },
    { column = 'geom', type = 'point', projection = srid },
  }
})

-- Тут пишем логику обработки
function osm2pgsql.process_node(object)
  if not object.tags.place then
    return
  end
  tables.osm_node:add_row({
    tags = object.tags,
    geom = { create = 'point' }
  })
end

-- И так же для линий и отношений
1 Like

Я писал довольно давно, сейчас повторяться не буду. Но я начал переписывание валидатора АТД который существует почти 13 лет, но был написан на очень древней системе. Сейчас же я буду писать его на PostGIS. Работа будет долгая, но на выходе будет качественный валидатор.

Я не пользовался ни PostgiSQL ни PostGIS, хотя и читал про них. Поэтому текущий валидатор не имеет никакого отношения к SQL. Но 3 месяца назад я стал проходить курсы по этим системам и теперь могу начать.

Сейчас я занят подготовкой БД. Для этого надо знать как пользоваться osm2pgsql. Я им вообще не пользовался. Поэтому подозреваю что нужно сначала прочитать мануал :slight_smile:

Когда прочитаю (через день или два) продолжу здесь задавать вопросы!

1 Like