Страница 1 из 1

MySql Spatial - редактирование геометрии

Добавлено: 01 янв 2012, 18:14
trir
Чего то не нашёл способа редактировать геометрию на SQl'е и пришлось писать собственные функции
Например, вот, для добавления точки к линии

Код: Выделить всё

CREATE DEFINER=`root`@`localhost` FUNCTION `LS_AddPoint`(Ls LineString, np point) RETURNS linestring
BEGIN
  Declare I, ICount Integer default 1;
  Declare nStr Text;
  Declare crP Point;
  Set ICount = NumPoints(Ls) + 1;
  Set nStr = 'LineString(';
  while I < ICount do
   Set crP = PointN(Ls, I);
   Set nStr = Concat(nStr, X(crP), ' ', Y(crP), ',');
   set I = I + 1;
  end while;
  Set nStr = Concat(nStr, X(nP), ' ', Y(nP), ')');
  Return LineFromText(nStr);
END $$
Как вообще редактировать геометрию через SQL?

Re: MySql Spatial - редактирование геометрии

Добавлено: 02 янв 2012, 13:41
bim2010
ogr2ogr
http://dev.mysql.com/doc/refman/5.6/en/ ... sions.html
Well-Known Text (WKT) Format
Creating Geometry Values Using WKT Functions
GIS functions
SELECT `OGR_FID`, `SHAPE` `SHAPE`, `osm_id`, `name`, `ref`, `highway`, `oneway`, `bridge`, `tunnel`, `maxspeed`, `lanes` FROM `highway` WHERE MBRIntersects(GeomFromText('POLYGON((30.957964190000 55.663876230000, 30.976541940000 55.663876230000, 30.976541940000 55.678349310000, 30.957964190000 55.678349310000, 30.957964190000 55.663876230000))'), `SHAPE`)
INSERT INTO `highway` (`SHAPE` , `OGR_FID` , `osm_id`, `ref`, `highway`) VALUES (GeometryFromText('LINESTRING (31.0009694 55.6433774,30.9963775 55.6469822,30.9918837 55.6504615,30.9872853 55.6541172,30.9824258 55.6578611,30.9764688 55.6625184,30.9753175 55.6634738,30.9737153 55.6643795,30.97249 55.664988,30.9708254 55.6655836,30.9677086 55.6667802,30.966766670976973 55.667316549489151,30.9660592 55.667773,30.9652466 55.6684462,30.9645743 55.6692349,30.964227949074033 55.670021356002565,30.9638221 55.6709587,30.963729695242613 55.671516117496822,30.963613995259109 55.672186090959215)',1) , 47 , 4418866, 'P133', 'primary')

Re: MySql Spatial - редактирование геометрии

Добавлено: 02 янв 2012, 16:12
trir
Да, я в принципе всё это читал, но там нет ответа на мой вопрос.
Как редактировать существующую геометрию - добавить точку к линии или полигону, добавить элемент в коллекцию и т. п.

Re: MySql Spatial - редактирование геометрии

Добавлено: 03 янв 2012, 08:59
bim2010
Приведенные выше SELECT FROM `highway` и INSERT INTO `highway` я получил из лога Mysql,
при добавлении точки к линии в QGIS. С помощью ogr2ogr

Код: Выделить всё

ogr2ogr -f "MySQL" MySQL:"geo,user=root,host=localhost,password=******" -nln highway -lco engine=MYISAM highway.shp
я загружаю шейпы из OSM в Mysql. Открываю векторный слой (базы данных) и подключаю данные Mysql в QGIS. Затем выполняю редактирование слоя highway, добавляя точки к линии. Анализируем лог. Какие команды Вы хотели увидеть из лога Mysql ?
SELECT, INSERT, UPDATE, DELETE …
Единственно, что меня самого удивило то, что при добавлении точки к линии в QGIS выполняются команды:
DELETE FROM `highway` WHERE `OGR_FID` = 47
INSERT INTO `highway` …
Представьте полигон в несколько тысяч точек, в который необходимо добавить еще одну точку.
Более корректно написана работа с Mysql в uDig через UPDATE
Лог из uDig при добавлении точки к линии:
SELECT OGR_FID,asWKB(SHAPE) as SHAPE FROM highway WHERE (((OGR_FID = '310') AND NOT ((OGR_FID = '310'))) AND MbrIntersects(SHAPE,GeomFromText('POLYGON ((31.404378958637622 55.51667837821648, 31.404378958637622 55.53105953474343, 31.440429764212208 55.53105953474343, 31.440429764212208 55.51667837821648, 31.404378958637622 55.51667837821648))', 1)))
SELECT asWKB(envelope(SHAPE)) FROM highway
SELECT OGR_FID,asWKB(SHAPE) as SHAPE,osm_id,name,ref,highway,oneway,bridge,tunnel,maxspeed,lanes FROM highway WHERE (OGR_FID = '310')
SELECT asWKB(envelope(SHAPE)) FROM highway
UPDATE highway SET SHAPE = GeomFromText('LINESTRING (31.4044049 55.516703, 31.4092618 55.5186671, 31.4170242 55.5230369, 31.4220112 55.5246325, 31.4265211 55.5275044, 31.4319852 55.5285353, 31.4348039 55.5296888, 31.43890355005453 55.530669351473335, 31.43944297208882 55.53079792008746, 31.4395959631157 55.53083463793391, 31.439828509476563 55.53089583434466)', 1) WHERE (OGR_FID = '310')
AsWKB () функция обеспечивает доступ к двоичным значения геометрии путем преобразования их в BLOB-значения, содержащие WKB представления, как я понимаю это временное хранилище, используемое для редактирования.
Да, я в принципе всё это читал, но там нет ответа на мой вопрос.
Как редактировать существующую геометрию - добавить точку к линии или полигону, добавить
элемент в коллекцию и т. п.
Понятно, что и этот мой ответ Вас не устроит, … хотя тема называется MySql Spatial - редактирование геометрии.
Способ редактировать геометрию в Mysql на уровне Mysql ссылки я указал (не все естественно).
Следующий уровень редактировать геометрию в Mysql – уровень GIS:
QGIS, uDig, gvSIG, Openjump, Using MySQL with FDO in AutoCAD
Какие GIS поддерживают работу с Mysql можно посмотреть здесь.
Под Web, например SUAS MapServer.
Как реализована поддержка Mysql в QGIS смотрим в API QGIS, Loading Layers
http://www.qgis.org/api/qgsmaplayer_8cpp-source.html
http://www.qgis.org/api/qgscoordinatere ... ource.html
http://www.qgis.org/api/qgsprojectionse ... ource.html

API Udig: Package org.geotools.data.mysql
Приведенный Вами пример, это на мой взгляд, уровень ГИС разработки, а не уровень Mysql. Вы ГИС разрабатываете на Delphi? Еще одна Нева?
Подсмотреть, как реализована на Delphi работа с PostgreSql можно в DSpatial GIS
Если можно приведите пример других SQL (Oracle, MS Sql, PostgreSql, SQLite …), что в них есть для редактирования геометрии в Sql, чего не хватает в Mysql?

Re: MySql Spatial - редактирование геометрии

Добавлено: 03 янв 2012, 09:55
ericsson
Я так понимаю, что топикстартер интересуется, есть ли в MySQL аналог вот этого:
http://docs.oracle.com/cd/B19306_01/app ... ap_ref.htm
Но это уже конструкция PL/SQL, так что...

Re: MySql Spatial - редактирование геометрии

Добавлено: 03 янв 2012, 13:23
Дмитрий Барышников
bim2010 писал(а): Единственно, что меня самого удивило то, что при добавлении точки к линии в QGIS выполняются команды:
Разработчики пишут
COPY is less robust than INSERT, but significantly faster
Правда для PostGIS есть ключик PG_USE_COPY, а вот для MySQL надо в исходниках искать. Так это не документировано. Особенно данное поведение "классно" проявляется при вставке записей в связанные таблицы. При изменении, в связанной таблице удаляется запись и все тут.
Ссылки:
http://gdal.org/ogr/drv_pg.html
http://gdal.org/ogr/drv_mysql.html
http://trac.osgeo.org/gdal/wiki/ConfigOptions

Re: MySql Spatial - редактирование геометрии

Добавлено: 03 янв 2012, 15:34
ericsson
Как-то это чудовищно...

Re: MySql Spatial - редактирование геометрии

Добавлено: 03 янв 2012, 17:16
Дмитрий Барышников
Не согласен. Я же внес в драйвер PostgreSQL и PostGIS (http://trac.osgeo.org/gdal/ticket/2557) возможность выбора insert али update. Добавьте и в MySQL - если кто пользуется. Патч в багтрекер, и всего делов-то. Или хотя бы сам баг (фичереквест) оформите.

Re: MySql Spatial - редактирование геометрии

Добавлено: 03 янв 2012, 19:58
trir
1. Я в Oracle и не сомневался, хотя и показательно, что там это реализовано на Java'е. И да - именно про это я и спрашивал.
2. Да, я пишу "типа" ГИС на Delphi, так что спасибо за ссылки. Но в данном случае, мне захотелось реализовать часть функционала в БД на SQL'е и столкнулся с рядом проблем.
3. По существу меня интересует:
3.1. Как реализовать приведённый мной пример, но работающий с WKB, а не WKT - как у меня?
3.2. Если вообще смысл замарачиватся с WKB - будет ли прирост скорости при обработке, ведь оба формата не "родные" для MySQL?

Re: MySql Spatial - редактирование геометрии

Добавлено: 03 янв 2012, 20:14
Voltron
trir писал(а):3.1. Как реализовать приведённый мной пример, но работающий с WKB, а не WKT - как у меня?
Точно также. Если MySQL умеет принимать WKB в качестве параметра запроса, то просто формируете нужную строку и обновляете запись
trir писал(а):3.2. Если вообще смысл замарачиватся с WKB - будет ли прирост скорости при обработке, ведь оба формата не "родные" для MySQL?
Есть. Парсить текст медленне.

Re: MySql Spatial - редактирование геометрии

Добавлено: 03 янв 2012, 22:08
bim2010
Если MySQL умеет принимать WKB в качестве параметра запроса
Умеет.
Еще ссылки по теме:
The UDF Repository for MySQL
Например API functions of PROJ.4 are ported to MySQL
Обертка на Delphi для PROJ тоже мне попадалась.
Cross Compare SQL Server 2008 Spatial, PostgreSQL/PostGIS 1.3-1.4, MySQL 5-6
MySQL Forums :: GIS
Пространственные расширения
GeoDjango Database API
MySQL GIS/Geometry with Grails
FDO Provider for MySQL

Еще надо упомянуть две хороших разработки на Delphi с исходниками:
HeidiSQL. В HeidiSQL грамотно написана работа с Mysql (без ODBC).
и SASPlanet

Re: MySql Spatial - редактирование геометрии

Добавлено: 04 янв 2012, 16:54
bim2010
Сравнил тексты http://download.osgeo.org/gdal/gdal190RC2.zip
C:\GDAL_OGR Source\gdal190RC2\gdal-1.9.0\ogr\ogrsf_frmts\pg\ ogrpgtablelayer.cpp и Ticket #2557 Тексты различаются. Автор не стал напрямую использовать Ваш Bishop текст.
Там реализовано через bForInsertOrUpdate. Посмотрел текст Mysql C:\GDAL_OGR Source\gdal190RC2\gdal-1.9.0\ogr\ogrsf_frmts\mysql\ogrmysqltablelayer.cpp Что сказать … Там только insert вариант. Еще одно замечание - работа только через WKT.
Смотрим тексты Geotools, которые использует Udig для работы с Mysql.
http://sourceforge.net/projects/geotool ... ses/2.7.4/
geotools-2.7.4-project.zip
Файлы в папке c:\geotools-2.7.4-project\geotools-2.7.4\modules\plugin\jdbc\jdbc-mysql\src\main\java\org\geotools\data\mysql\
Там есть WKT и WKB(WKBReader ,WKBWriter) вариант работы с Mysql и по умолчанию update.
Bishop большая просьба к Вам, не могли бы Вы наметанным взглядом посмотреть (У Вас почти полсотни ticket-ов у огров) C:\GDAL_OGR Source\gdal190RC2\gdal-1.9.0\ogr\ogrsf_frmts\mysql\ogrmysqltablelayer.cpp и если я не заблуждаюсь в своих … оформить баг (фичереквест).

Re: MySql Spatial - редактирование геометрии

Добавлено: 05 янв 2012, 14:23
Дмитрий Барышников
bim2010 писал(а):Сравнил тексты http://download.osgeo.org/gdal/gdal190RC2.zip
C:\GDAL_OGR Source\gdal190RC2\gdal-1.9.0\ogr\ogrsf_frmts\pg\ ogrpgtablelayer.cpp и Ticket #2557 Тексты различаются. Автор не стал напрямую использовать Ваш Bishop текст.
Не стал, он просто все перенес в основное тело функции SetFeature, ну подправил по мелочи. Главное, что в моем проекте, где использовались связанные таблицы, при обновлении записи в одной таблице, в связанной записи не грохаются в новых версиях GDAL.
Кстати с PG_USE_COPY относится к созданию записей, а не к обновлению - это я попутался.
bim2010 писал(а): Bishop большая просьба к Вам, не могли бы Вы наметанным взглядом посмотреть C:\GDAL_OGR Source\gdal190RC2\gdal-1.9.0\ogr\ogrsf_frmts\mysql\ogrmysqltablelayer.cpp и если я не заблуждаюсь в своих … оформить баг (фичереквест).
Я посмотрю, может даже патч сделаю, вот потестить только было бы где. Нет ни у кого базы и таблицы для тестирования в онлайн доступе?

Re: MySql Spatial - редактирование геометрии

Добавлено: 05 янв 2012, 23:59
bim2010
Нет ни у кого базы и таблицы для тестирования в онлайн доступе?
Сделано два варианта. Bishop смотрите в ЛС.