Блоґ одного кібера

Історія хвороби контуженого інформаційним вибухом

PostgreSQL & PostGIS “Hello world”

with 2 comments

Інсталяція:

sudo apt-get install -y postgresql postgresql-contrib postgis

Після чого від імені користувача postgres (це суперкористувач для postgres), створюємо користувача gisuser та базу для нього, яку наприклад назвемо gis:

sudo -u postgres createuser gisuser
sudo -u postgres createdb --encoding=UTF-8 --owner=gisuser gis
# і створимо пароль для користувача:
sudo -u postgres psql -d gis -c "ALTER USER gisuser WITH PASSWORD 'password'"

# і увімкнути розширення postgis:
sudo -u postgres psql -d gis -c "CREATE EXTENSION postgis;"
sudo -u postgres psql -d gis -c "CREATE EXTENSION postgis_topology;"
CREATE EXTENSION

Тепер ми можемо з’єднуватись з нашою базою за допомогою клієнта, вказавши базу і користувача:

psql -d gis -U gisuser

У випадку отримання помилки:

psql: FATAL:  Peer authentication failed for user

Треба відредагувати файл sudo vim /etc/postgresql/9.4/main/pg_hba.conf, чи який там буде для вашої версії, і зробити таку заміну десь ближче до кінця:

- local   all             all                                     peer
+ local   all             all                                     md5

І перезавантажте сервер

sudo /etc/init.d/postgresql restart

Тоді можна буде логінитись (дивно, але в мене навіть пароль не питає), і виконувати запити:

select postgis_full_version();
-- В мене дає щось схоже на:
-- POSTGIS="2.1.5 r13152" GEOS="3.4.2-CAPI-1.8.2 r3921"
-- PROJ="Rel. 4.8.0, 6 March 2012" GDAL="GDAL 1.11.2, released 2015/02/10"
-- LIBXML="2.9.2" LIBJSON="UNKNOWN" RASTER

Можна ще поставити гарний GUI-клієнт:

sudo apt-get install -y pgadmin3

Гаразд, давайте тепер створимо табличку з містами:

CREATE TABLE cities ( 
    id SERIAL PRIMARY KEY,
    name VARCHAR(100),
    location GEOGRAPHY(POINT,4326)
);

4326 це ідентифікатор системи координат (SRID, Spatial Reference system ID) і означає що ми використовуватимемо систему координат WGS 84. Здається це популярна система координат.

Тепер заповнимо таблицю якимись даними:

INSERT INTO cities (name, location) VALUES
 ('Львів', ST_GeographyFromText('SRID=4326;POINT(49.83 24.014167)') ),
 ('Київ', ST_GeographyFromText('SRID=4326;POINT(50.45 30.523611)') ),
 ('Івано-Франківськ', ST_GeographyFromText('SRID=4326;POINT(48.922778 24.710556)') )
;

І спробуємо зробити якийсь запит, наприклад скільки метрів від Львова до Києва:

select ST_Distance(
    (select location from cities where name='Львів'),
    (select location from cities where name='Київ')
);

І цей запит дає мені 723904.293225235, що приблизно 723 км, в той час як до Києва по прямій менш ніж 500 км. Я вибрав неправильну проекцію, або переписав з вікіпедії неправильні координати, або передав функції якісь неправильні параметри.😦

Але на сьогодні напевне просто піду спати. До речі, може ви підкажете в чому помилка?

Посилання

Written by bunyk

Листопад 25, 2015 at 00:57

Оприлюднено в Інструменти, Кодерство

Tagged with

Відповідей: 2

Subscribe to comments with RSS.

  1. Ага, найпростіше пояснення, я поплутав місцями широту і довготу:

    INSERT INTO cities (name, location) VALUES
     ('Львів', ST_GeographyFromText('SRID=4326;POINT(24.014167 49.83)') ),
     ('Київ', ST_GeographyFromText('SRID=4326;POINT(30.523611 50.45)') ),
     ('Івано-Франківськ', ST_GeographyFromText('SRID=4326;POINT(24.710556 48.922778)') )
    ;
    

    https://tools.wmflabs.org/geohack/geohack.php?language=uk&pagename=%D0%9B%D1%8C%D0%B2%D1%96%D0%B2&params=49_49_48_N_24_0_51_E_scale:100000
    Дає координати як latitude, longtitude, а EWKT для SRID=4326, який і передається в ST_GeoraphyFromText – longtitude latitude.

    Виходить приблизно 470 км.

    bunyk

    Листопад 25, 2015 at 01:39

  2. на рахунок постгреса

    коли міняєш pg_hba.conf, його можна не перезапускати, а релодити (service postgresql reload)

    > local all all md5
    краще робити
    local gisuser gis md5

    метод peer означає, що буде використовуватись логін тільки для тих постгрес юзерів, які відповідають системним. Тобто, теоретично можна зробити лінукс-юзера gisuser і заходити в psql з-під нього

    > Тоді можна буде логінитись (дивно, але в мене навіть пароль не питає)
    можливо у тебе стоїть метод trust a не md5?

    >select postgis_full_version();
    у тебе код негарно екранувався =)

    danbst

    Січень 1, 2016 at 14:45


Залишити відповідь

Заповніть поля нижче або авторизуйтесь клікнувши по іконці

Лого WordPress.com

Ви коментуєте, використовуючи свій обліковий запис WordPress.com. Log Out / Змінити )

Twitter picture

Ви коментуєте, використовуючи свій обліковий запис Twitter. Log Out / Змінити )

Facebook photo

Ви коментуєте, використовуючи свій обліковий запис Facebook. Log Out / Змінити )

Google+ photo

Ви коментуєте, використовуючи свій обліковий запис Google+. Log Out / Змінити )

З’єднання з %s

%d блогерам подобається це: