Экспорт данных их osm в MySQL

Приветствую пользователей форума.

Нужна помощь. Который день сижу…

Суть вот в чем.
Как видно из названия топика необходимо сделать экспорт данных в mysql.
Установил osmosis 0.41 на Linux.

Пишу в консоли:

osmosis --read-xml file="map.osm" --write-apidb dbType="mysql" host="localhost" database="osm" user="username" password="123456"

В ответ пишет, что не совпадает структура данных.

Database version mismatch. The schema is missing migrations ...

Перепробовал кучу разных скриптов для создания схемы базы данных. Ни один не подходит.

Кто-нибудь сталкивался с этим?
Где взять правильную схему базы данных??

Вы пробовали скрипт apidb_0.6.sql, идущий вместе с osmosis?

Я пробовал. Точнее сказать посмотрел на него и не стал пробовать. Ибо он для postgresql


--
-- PostgreSQL database dump
--

SET statement_timeout = 0;
SET client_encoding = 'UTF8';
SET standard_conforming_strings = off;
SET check_function_bodies = false;
SET client_min_messages = warning;
SET escape_string_warning = off;

--
-- Name: plpgsql; Type: PROCEDURAL LANGUAGE; Schema: -; Owner: -
--

а зачем?

“а зачем” – это худший вопрос в мире. Почему-то популярен у линуксоидов и участников опенсорсных проектов. Либо ты знаешь, как сделать, либо нет.

Ну а вдруг он хочет сделать, допустим свой конвертор osm2mp (с блекджеком и шлюхами с поддержкой мультиязычных названий в адресах и автоматическим приписыванием addr:district и addr:suburb к посёлкам и улицам). :slight_smile:

Возвращаясь к вопросу темы.
Скачал osmosis, взял дамп базы по ссылке:
http://git.openstreetmap.org/rails.git/blob/HEAD:/db/structure.sql
http://wiki.openstreetmap.org/wiki/Rails_port/Database_schema

В итоге, при попытке импорта файла http://data.gis-lab.info/osm_dump/dump/RU/RU-121003.osm.bz2
получаю следующую ошибку:

Caused by: org.postgresql.util.PSQLException: ОШИБКА: INSERT или UPDATE в таблице "current_way_nodes" нарушает ограничение внешнего ключа "current_way_nodes_node_id_fkey"
  Подробности: Ключ (node_id)=(168711) отсутствует в таблице "current_nodes".
        at javax.xml.parsers.SAXParser.parse(Unknown Source)
        at org.openstreetmap.osmosis.xml.v0_6.XmlReader.run(XmlReader.java:111)
        at java.lang.Thread.run(Unknown Source)

Как быть в этом случае? Очень уж не хочется планету всю импортировать.

Нет, это правильный вопрос. Если, конечно, хотеть помочь по настоящему.
Если есть гараздо более лёгкие пути решить похожие задачи, то вполне логично узнать не подойдёт ли один из них. Может человек просто не знает про эти пути.

Автору, рекомендую использовать гугль.

“а зачем?” - нужна информация “адрес здания - координаты”, пока только на один город, затем понадобится на другие.

Пробовал просто вытащить данные с помощью osmosis, не получается. К тому же этот результат опять же нужно будет парсить.

Проще всего вначале импортировать всё в базу PostgreSQL + PostGIS средствами osm2pgsql, а потом парой несложных и быстрых запросов через фенкции PostGIS вытащить данные с нужными объектами, описаниями и координатами в плоскую таблицу, которую уже впоследствии выгрузить и использовать в mySQL. Вливать всё в mysql не имеет смысла, поскольку хранить и обрабатывать в нём геопростанственные данные в виде геометрий объектов крайне не удобно и не эффективно.

Для этого существуют геокодеры. Например nominatim. Или нужны все здания и их координаты?

Да, нужны все данные. Делаю сайт по недвижимости. Необходима возможность выбора здания (город → улица → дом).
Всех адресов я естественно не знаю. Решил вытащить из osm.

Можно было конечно и в PostgreSQL выгрузить данные. Но с MySQL знаком лучше. В случае с PostgreSQL, то нужно потратить время на ознакомление, установку, выбор клиента базы данных и т.д.
Зачем? Если можно выгрузить в mysql.

“Вливать всё в mysql не имеет смысла, поскольку хранить и обрабатывать в нём геопростанственные данные в виде геометрий объектов крайне не удобно и не эффективно.” - это нужно сделать одни раз. Нужные данные будут храниться в другом формате/таблицах.

Это нужно будет делать постоянно, для того, чтобы отслеживать изменения. Иначе данные будут просто неактуальными.

Потом планирую добавлять нужные адреса руками, через сайт. Когда пользователи пожалуются, что не могут найти адрес на сайте.
Постоянно обновлять данные в базе по-моему лишняя работа.

Если я правильно понимаю эту строчку в вики “MySql does not have geographic extensions. Requires database server to be installed, with associated administrative overhead”, только координаты нодов там?

Если это нужно сделать один раз, тем более проще это один раз сделать в PostgreSQL/PostGIS, чем пытаться заставить выжать из mysql то, чего он в принципе не может.

osm2sql.jar вам в помощь

Вообще-то ничего особого изучать не нужно. Базу PostGIS можно взять готовую на gis-lab. Использовать psql в любом скриптовом языке не сложнее, чем mysql. Могу даже пример подбросить: выгружает список всех адресов внутри заданой границы (в примере - Мурманск) в csv: http://osm.sbin.ru/tmp/pgaddr.zip

спасибо всем за советы, буду разбираться