pgAdmin과 같은 GUI 툴에서 표시되지 않는 인덱스를 포함하여 전체 인덱스를 확인하는 쿼리는 다음과 같습니다.
SELECT indexname, indexdef FROM pg_indexes WHERE schemaname = '스키마 이름' AND tablename = '테이블 이름'

공간정보시스템 / 3차원 시각화 / 딥러닝 기반 기술 연구소 @지오서비스(GEOSERVICE)
pgAdmin과 같은 GUI 툴에서 표시되지 않는 인덱스를 포함하여 전체 인덱스를 확인하는 쿼리는 다음과 같습니다.
SELECT indexname, indexdef FROM pg_indexes WHERE schemaname = '스키마 이름' AND tablename = '테이블 이름'
스키마를 생성하는 명령은 다음과 같습니다.
CREATE SCHEMA my_schema;
현재 기본으로 지정된 스키마를 확인하는 명령은 다음과 같습니다.
SHOW search_path;
원하는 스키마를 기본으로 지정하는 명령은 다음과 같습니다.
SET search_path my_schema;
d:/_t/LSMD_CONT_LDREG_11_202607.shp 경로의 SHP 파일을 temp2라는 데이터베이스에 cadastral이라는 테이블 이름으로 import 하는 명령은 다음과 같습니다.
shp2pgsql -I -s 0 -W "CP949" -g the_geom "d:/_t/LSMD_CONT_LDREG_11_202607.shp" public.cadastral | psql -h localhost -p 5432 -U postgres -d temp2
이렇게 import된 테이블을 GeoService-Xr에서 지오데이터로써 사용하기 위해 다음 쿼리 실행이 필요합니다.
ALTER TABLE public.cadastral RENAME COLUMN gid TO fid; CREATE INDEX cadastral_Index ON public.cadastral (fid);
이 글은 three.js를 이용한 효과적인 광원 효과를 위해 LightProbeGrid를 WebGPU 렌더러에서 사용할 때 빠른 적용을 위해 작성된 글입니다.
먼저 필요한 API에 대한 import 문입니다.
import { LightProbeGrid } from 'three/examples/jsm/lighting/LightProbeGrid.js';
import { LightProbeGridHelper } from 'three/examples/jsm/helpers/LightProbeGridHelper.js';
관련된 필드는 다음과 같습니다.
private probes?: LightProbeGrid; private probesHelper?: LightProbeGridHelper;
LightProbeGrid는 정적 장면에 대한 광원 효과입니다. 즉, 장면을 구워야 합니다. 아래의 코드는 장면에 대한 광원을 굽는 코드입니다.
async bake(resolution: number) {
if (this.probes) {
this.scene.remove(this.probes);
this.probes.dispose();
}
const probes = new LightProbeGrid(
5.6, 4.7, 5.6,
resolution, resolution, resolution
);
probes.position.set(0, 2.45, 0);
await probes.bake(
this.renderer, this.scene,
{
cubemapSize: 32,
sampleCount: 512,
bounces: 0,
near: 0.05,
far: 20
}
);
probes.visible = params.enabled;
this.scene.add(probes);
this.probes = probes;
// Update debug visualization
if (!this.probesHelper) {
this.probesHelper = new LightProbeGridHelper(probes);
this.probesHelper.visible = params.showProbes;
this.scene.add(this.probesHelper);
} else {
this.probesHelper.probes = probes;
this.probesHelper.update();
}
}
위의 코드에서 사용된 설정값에 대한 객체는 다음과 같습니다.
const params = {
enabled: true,
showProbes: true,
resolution: 6
};
GUI를 통해 설정값을 조정하기 위한 코드는 다음과 같습니다.
private setupGUI() {
const gui = this.renderer.inspector.createParameters('Light Probes');
gui.add(params, 'enabled').name('GI').onChange((value: boolean) => {
if(this.probes) this.probes.visible = value;
});
gui.add(params, 'resolution', 2, 12, 1).name('Resolution').onChange((value: number) => {
this.bake(value);
});
gui.add(params, 'showProbes').name('Show Probes').onChange((value: boolean) => {
if(this.probesHelper) this.probesHelper.visible = value;
});
}
SunLight는 태양광인데, 흔히 알고 있고 있는 DirectionalLight와 비슷합니다. 다만 그림자로써의 DirectionLight와 다르게 처리되는데 훨씬 큰 범위의 장면에 대한 그림자를 Cascade 방식으로 처리하여 표현합니다. SunLight을 적용하기 위한 코드를 순서대로 정리하면 다음과 같습니다.
먼저 필요한 클래스를 import 합니다.
import { SunLight } from 'three/addons/lights/SunLight.js';
import { SunLightNode } from 'three/addons/lights/SunLightNode.js';
SunLight는 그림자 표현을 위해 SunLightNode라는 TSL 노드를 사용합니다. 이 TSL 노드는 기본 노드가 아닌 확장 노드이므로 등록이 필요합니다. 다음처럼 등록할 수 있습니다.
this.renderer.library.addLight(SunLightNode, SunLight);
실제 SunLight를 생성하는 코드는 다음과 같습니다.
private sunLight!: SunLight;
private setupSunLight() {
this.renderer.library.addLight(SunLightNode, SunLight);
const sunLight = new SunLight();
sunLight.position.setFromSphericalCoords(1, THREE.MathUtils.degToRad(90 - params.elevation), THREE.MathUtils.degToRad(params.azimuth));
sunLight.castShadow = true;
sunLight.shadow.camera.far = params.far; // maximum shadow distance
sunLight.shadow.mapSize.setScalar(params.resolution);
sunLight.shadow.normalBias = 0.05;
this.scene.add(sunLight);
this.sunLight = sunLight;
}
위의 코드를 보면 설정을 위해 param 객체를 사용하고 있는데, 해당 객체는 다음 예시와 같습니다.
const params = {
showCascades: false,
far: 1000,
resolution: 2048,
azimuth: 135,
elevation: 10
};
이외에 기본적으로 그림자를 위한 렌더러와 매시에 대한 코드도 추가해야 합니다. 즉..
renderer.shadowMap.enabled = true; ... mesh.castShadow = true; mesh.receivedShadow = true;