Veel

Looge kihi kohale kuuskantvõrgud

Looge kihi kohale kuuskantvõrgud


Mul on shapefile, millel on Ameerika Ühendriikide piirjooned, ja ma tahan luua selle kihi kohal kuuskantvõrgud.

Proovisin kasutada seda funktsiooni, mis loob kihi kohale heksid. Lõin tühja tabeli ja lisasin siis ageomveerg ja seejärel käivitas kohandatud funktsiooni, nagu näidatud.

LOE TABEL, KUI EI OLE hex_grid (peidetud jada EI NULL PRIMARY KEY) SELECT AddGeometryColumn ('hex_grid', 'geom', 0, 'POLYGON', 2); - heksaruudulise SELECT genhexagonite loomine (0,05, ST_xmin (ST_Extent (SELECT geom FROM usa)), ST_ymin (ST_Extent (SELECT geom FROM usa)), ST_xmax (ST_Extent (SELECT geom FROM usa)), ST_ymax (ST_Extent (SELECT geom) USAst)));

Kuid mul tekkis see viga, et ma pole kindel, kuidas seda teha, olen kindel, et see tegeleb heksside loomisega, kui see ületab USA piirjoone. Vaata allpool:


Vaadates teie lingitud postitust,genhexagonsFunktsioon võtab 5 ujukparameetrit, lahtri laiuse ja (x, y) koordinaadid SW- ja NE-nurkade ulatuses. Möödute ujukist ja geomeetriast.

FUNKTSIOONI LOOMINE VÕI ASENDA genhexagons (ujuki laius, xmin ujuk, ymin ujuk, xmax ujuk, ymax ujuk)

Võimalik, et saate seda kasutadaST_xmin (ST_Extent (teie_geom))(ja ST_ymin, ST_ymax jne), kui te ei soovi funktsiooni väljakutse ulatuses koordinaatide väärtusi kõvasti kodeerida.

Olen selles postituses koodi proovinud sõna-sõnalt ja see töötab reklaamitult - see loob Keenia kohale kuuskantvõrgu.

MUUDA

Võib olla lihtsam, kui määrate piirid käsitsi. Pideva USA jaoks oletan, et ulatuse nurgad on umbes (-124,8,25,10) ja (-66,9,49,6)

nii helistades

genhexagons (1,0, -124,8, 25,10, -66,9, 49,6)

annab 1-kraadise ruudustiku külgneva USA kohal ...

Kuid näib, et see kood genereerib liiga palju paanide ridu ... Ma leian, et see hõlmab ka enamikku Kanadat: /

Leidsin, et suutsin klammerdada tulemused piirikasti, visates kõik paanid, mis ei kattunud piiramiskastiga, ja kirjutades need uude tabelissekärbitud.

loo tabel, mis on lõigatud järgmiselt (vali * hex_grid'ist, kus ST_Intersects (st_setSRID (the_geom, 4326), st_setSRID (st_envelope ('POLYGON ((- 124,8 25,10, -124,8 49,6, -66,9 49,6, -66.9 25.10, -124.8 25.10)) ": : geomeetria), 4326)));

Selle toomine QGIS-i ...


Kirjutasin funktsiooni PostGIS, et genereerida teise kihi peal kuusnurkseid võre.

KASUTA $ DEKLAREERI _kursorite valik kursorile geom3857 FROM nrw; _tabeli TEKST: = 'nrw_hx_10k'; _srid INTEGER: = 3857; _kõrgus NUMERIKA: = 10000; _laius NUMERIC: = _kõrgus * 0,866; _geom geomeetria; _hx TEKST: = 'POLYGON ((' || 0 || "|| 0 || ',' || (_laius * 0,5) ||" || (_kõrgus * 0,25) || ',' || (_laius * 0,5) || "|| (_kõrgus * 0,75) || ',' || 0 ||" || _kõrgus || ',' || (-1 * (_laius * 0,5)) || "|| (_kõrgus * 0,75) || ',' || (-1 * (_laius * 0,5)) || "|| (_kõrgus * 0,25) || ',' || 0 ||" || 0 || ')) " ; _hx_g GEOMETRY: = ST_SetSRID (_hx :: GEOMETRY, _srid); TEGEMISE TABELI ALGUSTAMINE hx_tmp (geom GEOMETRY (POLYGON)); OPEN _curs; LOOP FETCH _curs INTO _geom; EX_T INS x_series, y_series) :: GEOMETRY (POLYGON) geom FROM genereerimissari ((st_xmin (_geom) / _width) :: INTEGER * _width - _width, (st_xmax (_geom) / _width) :: INTEGER * _width + _width, _width) x_series, genereerida_seeria ((st_ymin (_geom) / (_kõrgus * 1,5)) :: INTEGER * (_kõrgus * 1,5) - _kõrgus, (st_ymax (_geom) / (_kõrgus * 1,5)) :: INTEGER * (_kõrgus * 1,5) + _kõrgus, _kõrgus * 1,5) y_series WHERE ST_Intersects (ST_Translate (_hx_g, x_series, y_series) :: GEOMEETRIA (POLÜGON), _geom); INSERT INTO hx_tmp SELECT ST_Translate (_hx_g, x_series, y_series) :: GEOMETRY (POLYGON) geom FROM create_series ((st_xmin (_geom) / _width) :: INTEGER * _width - (_width * 1.5), (st_xmax (_geom) / _width) :: INTEGER * _width + _width, _width) x_series, gene_series ((st_ymin (_geom) / (_height * 1.5)) :: INTEGER * (_height * 1.5) - (_height * 1.75), (st_ymax (_geom) / (_height * 1.5) ) :: INTEGER * (_kõrgus * 1,5) + _kõrgus, _kõrgus * 1,5) y_seeria WHERE ST_Intersects (ST_Translate (_hx_g, x_series, y_series) :: GEOMETRY (POLYGON), _geom); LÕPP LOOP; SULETUD _kohad; CREATE INDEX sidx_hx_tmp_geom ON hx_tmp GIST (geom) kasutades; TÄITA „PILKUTABEL, KUI ON OLEMAS“ || _tabel; TÄITA „LOE TABEL” || _tabel || ' (geom geomeetria (polügoon, '|| _srid ||')) "; TÄITA 'INSERT INTO' || _tabel || ' VALI * FROM hx_tmp GROUP BY geom '; TÄITA 'LOO INDEKS sidx_' || _tabel || '_geom ON' || _tabel || ' GIST (geom) KASUTAMINE "; LABI TABEL, KUI ON HX_tmp; LÕPP $ $;

Sisendparameetrid tuleb määrata järgmisele väärtusele: _curs: geomeetria välja nimi ja sisendi geomeetriate tabeli nimi. _table: väljundtabeli nimi. _srid: sisendi (ja väljundi) geomeetriate geograafiline projektsioonikood. _kõrgus: kuusnurkse võre lahtri kõrgus projektsioonühikutes.

Ma genereerin deklareerimisplokis skaleeritud kuusnurga geomeetria ja seejärel vaatan sisendgeomeetriad läbi. Tsüklis genereerin x ja y ulatuse seeriad pluss mõned iga sisendi geomeetria jaoks. Kuusnurk tõlgitakse ja sisestatakse ajutisse tabelisse, kui kaks geomeetriat lõikuvad. Teine seeriapaar genereeritakse alternatiivsed nihkeread. Lõpuks rühmitan duplikaatide eemaldamiseks kuusnurkse võre lahtrid nende geomeetria järgi.

Meediumil on üksikasjalikum kirjeldus ja mõned taustad.


Lihtne funktsioon kuuskantvõrgu Github Repo jaoks: https://github.com/imran-5/Postgis-Custom

Funktsioon =================================================== ===================

FUNKTSIOONI LOOMINE VÕI ASENDA public.I_Grid_Hex (geomeetria, raadiusega topelttäpsus) TAGASTAB SETOF-i geomeetria AS $ BODY $ DECLARE srid INTEGER: = 4326; sisend_srid INTEGER; x_max DECIMAL; y_max KÜMMEND; x_min KOHALIK; y_min KÜMMEND; x_sari KÜMMEND; y_seeria DECIMAL; b ujuk: = raadius / 2; ujuk: = b / 2; --sin (30) = .5 c ujuk: = 2 * a; --temp GEOMETRY: = ST_GeomFromText (FORMAT ('POLYGON ((0 0,% s% s,% s% s,% s% s,% s% s,% s% s, 0 0)) ", - (b), (a), (b), (a + c), (0), (a + c + a), (-1 * b), (a + c), (-1 * b), (a)), srid); geom_grid GEOMETRY: = ST_GeomFromText (FORMAT ('POLYGON ((0 0,% s% s,% s% s,% s% s,% s% s,% s% s, 0 0)) ", (raadius * 0,5 ), (raadius * 0,25), (raadius * 0,5), (raadius * 0,75), 0, raadius, (raadius * -0,5), (raadius * 0,75), (raadius * -0,5), (raadius * 0,25)) , srid); BEGIN CASE st_srid (geom) KUI 0 SIIS geom: = ST_SetSRID (geom, 4326); TÕSTETE TEADE 'SRID ei leitud.'; MUU TÕSTETE TEADE 'SRID leitud.'; LÕPPJUHTUM; sisend_srid: = st_srid (geom); geom: = st_transform (geom, srid); x_max: = ST_XMax (geom); y_max: = ST_YMax (geom); x_min: = ST_XMin (geom); y_min: = ST_YMin (geom); x_sari: = lagi (@ (x_max - x_min) / raadius); y_seeria: = lagi (@ (y_max - y_min) / raadius); TAGASI PÄRING foo as (SELECT ST_Translate (lahter, x * (2 * a + c) + x_min, y * (2 * (c + a)) + y_min) AS hexa PÕHJAL generaator_saeria (0, x_sari, 1) AS , create_series (-1, y_series, 1) AS y, (SELECT ST_Translate (geom_grid :: geomeetria, b, a + c) lahtriliiduna SELECT geom_grid AS cell) AS foo) valige ST_CollectionExtract (ST_Collect (ST_Transform (ST_Intersection (ST_CollectionExtract ( hexa, 3), geom), input_srid)), 3) foo-st, kus ST_Intersects (hexa, geom); LÕPP; $ BODY $ LANGUAGE 'plpgsql' VOLATILE;

Päring ülaltoodud küsimuse kohta:

SELECT I_Grid_Hex (st_envelope (st_collect (geom)), 1) "us-osariikidest"

Tulemus

Veel üks lihtne päring

Valige polügoonide limiidist 1 I_Grid_Hex (geom, .0001)

Tulemus =================================================== =====================