대규모 데이터 표시 (2 개) - 성능 최적화

배경

    대용량 데이터를 수행하기 전에 보여, 온라인 사전 렌더링 속도도 구분 3-12 등급의 벡터 이상 천만 표면 처리 된 데이터 슬라이스 정도로,이 문서에서, 몇 가지 최적화 작업을 결여, 온라인보기 제어 데이터 요청 시간은 10 초에 관한 것이다.

준비된

    소프트웨어 환경 (비주얼 C ++ 빌드 1914 64 비트에 의해 컴파일 12.0) PostGIS와 (3.0.0rc2 r17909)과 PostgreSQL는, 마이크로 소프트의 오픈 소스 데이터는 주택 데이터 public.california20191107 (10,988,317 바)의 일부입니다.

전처리

    전처리 단계 이전에 잘라 슬라이스 3-12 벡터이다. XYZ는 먼저 최대 및 최소 데이터 (12)이 메쉬 범위에 의해 생성 된 취득하고, 그 데이터를 하나의 그리드 테이블 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 스테이지 3-11, 슬라이스를 생성하기 위해 사용되는 XYZ 벡터의 모든 쿼드 키를 생성한다.

--示例
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을 얻기 위해 사용 벡터 생성을, 전처리 및 설정 한 후 끝 부분은 신속하게 결정 요청 XYZ 단계 3-12이 있는지 데이터가 될 수 있습니다. 데이터 요청이 12보다 클 때, 우리는 데이터베이스 쿼리 슬라이스 취득 벡터를 사용합니다. 잘못된 URL 데이터베이스 쿼리 시간을 단축 반환되지 않은 경우는 의지와 프로그램에 캐시 데이터베이스 쿼리 인 경우 아이가, 12 XYZ 단계인지 여부를 결정합니다 (12 개) 캐시 된 데이터보다 크지는 없기 때문이다.


추천

출처www.cnblogs.com/polong/p/11831981.html