Vairāk

Izveidojiet sešstūra režģus virs slāņa

Izveidojiet sešstūra režģus virs slāņa


Man ir formas fails, kuram ir Amerikas Savienoto Valstu kontūras, un es vēlos izveidot sešstūra režģus, kas atrodas virs šī slāņa.

Es mēģināju izmantot šo funkciju, kas virs slāņa izveidos heksus. Es izveidoju tukšu tabulu un pēc tam pievienoju ageomkolonnu un pēc tam izpildīja pielāgoto funkciju, kā parādīts.

IZVEIDOT TABULU, JA NEBŪT hex_grid (slēptās sērijas NOT NULL PRIMARY KEY) SELECT AddGeometryColumn ('hex_grid', 'geom', 0, 'POLYGON', 2); - sešstūra režģa SELECT genhexagons izveide (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) NO ASV))));

Tomēr man radās šī kļūda, ka neesmu pārliecināts, kā rīkoties, esmu pārliecināts, ka tā nodarbojas ar sešstūru izveidošanu, kad tā pārsniedz ASV kontūras robežu. Skatīt zemāk:


Aplūkojot ziņu, ar kuru esat saistījis,genhexagonsFunkcijai ir nepieciešami 5 pludiņa parametri, šūnu platums un (x, y) koordinātas DR un ZA leņķiem. Jūs ejat pa pludiņu un ģeometriju.

IZVEIDOT VAI NOMAINĪT FUNKCIJU genhexagons (pludiņa platums, xmin pludiņš, ymin pludiņš, xmax pludiņš, ymax pludiņš)

Jūs, iespējams, varēsit izmantotST_xmin (ST_Extent (your_geom))(un ST_ymin, ST_ymax utt.), ja nevēlaties kodēt savas funkcijas izsaukuma koordinātu vērtības.

Esmu izmēģinājis kodu šajā ziņojumā burtiski, un tas darbojas kā reklamēts - tas izveido sešstūra režģi virs Kenijas.

REDIĢĒT

Var būt vienkāršāk, ja robežas norādāt manuāli. Attiecībā uz blakus esošajiem ASV, es domāju, ka stūri ir aptuveni (-124,8,25,10) un (-66,9,49,6)

tik zvana

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

dod 1 grādu režģi pār blakus esošo ASV…

Tomēr šķiet, ka šis kods ģenerēs pārāk daudz flīžu rindu ... Es uzskatu, ka tas attiecas arī uz lielāko daļu Kanādas: /

Es atklāju, ka es varēju sagriezt rezultātus ierobežojošajā lodziņā, nometot visas flīzes, kas nepārklājas ar ierobežojošo lodziņu, un ierakstīju tās jaunā tabulā ar nosaukumuapgriezts.

izveidot tabulu, kas izgriezta kā (atlasiet * no hex_grid, kur 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)) ": : ģeometrija), 4326)));

Ievest to QGIS ...


Es uzrakstīju PostGIS funkciju, lai ģenerētu sešstūra režģus virs cita slāņa.

VAI $ $ DEKLARĒJIET _curs KURŠU ATLASĪT geom3857 NO nrw; _tabulas TEKSTS: = 'nrw_hx_10k'; _srid INTEGER: = 3857; _augums NUMERISKAIS: = 10000; _ platums NUMERIC: = _ augstums * 0,866; _geom ĢEOMETRIJA; _hx TEKSTS: = 'POLYGON ((' || 0 || "|| 0 || ',' || (_ platums * 0,5) ||" || (_ augstums * 0,25) || ',' || (_ platums * 0,5) || "|| (_augstums * 0,75) || ',' || 0 ||" || _augstums || ',' || (-1 * (_platums * 0,5)) || "|| (_augstums * 0,75) || ',' || (-1 * (_ platums * 0,5)) || "|| (_ augstums * 0,25) || ',' || 0 ||" || 0 || ')) " ; _hx_g GEOMETRY: = ST_SetSRID (_hx :: GEOMETRY, _srid); BEGIN CREATE TEMP TABLE hx_tmp (geom GEOMETRY (POLYGON)); OPEN _curs; LOOP FETCH _curs INTO _geom; EX_T INS x_series, y_series) :: GEOMETRY (POLYGON) geom FROM generator_series ((st_xmin (_geom) / _width) :: INTEGER * _width - _width, (st_xmax (_geom) / _width) :: INTEGER * _width + _width, _width) x_series ģenerēt_sērijas ((st_ymin (_geom) / (_height * 1.5)) :: INTEGER * (_height * 1.5) - _height, (st_ymax (_geom) / (_height * 1.5)) :: INTEGER * (_height * 1.5) + _height, _height * 1.5) y_series WHERE ST_Intersects (ST_Translate (_hx_g, x_series, y_series) :: GEOMETRY (POLYGON), _geom); INSERT INTO hx_tmp SELECT ST_Translate (_hx_g, x_series, y_series) :: GEOMETRY (POLYGON) geom FROM generator_series ((st_xmin (_geom) / _width) :: INTEGER * _width - (_width * 1.5), (st_xmax (_geom) / _width) :: INTEGER * _width + _width, _width) x_series, generator_series ((st_ymin (_geom) / (_height * 1.5)) :: INTEGER * (_height * 1.5) - (_height * 1.75), (st_ymax (_geom) / (_height * 1.5) ) :: INTEGER * (_height * 1.5) + _height, _height * 1.5) y_series WHERE ST_Intersects (ST_Translate (_hx_g, x_series, y_series) :: GEOMETRY (POLYGON), _geom); GALA LOOP; AIZVĒRT _curs; CREATE INDEX sidx_hx_tmp_geom ON hx_tmp IZMANTOJOT GIST (geom); IZPILDIET "PILNU TABULU, JA PASTĀV" _tabula; IZPILDIET “CREATE TABLE” || _tabula || ' (geom GEOMETRY (POLYGON, '|| _srid ||')) '; IZPILDIET “INSERT INTO” || _tabula || ' SELECT * FROM hx_tmp GROUP BY geom '; IZPILDIET 'CREATE INDEX sidx_' || _tabula || '_geom ON' || _tabula || ' GIST (geom) LIETOŠANA ”; PILNOT TABULU, JA ESOT, hx_tmp; END $$;

Ievades parametri ir jāiestata: _curs: ģeometrijas lauka nosaukums un ievades ģeometrijas tabulas nosaukums. _table: izvades tabulas nosaukums. _srid: ievades (un izvades) ģeometriju ģeogrāfiskās projekcijas kods. _height: sešstūra režģa šūnas augstums projekcijas vienībās.

Deklarēšanas blokā ģenerēju mērogotu sešstūra ģeometriju un pēc tam veicu ieejas ģeometriju. Cilpā es ģenerēju virknes x un y apjomam, kā arī dažas katrai ievades ģeometrijai. Sešstūris tiek tulkots un ievietots pagaidu tabulā, ja abas ģeometrijas krustojas. Otrs sēriju pāris tiek ģenerēts alternatīvas nobīdes rindas. Visbeidzot, es grupēju sešstūra režģa šūnas pēc to ģeometrijas, lai noņemtu dublikātus.

Uz plašsaziņas līdzekļiem ir detalizētāks apraksts un daži foni.


Vienkārša funkcija sešstūra režģim Github Repo: https://github.com/imran-5/Postgis-Custom

Funkcija =================================================== ===================

IZVEIDOT VAI NOMAINĪT FUNKCIJU public.I_Grid_Hex (ģeometrijas ģeometrija, divkārša rādiusa rādiuss) ATGRIEZS SETOF ģeometrija AS $ BODY $ DECLARE srid INTEL: = 4326; input_srid INTEGER; x_max DECIMAL; y_max DECIMAL; x_min DECIMAL; y_min DECIMAL; x_sērijas DECIMAL; y_sērijas DECIMAL; b pludiņš: = rādiuss / 2; pludiņš: = b / 2; --sin (30) = .5 c pludiņš: = 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))', (rādiuss * 0,5 ), (rādiuss * 0,25), (rādiuss * 0,5), (rādiuss * 0,75), 0, rādiuss, (rādiuss * -0,5), (rādiuss * 0,75), (rādiuss * -0,5), (rādiuss * 0,25)) , srid); SĀKT LIETU st_srid (geom) KAD 0 TAD geom: = ST_SetSRID (geom, 4326); PALIELINĀT PAZIŅOJUMU “SRID nav atrasts.”; Cits paziņojums par pacelšanu “Atrasts SRID.”; END CASE; input_srid: = st_srid (geom); geom: = st_transform (geom, srid); x_max: = ST_XMax (geom); y_max: = ST_YMax (geom); x_min: = ST_XMin (ģeomens); y_min: = ST_YMin (geom); x_sērija: = griesti (@ (x_max - x_min) / rādiuss); y_series: = griesti (@ (y_max - y_min) / rādiuss); ATGRIEZT VAJADZĪBU Ar foo as (SELECT ST_Translate (šūna, x * (2 * a + c) + x_min, y * (2 * (c + a)) + y_min) AS hexa NO , generator_series (-1, y_series, 1) AS y, (SELECT ST_Translate (geom_grid :: geometry, b, a + c) kā šūnu savienojums SELECT geom_grid AS šūna) AS foo) atlasiet ST_CollectionExtract (ST_Collect (ST_Transform (ST_Intersection (ST_CollectionExtract ( hexa, 3), geom), input_srid)), 3) no foo, kur ST_Intersects (hexa, geom); END; $ BODY $ LANGUAGE 'plpgsql' VOLATILE;

Vaicājums par iepriekš minēto jautājumu:

Atlasiet I_Grid_Hex (st_envelope (st_collect (geom)), 1) no "us-states"

Rezultāts

Vēl viens vienkāršs vaicājums

Atlasiet I_Grid_Hex (geom, .0001) no daudzstūru 1. ierobežojuma

Rezultāts =================================================== =====================