lt.geologyidea.com
Daugiau

Sukurkite šešiakampius tinklelius per sluoksnį

Sukurkite šešiakampius tinklelius per sluoksnį


We are searching data for your request:

Forums and discussions:
Manuals and reference books:
Data from registers:
Wait the end of the search in all databases.
Upon completion, a link will appear to access the found materials.


Turiu formos failą, kuriame yra JAV kontūrai, ir aš noriu sukurti šešiakampes tinklelius, kurie būtų virš šio sluoksnio.

Bandžiau naudoti šią funkciją, kuri sukurs šešiakampius virš sluoksnio. Sukūriau tuščią lentelę ir tada pridėjau ageomstulpelį ir tada vykdė pasirinktinę funkciją, kaip parodyta.

SUKURTI LENTEL IF, JEI NĖRA hex_grid (paslėptas serijinis NĖRA VISO PAGRINDINIO RAKTO) SELECT AddGeometryColumn ('hex_grid', 'geom', 0, 'POLYGON', 2); - šešioliktainio tinklelio SELECT genhexagons kūrimas (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) IŠ JAV))));

Tačiau patekau į šią klaidą, kad nesu tikras, kaip elgtis, esu tikra, kad ji susijusi su šešiakampių kūrimu, kai ji viršija JAV kontūro ribą. Žiūrėkite žemiau:


Peržiūrėdami įrašą, su kuriuo susiejote,geneksagonaifunkcijai reikalingi 5 plūduriuojantys parametrai, langelio plotis ir (x, y) koordinatės SW ir ŠR kampams. Pravažiuoji plūdele ir geometrija.

SUKURTI ARBA PAKEISTI FUNKCIJĄ genhexagons (plūdės plūdės, xmin plūdės, ymin plūdės, xmax plūdės, ymax plūdės)

Galbūt galėsite naudotisST_xmin (ST_Extent (your_geom))(ir ST_ymin, ST_ymax ir kt.), jei nenorite sunkiai koduoti koordinačių reikšmių savo funkcijos iškvietime.

Aš išbandžiau kodą tame įraše pažodžiui, ir jis veikia kaip reklamuojamas - sukuria šešiakampę tinklelį virš Kenijos.

REDAGUOTI

Gali būti paprasčiau, jei ribas nurodysite rankiniu būdu. Spėju, kad JAV yra apytiksliai (-124,8,25,10) ir (-66.9,49,6)

taip skambina

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

suteikia 1 laipsnio tinklelį per gretimą JAV ...

Tačiau atrodo, kad šis kodas sugeneruos per daug plytelių eilučių ... Manau, kad jis apima ir didžiąją Kanados dalį: /

Radau, kad sugebėjau įklijuoti rezultatus į surišimo dėžutę numetusi plyteles, kurios nepersidengė ribojančios dėžutės, ir užrašiau jas į naują lentelę, vadinamąnukirpta.

sukurti lentelę, nukirptą kaip (pasirinkite * iš hex_grid, kur ST_Intersects (st_setSRID (the_geom, 4326), st_setSRID (st_envelope ('POLYGON ((- 124,8 25,10, -124,8 49,6, -6,6,9 49,6, -66.9 25.10, -124.8 25.10)) ": : geometrija), 4326)));

Įtraukite tai į QGIS ...


Parašiau „PostGIS“ funkciją, kad generuočiau šešiakampes tinklelius ant kito sluoksnio.

ATSISAKYKITE _curs žymeklį PASIRINKTI geom3857 NUO nrw; _table TEXT: = 'nrw_hx_10k'; _srid INTEGER: = 3857; _aukštis NUMERIS: = 10000; _plotis NUMERIS: = _aukštis * 0,866; _geom GEOMETRIJA; _hx TEKSTAS: = 'POLYGON ((' || 0 || "|| 0 || ',' || (_ plotis * 0,5) ||" || (_ aukštis * 0,25) || ',' || (_ plotis * 0,5) || "|| (_aukštis * 0,75) || ',' || 0 ||" || _aukštis || ',' || (-1 * (_plotis * 0,5)) || "|| (_aukštis * 0,75) || ',' || (-1 * (_ plotis * 0,5)) || "|| (_ aukštis * 0,25) || ',' || 0 ||" || 0 || ')) " ; _hx_g GEOMETRY: = ST_SetSRID (_hx :: GEOMETRY, _srid); PRADĖTI SUKURTI TEMPO LENTEL h hx_tmp (geom GEOMETRY (POLYGON)); OPEN _curs; LOOP FETCH _curs INTO _geom; EXIT INSTATE 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, generuoti_series ((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_Interects (ST_Translate (_hx_g, x_series, y_series) :: GEOMETRY (POLYGON), _geom); INSERT INTO hx_tmp PASIRINKITE 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 * (_aukštis * 1,5) + _aukštis, _aukštis * 1,5) y_series WHERE ST_Intersects (ST_Translate (_hx_g, x_series, y_series) :: GEOMETRY (POLYGON), _geom); END LOOP; UŽDARYTI _keiksmai; CREATE INDEX sidx_hx_tmp_geom ON hx_tmp NAUDOJANT GIST (geom); VYKDYKITE „LAŠO LENTEL IF, JEI BŪTŲ“ || _ lentelė; VYKDYK „SUKURTI LENTELLE“ _table || ' (geom GEOMETRIJA (POLIGONAS, '|| _srid ||')) "; VYKDYKITE „INSERT INTO“ || _table || ' PASIRINKTI * IŠ hx_tmp GROUP BY geom '; VYKDYKITE „CREATE INDEX sidx_“ || _table || '_geom ON' || _table || ' NAUDOJANT GIST (geom) “; NUŠKĖTI LENTEL IF, JEI YRA hx_tmp; PABAIGA $$;

Įvesties parametrai turi būti nustatyti: _curs: geometrijos lauko pavadinimas ir įvesties geometrijos lentelės pavadinimas. _table: išvesties lentelės pavadinimas. _srid: įvesties (ir išvesties) geometrijų geografinis projekcijos kodas. _ aukštis: šešiakampio tinklelio elemento aukštis projekcijos vienetuose.

Deklaravimo bloke sugeneruoju pakeistą šešiakampio geometriją ir tada peržiūriu įvesties geometrijas. Cikle aš generuoju x ir y laipsnių serijas, taip pat keletą kiekvienos įvesties geometrijos. Šešiakampis išverčiamas ir įterpiamas į laikiną lentelę, jei dvi geometrijos susikerta. Antroji serijų pora yra sukurta alternatyvių kompensuotų eilučių. Galiausiai aš sugrupuoju šešiakampio tinklelio ląsteles pagal jų geometriją, kad pašalinčiau dublikatus.

Terpėje yra išsamesnis aprašymas ir tam tikras pagrindas.


Paprasta šešiakampio tinklo „Github Repo“ funkcija: https://github.com/imran-5/Postgis-Custom

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

KURTI ARBA PAKEISTI FUNKCIJĄ public.I_Grid_Hex (geom geometrija, dvigubas tikslumo spindulys) GRĄŽINA NUSTATYTI geometriją AS $ BODY $ DECLARE srid INTEGER: = 4326; input_srid INTEGER; x_max DEKIMALIS; y_max DEKALIS; x_min DEKIMALIS; y_min DEKIMALIS; x_series DEKIMAL; y_series DECIMAL; b plūdė: = spindulys / 2; plūdė: = b / 2; --sin (30) = .5 c plūdė: = 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)) ", (spindulys * 0,5 ), (spindulys * 0,25), (spindulys * 0,5), (spindulys * 0,75), 0, spindulys, (spindulys * -0,5), (spindulys * 0,75), (spindulys * -0,5), (spindulys * 0,25)) , srid); PRADŽIOS ATVEJAS st_srid (geom) KADA 0 TADA geom: = ST_SetSRID (geom, 4326); PAKELTI PRANEŠIMĄ 'SRID nerastas.'; KITAS KELIMO PRANEŠIMAS „Rasta„ SRID ““. Pabaigos byla; input_srid: = st_srid (geom); geom: = st_transformuoti (geom, srid); x_max: = ST_XMax (geom); y_max: = ST_YMax (geom); x_min: = ST_XMin (geom); y_min: = ST_YMin (geom); x_series: = lubos (@ (x_max - x_min) / spindulys); y_series: = lubos (@ (y_max - y_min) / spindulys); GRĮŽTI UŽKLAUSĄ Su foo as (SELECT ST_Translate (langelis, x * (2 * a + c) + x_min, y * (2 * (c + a)) + y_min) AS hexa IŠ generavimo_serijos (0, x_series, 1) AS x , generator_series (-1, y_series, 1) AS y, (PASIRINKITE ST_Translate (geom_grid :: geometrija, b, a + c) kaip ląstelių sąjunga SELECT geom_grid AS ląstelė) AS foo) pasirinkite ST_CollectionExtract (ST_Collect (ST_Transform (ST_Intersection (ST_CollectionExtract ( hexa, 3), geom), input_srid)), 3) iš foo, kur ST_Interects (hexa, geom); GALAS; $ BODY $ LANGUAGE 'plpgsql' PASTAVI;

Užklausa aukščiau pateiktam klausimui:

PASIRINKITE I_Grid_Hex (st_envelope (st_collect (geom)), 1) iš „us-states“

Rezultatas

Dar viena paprasta užklausa

Pasirinkite I_Grid_Hex (geom, .0001) iš 1 poligonų ribos

Rezultatas =================================================== =====================


Žiūrėti video įrašą: Tinklelis rėmelis -