Страница 1 из 1
Помогите с запросом (Postgis)
Добавлено: 27 май 2009, 09:08
Vavik
Есть запрос
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 ?
Re: Помогите с запросом (Postgis)
Добавлено: 28 май 2009, 08:58
KolesovDmitry
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;
Re: Помогите с запросом (Postgis)
Добавлено: 29 май 2009, 00:23
Vavik
Спасибо, всё работает:) Правда у меня расстояния неизвестно в чём указываются. Получил вот такое число 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 ?
Re: Помогите с запросом (Postgis)
Добавлено: 29 май 2009, 08:34
KolesovDmitry
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 - название поля, в котором хранится геометрия.
Re: Помогите с запросом (Postgis)
Добавлено: 29 май 2009, 11:59
Vavik
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, которые имеются, в не зависимости, попадают они в радиус или нет.
Re: Помогите с запросом (Postgis)
Добавлено: 29 май 2009, 13:41
KolesovDmitry
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, отсюда и идут многие вопросы.
Re: Помогите с запросом (Postgis)
Добавлено: 29 май 2009, 19:25
Vavik
Вроде SRID 4326, а как его поменять на 26986 ?
Re: Помогите с запросом (Postgis)
Добавлено: 30 май 2009, 07:51
KolesovDmitry
Vavik писал(а):Вроде SRID 4326, а как его поменять на 26986 ?
Тогда есть два пути:
- 1) преобразовать ваш shp перед экспортом в SQL. Это можно сделать, например, при помощи утилиты ogr2ogr или любым другим способом.
2) экспрортировать shp в PostGIS со SRID 4326, а потом уже в PostGIS (его средствами) преобразовать в требуемую систему. Для этого воспользуйтесь функцией ST_TRANSFORM (функция очень простая, подробности об использовании смотрите в документации).
Re: Помогите с запросом (Postgis)
Добавлено: 30 май 2009, 17:23
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
Что делать???
Re: Помогите с запросом (Postgis)
Добавлено: 30 май 2009, 19:28
Vavik
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 без инсталятора ставить)) Вот
Тут вроде написано, как, а чёт у меня не получается всё равно...

Re: Помогите с запросом (Postgis)
Добавлено: 30 май 2009, 19:46
ProFF
KolesovDmitry писал(а):
Тогда есть два пути:
1) преобразовать ваш shp перед экспортом в SQL. Это можно сделать, например, при помощи утилиты
ogr2ogr или любым другим способом.
...
Этот путь мне больше нарвится) правда не могу эту утилиту поставить. Вообще я не пойму, как её или например ptoj, geos без инсталятора ставить)) Вот
Тут вроде написано, как, а чёт у меня не получается всё равно...

[/quote]
Спосибо Все работает, нашел в чем ошибся.
Re: Помогите с запросом (Postgis)
Добавлено: 31 май 2009, 10:41
ProFF
Подскажите как изменить кодировку у базы с win1251 на UTF8
Re: Помогите с запросом (Postgis)
Добавлено: 31 май 2009, 14:01
Vavik
ProFF писал(а):Подскажите как изменить кодировку у базы с win1251 на UTF8
Кажись никак. Можно сделать копию базы, потом создать новую в нужной кодировке и восстановить туда сохранённую бд) А вообще, чтто меняет кодировка ? а то я не знаю для чего она))
Re: Помогите с запросом (Postgis)
Добавлено: 31 май 2009, 23:31
ProFF
Vavik писал(а):ProFF писал(а):Подскажите как изменить кодировку у базы с win1251 на UTF8
Кажись никак. Можно сделать копию базы, потом создать новую в нужной кодировке и восстановить туда сохранённую бд) А вообще, чтто меняет кодировка ? а то я не знаю для чего она))
Повидемому что то меняет так как слой WayLine был создан в кодировке win1251 при перегоне в шейп фойл была выстовлена кодировка UTF-8, после чего он стал уже в загруженном виде в PostgresSQL отображать место подписей, кракозябры. Провел эксперемент оказалась насамом деле от кодировки зависет.
UTF-8 хороша вообще тем что используется везде. Если кодировка win1251 в большенстве случаев не поддерживается на серверах Linux, Unix - товот UTF -8 наоборот поддержиается.