postgis生成網(wǎng)格

用的比較多的網(wǎng)格有六邊形網(wǎng)格零远、正方形網(wǎng)格炊汤、長(zhǎng)方形網(wǎng)格正驻。網(wǎng)格的生成方法有很多種,在這里做一個(gè)分類(lèi)婿崭,按照實(shí)現(xiàn)方式分為:

  • 前端實(shí)現(xiàn)
  • 后端實(shí)現(xiàn)(java拨拓、python肴颊、C#)
  • 數(shù)據(jù)庫(kù)層實(shí)現(xiàn)
前端實(shí)現(xiàn)的方式可以使用turf進(jìn)行網(wǎng)格生成rurf鏈接
image.png
后端實(shí)現(xiàn)方式目前只嘗試過(guò)一種:使用geotools vector grid包 link
ReferencedEnvelope gridBounds =
                new ReferencedEnvelope(110.0, 150.0, -45.0, -5.0, DefaultGeographicCRS.WGS84);

        SimpleFeatureSource grid = Grids.createSquareGrid(gridBounds, 10.0);
image.png
最后一種就是借助postgis氓栈,通過(guò)數(shù)據(jù)庫(kù)生成
首先是生成六邊形網(wǎng)格 link
----------------------------------------------------------------------------------
-- INPUT
--
--   areakm2     : area of each hexagon in square km.
--                   - note: hexagon size can be off slightly due to coordinate rounding in the calcs.
--
--   xmin, ymin  : min coords of the grid extents.
--
--   xmax, ymax  : max coords of the grid extents.
--
--   inputsrid   : the coordinate system (SRID) of the input min/max coords.
--
--   workingsrid : the SRID used to process the polygons.
--                   - SRID must be a projected coord sys (i.e. in metres) as the calcs require ints. Degrees are out.
--                   - should be an equal area SRID such as Albers or Lambert Azimuthal (e.g. Australia = 3577, US = 2163).
--                   - using Mercator will NOT return hexagons of equal area due to its distortions (don't try it in Greenland).
--
--   ouputsrid   : the SRID of the output polygons.
--
-- NOTES
--
--   Hexagon height & width are rounded up & down to the nearest metre, hence the area may be off slightly.
--   This is due to the Postgres generate_series function which doesn't support floats.
--
--   Why are my areas wrong in QGIS, MapInfo, etc...?
--      Let's assume you created WGS84 lat/long hexagons, you may have noticed the areas differ by almost half in a desktop GIS
--      like QGIS or MapInfo Pro. This is due to the way those tools display geographic coordinate systems like WGS84 lat/long.
--      Running the following query in PostGIS will confirm the min & max sizes of your hexagons (in km2):
--
--         SELECT (SELECT (MIN(ST_Area(geom::geography, FALSE)) / 1000000.0)::numeric(10,3) From my_hex_grid) AS minarea,
--               (SELECT (MAX(ST_Area(geom::geography, FALSE)) / 1000000.0)::numeric(10,3) From my_hex_grid) AS maxarea;
--
--------------------------------------------------------------------------------------------------------------------------------

--DROP FUNCTION IF EXISTS hex_grid(areakm2 FLOAT, xmin FLOAT, ymin FLOAT, xmax FLOAT, ymax FLOAT, inputsrid INTEGER,
--  workingsrid INTEGER, ouputsrid INTEGER);
CREATE OR REPLACE FUNCTION hex_grid(areakm2 FLOAT, xmin FLOAT, ymin FLOAT, xmax FLOAT, ymax FLOAT, inputsrid INTEGER,
  workingsrid INTEGER, ouputsrid INTEGER)
  RETURNS SETOF geometry AS
$BODY$

DECLARE
  minpnt GEOMETRY;
  maxpnt GEOMETRY;
  x1 INTEGER;
  y1 INTEGER;
  x2 INTEGER;
  y2 INTEGER;
  aream2 FLOAT;
  qtrwidthfloat FLOAT;
  qtrwidth INTEGER;
  halfheight INTEGER;

BEGIN

  -- Convert input coords to points in the working SRID
  minpnt = ST_Transform(ST_SetSRID(ST_MakePoint(xmin, ymin), inputsrid), workingsrid);
  maxpnt = ST_Transform(ST_SetSRID(ST_MakePoint(xmax, ymax), inputsrid), workingsrid);

  -- Get grid extents in working SRID coords
  x1 = ST_X(minpnt)::INTEGER;
  y1 = ST_Y(minpnt)::INTEGER;
  x2 = ST_X(maxpnt)::INTEGER;
  y2 = ST_Y(maxpnt)::INTEGER;

  -- Get height and width of hexagon - FLOOR and CEILING are used to get the hexagon size closer to the requested input area
  aream2 := areakm2 * 1000000.0;
  qtrwidthfloat := sqrt(aream2/(sqrt(3.0) * (3.0/2.0))) / 2.0;
  
  qtrwidth := FLOOR(qtrwidthfloat);
  halfheight := CEILING(qtrwidthfloat * sqrt(3.0));

  -- Return the hexagons - done in pairs, with one offset from the other
  RETURN QUERY (
    SELECT ST_Transform(ST_SetSRID(ST_Translate(geom, x_series::FLOAT, y_series::FLOAT), workingsrid), ouputsrid) AS geom
      FROM generate_series(x1, x2, (qtrwidth * 6)) AS x_series,
           generate_series(y1, y2, (halfheight * 2)) AS y_series,
           (
             SELECT ST_GeomFromText(
               format('POLYGON((0 0, %s %s, %s %s, %s %s, %s %s, %s %s, 0 0))',
                 qtrwidth, halfheight,
                 qtrwidth * 3, halfheight,
                 qtrwidth * 4, 0,
                 qtrwidth * 3, halfheight * -1,
                 qtrwidth, halfheight * -1
               )
             ) AS geom
             UNION
             SELECT ST_Translate(
               ST_GeomFromText(
                 format('POLYGON((0 0, %s %s, %s %s, %s %s, %s %s, %s %s, 0 0))',
                   qtrwidth, halfheight,
                   qtrwidth * 3, halfheight,
                   qtrwidth * 4, 0,
                   qtrwidth * 3, halfheight * -1,
                   qtrwidth, halfheight * -1
                 )
               )
             , qtrwidth * 3, halfheight) as geom
           ) AS two_hex);

END$BODY$
  LANGUAGE plpgsql VOLATILE
  COST 100;

CREATE TABLE us_hex_grid (
  gid SERIAL NOT NULL PRIMARY KEY,
  geom GEOMETRY('POLYGON', 4326, 2) NOT NULL
)
WITH (OIDS=FALSE);


INSERT INTO us_hex_grid (geom)
SELECT hex_grid(5, 119.95, 30.03, 120.43, 30.43, 4326, 3857, 4326);
image.png
生成正方形網(wǎng)格 link
raster ST_MakeEmptyRaster(raster rast);

raster ST_MakeEmptyRaster(integer width, integer height, float8 upperleftx, float8 upperlefty, float8 scalex, float8 scaley, float8 skewx, float8 skewy, integer srid=unknown);

raster ST_MakeEmptyRaster(integer width, integer height, float8 upperleftx, float8 upperlefty, float8 pixelsize);

--width  寬上多少個(gè)格子
-- height 高上多少格子
-- upperlefty 左上角坐標(biāo)y
-- upperleftx 坐上角坐標(biāo)x
-- pixelsize 距離
-- scalex x方向距離
-- scaley y方向距離
-- skewx x方向上旋轉(zhuǎn)
-- skewy y方向上旋轉(zhuǎn)
SELECT
    (
        ST_PixelAsPolygons (
            ST_AddBand (
                ST_SetSRID(ST_MakeEmptyRaster( 50, 30, 119.96, 30.40, 0.01),4326),
                '8BSI' :: TEXT,
                1,
                0
            ),
            1,
            FALSE
        )).geom
        
        
image.png
生成矩形
-- scalex x方向距離
-- scaley y方向距離 
-- scalex scaley帶正負(fù)號(hào),和象限一致
SELECT
    (
        ST_PixelAsPolygons (
            ST_AddBand (
                ST_MakeEmptyRaster( 50, 50, 119.96, 30.40, 0.01, 0.01, 0, 0, 4326),
                '8BSI' :: TEXT,
                1,
                0
            ),
            1,
            FALSE
        )).geom
image.png
SELECT
    (
        ST_PixelAsPolygons (
            ST_AddBand (
                ST_MakeEmptyRaster( 50, 50, 119.96, 30.40, 0.01, -0.02, 0, 0, 4326),
                '8BSI' :: TEXT,
                1,
                0
            ),
            1,
            FALSE
        )).geom
image.png
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末婿着,一起剝皮案震驚了整個(gè)濱河市授瘦,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌竟宋,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,214評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異瞬矩,居然都是意外死亡攒磨,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,307評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門(mén)蜗字,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)打肝,“玉大人,你說(shuō)我怎么就攤上這事挪捕〈炙螅” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 152,543評(píng)論 0 341
  • 文/不壞的土叔 我叫張陵级零,是天一觀的道長(zhǎng)断医。 經(jīng)常有香客問(wèn)我,道長(zhǎng)奏纪,這世上最難降的妖魔是什么鉴嗤? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 55,221評(píng)論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮序调,結(jié)果婚禮上醉锅,老公的妹妹穿的比我還像新娘。我一直安慰自己炕置,他們只是感情好荣挨,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,224評(píng)論 5 371
  • 文/花漫 我一把揭開(kāi)白布男韧。 她就那樣靜靜地躺著,像睡著了一般默垄。 火紅的嫁衣襯著肌膚如雪此虑。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 49,007評(píng)論 1 284
  • 那天口锭,我揣著相機(jī)與錄音朦前,去河邊找鬼。 笑死鹃操,一個(gè)胖子當(dāng)著我的面吹牛韭寸,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播荆隘,決...
    沈念sama閱讀 38,313評(píng)論 3 399
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼恩伺,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了椰拒?” 一聲冷哼從身側(cè)響起晶渠,我...
    開(kāi)封第一講書(shū)人閱讀 36,956評(píng)論 0 259
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎燃观,沒(méi)想到半個(gè)月后褒脯,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,441評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡缆毁,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,925評(píng)論 2 323
  • 正文 我和宋清朗相戀三年番川,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片脊框。...
    茶點(diǎn)故事閱讀 38,018評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡颁督,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出缚陷,到底是詐尸還是另有隱情适篙,我是刑警寧澤,帶...
    沈念sama閱讀 33,685評(píng)論 4 322
  • 正文 年R本政府宣布箫爷,位于F島的核電站嚷节,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏虎锚。R本人自食惡果不足惜硫痰,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,234評(píng)論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望窜护。 院中可真熱鬧效斑,春花似錦、人聲如沸柱徙。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,240評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至敌完,卻和暖如春储耐,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背滨溉。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,464評(píng)論 1 261
  • 我被黑心中介騙來(lái)泰國(guó)打工什湘, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人晦攒。 一個(gè)月前我還...
    沈念sama閱讀 45,467評(píng)論 2 352
  • 正文 我出身青樓闽撤,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親脯颜。 傳聞我的和親對(duì)象是個(gè)殘疾皇子哟旗,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,762評(píng)論 2 345

推薦閱讀更多精彩內(nèi)容

  • 網(wǎng)格線(Grid Line) 構(gòu)成網(wǎng)格結(jié)構(gòu)的分界線。它們既可以是垂直的(“列網(wǎng)格線(column grid lin...
    晚溪呀閱讀 1,141評(píng)論 0 0
  • CSS Grid(網(wǎng)格) 布局(又稱(chēng)為 “Grid(網(wǎng)格)” )伐脖,是一個(gè)二維的基于網(wǎng)格的布局系統(tǒng)它的目標(biāo)是完全改變...
    諾CIUM閱讀 1,305評(píng)論 0 3
  • 她似乎從來(lái)都不怕冷热幔,愛(ài)穿裙子,不論春夏秋冬讼庇。 她不愛(ài)笑,穿裙子也是亭亭玉立近尚,如茶花一樣的鮮嫩也像...
    介眉閱讀 393評(píng)論 4 3
  • 一條寬闊的大河在這片綠色灌木叢裹繞的岬角處打了個(gè)轉(zhuǎn)兒蠕啄,滾滾東流而去。此時(shí)的我戈锻,正站在這岬角的一塊堤石上歼跟,遠(yuǎn)望著大河...
    那棵老橡樹(shù)閱讀 410評(píng)論 0 2
  • 晨間與傍晚時(shí)分,總是涼風(fēng)習(xí)習(xí)格遭,而中午卻艷陽(yáng)高照哈街,可以多給孩子帶件外套,晚上放學(xué)讓孩子們穿上拒迅。 周一...
    劉瑤_de90閱讀 326評(píng)論 0 5