[issue] GeoNames 사이트에서 받은 데이터들은 txt 형식을 하고 있으나, 실제로는 tab으로 구분되어 있는 CSV파일 형식이다.  이것을 iOS나 안드로이드에서 사용할 DB로 변환을 해야함.

 

[solution] 네이버 웹검색을 통해 해결책을 찾음  [출처 : 상상하면님 블로그]

  1. firefox 에서 부가기능에서 sqlite manager 설치   

   2. sqlite manager > DataBase> new Database 메뉴실행 

 

  4. DataBase> import

     4-1. CSV파일 선택/ 인코딩 방식 / 구분자 등의 정보지정

4-2. Table column 명 및 Data Type, Primary Key등의 정보 입력

      4-3. import 완료 메시지 출력( 레코드 갯수)

4-4. import Fail 메시지 출력

 importing 하는 과정에서 7개의 레코드에서 에러가 발생했다고 한다.  

 별도로 확인이 필요할 것 같다.   "이유가 뭐니~"

 

 5. Data 확인

파일정보를 SQLite Manager에게 변환했으니, 이제 필요한 자료가 있으면 엡에서 해당 DB를 접근하여 처리하도록 하면 되겠다.

 

[geonames.org cities1000.zip 내용을 DB변환] :  geonames.zip

Posted by 꿈을펼쳐라
,

데이터 포멧을 확인하기 위해서 먼저, http://www.geonames.org에서 한국도시 정보 파일인 KR.zip을 다운 받아 압축을 해제하면 KR.txt 파일이 나온다.  다행이 text 파일이니 워드패드로도 확인가능하니 우선 열어보면 다음과 같다.

 

몇가지 글자는 깨져서 나타나지만, 일정한 형식으로 작성된 듯하다. 각 밸류는 탭으로 구분되어 있으며, 사이트에 따른 여러 언어를 표현하기 위해 UTF-8 인토딩을 적용했다는 내용을 참고하여 이번엔 엑셀프로그램을 이용해 보자.

 

 

이렇게 해서 파일을 열어보면 다음과 같다.

2012년10월30일 기준으로 KR.txt에는 총 78,343개의 도시정보를 갖고 있다. 

그럼, 각 필드의 의미를 살펴보자.

Column 

Name 

Format 

Contents 

 1

geonameid

 interger

 Record ID

 2

 name

 varchar(200)

 지형이름(UTF-8) 

 3

 asciiname

 varchar(200)

 지형이름(ASCII)

 4

 alternatenames

 varchar(5000)

 쉼표로 구분된 다른 이름 (이명)

 5

 latitude

 decimal degrees

 위도(WGS84)

 6

 longitude

 decimal degrees

 경도(WGS84) 

 7

 feature class

 char(1)

 Record 특성 CLASS (codes.html) 

 8

 feature code

 varchar(10)

 Record 특성 CODE (codes.html)

 9

 country code

 char(2)

 ISO-3166 2-letter country code

 10

 cc2

 char(60) 

 alternate country codes,

 11

admin1 code

 varchar(20)

 지역코드1 (admin1Codes.txt 참고, 한국 : 광역시도)

 12

 admin2  code

 varchar(80)

 지역코드2 (admin2Codes.txt 참고, 한국 : 대규모 시군)

 13

admin3 code

 varchar(20)

 지역코드3 (한국의 경우, 소규모 시군)

 14

admin4 code

 varchar(20)

 지역코드4

 15

 population

 bigint( 8byte int)

 인구

 16

 elevation

 interger (meters)

 해발고도

 17

 dem

 interger

 DEM 정보

 18

 timezone

varchar(40) 

 timezone 정보

 19

modification 

yyyy-mm-dd 

 데이터 수정일

여기서 7,8번 정보를 관심있게 볼 필요가 있다. 

Record의 특성을 분류해서 code값으로 분류하였는데 주요 정보들은 다음과 같다. 

 [7 : feature class] 

 Class

Description 

 A

country, state, region, ... 

 H

stream, lake, ... 

 L

park, area, ... 

 P

city, village, ... 

 R

road, railroad, ... 

 S

spot, building, farm

 T

mountain, hill, rock , ....

 U

undersea 

 V

forest, health, ... 

[ 8 : feature code ]

feature code에는 feature class를 기준으로 보다 다양한 분류를 하고 있는, 이 내용을 정리하여 엑셀파일로 첨부한다.  행정구역단위의 분류뿐 아니라, 주도 산, 다리, 강, 호수등의 자연적 특성, 빌딩, 도로, 철도 등의 인위적 특성등으로 구분하여 분류를 하고 있다.    이것을 이용한다면 다양한 형태의 서비스를 위한 Map Service의 질을 향상 시킬 수 있을 것 같다. 

Feature Class Code File download :featureCode.xlsx

 

사이트에서 보다 다양하고 정밀한 정보를 얻을 수 있으나, 현재 내가 필요한 정보는 이 수준에서 정리 될 수 있을 것 같다.  관심있는 분들은 보다 세심히 살펴 보시면, 득템하실 지도...

 

Posted by 꿈을펼쳐라
,

1. 프로젝트 명 : 3D Navigation System 개발  ( 2009년 3월)

2. 개발 환경 
   1) 개발Tool : Embeded Visual C++ 4.0 
   2) Target Device : WinCE 5.0 

3. 문제점  
   1) 현상 : Application이 실행 도중 일정치 않은 위치에서 다운되는 현상이 지속적으로 발생됨. 
   2) 원인 : WinCE 5.0에서는 구조적으로 한 Process당 사용할 수 있는 메모리의 양이 32MB로 제한되어 있음.
   3) Test 프로그램 화면
      ㄱ) Total Virtual mem Size가 32Mb 임을 확인할 수 있음. 
      ㄴ) Test App.에서는 현재 26Mb까지 할당했고, 1Mb 추가로 재할당할 때 메모리 오류 발생하였음.


4. 해결방법
  1) Memory Map 적용 : 32Mb 한계 이상을 사용하기 위해서는 임시 메모리맵 방식을 사용하여 마치 추가,
    메모리 영역처럼 사용할 수 있음.
 2) Memory Pool 적용 : . 잦은 메모리의 할당 및 해제는 속도저하는 물론 메모리 단편화를 야기할 수
    있으므로
큰 용량을 한번에 생성한 후, 이를 사용시 필요한 만큼의 크기를 변환해서 사용하는 방식
 3) 참고 Site : http://msdn.microsoft.com/en-us/library/aa454885.aspx#Mtps_DropDownFilterText 


5. 구현

Class

주요기능

CMemoryPool

광역으로 선언되어 전체 App. 상에서 메모리 할당 및 생성 인터페이스를 제공하고, 전체 메모리 현황을 관리

CMemoryBlock

확보된 Memory Pool을 일정 Size로 나누어 효율적인 메모리 관리를 하고자 함( Block을 나누지 않을 경우, 메모리할당이 많아 질수록, 특정 주소를 찾거나, 메모리 해제시의 영역 Merge등에서 나쁜 성능을 나타낼 수 있음)

CMemAllocInfo

실제 메모리 할당하는 내용 ( 할당 메모리 위치(포인터), 할당메모리 크기, 할당메모리 영역 상태 등)

4-byte align을 위한 Reserved 버퍼를 둠


6. 성능 Test
  1) Test 방법

. 일정 Size의 메모리를 반복적으로 할당하고 해제하여 그 소요시간을 확인.

. 할당 메모리 Size는 Critical point로 지적된 4k, 128k 를 기준으로 실시함.

. 반복횟수 : 1000

. 메모리 해제시 순차적 해제가 아닌 최악의 조건인 중간 중간에 빈 블록이 발생하여

이를 고려하여 해제하는 방식으로 테스트
  2) Test
결과 (단위 : Second)

No

MemSize

반복횟수

기존 방법

MemoryPool 방식

1

128k

50

120(2.4)

0 (0)

2

4K

1000

39 (0.039)

39 (0.039

3

1k

5000

95 (0.019)

616 (0.1232)

ㄱ.   128k 이상의 할당에서는 MemoryPool 방식이 기존 방식보다 월등히 우수한 성능을 보임.

ㄴ.   4k 에서는 동일한 성능을 보임

ㄷ.   1k 미만에서는 기존 방식이 훨씬 우수한 성능을 보임

ㄹ.   MemoryPool 방식은 할당 메모리 횟수가 클 수록, 수행 속도가 급수적으로 증가함.

( )안의 값은 1회당 소요시간을 의미함

  3) Test 결과

MemoryPool 방식이 작은 용량의 할당에서는 성능저하를 보이나, 전체 App. 단위에서

볼 때, 그리고 다른 Process 처리 시간 단위를 비교해 보았을 때 그 영향이 크지 않으며

더욱이 큰용량의 메모리 할당에서는 기존 방식보다 훨씬 우월한 성능을 보이고 있으며,

WinCE상 한 Process 32Mb의 메모리 문제를 해결하기 위한 좋은 대안으로 판단

7. 적용 방법
   1)  메모리 할당 Size를 크게하고, 횟수를 최소화 하는 방향으로 적용

-----------------------------------------------------------------------------------------------------------------

[참고자료] WinCE 5.0 환경에서 메모리 할당시 메모리 변화 현황

 

alloc size

Avail. Phy.

Avail. Virtual.

Diff. Phy.(K)

Diff. Virtual.(K)

Pointer Pos.

diff.(K)

Initial

164073472

29949952

-

-

0x00000000

-

512K

163545088

29360128

516

576

0x00060020

384.0

256K

163278848

29032448

260

320

0x000f0020

576.0

128K

163139584

28835840

136

192

0x00140020

320.0

64K

163074048

28835840

64

0

0x00032600

(1078.5)

32K

163041280

28835840

32

0

0x00042610

64.0

16K

163024896

28835840

16

0

0x0004a620

32.0

8K

163016704

28835840

8

0

0x0004e630

16.0

4K

163012608

28835840

4

0

0x00050640

8.0

2K

163012608

28835840

0

0

0x00051650

4.0

1K

163008512

28835840

4

0

0x00051e60

2.0

1)     128k 이하시 Virtual Mem.의 변화량이 없음. ( Virtual Mem -> 128 k align )

2)     4K 이하시 Phy. Mem. 의 변화량이 없음. ( Phy. Mem. -> 4k align)

 

Posted by 꿈을펼쳐라
,

Web3D를 구현하기 위해, ActiveX에 OpenGL을 구현하는 프로그램을 개발 중, 웹페이지 갱신마다 지속적으로
메모리가 증가하는 현상이 나타났다.

결국, 문제는 wglCreateContext()함수로 생성한 HGLRC를 wglDeleteContext() 호출을 하지 않고 그냥 App을 종료시킴으로 발생한 문제였다.

오래전에 구현한 소스라 신경쓰지 않고, 그냥 갖다 썼는데, 이렇게 큰 문제가 발생될 줄이라... 

아마도, 일반 App에서는 큰 문제가 발생되지 않을 수도 있을 것이다.  프로그램 시작할때, HGLRC를 생성하고 OpenGL 종료시점과 프로그램 종료시점이 같으므로, 메모리 릭이 발생되는 순간 프로그램도 종료되므로, 실제 큰 문제가 발생되지 않았을 것이다.

하지만, ActiveX의 경우, 컨테이너에서 지속적으로 페이지 "갱신"을 시키면, 새로운 컨텍스트가 계속 발생되므로 문제를 야기 시켰다. 

먹었으면 싸야하고, 생성했으면 지우는 것이 우주의 이치인 것을....    기본에 충실하자. !!! 

PS. 이놈의 크기가 생각보다 크다.  :   640 * 480 * 3 ( color depth)


Posted by 꿈을펼쳐라
,



 윗 그림에서 보는 바와 같이, 화면을 회전하는 순간 건물의 색상과 빛의 속성이 변경된다.  

[원인]

나무를 그리기 위해 아래와 같은 코딩을 적용하였다. 

 ... 

 GLUquadricObj* obj=gluNewQuadric();
 gluQuadricDrawStyle(obj, GLU_FILL);
 gluQuadricNormals(obj,GLU_FLAT);
 gluQuadricOrientation(obj,GLU_INSIDE);
 glColorMaterial(GL_FRONT, GL_DIFFUSE);

 glPushMatrix();
 glTranslatef(x,y,0.f); 

 glColor3f(1.f,0.5f,1.f);
 gluCylinder(obj,0.3,0.3,1, 4, 1);


 glTranslatef(0.f,0.f,1.f); 
 glColor3f(0.f,1.f,0.f);
 gluCylinder(obj,1.5,0.,6,16, 1);
 
 gluDeleteQuadric(obj);

 glPopMatrix();

  문제는 glColorMaterial(GL_FRONT, GL_DIFFUSE); 구문이다.    

  GL 초기 Setup 과정에서는 glColorMaterial(GL_FRONT, GL_AMBIENT_AND_DIFFUSE); 로 세팅을 하는데, 프로그램 중간에 Diffuse 값만을 세팅하니, 이후에 glColor로 정의되는 색상은 Diffuse Color만 변경되므로 문제가 발생하였다.

 [해결책]
  glColorMaterial(GL_FRONT, GL_DIFFUSE); 구문을 생략
  만약에 반드시  glColorMaterial(GL_FRONT, GL_DIFFUSE)를 적용해야 한다면, 사용후 초기속으로 재설정해주를 코드 필요.
 

Posted by 꿈을펼쳐라
,