大規模なデータ・ショー(2) - パフォーマンスの最適化

背景

    大量のデータを実行する前に9分3-12グレードベクトルは、オンライン処理さ以上千万表面データ、ビューをスライスしたように、プリレンダリングの速度と、この記事でも欠けている、いくつかの最適化の作業をオンライン表示制御データ要求時間は10秒程度です。

レディ

    ソフトウェア環境:PostGISの(3.0.0rc2 r17909)とPostgreSQL(ビジュアルC ++ビルド1914でコンパイル12.0、64ビット)、Microsoftのオープンソースのデータは、住宅のデータpublic.california20191107(10988317本のバー)の一部です。

前処理

    前処理段階は、以前に切断し、スライス3-12ベクトルです。XYZは、第1の最大と最小のデータ12は、このメッシュ範囲によって生成され取得し、データは1つにグリッドテーブルpublic.ca_xyzのいずれかを交差して得ました。

--经度转切片x
CREATE OR REPLACE FUNCTION lon2tile(lon DOUBLE PRECISION, zoom INTEGER)
  RETURNS INTEGER AS
$BODY$
    SELECT FLOOR( (lon + 180) / 360 * (1 << zoom) )::INTEGER;
$BODY$
  LANGUAGE SQL IMMUTABLE;
--纬度转切片y
CREATE OR REPLACE FUNCTION lat2tile(lat double precision, zoom integer)
  RETURNS integer AS
$BODY$
    SELECT floor( (1.0 - ln(tan(radians(lat)) + 1.0 / cos(radians(lat))) / pi()) / 2.0 * (1 << zoom) )::integer;
$BODY$
  LANGUAGE sql IMMUTABLE;
--xyz转几何
create or replace function TileBBox (z int, x int, y int, srid int = 3857)
    returns geometry
    language plpgsql immutable as
$func$
declare
    max numeric := 20037508.34;
    res numeric := (max*2)/(2^z);
    bbox geometry;
begin
    bbox := ST_MakeEnvelope(
        -max + (x * res),
        max - (y * res),
        -max + (x * res) + res,
        max - (y * res) - res,
        3857
    );
    if srid = 3857 then
        return bbox;
    else
        return ST_Transform(bbox, srid);
    end if;
end;
$func$;
--数据最大最小经纬度计算最大最小xyz
select lat2tile(ST_Y((pt).geom),12) y, lon2tile(ST_X((pt).geom),12) x  FROM (SELECT ST_DumpPoints(ST_Extent(geom))  AS pt from public.california20191107) as foo where (pt).path[2] in (1,3)
--网格表
CREATE TABLE public.ca_xyz  ( x integer,y integer,z integer,id integer NOT NULL )  WITH (OIDS = FALSE)    TABLESPACE pg_default;
--示例
insert into public.ca_xyz (id,z,x,y) select 1,3,1,3 from public.california20191107  where TileBBox(3,1,3,4326)&&geom limit 1



    次は、それが比較的簡単で、XYZステージがxyzベクトルのすべてのスライスを生成するために使用される、3-11を生成quadkey。

--示例
SELECT ST_AsMVT(vt,'polygon',4096,'geo') tile  FROM (SELECT ST_AsMVTGeom(geom,Box2D(TileBBox(3,1,3,4326)),4096,0,true) AS geo FROM public.california20191107   where TileBBox(3,1,3,4326)&&geom) AS  vt

バックグラウンドサービス

    端部を迅速にするために使用される場合、ベクトルの生成を前処理した後、スライスベクトルgolangは、完全にプログラムにロードされ得る、およびキーと値のペアを確立することが3-12データか否かを迅速に決定要求XYZステージとすることができます。データリクエストが12よりも大きい場合、我々は、データベースクエリスライス取得ベクトルを使用しています。12のキャッシュされたデータは、それがプログラムに意志とキャッシュデータベースクエリの場合、子供は12 XYZステージであるかどうかを決定し、それは無効なURLが返信されない場合は、データベースのクエリ時間を短縮します以下ではありませんについて。


おすすめ

転載: www.cnblogs.com/polong/p/11831981.html