同步操作将从 DXnima/WebGIStest 强制同步,此操作会覆盖自 Fork 仓库以来所做的任何修改,且无法恢复!!!
确定后同步将在后台操作,完成时将刷新页面,请耐心等待。
create or replace function TileBBox (z int, x int, y int, srid int = 3857)returns geometrylanguage plpgsql immutable as$func$declaremax numeric := 20037508.34;res numeric := (max*2)/(2^z);bbox geometry;beginbbox := ST_MakeEnvelope(-max + (x * res),max - (y * res),-max + (x * res) + res,max - (y * res) - res,3857);if srid = 3857 thenreturn bbox;elsereturn ST_Transform(bbox, srid);end if;end;$func$;-- 获取Geometry的边界minX minY maxX maxYDROP FUNCTION IF EXISTS MVT_BBoxXY;CREATE OR REPLACE FUNCTION MVT_BBoxXY(z int, g geometry, srid int = 3857)RETURNS int[]AS$BODY$DECLAREmax numeric := 20037508.34;res numeric := 2^(z-1);poi1 geometry; poi2 geometry;minx numeric; miny numeric;maxx numeric; maxy numeric;BEGINIF srid != 3857 THENg := ST_Transform(g, 3857);END IF;poi1 := ST_Point(ST_XMin(g), ST_YMin(g));poi2 := ST_Point(ST_XMax(g), ST_YMax(g));minx = (1 + ST_X(poi1)/max)*res;maxy = (1 - ST_Y(poi1)/max)*res;maxx = (1 + ST_X(poi2)/max)*res;miny = (1 - ST_Y(poi2)/max)*res;IF minx < 0 THEN minx = 0; END IF;IF miny < 0 THEN miny = 0; END IF;IF maxx < 0 THEN maxx = 0; END IF;IF maxy < 0 THEN maxy = 0; END IF;RETURN array[trunc(minx,0),trunc(miny,0),trunc(maxx,0),trunc(maxy,0)];END$BODY$LANGUAGE plpgsql IMMUTABLE;-- 将切片存入表mvt_test中DROP TABLE IF EXISTS mvt_test;CREATE TABLE mvt_test(z integer not null,x integer not null,y integer not null,mvt bytea,--bbox geometry(Polygon,3857),CONSTRAINT mvt_test_z_x_y_pk PRIMARY KEY (z, x, y));CREATE index if NOT EXISTS mvt_test_z_x_y_pk ON mvt_test (z, x, y);-- 创建需要矢量切片的规则-- 本文是将layer_university、capital、province三个表的数据进行矢量切片DROP FUNCTION IF EXISTS MVT_Rule;CREATE FUNCTION MVT_Rule(z integer, x integer, y integer) RETURNS bytea AS$$DECLAREbbox geometry := TileBBox( z,x,y );BEGINRETURN (SELECT( SELECT ST_AsMVT ( P, 'university', 4096, 'geom' ) AS "mvt" FROM( SELECT ST_AsMVTGeom ( ST_AsText ( geom ), bbox, 4096, 64, TRUE ) geom,name FROM layer_university WHERE geom && bbox) AS P ) ||( SELECT ST_AsMVT ( P, 'capital', 4096, 'geom' ) AS "mvt" FROM( SELECT ST_AsMVTGeom ( ST_AsText ( geom ), bbox, 4096, 64, TRUE ) geom,name FROM capital WHERE geom && bbox) AS P ) ||( SELECT ST_AsMVT ( P, 'china', 4096, 'geom' ) AS "mvt" FROM( SELECT ST_AsMVTGeom ( ST_AsText ( geom ), bbox, 4096, 64, TRUE ) geom,province,type FROM province WHERE geom && bbox) AS P )AS mvt);END;$$LANGUAGE'plpgsql';-- 矢量切片存储到表DROP FUNCTION IF EXISTS MVT_Title;CREATE FUNCTION MVT_Title (zoom int,x1 int,y1 int)RETURNS byteaAS$$declaretitle bytea;BEGINIF EXISTS(SELECT * FROM mvt_test WHERE x=x1 AND y=y1 AND z = zoom) THENtitle = (SELECT mvt FROM mvt_test WHERE x=x1 AND y=y1 AND z=zoom);ELSEtitle = (SELECT MVT_Rule(zoom,x1,y1));INSERT INTO mvt_test (z,x,y,mvt) VALUES (zoom,x1,y1,title);END IF;RETURN title;END;$$LANGUAGE'plpgsql';-- 缓存瓦片mvt_testDROP FUNCTION IF EXISTS MVT_Test_Cache;CREATE OR REPLACE FUNCTION MVT_Test_Cache(start_zoom int, end_zoom int, g geometry, srid int = 3857)RETURNS VOIDAS$BODY$DECLAREbbox numeric[];title bytea;BEGINFOR cache_z in start_zoom..end_zoom loopbbox := MVT_BBoxXY(cache_z, g, srid);FOR cache_x in bbox[1]..bbox[3] loopFOR cache_y in bbox[2]..bbox[4] looptitle = (SELECT MVT_Title(cache_z, cache_x, cache_y));IF EXISTS(SELECT * FROM mvt_test WHERE x = cache_x AND y = cache_y AND z = cache_z) THENUPDATE mvt_test SET mvt = title WHERE x = cache_x AND y = cache_y AND z = cache_z;ELSEINSERT INTO mvt_test (z, x, y, mvt) VALUES (cache_z, cache_x, cache_y, title);END IF;END loop;END loop;END loop;END$BODY$LANGUAGE plpgsql VOLATILE;-- 测试瓦片-- MVT_Title(zoom,x,y)-- SELECT MVT_Title(0,0,0);-- SELECT MVT_Title(1,1,0);-- 测试缓存-- 缓存等级zoom:0-2-- 缓存范围bbox:[73.5011421000001,6.32342077500007,135.08851148,53.5609010500001]-- SELECT MVT_Test_Cache(0,6, ST_MakeEnvelope(73.5011421000001,6.32342077500007,135.08851148,53.5609010500001, 4326))
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。