Tuesday 30 June 2009

Convert MULTIPOLYGON to POLYGON in PostGIS

One way how to convert features from MULTIPOLYGON to POLYGON type in PostGIS. This approach can be used when geometries certainly are simple polygons and not multi-polygons.

UPDATE mytable SET the_geom = st_polygonfromtext(st_astext(the_geom)) WHERE st_astext(the_geom) NOT LIKE 'POLYGON%';

Timer function for PostgreSQL

This function will return execution time for any SELECT statement given as a parameter. It is useful for queries in psql.

DROP FUNCTION IF EXISTS timer(VARCHAR);
CREATE FUNCTION timer(VARCHAR)
RETURNS INTERVAL AS'

DECLARE
t1 TIMESTAMP;
t2 TIMESTAMP;

BEGIN

t1 = timeofday();
EXECUTE $1;
t2 = timeofday();

RETURN (t2 - t1);
END;'
language 'plpgsql';


EXAMPLE:
=> SELECT timer('SELECT foo FROM bar LIMIT 100');

-[ RECORD 1 ]----------
timer | 00:00:00.012927

Convert integers to base36 in PostgreSQL

This is PostgreSQL function for converting integers to base36 numbering system:

CREATE OR REPLACE FUNCTION dec2base36(bigint)
RETURNS character varying AS'

DECLARE
inparam alias FOR $1;
invalue bigint;
CLIST char ARRAY[35] :='{0,1,2,3,4,5,6,7,8,9,A,B,C,D,E,
F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U,V,W,X,Y,Z}';
rv varchar :=''; -- rv = resulting value

BEGIN
invalue = inparam;

WHILE invalue != 0 LOOP
rv = (CLIST[((invalue % 36)+1)]) || rv;
invalue = (invalue/36);
END LOOP;

RETURN(rv);
END;'
language 'plpgsql';


EXAMPLE:
=> SELECT dec2base36(123456789);

-[ RECORD 1 ]------
dec2base36 | 21I3V9

Sunday 21 June 2009

PostGIS špikeri

Konvertēt MULTIPOLYGON uz POLYGON ģeometrijas veidu:
CREATE TABLE gislatvija.mezi_simple AS SELECT gid, shape_leng, shape_area, (public.st_dump(the_geom)).geom AS the_geom FROM gislatvija.mezi_multi;

Validēt ģeometriju:
SELECT st_isvalid(the_geom) FROM foo WHERE gid = 40;
st_isvalid
------------
t
(1 row)


Uzzināt objekta ģeometrijas izmēru megabaitos:
SELECT st_mem_size(the_geom)/131072 as size_in_mb FROM foo WHERE gid = 40;
size_in_mb
---------
2
(1 row)



Ģenerēt 'bounding box' ģeometriju no koordinātēm:
UPDATE mytable SET the_geom = st_geomfromtext('POLYGON((' || minx || ' ' || maxy || ',' ||
maxx || ' ' || maxy || ',' || maxx || ' ' || miny || ',' || minx || ' ' || miny || ',' || minx ||
' ' || maxy || '))', 27700);


Shapefile dump from PostGIS database:
pgsql2shp -u lasma -h localhost -f myfile mydatabase "select id, ('/home/lasma/' || tif_path) as location from myschema.mytable where name = 'Worcester'"

Saturday 20 June 2009

Taisam savas kartes uz Garmin GPSmap 60CSx GPS


Aprakstītās darbības norisinās uz Kubuntu ar sekojošiem rīkiem:

  • GPSMapEdit (uz Wine emulatora)
  • cGPSmapper
  • ogr2ogr

Programmu un rīku instalēšanas process

ogr2ogr
(daļa no GDAL/OGR)
Daram konsolē:

$ sudo apt-get install gdal-bin

GPSMapEdit un Wine
Wine ir MS Windows emulators uz GNU/Linux. Ar tā palīdzību var palaist *.exe failus. Uzinstalējam Wine paciņas:

$ sudo apt-get install wine wine-gecko

Lejuplādējam GPSMapEdit:
$ wget http://www.geopainting.com/download/mapedit1-0-57-3.zip
$ mkdir ~/mapedit
$ unzip mapedit1-0-57-3.zip -d ~/mapedit


cGPSmapper
Lejuplādējam bezmaksas Linux versiju (1), atzipojam (2), iekopējam kaut kur, kur
bash var palaist gpsmapper kā komandu (3):
$ wget http://www.cgpsmapper.com/download/cgpsmapper-static.gz
$ gunzip cgpsmapper-static.gz
$ sudo mv cgpsmapper-static /usr/bin/cgpsmapper


Ja negribas piedraņķēt bin direktoriju, tad var uztaisīt symlinku:
$ sudo ln -s cgpsmapper-static /usr/bin/cgpsmapper


Datu apstrāde

Pirmkārt, salasam kaut kādus šeipfailus (*.shp), ko gribam ielādēt savā Garmin GPS uztvērējā. Pirmais, pārprojicējam visu uz WGS 84 (Lat/Lon) koordinātu sistēmu ar ogr2ogr, piemēram:

$ ogr2ogr -t_srs EPSG:4326 mezi_EPSG4326.shp mezi_LKS92.shp

Talāk varam startēt GPSMapEdit:
$ wine ~/mapedit/mapedit.exe

Importējam pārprojicētos šeipus caur File -> Import un sekojam programmas instrukcijām.
Saglabājam visu padarīto kā
gmapsupp.mp failu (šis faila nosaukums ir obligāts!).

Tagad
gmapsupp.mp fails ir jākonvertē Garmin saprotamā *.img formātā. To daram ar cgpsmapper.
$ cgpsmapper -q gmapsupp.mp

Izsaukts bez argumentiem, cgpsmapper izdos lietošanas pamācību:
$ cgpsmapper
*************************************************************
cGPSmapper a GIS converter into GARMIN compatible format maps
............
............


Šī konvertācija aizņems ieverojamu laika posmu, pacietība būs vajadzīga.

Visbeidzot izveidojam USB savienojumu ar savu Garmin ierīci un iekopējam gmapsupp.img failu mapē "Garmin" uz GPS uztverēja atmiņas kartes. Ja šī mape neeksiste, tad tā ir jāizveido. Startējam GPSmap 60CSx uztverēja režīmā un jaunizveidotajai kartei vajadzētu parādīties automātiski.

Te līdzīgs stāsts:
http://reidster.net/garmin/

"Kreisā" LKS92 koordinātu sistēma

"Kreisās" LKS92 specifikācija proj4 formātā:
+proj=tmerc +lat_0=0 +lon_0=24 +k=0.9996 +x_0=500000 +y_0=0 +ellps=
GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs
Kas ir līdzvērtīga EPSG:2100 (Grieķu koordinātu sistēma).
Pārprojicējam uz WGS 84 (EPSG:4326) izmantojot GDAL/OGR šādi:

$ ogr2ogr -t_srs EPSG:4326 mezi_EPSG4326.shp mezi_LKS92.shp

Lasīt vairāk par "6 miljonu operu" un LKS92 te:
http://www.gisnet.lv/gisnet/2007/04/sesu-miljonu-opera/

Klusumā tapa ideja

Tā, jau gads kā pagājis klusumā...
Vajadzēs kaut ko mainīt. Kapēc gan neizmantot šo blogu, kā vērtīgu piezīmju krātuvi sev, kas aizsniedzma no jebkuras vietas?