Помогите с запросом (Postgis)

Ответить
Vavik
Интересующийся
Сообщения: 16
Зарегистрирован: 07 апр 2009, 16:58
Репутация: 0

Помогите с запросом (Postgis)

Сообщение Vavik » 27 май 2009, 09:08

Есть запрос
select ST_Distance( geomfromtext('POINT(40.19992 43.6737)', 26986), geomfromtext('POINT(40.20211 43.67327)', 26986))
То есть находится дистаниця между точками по их координатам, а как сделать, чтобы не по координатам, а по названию там или id находилась ? Нашёл вот такого вида запросик, может посмотрев на него поймёте чего я хочу) правда он не работает(

SELECT ST_Distance(a.location, b.location)
FROM points_tbl a, points_tbl b
WHERE a.id = 1000 AND b.id = 3029;

И ещё, какой запрос выведет мне координаты точки, если я укажу её название или id ?

KolesovDmitry
Гуру
Сообщения: 810
Зарегистрирован: 22 авг 2007, 14:58
Репутация: 123
Откуда: Казань

Re: Помогите с запросом (Postgis)

Сообщение KolesovDmitry » 28 май 2009, 08:58

Vavik писал(а): Нашёл вот такого вида запросик, может посмотрев на него поймёте чего я хочу) правда он не работает(

SELECT ST_Distance(a.location, b.location)
FROM points_tbl a, points_tbl b
WHERE a.id = 1000 AND b.id = 3029;
Странно, почему не работает?.. Специально ввел для проверки запрос:

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

SELECT ST_DISTANCE(a.the_geom,b.the_geom) FROM city a, city b WHERE a.city_id=333 AND b.city_id=3444;
и все получилось (здесь city - таблица, содержащая точечные объекты, city_id - ключевое поле, the_geom - поле, содержащее "геометрию").
ещё, какой запрос выведет мне координаты точки, если я укажу её название или id ?
Так:

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

SELECT ST_X(the_geom),ST_Y(the_geom) FROM city WHERE city_id=333;
Или так:

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

SELECT AsText(the_geom) FROM city WHERE city_id=333;

Vavik
Интересующийся
Сообщения: 16
Зарегистрирован: 07 апр 2009, 16:58
Репутация: 0

Re: Помогите с запросом (Postgis)

Сообщение Vavik » 29 май 2009, 00:23

Спасибо, всё работает:) Правда у меня расстояния неизвестно в чём указываются. Получил вот такое число 0,01887057232, а реальное расстояние около 1.75-1.95 км. В каких велечинах я получил результат ?) SRID 26986, ранее был 4326, но ничего не изменилось.

Ещё нужен запрос, который выдавал все точки, находящиеся в радиусе другой. Делаю так

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

 SELECT  b.name,st_dwithin(a.the_geom,b.the_geom, 1000)  from table_p a, table_p b 
WHERE a.name~'point' AND b.name~'mod point' 
слово "mod" присутствует в нескольких точках, то есть мне надо, чтобы был результат с такими точками попавшими в радиус, а он мне выводит, все которые только есть.

Нашёл ещё такой запрос,который должен это делать

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

SELECT * FROM geotable 
	WHERE ST_DWithin(geocolumn, 'POINT(1000 1000)', 100.0);
Но не пойму что такое geocolumn ?

KolesovDmitry
Гуру
Сообщения: 810
Зарегистрирован: 22 авг 2007, 14:58
Репутация: 123
Откуда: Казань

Re: Помогите с запросом (Postgis)

Сообщение KolesovDmitry » 29 май 2009, 08:34

Vavik писал(а):Спасибо, всё работает:) Правда у меня расстояния неизвестно в чём указываются. Получил вот такое число 0,01887057232, а реальное расстояние около 1.75-1.95 км. В каких велечинах я получил результат ?) SRID 26986, ранее был 4326, но ничего не изменилось.
Не видя данные, и не зная, откуда они взялись, как вы их положили в PostGIS, сложно что-то сказать... Но очень подозрительно то, что раньше SRID был 4326, а теперь 26986, но результат не изменился (поскольку у первой системы единицы измерения градусы, а у второй - метры). Вы как данные трансформировали из одной системы в другую?
Ещё нужен запрос, который выдавал все точки, находящиеся в радиусе другой. Делаю так

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

 SELECT  b.name,st_dwithin(a.the_geom,b.the_geom, 1000)  from table_p a, table_p b 
WHERE a.name~'point' AND b.name~'mod point' 
слово "mod" присутствует в нескольких точках, то есть мне надо, чтобы был результат с такими точками попавшими в радиус, а он мне выводит, все которые только есть.
Честно сказать, я не понял, что нужно сделать...
Нашёл ещё такой запрос,который должен это делать

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

SELECT * FROM geotable 
	WHERE ST_DWithin(geocolumn, 'POINT(1000 1000)', 100.0);
Но не пойму что такое geocolumn ?
А вот этот пример понятен, здесь geocolumn - название поля, в котором хранится геометрия.

Vavik
Интересующийся
Сообщения: 16
Зарегистрирован: 07 апр 2009, 16:58
Репутация: 0

Re: Помогите с запросом (Postgis)

Сообщение Vavik » 29 май 2009, 11:59

KolesovDmitry писал(а): Не видя данные, и не зная, откуда они взялись, как вы их положили в PostGIS, сложно что-то сказать... Но очень подозрительно то, что раньше SRID был 4326, а теперь 26986, но результат не изменился (поскольку у первой системы единицы измерения градусы, а у второй - метры). Вы как данные трансформировали из одной системы в другую?
Вот так я импортировал данные в Postgis

shp2pgsql -i -D -s 4326 PolyanaKrasnaya_A.shp PolyanaKrasnaya_A > PolyanaKrasnaya_A.sql
psql -U postgres -f PolyanaKrasnaya_A.sql -d PolyanaKrasnaya(map)

Тут мне не понравились результаты запросов с непонятными цифрами, полазил на одном форуме, там советывали перевести SRID на 26986. Ну я по новой загнал Данные только поменяв SRID, а толку 0.

shp2pgsql -i -D -s 26986 PolyanaKrasnaya_A.shp PolyanaKrasnaya_A > PolyanaKrasnaya_A.sql
psql -U postgres -f PolyanaKrasnaya_A.sql -d PolyanaKrasnaya(map)
KolesovDmitry писал(а): Честно сказать, я не понял, что нужно сделать...
Вообщем есть такая функция
ST_DWithin(geometry, geometry, float)
Которая возвращает истину, если геометрии находятся в пределах указанного расстояния одна от другой.

У меня же имеются точки - точки tip1 точки tip2 и tip3. Я хочу в результате получить, например точки tip1 попадающие в радиус отдельно взятой точки. Только, мне нужно, чтобы выводились название этих точек, а не лишь логическое значение, то что они попадают в радиус.
Я сделал такой запрос

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

SELECT  b.name,st_dwithin(a.the_geom,b.the_geom, 1000)  from table_p a, table_p b 
WHERE a.name~'point' AND b.name~'tip1 point'
Но он мне выводит все точки tip1, которые имеются, в не зависимости, попадают они в радиус или нет.

KolesovDmitry
Гуру
Сообщения: 810
Зарегистрирован: 22 авг 2007, 14:58
Репутация: 123
Откуда: Казань

Re: Помогите с запросом (Postgis)

Сообщение KolesovDmitry » 29 май 2009, 13:41

Vavik писал(а): Вот так я импортировал данные в Postgis

shp2pgsql -i -D -s 4326 PolyanaKrasnaya_A.shp PolyanaKrasnaya_A > PolyanaKrasnaya_A.sql
psql -U postgres -f PolyanaKrasnaya_A.sql -d PolyanaKrasnaya(map)

Тут мне не понравились результаты запросов с непонятными цифрами, полазил на одном форуме, там советывали перевести SRID на 26986. Ну я по новой загнал Данные только поменяв SRID, а толку 0.

shp2pgsql -i -D -s 26986 PolyanaKrasnaya_A.shp PolyanaKrasnaya_A > PolyanaKrasnaya_A.sql
psql -U postgres -f PolyanaKrasnaya_A.sql -d PolyanaKrasnaya(map)
Так не годится. Для начала вам нужно узнать, в какой системе координат/проекции хранятся ваши данные в shp-файле, а потом уже импортировать данные в PostGIS, как хранящиеся именно в этой системе. (Илюстрирующий пример того, что у вас выходит сечас. Предположим, вы создали чертеж стула, при этом все длины указали в сантиметрах. После этого вы отдали чертеж столяру, утверждая, что меряли все дюймовой линейкой :) Поэтому не нужно удивляться при получении заказа, что на стуле сидеть как-то неудобно... )
Вообщем есть такая функция
ST_DWithin(geometry, geometry, float)
Которая возвращает истину, если геометрии находятся в пределах указанного расстояния одна от другой.

У меня же имеются точки - точки tip1 точки tip2 и tip3. Я хочу в результате получить, например точки tip1 попадающие в радиус отдельно взятой точки. Только, мне нужно, чтобы выводились название этих точек, а не лишь логическое значение, то что они попадают в радиус.
Я сделал такой запрос

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

SELECT  b.name,st_dwithin(a.the_geom,b.the_geom, 1000)  from table_p a, table_p b 
WHERE a.name~'point' AND b.name~'tip1 point'
Но он мне выводит все точки tip1, которые имеются, в не зависимости, попадают они в радиус или нет.
Так ведь тогда нужно сделать что-то вроде:

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

SELECT b.name,a.name FROM table_p a, table_p b WHERE ST_DWithin(a.geometry, b.geometry, 1000) AND b.name='чему он там равняется'
Совет: почитайте что-нибудь для начинающих про запросы SQL (не пространственные), порешайте простые задачки. Видимо, у вас попросту не хватает практики работы с SQL, отсюда и идут многие вопросы.

Vavik
Интересующийся
Сообщения: 16
Зарегистрирован: 07 апр 2009, 16:58
Репутация: 0

Re: Помогите с запросом (Postgis)

Сообщение Vavik » 29 май 2009, 19:25

Вроде SRID 4326, а как его поменять на 26986 ?

KolesovDmitry
Гуру
Сообщения: 810
Зарегистрирован: 22 авг 2007, 14:58
Репутация: 123
Откуда: Казань

Re: Помогите с запросом (Postgis)

Сообщение KolesovDmitry » 30 май 2009, 07:51

Vavik писал(а):Вроде SRID 4326, а как его поменять на 26986 ?
Тогда есть два пути:
  • 1) преобразовать ваш shp перед экспортом в SQL. Это можно сделать, например, при помощи утилиты ogr2ogr или любым другим способом.
    2) экспрортировать shp в PostGIS со SRID 4326, а потом уже в PostGIS (его средствами) преобразовать в требуемую систему. Для этого воспользуйтесь функцией ST_TRANSFORM (функция очень простая, подробности об использовании смотрите в документации).

ProFF
Новоприбывший
Сообщения: 11
Зарегистрирован: 03 мар 2009, 20:35
Репутация: 0

Re: Помогите с запросом (Postgis)

Сообщение ProFF » 30 май 2009, 17:23

Помогите пишу запрос в Postgis - е

shp2pgsql -i -D -s 4326 wayline.shp wayline > wayline.sql

Выдает такую ошибку:
ERROR: ошибка синтаксиса в или рядом "shp2pgsql"
СТРОКА 1:shp2pgsql -i -D -s 4326 wayline.shp wayline > wayline.sql
^

********** Ошибка **********

ERROR: ошибка синтаксиса в или рядом "shp2pgsql"
SQL state: 42601
Характеристика:1

Что делать???

Vavik
Интересующийся
Сообщения: 16
Зарегистрирован: 07 апр 2009, 16:58
Репутация: 0

Re: Помогите с запросом (Postgis)

Сообщение Vavik » 30 май 2009, 19:28

ProFF писал(а):Помогите пишу запрос в Postgis - е

shp2pgsql -i -D -s 4326 wayline.shp wayline > wayline.sql

Выдает такую ошибку:
ERROR: ошибка синтаксиса в или рядом "shp2pgsql"
СТРОКА 1:shp2pgsql -i -D -s 4326 wayline.shp wayline > wayline.sql
^

********** Ошибка **********

ERROR: ошибка синтаксиса в или рядом "shp2pgsql"
SQL state: 42601
Характеристика:1

Что делать???
Это надо не через запрос делать, а в командной строке и ещё в этом "запросе" может чего-то не хватать, в результате он не сработает.
KolesovDmitry писал(а): Тогда есть два пути:
1) преобразовать ваш shp перед экспортом в SQL. Это можно сделать, например, при помощи утилиты ogr2ogr или любым другим способом.
...
Этот путь мне больше нарвится) правда не могу эту утилиту поставить. Вообще я не пойму, как её или например ptoj, geos без инсталятора ставить)) Вот Тут вроде написано, как, а чёт у меня не получается всё равно... :roll:

ProFF
Новоприбывший
Сообщения: 11
Зарегистрирован: 03 мар 2009, 20:35
Репутация: 0

Re: Помогите с запросом (Postgis)

Сообщение ProFF » 30 май 2009, 19:46

KolesovDmitry писал(а): Тогда есть два пути:
1) преобразовать ваш shp перед экспортом в SQL. Это можно сделать, например, при помощи утилиты ogr2ogr или любым другим способом.
...
Этот путь мне больше нарвится) правда не могу эту утилиту поставить. Вообще я не пойму, как её или например ptoj, geos без инсталятора ставить)) Вот Тут вроде написано, как, а чёт у меня не получается всё равно... :roll:[/quote]

Спосибо Все работает, нашел в чем ошибся.

ProFF
Новоприбывший
Сообщения: 11
Зарегистрирован: 03 мар 2009, 20:35
Репутация: 0

Re: Помогите с запросом (Postgis)

Сообщение ProFF » 31 май 2009, 10:41

Подскажите как изменить кодировку у базы с win1251 на UTF8

Vavik
Интересующийся
Сообщения: 16
Зарегистрирован: 07 апр 2009, 16:58
Репутация: 0

Re: Помогите с запросом (Postgis)

Сообщение Vavik » 31 май 2009, 14:01

ProFF писал(а):Подскажите как изменить кодировку у базы с win1251 на UTF8
Кажись никак. Можно сделать копию базы, потом создать новую в нужной кодировке и восстановить туда сохранённую бд) А вообще, чтто меняет кодировка ? а то я не знаю для чего она))

ProFF
Новоприбывший
Сообщения: 11
Зарегистрирован: 03 мар 2009, 20:35
Репутация: 0

Re: Помогите с запросом (Postgis)

Сообщение ProFF » 31 май 2009, 23:31

Vavik писал(а):
ProFF писал(а):Подскажите как изменить кодировку у базы с win1251 на UTF8
Кажись никак. Можно сделать копию базы, потом создать новую в нужной кодировке и восстановить туда сохранённую бд) А вообще, чтто меняет кодировка ? а то я не знаю для чего она))
Повидемому что то меняет так как слой WayLine был создан в кодировке win1251 при перегоне в шейп фойл была выстовлена кодировка UTF-8, после чего он стал уже в загруженном виде в PostgresSQL отображать место подписей, кракозябры. Провел эксперемент оказалась насамом деле от кодировки зависет.

UTF-8 хороша вообще тем что используется везде. Если кодировка win1251 в большенстве случаев не поддерживается на серверах Linux, Unix - товот UTF -8 наоборот поддержиается.

Ответить

Вернуться в «PostGIS/PostgreSQL»

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и 21 гость