Это тема для написания кода валидаторов. Кто имеет какой-то опыт программирования - добро пожаловать!
Здесь обсуждаются инструменты, подходы, особенность данных в ОСМ, алгоритмы - все вопросы возникающие в момент создания валидатора данных в ОСМ.
Это тема для написания кода валидаторов. Кто имеет какой-то опыт программирования - добро пожаловать!
Здесь обсуждаются инструменты, подходы, особенность данных в ОСМ, алгоритмы - все вопросы возникающие в момент создания валидатора данных в ОСМ.
Я никогда ранее не работал с PostgreSQL, поэтому имею много простых вопросов. Я буду задавать вопросы в этой теме. Буду мониторить ответы и пробовать сам. Вполне возможно что я найду ответ в доках раньше чем в теме. Если разберусь раньше - напишу об этом. Но если я отвечу не правильно - поправьте меня!
Какой утилитой нужно пользоваться чтобы закачать в 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 я пока ещё не менял. По нему будет следующий вопрос.
Когда я запустил то получил странную ошибку?
![]()
Может кто-то знает? К сожалению сайт osm2pgsql.org от меня недоступен … Сообщает об ошибках.
Я так понимаю что ошибка не принципиальная, но лучше её исправить.
Это он предупреждает, что используется устаревший способ импорта. Сейчас там на Lua перешли. Можно в целом игнорировать, если импорт по-старому работает.
Для валидатора нужны специальные данные. Поэтому я буду делать 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
Я так понимаю что мне всё-таки нужно писать Lua файл а не править style.
Например, мне для населённых пунктов нужно выбрать не только те, в которых есть place = * а только такие:
place=city, place=town, place=village, place=hamlet, place=isolated_dwelling, place=locality
Эту проверку уже не вписать в style файл?
Более того, place=locality нужно включать только, когда в нём есть oktmo:user! Это заброшенный НП, но который тянется в документах. А иначе эта точка не имеет никакого отношения к населённым пунктам, их десятки тысяч!
Я правильно понимаю? Тогда возникают следующие вопросы.
Что такое Lua? Где можно о нём узнать? Может быть есть какие-то простые книги? Какие IDE есть с Lua? Я не привык писать в текстовом редакторе :)
А где есть примеры по написанию программ нужных в ОСМ? Всё-таки Lua не предназначен только для ОСМ, скорее всего идеальное знания Lua будут не нужно.
Функции
function filter_tags_way (keyvalues, numberofkeys)
function filter_tags_relation_member (keyvalues, keyvaluemembers, roles, membercount)
придуманы просто так, назвали так а могли по-другому? Или osm2pgsql считает что такие функция должна быть в файле и ожидает от них вполне конкретные результаты? Где это посмотреть?
Ещё раз напишу - адрес https://osm2pgsql.org/ у меня не доступен как и много других :( А доступа к ВПН у меня нету (не спрашивайте почему).
P.S. Если что, у меня нет доступа ![]()
-- For documentation of Lua tag transformations see
– Osm2pgsql v2 Manual - osm2pgsql
Если что, вот код который работает сейчас в валидаторе ![]()
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
Может вы куда-нибудь напишите про эту проблемы? Что в форуме есть интересная тема.
Просто у меня не доступа в Телеграм. Я не знаю какими ещё средствами пользуется молодёжь.
Зато на выходе будет новый, классный валидатор ![]()
Луа – это скриптовой язык программирования, придуманный даже раньше Питона. Используется главным образом в играх (для написания скриптов персонажей).
Самые простые книги, вероятно, типа такой: 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 спрашивать.
Osm2pgsql v1 Manual - osm2pgsql.pdf (2,8 МБ)
Osm2pgsql v2 Manual - osm2pgsql.pdf (2,8 МБ)
Самое смешное в том что мы посмотрели и решили купить в Озоне почти эту книгу (другое издание но того же автора).
Это же книга которая касается Roblox. Самой любимой игре в нашей семье :)
Да, спасибо! Хорошо что 2 варианта. У одного есть одни плюсы, у другого другие.
Теперь буду наверное пару дней читать мануал :)
Но ссылку на форум молодёжи дать стоит ;)
Так, я может пропустил чего из соседней темы. А есть план что вообще нужно затащить в базу и что потом с ними делать?
У меня опыта немного в OSM в постгресе, но osm2pgsql как будто по большей части нужен для osm-carto и nominatim. А для всякого необычного приходится писать свои скрипты, которые нужные данные отфильтровывают и куда-то загоняют
Про 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
-- И так же для линий и отношений
Я писал довольно давно, сейчас повторяться не буду. Но я начал переписывание валидатора АТД который существует почти 13 лет, но был написан на очень древней системе. Сейчас же я буду писать его на PostGIS. Работа будет долгая, но на выходе будет качественный валидатор.
Я не пользовался ни PostgiSQL ни PostGIS, хотя и читал про них. Поэтому текущий валидатор не имеет никакого отношения к SQL. Но 3 месяца назад я стал проходить курсы по этим системам и теперь могу начать.
Сейчас я занят подготовкой БД. Для этого надо знать как пользоваться osm2pgsql. Я им вообще не пользовался. Поэтому подозреваю что нужно сначала прочитать мануал ![]()
Когда прочитаю (через день или два) продолжу здесь задавать вопросы!