powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / MySQL [игнор отключен] [закрыт для гостей] / (MySQL 5.5.36) spatial, работа с геометрией
13 сообщений из 13, страница 1 из 1
(MySQL 5.5.36) spatial, работа с геометрией
    #38671522
однобитный
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Здрасте!

Создал таблицу для хранения геометрической фигуры. Помещаю туда точку.

Код: sql
1.
2.
3.
4.
5.
CREATE TABLE IF NOT EXISTS `geom` (
  `g` point DEFAULT NULL
) ENGINE=MyISAM DEFAULT CHARSET=utf8;

INSERT INTO geom VALUES (GeomFromText('POINT(1 1)'));



у меня есть многоугольник (полигон), я хочу узнать входит ли это точка в мой многоугольник

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
DELIMITER //

CREATE FUNCTION GISWithin(pt POINT, mp MULTIPOLYGON) RETURNS INT(1) DETERMINISTIC
BEGIN

DECLARE str, xy TEXT;
DECLARE x, y, p1x, p1y, p2x, p2y, m, xinters DECIMAL(16, 13) DEFAULT 0;
DECLARE counter INT DEFAULT 0;
DECLARE p, pb, pe INT DEFAULT 0;

SELECT MBRWithin(pt, mp) INTO p;
IF p != 1 OR ISNULL(p) THEN
RETURN p;
END IF;

SELECT X(pt), Y(pt), ASTEXT(mp) INTO x, y, str;
SET str = REPLACE(str, 'POLYGON((','');
SET str = REPLACE(str, '))', '');
SET str = CONCAT(str, ',');

SET pb = 1;
SET pe = LOCATE(',', str);
SET xy = SUBSTRING(str, pb, pe - pb);
SET p = INSTR(xy, ' ');
SET p1x = SUBSTRING(xy, 1, p - 1);
SET p1y = SUBSTRING(xy, p + 1);
SET str = CONCAT(str, xy, ',');

WHILE pe > 0 DO
SET xy = SUBSTRING(str, pb, pe - pb);
SET p = INSTR(xy, ' ');
SET p2x = SUBSTRING(xy, 1, p - 1);
SET p2y = SUBSTRING(xy, p + 1);
IF p1y < p2y THEN SET m = p1y; ELSE SET m = p2y; END IF;
IF y > m THEN
IF p1y > p2y THEN SET m = p1y; ELSE SET m = p2y; END IF;
IF y <= m THEN
IF p1x > p2x THEN SET m = p1x; ELSE SET m = p2x; END IF;
IF x <= m THEN
IF p1y != p2y THEN
SET xinters = (y - p1y) * (p2x - p1x) / (p2y - p1y) + p1x;
END IF;
IF p1x = p2x OR x <= xinters THEN
SET counter = counter + 1;
END IF;
END IF;
END IF;
END IF;
SET p1x = p2x;
SET p1y = p2y;
SET pb = pe + 1;
SET pe = LOCATE(',', str, pb);
END WHILE;

RETURN counter % 2;

END;

DELIMITER ; 

SET @poly = 'Polygon((0 0,0 3,3 0,0 0),(1 1,1 2,2 1,1 1))';
SELECT AsText(g) FROM `geom` WHERE  GISWithin(g, @poly);



все вроде хорошо, но делаю так и ругается на синтаксис...

#1064 - You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near 'SELECT AsText(g) FROM `geom` WHERE GISWithin(g, @poly)' at line 2

не могу понять что он хочет...
если перезапустить сервер и делать просто

Код: sql
1.
'SELECT AsText(g) FROM `geom`



то этот простой запрос работает
...
Рейтинг: 0 / 0
(MySQL 5.5.36) spatial, работа с геометрией
    #38671647
alex564657498765453
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
однобитныйЗдрасте!

Создал таблицу для хранения геометрической фигуры. Помещаю туда точку.

Код: sql
1.
2.
3.
4.
5.
CREATE TABLE IF NOT EXISTS `geom` (
  `g` point DEFAULT NULL
) ENGINE=MyISAM DEFAULT CHARSET=utf8;

INSERT INTO geom VALUES (GeomFromText('POINT(1 1)'));



у меня есть многоугольник (полигон), я хочу узнать входит ли это точка в мой многоугольник

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
DELIMITER //

CREATE FUNCTION GISWithin(pt POINT, mp MULTIPOLYGON) RETURNS INT(1) DETERMINISTIC
BEGIN

DECLARE str, xy TEXT;
DECLARE x, y, p1x, p1y, p2x, p2y, m, xinters DECIMAL(16, 13) DEFAULT 0;
DECLARE counter INT DEFAULT 0;
DECLARE p, pb, pe INT DEFAULT 0;

SELECT MBRWithin(pt, mp) INTO p;
IF p != 1 OR ISNULL(p) THEN
RETURN p;
END IF;

SELECT X(pt), Y(pt), ASTEXT(mp) INTO x, y, str;
SET str = REPLACE(str, 'POLYGON((','');
SET str = REPLACE(str, '))', '');
SET str = CONCAT(str, ',');

SET pb = 1;
SET pe = LOCATE(',', str);
SET xy = SUBSTRING(str, pb, pe - pb);
SET p = INSTR(xy, ' ');
SET p1x = SUBSTRING(xy, 1, p - 1);
SET p1y = SUBSTRING(xy, p + 1);
SET str = CONCAT(str, xy, ',');

WHILE pe > 0 DO
SET xy = SUBSTRING(str, pb, pe - pb);
SET p = INSTR(xy, ' ');
SET p2x = SUBSTRING(xy, 1, p - 1);
SET p2y = SUBSTRING(xy, p + 1);
IF p1y < p2y THEN SET m = p1y; ELSE SET m = p2y; END IF;
IF y > m THEN
IF p1y > p2y THEN SET m = p1y; ELSE SET m = p2y; END IF;
IF y <= m THEN
IF p1x > p2x THEN SET m = p1x; ELSE SET m = p2x; END IF;
IF x <= m THEN
IF p1y != p2y THEN
SET xinters = (y - p1y) * (p2x - p1x) / (p2y - p1y) + p1x;
END IF;
IF p1x = p2x OR x <= xinters THEN
SET counter = counter + 1;
END IF;
END IF;
END IF;
END IF;
SET p1x = p2x;
SET p1y = p2y;
SET pb = pe + 1;
SET pe = LOCATE(',', str, pb);
END WHILE;

RETURN counter % 2;

END;

DELIMITER ; 

SET @poly = 'Polygon((0 0,0 3,3 0,0 0),(1 1,1 2,2 1,1 1))';
SELECT AsText(g) FROM `geom` WHERE  GISWithin(g, @poly);



все вроде хорошо, но делаю так и ругается на синтаксис...

#1064 - You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near 'SELECT AsText(g) FROM `geom` WHERE GISWithin(g, @poly)' at line 2

не могу понять что он хочет...
если перезапустить сервер и делать просто

Код: sql
1.
'SELECT AsText(g) FROM `geom`



то этот простой запрос работает

никогда не имел дело с подобным, НО
просто зайдя на страницу документации понял

1)функция ждёт mp MULTIPOLIGON

2)такой тип строиться путём MULTIPOLYGON(poly1,poly2)

3)poly1 = POLYGON(ls11,ls12), poly2 = POLYGON(ls21,ls22)

4)ls11 = LINESTRING(pt111,pt112,pt113), ls12.......

5)pt111 = POINT(0 0);.....

Тоесть задание мультиполигона с полигоном типо кдвадрата 00 11 01 10

будет

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
SET @poly = 
MULTIPOLYGON(

	POLYGON(

		LINESTRING(
			POINT(0,0),
			POINT(0,3),
			POINT(3,3),
			POINT(3,0)
		),
		LINESTRING(
			POINT(0,0),
			POINT(3,0)
		)
	),

	POLYGON(

		LINESTRING(
			POINT(1,1),
			POINT(1,3),
			POINT(3,3),
			POINT(3,1)
		),
		LINESTRING(
			POINT(1,1),
			POINT(3,1)
		)
	)
);
...
Рейтинг: 0 / 0
(MySQL 5.5.36) spatial, работа с геометрией
    #38671660
tanglir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alex564657498765453, результат функции astext вполне может быть такой, какого ожидает функция ТСа (пример с лайнстрингом тут ). Другое дело, что функция ТСа ожидает именно полигон, а не мультиполигон.
Но я не понимаю, начешуя это всё нужно, если есть куча встроенных функций.
И тем более я не понимаю, почему ТС использует MBR-функции, но не использует "точные" функции, расположенные в соседнем разделе хелпа
...
Рейтинг: 0 / 0
(MySQL 5.5.36) spatial, работа с геометрией
    #38671663
однобитный
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
спасибо, думал что мультиполигон пропускает полигоны, точки и т.д. как geometry
...
Рейтинг: 0 / 0
(MySQL 5.5.36) spatial, работа с геометрией
    #38671682
однобитный
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
tangliralex564657498765453, результат функции astext вполне может быть такой, какого ожидает функция ТСа (пример с лайнстрингом тут ). Другое дело, что функция ТСа ожидает именно полигон, а не мультиполигон.
Но я не понимаю, начешуя это всё нужно, если есть куча встроенных функций.
И тем более я не понимаю, почему ТС использует MBR-функции, но не использует "точные" функции, расположенные в соседнем разделе хелпа
я был бы рад, если бы вы кинули ссылкой, на штатную функцию определения точки внутри полигона
...
Рейтинг: 0 / 0
(MySQL 5.5.36) spatial, работа с геометрией
    #38671714
tanglir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
однобитный,

последняя ссылка в предыдущем посте. ST_within. Разве не оно?
...
Рейтинг: 0 / 0
(MySQL 5.5.36) spatial, работа с геометрией
    #38671721
alex564657498765453
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
tangliralex564657498765453, результат функции astext вполне может быть такой, какого ожидает функция ТСа (пример с лайнстрингом тут ). Другое дело, что функция ТСа ожидает именно полигон, а не мультиполигон.
Но я не понимаю, начешуя это всё нужно, если есть куча встроенных функций.
И тем более я не понимаю, почему ТС использует MBR-функции, но не использует "точные" функции, расположенные в соседнем разделе хелпа

я и сам это хотел дописать, но запнулся на тестах у себя...

почему не работает
Код: sql
1.
2.
3.
4.
set @p1 = POINT(0,0);
set @p2 = POINT(1,1);

set @ls1 = (@p1,@p2);


пишет ошибку что р1 не геометрическая фигура!?
...
Рейтинг: 0 / 0
(MySQL 5.5.36) spatial, работа с геометрией
    #38671723
однобитный
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
но что-то не хочет работать со штатными...

SELECT * FROM `geom` WHERE ST_Intersects(GeomFromText('PONT(55.753575000000 37.621040000000)'), GeomFromText('POLYGON(55.78285293197814 37.546170438598594, 55.728061591974 37.5458271158447, 55.73271120739292 37.695859159301726, 55.78846322660012 37.67148324377439, 55.78285293197814 37.546170438598594)'));

SELECT * FROM `geom` WHERE ST_Intersects(GeomFromText('POLYGON(55.78285293197814 37.546170438598594, 55.728061591974 37.5458271158447, 55.73271120739292 37.695859159301726, 55.78846322660012 37.67148324377439, 55.78285293197814 37.546170438598594)'),GeomFromText('PONT(55.753575000000 37.621040000000)'));
...
Рейтинг: 0 / 0
(MySQL 5.5.36) spatial, работа с геометрией
    #38671724
alex564657498765453
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alex564657498765453
я и сам это хотел дописать, но запнулся на тестах у себя...

почему не работает
Код: sql
1.
2.
3.
4.
set @p1 = POINT(0,0);
set @p2 = POINT(1,1);

set @ls1 = LINESTRING(@p1,@p2);


пишет ошибку что р1 не геометрическая фигура!?
...
Рейтинг: 0 / 0
(MySQL 5.5.36) spatial, работа с геометрией
    #38671768
tanglir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alex564657498765453почему не работаетпотому что, насколько я могу судить из доки , лайнстринг задаётся не так.
У меня вышеприведённый код отрабатывает без ошибок, но результат - NULL.
...
Рейтинг: 0 / 0
(MySQL 5.5.36) spatial, работа с геометрией
    #38671851
alex564657498765453
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
tangliralex564657498765453почему не работаетпотому что, насколько я могу судить из доки , лайнстринг задаётся не так.
У меня вышеприведённый код отрабатывает без ошибок, но результат - NULL.

:) да я и сам доки почитал, но английский я знаю плохо, а не работал с геометрией ваще в базе...

есть два формата - строка текста, и бинарное представление
функция linestring строит тип ЛИНИЯ из точек или бинарного представления точек

итого

Код: sql
1.
2.
3.
4.
5.
set @point2 = POINT(2,2);
set @point3 = POINT(2,0);

set @ls1 = LINESTRING(@point2, @point3);--not work, @point2 non geometry
set @ls2 = LINESTRING(POINT(2,0), POINT(2,2)); -- work



так что вопрос остаёться в силе, почему???

Код: sql
1.
2.
set @point2 = POINT(2,2);
select @point2,POINT(2,2),GeomFromWKB(@point2);


в выводе 1 колонка отличаеться от 2 и 3. видимо WKB - well known binary, и геометрический тип это не совсем одно и тоже.
геометрический тип, это как тип текст(который может быть в разной кодировке)
а бинарное представление геометрического обьекта - это посути внутренее хранение типа + указатель на тип.
...
Рейтинг: 0 / 0
(MySQL 5.5.36) spatial, работа с геометрией
    #38671859
alex564657498765453
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: sql
1.
2.
3.
4.
5.
set @point2 = POINT(2,2);
set @point3 = POINT(2,0);

set @ls1 = LINESTRING(@point2, @point3);--not work, @point2 non geometry
set @ls2 = LINESTRING(POINT(2,0), POINT(2,2)); -- work


к слову

Код: sql
1.
2.
set @ls1 = LINESTRING(@point2, @point3);--not work, @point2 non geometry
set @ls1 = LINESTRING(POINT(@point2), POINT(@point3));--WORK!!!



видать, если мы в процедуре обьявим переменую как точка, тогда строка 1 заработает, а просто отправляя кусок кода с перемеными, не срабатывает ибо идёт автопреобразование...

по сути получаеться
Код: sql
1.
2.
3.
4.
5.
6.
--мы пишем
set @a = POINT(<decimal>,<decimal>);

-а на деле, если бы мы писали
set @a = asBinary(POINT(<decimal>,<decimal>));
set @a = asWKB(POINT(<decimal>,<decimal>));
...
Рейтинг: 0 / 0
(MySQL 5.5.36) spatial, работа с геометрией
    #38671876
alex564657498765453
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
СПАСИБО АВТОР, сам бы ещо наверно годы бы не лез туда...а так прокатически узучил эту часть мускла...
...
Рейтинг: 0 / 0
13 сообщений из 13, страница 1 из 1
Форумы / MySQL [игнор отключен] [закрыт для гостей] / (MySQL 5.5.36) spatial, работа с геометрией
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]