exp 함수

exp 함수는 자연상수에 대한 제곱입니다. 몇번 제곱할 것인지는 exp 함수의 인자로 결정됩니다. 참고로 자연상수의 값은 2.718281~ 입니다. exp 함수에 대한 의미있는 경우는 다양할테지만 여기에 한가지 예를 그래프로 나타내면 아래와 같습니다.

지오서비스웹(GEOSERVICE-WEB) 기능 별 메뉴얼

주소를 좌표로 변환하는 지오코딩

(참고) 엑셀을 CSV로 변환할 필요 없이 바로 이용할 수 있습니다. 더 이상 번거롭게 CSV로 변환할 필요가 없습니다. 이는 다른 모든 기능도 동일하게 적용됩니다.

영상보다 이미지와 글이 편한 분들은 아래를 참조해 주세요.

주소 데이터를 지도에 표시하고 싶다구요! (지오코딩)

지오코딩 결과를 QGIS의 배경지도와 중첩 예시

지오코딩 결과를 QGIS의 TMS for Korea 배경지도에 맵핑

좌표를 주소로 변환하는 리버스 지오코딩

SHP 데이터를 CSV로 변환(지오코딩 결과를 텍스트 파일로 저장)

SHP 파일로부터 레이어 구성

지점 간 거리 분석

헥사곤 도형 생성

포인트 카운트 분석

색상단계 구분도 분석

밀도 분석

히트맵 분석

파이차트 맵 분석

배경지도 변경

GEOSERVICE-WEB의 배경지도 변경

폴리라인을 포인트로 변경

라인을 포인트로 변경 (Line To Point)

새로운 공간 데이터 생성

공간/속성 데이터 구축(편집)

공간/속성 데이터 구축(편집)

지오서비스웹 공간/속성 데이터 편집

정밀한 지오코딩 결과 만들기 (편집 기능 활용)

내가 원하는 지역에 대한 최신 행정구역 데이터(SHP 파일) 추출

티센 폴리곤 생성

내가 원하는 지역에 대한 최신 행정구역을 SVG 파일로 생성하기

행정구역도 SVG 생성 및 파워포인트에서 활용하기

FingerEyes-Xr, 전체 데이터 로딩하지 않고 필요한 데이터만 그때 그때 로딩해 사용하기

inputLayer는 SHP 파일을 통해 구성된 레이어임.

const cntRows = inputLayer.totalRowsCount();

for (let fid = 0; fid < cntRows; fid++) {
    const sRow = inputLayer.getShapeByFID(fid)
    const attributeValues = inputLayer.getAttributeByFID(fid)

    const pt = sRow.shapeData().representativePoint();
    const tsd = new Xr.data.TextShapeData({ x: pt.x, y: pt.y, text: attributeValues[labelFieldIndex] });
    const tgr = new Xr.data.TextGraphicRow(cntRows + fid, tsd);
    const fontSymbol = tgr.fontSymbol();

    fontSymbol.color(this.#labelSymbol.fontColor);
    fontSymbol.size(this.#labelSymbol.fontSize);
    fontSymbol.strokeColor(this.#labelSymbol.fontStrokeColor);
    fontSymbol.weight(this.#labelSymbol.bBold ? "600" : undefined);
    fontSymbol.strokeWidth(this.#labelSymbol.fontStrokeWidth);

    gl.rowSet().add(tgr);
}

4번과 5번 코드가 관련된 코드인데, attributeValues는 배열로서 해당 fid에 대한 값이 그 타입에 상관없이 문자열로 저장되어 있다.

GLSL 코드

다음과 같은 결과를 프레그먼트 쉐이더로 작성한다면 … ? 즉, 화면의 반을 가르고 가른 영역의 중심을 원점으로 삼으며 원점을 기준으로 gl_FragCoord 지점에 대한 좌표(x,y)에 대한 각도(atan(y,x))에 대해 왼쪽 영역은 cos 값으로, 오른쪽 영역은 sin 값으로 채움.

방식은 여러가지겠지만 여기서는 2가지 구현 코드를 언급함. 첫번째는 제시된 문제를 그대로 해석해 풀이한 것.

uniform vec2 iResolution;

void main2() {
    vec2 uv = gl_FragCoord.xy / iResolution;
  
    vec2 origin = uv.x < 0.5 ? vec2(0.25, 0.5) : vec2(0.75, 0.5);
    vec2 v = uv - origin;
  
    float angle = atan(v.y, v.x);
    float c = cos(angle);
    float s = sin(angle);
    
    vec3 color = uv.x < 0.5 ? vec3(c) : vec3(s);
    
    gl_FragColor = vec4(color, 1.0);
}

두번째는 삼각함수의 원리를 이해하고 상황에 맞게 최적화해 구현한 것.

uniform vec2 iResolution;

void main() {
  vec2 uv = gl_FragCoord.xy / iResolution.xy;

  vec2 normal = uv.x > .5 ? 
    normalize(uv - vec2(0.75, 0.5)) : 
    normalize(uv - vec2(0.25, 0.5));
  
  float t = uv.x > .5 ?  normal.y : normal.x;

  gl_FragColor = vec4(vec3(t), 1.0);
}

Javascript의 스프레드 연산자(spread operator)를 적용해 보자

스프레드 연산자를 적용할 수 있는 클래스 AA가 있다고 할때 활용 예는 다음과 같다.

const aa = new AA();

aa.addItem(1);
aa.addItem(2);
aa.addItem(3);

console.log(...aa)

콘솔에 1 2 3이 찍힌다. 바로 … 연산자가 스프레드 연산자이다. 이처럼 스프레드 연산자를 적용할 수 있도록 하기 위해서 AA 클래스는 다음처럼 작성되어야 한다.

class AA {
  constructor() {
    this.items = []; // 이터러블한 내용을 저장할 배열
  }

  // 아이템을 추가하는 메소드
  addItem(item) {
    this.items.push(item);
  }

  // Symbol.iterator를 구현하여 이터러블하게 만듭니다.
  [Symbol.iterator]() {
    let index = 0;
    let data  = this.items;
    return {
      next: () => {
        if (index < data.length) {
          return { value: data[index++], done: false };
        } else {
          return { done: true };
        }
      }
    };
  }
}

참고로 스프레드 연산자는 매우 유용한 문법으로, 배열이나 이터러블 객체의 요소를 개별 요소로 확장하거나, 함수 호출 시 인수로 사용하거나, 객체 리터럴에서 속성을 복사할 때 사용된다. 예를들어 아래의 코드의 예시가 있다.

사례1

let arr1 = [1, 2, 3];
let arr2 = [...arr1, 4, 5]; // [1, 2, 3, 4, 5]

사례2

function sum(x, y, z) {
  return x + y + z;
}

let numbers = [1, 2, 3];
console.log(sum(...numbers)); // 6

사례3

let obj1 = { foo: 'bar', x: 42 };
let obj2 = { ...obj1, y: 1337 }; // { foo: 'bar', x: 42, y: 1337 }

스프레드 연산자는 얕은 복사를 수행한다는 점을 유념하자. 위의 예제를 보면 알겠지만 스프레드 연산자는 코드를 더욱 간결하고 가독성을 높여주며 데이터 구조를 쉽게 조작할 수 있게 해준다. 하지만 얕은 복사라는 점을 다시 한번 더 유념하자.