30. 2024.06.16(일) 수정사항. 어떤 좌표로 작도된 도면을 다른 좌표계로 변환해야 할 경우가 있다. bessel1841 좌표계 도면을 wgs84로 변환해야 할 경우, 반대로 wgs84 좌표계 도면을 bessel1841로 변환할 경우이다.
① 예를 들면, 화성동탄 계획평면도는 bessel1841(舊좌표) 중부원점으로 그려진 도면이다. 이 도면을 wgs84(新좌표)로 변환할 필요가 있을때, 엑셀 화면의 다음 버튼을 클릭하면, bessel좌표를 wgs좌표로 계산한 뒤, 같은 도면내에서 계산된 좌표로 객체를 이동한다.
편집하고자 하는 도면의 좌표계를 필히 확인하여야 한다. 변환하고자 하는 좌표계와 다른 버턴을 클릭하면 실행을 중지하게 했다.
② e.g. 붉은 색 네모 안의 객체를 wgs84 좌표계로 변환하여 이동시키는 경우,
나. 선택한 객체들의 좌표는 신좌표로 계산되어 이동하게 된다.
다. 이동한 객체들은 wgs 좌표계이므로, 엑셀화면에서, wgs 좌표계 + 가산값 600,000을 선택하여 카카오 지도를 실행하면,
라. 카카오지도로 확인하였을때, 좌표이동이 된 것을 알 수 있다.
③ 좌표이동은 모든 종류의 객체들이 되는 것은 아니고, 자주 쓰이는 종류만 추가했다.
아크, 블록, 원, 타원, 선, MTEXT, 점, lw폴리선, 2D폴리선, 3D폴리선, 문자, 지시선, 해치, spline, 솔리드, 래스터 이미지, 기타 몇개는 된다.
각 개체의 좌표, 중심점, 시종점 등을 계산하여 캐드 Object 속성을 업데이트 하기 때문에 이동시키는 것은 어렵지 않으나, 객체의 종류가 너무 많다. 이동이 되지 않는 객체는 coding이 되지 않았다.
가) 특히, 해치(hatch)의 경우, 캐드에서는 따로 속성값을 안 주는 것 같다. 오토캐드 Guide를 읽어 봤는데, 해치를 만드는 Method만 있고, Property는 안 준다. 그래서, GetBoundingBox minExt, maxExt를 이용해, 해치의 바운더리 중심점을 구해 이동시켰다. 그 외 솔리드, 래스터 이미지 등 몇 종류 object도 이렇게 해도 되는지, 분명히 다른 방법이 있을텐데, 미봉책으로 이렇게 한다.
나) 좌표계와 좌표변환에 의한 오차
- 지구 타원체에 대한 bessel1841과 grs80의 기준값이 다르므로 수학적인 좌표변환은 여러 의미에서 불가능하다. 「국가좌표변환계수 고시 」 계산식에 의해 근사적으로 구할 수 밖에 없다.
또한 지구는 수학적인 타원체가 아닌, 울퉁불퉁한 덩어리이고, 각 지역에서 진북, 중력가속도가 다르며, 지구에는 수학적인 중심점이 없다.
- 현실에서의 100m에 대한 측량값을 각 기준계(bessel1841, grs80)에 따라 작도하고 변환하면, 100m가 아니라 100m±α 값이 된다. 이는 지구타원체에 대한 기준계가 다르므로 나타나는 결과이다.
- 그러므로, bessel로 작도된 도면을 grs80으로 변환하면 길이가 달라진다. 반대의 경우도 같다. 좌표변환된 도면을, beseel ↔ wgs 상호간 변환후 다시 원래의 좌표로 변환한다면 「국가좌표변환계수 고시 」의 계산식에 의해 7mm 정도의 이동 오차도 발생한다.
- 첨부 엑셀파일의 변환 macro를 사용한다면, 점, 선 등은 각 포인트를 좌표변환하여 이동한다. hatch, 솔리드등과 같은 객체는 cad에서 따로 각 포인트 별 좌표점을 주지 않는 것 같다. 할 수 없이 GetBoundingBox 등을 이용한 이동점을 기준으로 단순 이동한다. 이렇게 하면, 라인, 폴리선과 같이 각 포인트를 좌표변환 이동한 경우와 끝점에서, 예를 들어 약 0.04mm의 오차가 발생한다. 항목30.의 설명 종료.
블로거 본문 시작 :
1. 개요 : 캐드 도면의 선 等을 클릭하고 Enter치면 인터넷의 카카오맵이 자동으로 실행되면서 캐드 도면의 선 等을 카카오맵에 나타낸다.
AutoCad로 작성된 도면에서 엑셀 VBA를 이용하여 객체의 좌표값을 계산하고, 카카오맵(HTML 파일), 구글어스(KML 파일), [환경부] (환경공간정보서비스) 생태자연도(js파일)로 표현한다. ※ 엑셀파일 等 첨부. 아래 8. 첨부파일에서 다운로드 링크 클릭하세요.
① VB는 엑셀에서 작성하였으며, 엑셀화면에서 컨트롤버튼을 클릭하면(2020.08.16 수정)
② 오토캐드 화면으로 전환되며, 이 도면에서 지도에 나타낼 폴리선, 선, 원 等 객체를 선택한다.
③ 카카오지도 버튼을 클릭하였다면, 아래 카카오지도가 실행되면서 선택한 객체들이 카카오지도의 화면에 나타난다.
④ 구글어스 버튼을 클릭하였다면, 아래 구글어스가 실행되면서 선택한 객체들이 구글어스의 화면에 나타난다.
2. 목적 : 정위치 편집된 위치도, 전체평면도 등 캐드도면으로만 봤을 때는 지형지물을 직관적으로 알기 어렵다. 엑셀VBA와 캐드를 연동하여, 캐드도면상의 객체를 클릭하면 엑셀에서 HTML파일 또는 KML파일을 생성하여 자동 실행한다. 지도를 확대하거나 축소하여도 좌표로 입력된 객체는 변하지 않으므로 지도에서 쉽게 알아 볼 수 있다.
3. 설정 : 각 컴퓨터 환경과 프로그램(엑셀, 캐드) 버전이 달라 실행시 따로 설정해주어야 한다.
① 엑셀파일의 경우 VBA를 사용해야 하므로, 엑셀파일 Open시 「보안 경고」 옵션에서 "이 콘텐츠 사용(E)"을 체크해 주어야 한다.
또는
② 엑셀파일 Open후 캐드와 연동하기 위하여 참조를 등록하여야 한다. Alt키+F11키를 동시에 눌러 VB창을 띄운 다음 도구(T)메뉴-참조(R) VBA project에서 그림과 같이, 예를 들어 cad 버전 2007을 이용한다면, AutoCAD 2007 Type Library에 체크해야 한다. 최초 1회만 하면 등록된다.
4. 방법 : 카카오맵이나 구글어스 모두 컨트롤버튼을 눌러 실행시킨다.
① 엑셀파일과 캐드파일이 동시에 열려 있어야 엑셀 ↔ 캐드간 화면전환이 가능하다. 캐드파일이 열려 있지 않다면, 다음과 같은 메시지박스가 나타나고 실행은 중지된다.
② 엑셀파일에서, '4. 선택회수 等'에서 선 종류(선, 문자, 클릭이벤트 포함 등 선택), 선색(색상지정 또는 캐드의 선색 그대로), 선두께 등 값을 클릭(설정)하고 실행버튼을 누르면 캐드 화면으로 전환되며, 각 그룹별로 지정한 객체 종류대로, 처음 객체들을 선택한 다음 Enter, 다음 객체들을 선택한 다음 Enter, 또 다음 객체들을 선택한 다음 Enter치면 카카오맵 또는 구글어스가 실행된다. Ⅰ,Ⅱ,Ⅲ 그룹을 모두 선택하면 Enter를 3번 쳐야 하고, Ⅱ,Ⅲ 그룹을 '선택안함'으로 설정하면 Enter를 1번만 입력하면 지도가 실행된다.
③ 컨트롤 버튼을 눌렀는데도 엑셀에서 캐드화면으로 전환되지 않을때는 작업표시줄에서 직접 캐드 탭을 선택하여 화면을 전환한다.
④ 카카오맵의 경우, 인터넷 익스플로러를 쓴다면 매번 실행시 마다 아래와 같이 스크립트 실행 경고가 뜨므로, 도구-인터넷옵션-고급-보안의 [내 컴퓨터]에 있는 파일에서 액티브 콘텐츠가 실행되는 것을 허용에 체크하면 다음부터는 나타나지 않는다.
5. 좌표 : 측지계는 지역측지계와 세계측지계를 선택하게 하였다.
① 도면은 좌표대로 작성되어야만 올바로 표현되고 그렇지 않다면 엉뚱한 곳에 표시될 것이다. 도면이 좌표대로 작성되었는데도 다르게 표시된다면, 측지계를 변경하여 실행해 본다.
② 종평면도와 같이 회전, 이동되어 좌표가 틀리다면 정위치로 편집하여 실행해야 한다.
③ (지역, 세계)TM좌표 → (지역, 세계)경위도 좌표로 변환하므로, 기준도면의 좌표계 원점을 확인해야 한다. 대부분 중부원점 아니면 동부원점이다.
6. 설정사항 : 카카오맵, 구글어스 실행시 문제점들
① PC에서 직접실행하기 위해 실행파일은 '20210127_kakaomap_Google earth_생태자연도.htm 또는 20210127_kakaomap_Google earth_생태자연도.kml'로 저장하여 직접 실행되게 된다. kml파일은 구글어스 파일이므로 PC나 스마트폰에 당연히 구글어스 또는 구글어스앱이 깔려 있어야 한다.
만약, 실행파일 저장위치는 편의상 C:\temp으로 지정했으며, PC C:\에 temp폴더가 없다면 'C:\temp' 폴더를 만들어야 저장할 수 있다.
엑셀 매크로를 실행시 마다 위 파일에 덮어 쉬우기 하므로, 따로 필요하다면 파일이름을 다른이름으로 변경한 후 매크로를 실행해야 한다.
②카카오맵에서 'point(지번주소)'는 카카오지도 API키를 통해서 주소를 읽어 오는데, 다음카카오의 정책으로 웹서버에서 실행해야 한다.
③ kml파일 실행시 한글이 깨지는 현상은 ANSI코드로 되어 있어, 20210127_kakaomap_Google earth_생태자연도.kml을 메모장에서 열어 인코딩을 UTF-8로 선택후 다시 저장하여 실행하면 한글이 바로 보인다.
④ kml파일은 스마트폰에서도 바로 실행되나, google의 정책으로 한국에서는 구글어스앱 실행이 안되게 막아 놓았다. 아래처럼 스마트폰에서 KML파일을 열려면, google 외국 계정으로 구글어스앱을 설치해야 한다. 아래 화면은 google에서 막기전에 실행한 화면이다.
⑤ HTML 파일을 스마트폰에서 실행시킬때, 일반적으로는 문제가 없지만, 위치추적(GPS, wifi)기능을 사용하려면 스마트폰 브라우져에서 실행해야 한다.
엑셀화면에서 "E9" 셀에 '위치추적기 아이콘(마크만)' 또는 '위치추적기 아이콘 좌표TM'을 선택하고, 실행하면,
캐드화면으로 전환되고, 지도에 나타날 객체를 선택하고, 카카오지도가 실행되면 다음과 같이 '내 위치'를 표시할 것인지를 묻는다. '허용'을 클릭하면, 현재위치에 "위치표시(십자선) 아이콘"이 나타난다.
현재 위치를 표현하는 아이콘(ICON)은 임의로 제수변 마크 위치표시(십자선) 아이콘(변경 : 20230122)의 src 주소를 불러 왔다. image이므로 다른 그림을 src로 연결해도 된다. 제수변 마크 위치표시(십자선) 아이콘이 표시되는 위치는 컴퓨터의 대략적인 IP 접속위치이다.
20190815_kakaomap_Google earth_생태자연도.htm으로 생성된 htm파일을 스마트폰에 붙여 넣어, "내 파일 → 내장 메모리 → Download → 20190815_kakaomap_Google earth_생태자연도.htm"을 실행시키면,
와 같이 나타나며, 「위치 추적」 여부는 안 물어보고, HTML코드만 실행한다. 이유는 google에서 보안때문에 막아 놓았다. https:// 환경에서만 위치 정보를 받아 갈 수 있게 해 놓았다. 개인의 위치 정보는 중요한 사항이니 보안환경에서만 나타내게 했다. google의 보안정책이다.
웹브라우저 창에 "file:///sdcard/download를 입력하면, 아래와 같이 탐색기가 실행되고,
KakaoMap, google earth, Vworld 등, 지도 자체가 측량값이 아닌 사진이므로 오차가 대략 ±5m정도 나고, 스마트폰의 GPS기능은 몇 십미터씩 왔다갔다 하고, 캐드 도면상의 선형이 좌표와 틀릴 수 있어, KakaoMap에서 나타나는 위치 표시는 정확하지 않다.
※ 카카오지도에서 위치추적기와 TM좌표를 같이 표현. (20230122 현재위치 표시는 '제수변마크크'가 아닌 '위치표시(십자선) 아이콘'으로 변경함.)
⑥ 카카오지도에서 클릭이벤트는 PC에서 마우스로 클릭시, 스마트폰에서 손가락 터치시 인포윈도가 팝업되면서, 캐드에서 읽어 온 레이어명과 각 객체의 길이, 면적등의 간단한 속성값을 표현한다. 편집할게 아니라면 보통은 없는 게 낫다. 편집할려면 약간의 javascript에 대한 이해가 필요하다.
PC에서 클릭 시
스마트폰에서는 손가락이 너무 커서, 클릭 할때 신경 써야 함.
7. 사례 : 첨부파일을 다운 받아 더블클릭하면 지도가 실행된다.
① 카카오맵 : 20210127_kakaomap_Google earth_생태자연도.htm
② 구글어스 : 20210127_kakaomap_Google earth_생태자연도.kml
③ 20200412_스마트폰 GRS80_TM좌표 간이측량.htm
PC에서는 당연히 기지국 GPS 좌표가 나타나고, 스마트폰에서는 file:///~ 에서 직접 실행해야 GPS 위치 정보가 나타난다. content//0@media/external/~에서 실행시키면 google의 보안정책에 의해 GPS 위치정보가 차단되어 현재 스마트폰의 위치는 나타나지 않는다.
④ 20200412_스마트폰 Bessel1841_TM좌표 간이측량.htm
8. 첨부파일
①
② 20210127_kakaomap_Google earth_생태자연도.htm ← 샘플파일 다운로드 할려면 링크 클릭
③ 20210127_kakaomap_Google earth_생태자연도.kml ← 샘플파일 다운로드 할려면 링크 클릭
④ 로컬호스트 관련 파일
index.html ← 다운로드 할려면 링크 클릭
index.js ← 다운로드 할려면 링크 클릭
package.json ← 다운로드 할려면 링크 클릭
⑤ 20200412_스마트폰 GRS80_TM좌표 간이측량.htm ← 다운로드 할려면 링크 클릭
⑥ 20200412_스마트폰 Bessel1841_TM좌표 간이측량.htm ← 다운로드 할려면 링크 클릭
⑦ 20201128 CAD 포인트좌표를 kakaomap에 주소로 표시.htm ← 다운로드 할려면 링크 클릭
⑧20210127_kakaomap_Google earth_생태자연도.xlsm ← 삭제, 8-⑨을 다운로드 하세요.
⑨ 20240329 Autocad용 kamap_Gmap_생태자연도.xlsm ← 다운로드 할려면 링크 클릭
⑧
⑨ 20240329 Autocad용 kamap_Gmap_생태자연도.xlsm ← 다운로드 할려면 링크 클릭
9. [환경부] (환경공간정보서비스) 생태자연도 추가(2019.07.05 수정)
① 엑셀 화면에서 「생태자연도」 버튼 클릭하면 캐드화면으로 전환되고, 현재는 폴리라인만 선택 가능하며, 폴리라인의 개수는 제한이 없습니다. 엑셀시트 C14셀(선 색)과 C15셀(선 두께) 값을 가져오므로, 선 색과 선 두께를 잘 조절해야 합니다.
② 생태자연도는 직관적으로 어느 지역인지 알기가 어려우므로, 특히 캐드도면의 좌표계를 확인해야 하며, 투영원점과 가산값을 주의 깊게 봐야한다.
③ 환경공간서비스의 생태자연도 API는 openlayers를 기반으로 한다고 합니다. 그래서 로컬호스트에서 실행해야 하고, 웹브라우저 창에서는(더블 클릭) 실행이 안됩니다. npm과 parcel 프로그램 둘 다 설치하여 로컬호스트에서 실행해야 합니다.
④ 로컬호스트 실행을 위해서는,
가. https://nodejs.org/en/에 가서 node-v10.16.0-x86.msi 다운 받아 설치해야 하고,
나. https://openlayers.org/en/latest/doc/tutorials/bundle.html 에 가서 설치해야 하고, (npm install ol, npm install --save-dev parcel-bundler)
다. https://parceljs.org/getting_started.html 도 설치하고,
라. c:드라이브의 임의의 곳에 폴더를 만들고("C:\Users\user\new-project", 파일을(index.html, index.js, package.json) 복사하여 넣어야 합니다.
마. 도스 명령창에서 c:\users\user\new-project\npm start 입력하고 엔터치면 약 30초 내외에서 로컬서버가 실행됩니다.
바. 엑셀에서 실행시키면 "C:\Users\user\new-project\index.js"을 덮어 쓰고, 변화가 있으면 로컬서버에서 자동으로 반영됩니다.
10. 엑셀화면의 하단의 「기타 실행버튼」의 '컨트롤 서식'들은,
① 캐드 도면에서 '중심선에 일정 폭을 가지는 평행한 폴리라인을 그리는 코드'
컨드롤 서식을 클릭하면 CAD 화면으로 전환되고, CAD 화면에서 선택한 폴리선들에서
InputBox로 입력 받은 폭만큼 떨어져 평행한 폴리선들을 그린다.
② 캐드 도면의 각 객체들의 좌표와 값을 가져오는 코드들
③ 엑셀 화면에서 캐드로 각 객체들을 그리는 코드들
④ 좌표계 간 변환 코드
(Bessel1841 TM좌표 ↔ WGS84 TM좌표로 변환, 경위도좌표(GCS) ↔ 평면직각좌표(TM) 코드들의, 개별 프러시져들임.
① 캐드 도면에서 '중심선에 일정 폭을 가지는 평행한 폴리라인을 그리는 코드'
컨드롤 서식을 클릭하면 CAD 화면으로 전환되고, CAD 화면에서 선택한 폴리선들에서
InputBox로 입력 받은 폭만큼 떨어져 평행한 폴리선들을 그린다.
② 캐드 도면의 각 객체들의 좌표와 값을 가져오는 코드들
③ 엑셀 화면에서 캐드로 각 객체들을 그리는 코드들
④ 좌표계 간 변환 코드
(Bessel1841 TM좌표 ↔ WGS84 TM좌표로 변환, 경위도좌표(GCS) ↔ 평면직각좌표(TM) 코드들의, 개별 프러시져들임.
11. [요청사항] ACAD 도면의 POINT를 선택시 포인트의 좌표에 해당하는 주소를 카카오지도에 표시하는 코드 추가하였습니다(20201128 수정).
① 엑셀 화면에서 「선 종류」에 추가 하였습니다. 기존 Point는 도면상의 Point 그대로이고, Point(지번주소)는 도면상의 Point 좌표에 해당하는 주소를 카카오지도에서 읽어 와서, 인포윈도우로 카카오지도에 나타내 줍니다. 포인트는 크기가 반지름이 1m인 작은 원으로 표현하였습니다.
③ 카카오지도를 실행하면 너무 좁아서 인포윈도우가 겹쳐서 보입니다. 주소가 긴 경우에는 칸이 넘어가서 인포윈도우를 넘어 표시되어, 조금 보시기 불편할 수 있습니다. 카카오지도에서 최대로 확대(Level 1)해도 다음과 같이 보입니다. 파란색 선은 지적선입니다. 당연히 polyline을 선택해서 실행해야 합니다.
12. [요청사항] ACAD 도면의 색상을 그대로 카카오맵 또는 구글어스에 표현함. 먼저 객체의 색상을 우선하고, 객체의 색상이 별도로 지정되어 있지 않고, ByLayer로 되어 있을때는 레이어의 색상으로 표현합니다. 선 두께는 ACAD상의 두께와는 상관없이 엑셀 쉬트 D14셀의 값으로 합니다.
13. [변경사항] 2021.03.22 변경사항
ⓘ 카카오지도의 API 키 관련 변경 공지사항이 있습니다.
아래는 제 API 키입니다. 그 전에는 아무 거나 해서, Admin 키를 넣었는데, 이제는 JavaScript 키를 쓰라고 하네요. 보안때문에 Admin 키를 넣으면 안된다고 합니다.
HTML 파일 15번째 줄에서,
<script type="text/javascript" src="http://dapi.kakao.com/v2/maps/sdk.js?appkey=abe85ab7일부번호 삭제513299580&libraries=services"></script> 이 것을,
<script type="text/javascript" src="http://dapi.kakao.com/v2/maps/sdk.js?appkey=c2d2fc7d6d8839952c6357aaf0dfc299&libraries=services"></script> 이렇게 바꾸고, 저장 후 실행하면 됩니다.
③ 블로거에 링크된 엑셀파일에도 API 키를 바꿔 놓았으니, 새로 다운 받으시면 됩니다. 또한 다음카카오의 정책이 언제 또 바뀔지 모르니, API 키는 다음카카오에 가입하여, API 키를 발급 받으셔서 본인 API 키를 쓰셔도 됩니다. 본인 API키를 쓰실려면, 엑셀 VBA 편집창에서,
ActiveCell.Cells(15, 1).Value = "<script type=" & """" & "text/javascript" & """" & " src=" & """" & "http://dapi.kakao.com/v2/maps/sdk.js?appkey=abe85ab7일부번호 삭제513299580&libraries=services" & """" & "></script>" 이 코드를 찾아, (ctrl+F 찾기해서)
ActiveCell.Cells(15, 1).Value = "<script type=" & """" & "text/javascript" & """" & " src=" & """" & "http://dapi.kakao.com/v2/maps/sdk.js?appkey=c2d2fc7d6d8839952c6357aaf0dfc299&libraries=services" & """" & "></script>" 이렇게 바꾸면 앞으로 실행할 때 마다 변경된 키가 입력됩니다.
게다가 웹서버를 통하게 되어 한글 인코딩도 UTF-8로 바꾸어야 합니다. 할 수 없이 메모장에서 HTML 문서를 열어서, 다른이름으로 저장에서 인코딩을 ANSI에서 UTF-8으로 바꾸어 다시 저장해야 합니다.
검색창에 "웹서버 크롬"으로 검색하면 "Web Server for Chrome"이란 앱이 나오고,
앱을 실행하면,
폴더는 아무 폴더나 지정해면 되는데, 저는 편의상 "C:\Temp"로 정했습니다. 한 번만 지정하면 바꾸기 전까지 매번 기억되네요.
만약 웹서버를 종료하고 클릭하면 '사이트에 연결할 수 없음'이라고 나옵니다.

② 실행화면 : 경상북도 영양군 영양읍 지적편집도. 경상북도는 동부원점인데, 연속지적도는 중부원점입니다. 카카오지도의 지적편집도는 연속지적도와 일치하나, 카카오지도의 항공지도와 연속지적도가 어긋나 있습니다. 원인이 무얼까 궁금합니다.

③ 엑셀화면 : 「9. 지도type 선택」을 추가하여 지적편집도 보기와 안보기를 설정하였습니다.

④ 카카오맵 지도Type 선택버튼을 넣느라 공간이 없어, 모니터 세로화면은 100%에서 90% 줄이고, 남는 공간에 선택버튼을 넣었습니다. 지도 타입을 안 보고 싶으시면, 「지도타입 안보기」를 클릭하세요. 고친 엑셀파일은 블로거 본문에서 링크로 다시 다운 받으세요.
17. [변경사항] 카카오맵 로드뷰 추가
가. Polyline 선상에 있는 텍스트를 카카오지도에 나탸내기 위해서는 텍스트는 폴리라인의 선상에 있어야 합니다. 폴리라인의 각 성분 중 두 점을 잇는 선분 사이에 텍스트가 위치해야 합니다. 폴리라인의 좌표점에 위치하면 내적이 0이므로 양수가 안 되어 인식이 되지 않습니다.
② 카카오지도에서 폴리곤을 클릭하였을때 인포윈도우에 문자를 나타내는 사례입니다.
캐드에서 폴리라인을 선택해도 카카오지도에서는 다각형의 폴리곤으로 구분하였습니다. 폴리곤내에 포함된 텍스트의 구분은 직선과 직선의 교점의 개수를 구하는 기하학의 방정식으로 판단할 수 있습니다.
나. 만약 폴리선으로 그렸다면, 카카오지도에서 선종류는 폴리라인을 선택하고, 선 두께는 가장 가는 선 1로 선택한다. 카카오지도에서는 레벨 1에서 1pixel이 0.25m이므로 200m는 800픽셀이며, 캡쳐 프로그램의 크기를 800픽셀×800픽셀로 고정 후, 선 두께 1로 그린 사각형을 캡쳐하면, 사진은 200m×200m인 정사각형이 된다. 최대 확대값은 레벨 0이므로 1pixel이 0.125m이다.
20. 2022.09.14(수) 수정사항. '마우스 클릭' 대신 '마우스 오버, 아웃'으로 대체
만들어진 카카오지도에서는, VBA 'polyline(속성클릭)'을 통해 만든 폴리라인의 속성을 확인하기 위해, 카카오맵의 선을 클릭하여 확인하였으나, 폴리라인의 위치를 확인해야 할 필요로 클릭하기에 너무 시간이 많이 걸리고 구분이 안되어, 마우스를 카카오맵의 폴리선 위에 올리면 속성정보가 나타나고, 마우스를 카카오맵의 폴리선에서 벗어 나면 원래 폴리선의 색상으로 돌아 오게 하는 "Sub K13_카카오맵_폴리라인마우스오버아웃()" 프러시져를 추가하였습니다. 주의 : 모니터 화면상의 폴리라인에 마우스를 갖다 대므로 마우스 위치를 정확히 놓기 어려움. 마우스 오버, 아웃이 반복되므로 모니터 화면의 폴리선이 번쩍 거리므로 신경써서 마우스 포인트를 카카오맵 선 위에 놓아야 안정된 폴리라인을 볼 수 있음. 폴리라인의 색 반전은 "보색" 계산을 통해서 카카오맵의 선색의 보색이 나타남.
③ 지도 하단의 「선의 거리 계산하기」 button을 클릭하여야 실행됩니다. 일단 「선의 거리 계산하기」 코드가 실행되면 취소할 수는 없습니다. 자바스크립트에 대한 이해가 부족해 취소 코드를 찾지 못했습니다.
웹서버가 구동되면 아래와 같이 됩니다. 이 명령어로 웹서버가 구동되는 것이므로, 창을 닫으면 웹서버도 끊어집니다. 웹서버가 구동중에는 변동사항이 계속 갱신되는 것을 확인할 수 있습니다.
⑤ 인터넷에서 다운받은 동탄신도시 관련도면(Bessel1841, 중부원점)으로 테스트를 해봅니다. 임의의 위치에 점(point)을 찍습니다. 아래에서는 임의로 찍은 녹색점이 5개 정도 보입니다.
이렇게 하면, 굳이 폴리라인을 exlode하여 직선, 폴리선, 아크로 변환할 필요없이 그냥 하나의 폴리라인을 객체선택하면 됩니다. 다만, 3Dpolyline은 자료구조가 또 달라 이 방법은 안됩니다.
가) CAD Polyline Object의 Coordinates 속성에서, 좌표값 x1, y1, x2, y2, x3, y3, ... , 이런 식 데이터에서 P1 시작점과 P2 끝점을 얻고,
아래는 제 API 키입니다. 그 전에는 아무 거나 해서, Admin 키를 넣었는데, 이제는 JavaScript 키를 쓰라고 하네요. 보안때문에 Admin 키를 넣으면 안된다고 합니다.
플랫폼 | 앱 키 |
네이티브 앱 키 | 01ee7443일부번호 삭제f64a9ff55f |
REST API 키 | 09494119일부번호 삭제a18071369 |
JavaScript 키 | c2d2fc7d6d8839952c6357aaf0dfc2 |
Admin 키 | abe85ab7일부번호 삭제5132995 |
· 네이티브 앱 키: Android, iOS SDK에서 API를 호출할 때 사용합니다.
· JavaScript 키: JavaScript SDK에서 API를 호출할 때 사용합니다.
· REST API 키: REST API를 호출할 때 사용합니다.
· Admin 키: 모든 권한을 갖고 있는 키입니다. 노출이 되지 않도록 주의가 필요합니다.
② 기존에 편집된 HTML 파일이 있다면, 메모장에서 여서서, API 키 부분을 수정하여 저장하시면 됩니다. 조금 성가시게 되었습니다.
HTML 파일 15번째 줄에서,
<script type="text/javascript" src="http://dapi.kakao.com/v2/maps/sdk.js?appkey=abe85ab7일부번호 삭제513299580&libraries=services"></script> 이 것을,
<script type="text/javascript" src="http://dapi.kakao.com/v2/maps/sdk.js?appkey=c2d2fc7d6d8839952c6357aaf0dfc299&libraries=services"></script> 이렇게 바꾸고, 저장 후 실행하면 됩니다.
③ 블로거에 링크된 엑셀파일에도 API 키를 바꿔 놓았으니, 새로 다운 받으시면 됩니다. 또한 다음카카오의 정책이 언제 또 바뀔지 모르니, API 키는 다음카카오에 가입하여, API 키를 발급 받으셔서 본인 API 키를 쓰셔도 됩니다. 본인 API키를 쓰실려면, 엑셀 VBA 편집창에서,
ActiveCell.Cells(15, 1).Value = "<script type=" & """" & "text/javascript" & """" & " src=" & """" & "http://dapi.kakao.com/v2/maps/sdk.js?appkey=abe85ab7일부번호 삭제513299580&libraries=services" & """" & "></script>" 이 코드를 찾아, (ctrl+F 찾기해서)
ActiveCell.Cells(15, 1).Value = "<script type=" & """" & "text/javascript" & """" & " src=" & """" & "http://dapi.kakao.com/v2/maps/sdk.js?appkey=c2d2fc7d6d8839952c6357aaf0dfc299&libraries=services" & """" & "></script>" 이렇게 바꾸면 앞으로 실행할 때 마다 변경된 키가 입력됩니다.
14. [요청사항] "UTM 좌표로"
ⓘ UTM 좌표로 된 도면을 구하려 아무리 검색해도 구할 수가 없어서 UTM 좌표로 하는 것은 검증이 안되어, UTM-K 좌표 샘플을 인터넷에서 검색하여 "2021-01-15 글쓴이 김 형준
대한민국 최신 행정구역(SHP) 다운로드" 구하였습니다. 하여튼 UTM-K도 투영도법은 UTM이나, WTM이나 같으니, 투영상수만 다르게 적용하면 됩니다.
대한민국 최신 행정구역(SHP) 다운로드" 구하였습니다. 하여튼 UTM-K도 투영도법은 UTM이나, WTM이나 같으니, 투영상수만 다르게 적용하면 됩니다.
엑셀 시트에서 측지계 기준점을 아래와 같이 잘 맞춰야 합니다. 인터넷에 보니 X축 가산값이 1,000,000이라고 하는 함부로 막 쓴 정보도 있어 약간 지체되었습니다. 수학 그래프의 X축은 오른쪽 방향이나, 측지계에서 X축은 North방향이므로 X(N)은 2,000,000입니다.
② UTM-K는 WGS84타원체에 「경도 127.5˚, 위도 38˚, X축(N) 가산값 2,000,000m, Y축(E) 가산값 1,000,000m, 축척계수(Κ0) 0.9996」 상수를 적용해서,
울산광역시 울주군의 행정구역을 예로 들면,
첨부파일의 VBA 코드를 수정하여 다시 링크하니, 다시 다운 받으시면 됩니다. 카카오지도와 구글어스 코드만 수정하였고, 생태자연도는 사용빈도가 없어 고치지 않았습니다.
15. [질문사항] "좌표로 주소를 얻어내려고"
ⓘ 카카오에서 API 정책을 바꾸면서 여러 가지가 바뀌게 되었네요. 블로거 본문 11.과 같이 2021.03.22 이전에는 좌표주소 변환은 로컬에서 가능했는데, 이제는 웹서버를 통해야 하는 것 같습니다. 로컬에서 가능한 방법을 모르겠습니다. 프로그래밍을 해야 하는 것 같습니다.
현재 로컬에서 좌표주소 변환 코드가 있는 HTML을 실행하면 주소는 나타나지 않습니다.
게다가 웹서버를 통하게 되어 한글 인코딩도 UTF-8로 바꾸어야 합니다. 할 수 없이 메모장에서 HTML 문서를 열어서, 다른이름으로 저장에서 인코딩을 ANSI에서 UTF-8으로 바꾸어 다시 저장해야 합니다.
□ 2023.06.07(수) 수정사항 시작 : Google에서 「"Web Server for Chrome" 앱이 더 이상 지원되지 않습니다. 2022년 12월 이후에는 이전 버전의 Chrome 앱이 Window 기기에서 열리지 않습니다. 이용 가능한 새 버전이 있는지 확인해 보세요."라고 공지합니다. "구글"이나 "카카오다음"이나 '게임의 룰'을 자꾸 바꿉니다. 다른 로컬 웹서버를 구축해야 합니다.
④ 만약 수백개의 점(포인트) 좌표에서 주소를 알아내야 한다면, 첨부 엑셀파일에 포함된 VBA에 있는 '포인트 삽입' 매크로를 실행해서 한꺼번에 캐드 도면으로 보내고, 지번주소 변환을 한꺼번에 하면 주소를 쉽게 찾을 수 있습니다.
16. [요청사항] "카카오맵 지도타입 바꾸기"
'카카오맵 지도타입 바꾸기'는 클릭 버튼을 추가하였습니다. 화면 아래 '지적편집도'를 클릭하면 다음 화면과 같이 지적편집도가 오버레이 되고, '지도타입 안보기'를 클릭하면 지도타입이 사라집니다.
① 실행화면 : 충청북도 청주시 흥덕구 송정동 지적편집도. 참고로 API라 '교통정보 보기'를 클릭하면, 실시간 교통상황이 화살표로 나타나네요.
② 실행화면 : 경상북도 영양군 영양읍 지적편집도. 경상북도는 동부원점인데, 연속지적도는 중부원점입니다. 카카오지도의 지적편집도는 연속지적도와 일치하나, 카카오지도의 항공지도와 연속지적도가 어긋나 있습니다. 원인이 무얼까 궁금합니다.
③ 엑셀화면 : 「9. 지도type 선택」을 추가하여 지적편집도 보기와 안보기를 설정하였습니다.
④ 카카오맵 지도Type 선택버튼을 넣느라 공간이 없어, 모니터 세로화면은 100%에서 90% 줄이고, 남는 공간에 선택버튼을 넣었습니다. 지도 타입을 안 보고 싶으시면, 「지도타입 안보기」를 클릭하세요. 고친 엑셀파일은 블로거 본문에서 링크로 다시 다운 받으세요.
18. [응용사항] 상황에 따라 각각 달라서 설명드리기 어려운, 간단한 응용사항을 두서없이 적습니다.
ⓘ 카카오지도에서 폴리라인을 클릭하였을때 인포윈도우에 문자를 나타내는 사례입니다.
이 경우 캐드 도면에서는 텍스트의 위치가 SHP파일의 속성을 DXF로 변환할 때 처럼 폴리라인의 선위에 있어야 합니다. 이 때, 한 선분(폴리라인)과 한 점(텍스트)의 거리는 선형대수로는 vector product가 0이어야 하나, 소수점 연산문제로 0.0003m 이내일때는 0으로 간주하였으며, scalar product가 양수이며, 제곱거리보다 작을 경우 텍스트가 폴리라인 위에 있다고 계산하였습니다.
가. Polyline 선상에 있는 텍스트를 카카오지도에 나탸내기 위해서는 텍스트는 폴리라인의 선상에 있어야 합니다. 폴리라인의 각 성분 중 두 점을 잇는 선분 사이에 텍스트가 위치해야 합니다. 폴리라인의 좌표점에 위치하면 내적이 0이므로 양수가 안 되어 인식이 되지 않습니다.
다. '지도 실행버튼'을 클릭하면
- 다음과 같은 msgbox가 나타나면 주의사항을 한번 읽어보고 확인을 클릭하고
- 다시 캐드 화면에서 마우스로 폴리라인을 선택한 후 엔터하면 카카오지도가 실행됩니다. 너무 많은 문자와 폴리선을 선택하면, 2009년産 컴퓨터와 같이 성능이 떨어지면 시간이 오래 걸릴 수도 있습니다. 폴리선을 클릭한 후 로드뷰도 같이 보면 다음과 같이 확인할 수 있습니다.
캐드에서 폴리라인을 선택해도 카카오지도에서는 다각형의 폴리곤으로 구분하였습니다. 폴리곤내에 포함된 텍스트의 구분은 직선과 직선의 교점의 개수를 구하는 기하학의 방정식으로 판단할 수 있습니다.
③ 카카오지도를 캡쳐해서 캐드 화면에 배경으로 사용할 때
가. 공사계획평면도에서 도면의 배경이 필요한 부분에 EX)가로×세로 200m인 선을 그린다.
- 크기가 조정된 사진을 move하여 당초에 그린 사각형과 일치 시킨다. 아래 그림에서 캐드 도면을 축소하여 화면에서는 실제 해상도보다 낮게 나오나, 확대시에는 실제 해상도로 보인다.
라. 카카오지도는 중부 단일원점이므로, 경도 127도에서 멀어질 수록 진북방향이 틀어지므로, 동부원점의 경우는 경위도에 맞게 사각형을 그리고, 래스터 이미지로 인서트 후 회전하여 맞추면 된다.
19. [오류찾기] ProgID때문에 오류 찾기 중입니다. 다른 분들은 다운로드 하지 마세요.
20. 2022.12.27(화) 수정사항. '마우스 클릭' 유지. 대신 폴리라인을 마우스 클릭시 폴리라인의 보색으로 나타나며, '마우스 move' 할 때(마우스를 폴리라인 선상에 갔다가 나오면) 원래 폴리라인 색상으로 나타 내게 함.
마우스 오버, 아웃 時 모니터 화면의 폴리선이 번쩍거려 너무 신경 쓰여서, "폴리라인을 마우스 클릭시 보색(반전색깔)으로 나타나고, 마우스로 폴리라인의 선상을 지나가면 (mousemove) 원래 폴리라인의 색상으로 나타나게 함. 이미 클릭하여 색깔이 반전된 폴리라인을 마우스로 지나가면, 당초 그 폴리라인에 지정한 색깔로 나타 남.
21. [요청사항] '선의 거리 계산하기' 코드 추가. 2022.10.12(수) 수정사항.
※ CODE 검증이 안되어 ERROR를 발견하신 분은 알려 주십시요.
① Kakao Maps API의 「선의 거리 계산하기」 샘플 code를 복사, 붙여넣기 하여 '선의 거리'를 지도에 나타내는 코드를 추가 하였습니다. "도보, 자전거 소요시간"은 필요 없을 것 같아 삭제하였습니다.
② Kakao Maps API의 샘플과 같이 "지도를 마우스로 클릭하면 선 그리기가 시작되고
오른쪽 마우스를 클릭하면 선 그리기가 종료됩니다."22. 안드로이드 11인가 이상 부터는 아예 "file:///" 에서는 그림파일 종류외에는 접근이 안되게 되어 있는 걸 알았습니다. 스마트폰에서 위치추적기(GPS)를 쓸 수 없다면, 내비게이터는 별 의미가 없네요.
'아이쿠'님 몰랐던 사항을 알려 주셔서 감사합니다.
아이쿠2022년 7월 29일 오전 10:14
안드로이드 정책으로 핸드폰에서 첨부된 문서를 찾을수 없다면 현재 사용하시는 폰의 안드로이드버전이 높으셔서 안되는것이고 구버전의 안드로이드폰을 사용하시면 본문에서 언급하신 내용으로 파일을 찾아서 실행하시면 현위치가 나타납니다.
① 그런데, 로컬에서 실행하는 HTML 파일의 카카오지도에서 GPS 기능을 써야 할 일이 생겼습니다. 안드로이드 10이하의 스마트폰에서 실행해야 하는데 스마트폰 유심칩 규격이 안 맞아 생각한 것이 "모바일 핫스팟"입니다. 모바일 핫스팟으로 공기계에서 Wi-fi로 인터넷에 연결한 다음 실행했습니다.
③ 스마트폰 공기계의 설정을 GPS만 사용하도록 설정합니다. 그러면, 실내, 지하, 고층건물들 사이에서는 GPS 수신이 안되어 현재 위치를 찾느라 배터리 소모가 많으나, 탁 트인 야외에서는 보다 정확한 위치(대략 3.5m 이내)를 나타냅니다.
④ 정밀도가 높은 GPS 측량기나, 정밀도가 낮은 스마트폰의 GPS 센서나, 따로 보정신호를 수신하지 않는다면 GPS위성의 신호가 우주에서 지표까지 도달하는 과정에서 전리층 오차, 대류층 오자, 기타 오차등으로 시간에 따라, 날씨에 따라, 위치에 따라 매번 바뀌어 ±30m 이내의 오차를 나타냅니다.
GPS 측량기는 '위성기준점'의 보정신호를 네트워크로 실시간으로 수신하므로 몇 cm급의 정확도를 나타냅니다. 보정신호를 받지 않는 스마트폰은 맑은 날, 개활지에서 GPS를 수신하였을 때 대략 ±3.5m의 정확도, 운이 좋을 때는 ±1.5m의 정확도, 운이 나쁠 때는 ±30m의 정확도를 얻을 수 있습니다.
23. 2023.01.15(일) 요청사항. 폴리라인은 lwpolyline (ObjectName은 "AcDbPolyline"), polyline (ObjectName은 "AcDb2dPolyline","AcDb3dPolyline") 두 가지 모두 같이 선택되게 했다. 카카오맵이나 구글어스에서 두 종류의 폴리라인 표현은 구분없이 평면상으로 polyline으로 같게 표현한다.
① 샘플도면에서 객체 특성을 보면 폴리라인은 LWPOLYLINE과 POLYLINE이 섞여 있다.
24. 2023.03.19(일) 요청사항. "아이쿠"님이 말씀하신, 「캐드문자에 대한 불편함」과 관련하여, 캐드에 있는 문자를 읽어 들여 카카오지도에 나타나게 함. 기존 텍스트를 인포윈도우(말 풍선)로 표현하는 Code는 삭제하고, 텍스트를 CustomOverlay로 문자 색상을 선택하고, 문자 크기를 배율로 선택하여 표현함.
① 샘플 캐드도면 (인터넷 검색으로 다운 받은 강원도 원주시 원주기업도시 계획평면도)
② 샘플 캐드도면을 카카오지도에 폴리라인과 Text(CustomOverlay)로 표시.
문자 색상은 Worksheets("영은").Range("C14") 셀 等에서 "검정+무지개색+캐드선색대로" 클릭하여 선택하고,
문자 크기는 기본 1m를 1px로 설정하고, Worksheets("영은").Range("A118") 셀에서 '0.1배, 0.2배, 0.5배, 1배, 2배, 5배, 10배로 클릭하여 선택할 수 있음.
③ 아래와 같이 샘플 캐드도면을 카카오지도에 폴리라인과 기존의 Text(인포윈도우)로 표시하는 CODE는 삭제함.
25. 2023.06.07(수) 요청사항. "스페이스"님이 말씀하신, 「크롬에서 "Web Server for Chrome" 앱 사용중지에 따른 대체 웹서버」를 찾아 보았습니다.
① Google에서 「"Web Server for Chrome" 앱이 더 이상 지원되지 않습니다. 2022년 12월 이후에는 이전 버전의 Chrome 앱이 Window 기기에서 열리지 않습니다. 이용 가능한 새 버전이 있는지 확인해 보세요."라고 공지합니다.
아래와 같은 크롬 확장프로그램으로 간단해서 좋았는데, 이제는 크롬에서 사용중지 되었습니다.
② 다른 간단한 방법을 찾아 보니, "python으로 웹서버 실행」하는 방법이 있습니다.
가. 먼저 python 프로그램을 설치합니다. 파이선 홈페이지(python.org)로 이동합니다. 다운로드(download)에서 Python "3.11.4(현재 최신버전)을 다운 받습니다. 저는 64bit 운영체제이므로, "Windows installer (64-bit)"를 다운 받았습니다.
Version | Operating System | Description | MD5 Sum | File Size | GPG | Sigstore |
---|
Windows installer (64-bit) | Windows | Recommended | e4413bb7448cd13b437dffffba294ca0 | 25426160 | SIG | .sigstore |
나. 다운로드 받은 파일을 더블클릭하여 python을 설치합니다. 설치 전에 PATH란에 체크해 주세요. 기본 값은 체크 해제 되어 있습니다.
설치가 완료되면 닫아주세요.
③ 키보도에서 윈도우 로고 key + R key를 동시에 눌러 실행창을 띄운 다음 "cmd"를 입력하고 확인을 누릅니다.
그러면, DOS 명령어창이 나타나고, 웹서버를 실행할 폴더로 이동합니다. 제 경우는 C:\temp에 저장하기 때문에 C:\>cd C:\temp 입력하고 엔터합니다. 그러면, C:\Temp> 폴더로 이동되고, C:\Temp>python -m http.server 8080을 입력하고 엔터합니다. 포트는 꼭 8080을 입력하세요. python 기본값은 8000인 것 같은데, 이유는 모르지만, 8080을 해야만 카카오지도와 연결됩니다. 명령어에서는 8080 앞에 콜론(:)이 없이 그냥 python -m http.server 8080을 입력하세요.
웹서버가 구동되면 아래와 같이 됩니다. 이 명령어로 웹서버가 구동되는 것이므로, 창을 닫으면 웹서버도 끊어집니다. 웹서버가 구동중에는 변동사항이 계속 갱신되는 것을 확인할 수 있습니다.
④ 웹서버가 구동되면, 브라우저 주소창에 localhost:8080을 입력하면 다음과 같이 연결됩니다.
⑤ 인터넷에서 다운받은 동탄신도시 관련도면(Bessel1841, 중부원점)으로 테스트를 해봅니다. 임의의 위치에 점(point)을 찍습니다. 아래에서는 임의로 찍은 녹색점이 5개 정도 보입니다.
이 도면으로 탐색기에서 실행하면 주소는 보이지 않고,
26. 2024.03.29(금) Autocad가 아닌, 대안 캐드인 ZWCAD를 사용할 경우.
① 엑셀 창에서 Alt+F11을 눌러 VBA 창을 띄운 다음, 바꾸기(Ctrl+h)에서 "현재 프로젝트" 클릭, 찾을 내용 "Autocad" 입력, 바꿀 내용 "ZWCAD" 입력한 후 모두 바꾸기 실행하여 26개를 일괄 변경한다.
③ 만약, 라이브러리가 누락되었다면, 메뉴 도구-참조에서 "ZWCAD 2021 Type Library" 等 자기 PC에 설치된 ZWCAD 버전에 맞는 라이브러리를 참조하시면 됩니다.
27. 2024.05.26(일) 추가사항. 캐드 객체종류(Entity)별로 클릭하기 성가시어 Arc, Line, Polyline(3종), Text(2종), Circle, Elllipse, Point, Leader는 한번에 선택하여 카카오맵에 나타나게 함. 카카오맵 code만 수정했으며, 구글어스(안함), 생태자연도(안함), "Entity 다중 선택"을 클릭하여 선택한 후 실행하면 됨.
주1) 캐드 포인트는 카카오맵에 없어, 반지름 0.1m의 원으로 표현
주1) 캐드 포인트는 카카오맵에 없어, 반지름 0.1m의 원으로 표현
주2) 캐드 텍스트는 카카오맵에서 상대값으로 표시되므로 확대, 축소시에도 화면상에는 같은 크기임.
주3) 캐드 지시선(Leader)은 시작점에 화살표가 표시되도록(카카오맵 startArrow : True)함.
주3) 캐드 지시선(Leader)은 시작점에 화살표가 표시되도록(카카오맵 startArrow : True)함.
주4) 캐드 폴리라인에 호(Arc)가 포함되어 있는 경우 직선으로 표시되므로, 호를 포함한 폴리라인은 Explode하여 실행해야 왜곡이 안됨.
2024.06.06(목) 수정사항 : 선 종류 선택의 "Entity 다중 선택" 프러시져에서 lwpolyline, 2Dpolyline에는 폴리라인에 포함된 호(Arc)를 표시함. 나머지 프러시저에서는 호(Arc)를 표시 못함.
① 샘플도면
① 샘플도면
28. 2024.05.29(수) 요청사항. Autocad가 아닌, 대안 캐드인 Bricscad용 VBA 수정.
① CAD 종류가 많네요. Autocad, ZWCAD, BricsCAD, etc. Bricsys 홈페이지에서 브릭스캐드 무료평가판(30일)을 다운로드 받을 수 있었습니다.
② 사용하는 캐드 종류가 BricsCAD임을 VB에 알려 줘야 하므로,
Autocad.Application → BricscadApp.AcadApplication 바꿔 주고, 파일 이름도 바꿔 줘야 하므로, Autocad용 → Bricscad용 으로 찾기/바꾸기(2024.06.16부터 수정) 해 준다.
참조도 AutoCAD... 타입 체크해제하고, BricscadApp Type Library 24.0으로 설정해 준다.
③ 이와 같이 두 가지만 바꾸면 CAD 종류를 브릭스캐드로 인식하여 실행하는데는 문제가 없으나, 기존 엑셀 VBA 코드에서 사용자 실수를 방지하기 위해 파일명을 "20210127_kakaomap_Google earth_생태자연도.xlsm"로 제한했기 때문에, 혼동을 방지하기 위해 파일이름을 "20240329 Bricscad용 kamap_Gmap_생태자연도.xlsm"로 변경한다. VB 코드에서도 찾기,바꾸기를 통해 엑셀 파일명과 동일하게 일괄 변경해 준다.
엑셀 VBA를 실행하게 되면, 결과는 카카오지도의 경우 "C:\Temp\"에 20240329 Bricscad용 kamap_Gmap_생태자연도.htm"로 저장된다.
④ 브릭스캐드 도면과 카카오지도 결과
e.g. 브릭스캐드 도면
e.g. 카카오지도 결과
⑤ BricsCAD 用 엑셀파일은 아래 링크로 다운 받으세요. 파일명도 바꾸었으니, 이 파일 이름으로 사용하셔야 실행됩니다.
29. 2024.06.06(목) 수정사항. 호(弧, ARC)가 포함된 폴리라인(lwpolyline, 2Dpolyline)을 카카오지도에 나타낼 때, Arc 부분을 약 5˚ 내외의 각도로 분할하여 직선좌표로 표현하는 code 추가. 선 종류 선택의 "Entity 다중 선택" 프러시져에서 lwpolyline, 2Dpolyline에만 적용됩니다.
① 일반적으로 호(弧, ARC)가 포함된 폴리라인을 카카오지도에 표현할 때, 아크 부분은 arc의 시점과 종점만을 직선으로 표현됩니다.
이는, 가) 캐드 Polyline Object의 Coordinates 속성과 GetBulge method, 나) 카카오지도에서 아크를 지원하지 않기 때문에 발생합니다.
예를 들면, 아래와 같은 예제 도면에서 호가 포함된 폴리선을 선택하면, 아크부분은 돌출부가 생략된 채로 직선으로 나타난다.
② 캐드 Polyline Object에서는 polyline에 포함된 호의 시작점 좌표, 끝점 좌표, Bulge값 3가지만 저장되어 있습니다. 그러므로, 3가지 값으로 반경(R), 중심점(C), 시점각과 종점각 4가지를 계산하여, 아크 부분을 임의로 지정한 5˚ 내외의 직선좌표로 변환하여 나타내면 다음과 같이 됩니다.
이렇게 하면, 굳이 폴리라인을 exlode하여 직선, 폴리선, 아크로 변환할 필요없이 그냥 하나의 폴리라인을 객체선택하면 됩니다. 다만, 3Dpolyline은 자료구조가 또 달라 이 방법은 안됩니다.
③ 캐드 polyline에서 포함된 Arc의 속성을 구하는 것은 아주 어려운 일입니다. 물론 CAD VBA에 포함된 ThisDrawing.Utility.AngleFromXAxis() 함수와 Distance() 함수를 이용하여 간단히 할 수도 있을 것 같지만, 여기서는 EXCEL VBA에서 순차적으로 계산하였습니다.
아래와 같은 예제 도면에서,
가) CAD Polyline Object의 Coordinates 속성에서, 좌표값 x1, y1, x2, y2, x3, y3, ... , 이런 식 데이터에서 P1 시작점과 P2 끝점을 얻고,
나) CAD Polyline Object의 GetBulge 메서드에서, b(1), b(2), b(3) ..., 이런 식 데이터에서 bulge(index)값을 불러 올 수 있습니다.
CAD Arc Object의 자료구조와 polyline에 포함된 arc의 자료구조는 다릅니다.
다) bulge값은 S(sagitta) / 선분P1P3(half chord)의 비율로써, bulge = 0이면 직선, bulge = ±1이면 반원, bulge > 0 이면 호가 반시계방향으로 그려지고, bulge < 0 이면 호가 시계방향으로 진행됨을 의미합니다.
라) 폴리라인의 좌표점을 추출할 때, GetBulge(i) = 0이면 직선으로 다음 좌표점까지 직선으로 계산합니다.
GetBulge(i) <> 0 아니면 호(弧)이므로 그 때 좌표점 x, y를 시작점(P1)으로, 다음 좌표점 x+1, y+1을 끝점(P2)로 판단하고 계산을 시작합니다.
마) 현의 길이 절반 P1P3(half chord)와 현의 가운데 점 좌표 P3는 P1, P2에서 간단히 나오고, θ/4 = arctangent(bulge)이므로, 호의 중심각 θ = 4 × arctangent(bulge)입니다.
바) P1P3(half chord) 길이와 호의 중심각 θ가 구해졌으므로, 반경 R(radius) = (half hord) / Sin(θ/2)이 나옵니다.
사) 현의 중심점에서 아크 중심점까지의 거리 S(sagitta) = half chord × bulge
아) P3점을 기준으로 P3P1의 각도는 P3P1(α) = atn(dy/dx)
자) P3점을 기준으로 P3P5의 각도는 P3P5(β) = P3P1(α) - (π/2 = 90˚) (P3는 모든 점에서 수직)
P3P5의 길이는 radius - sagitta
차) 그러므로, 아크의 중심점은
C(x) = 현의 중심점(x) + P3P5 길이 × Cos(P3P5(β))
C(y) = 현의 중심점(y) + P3P5 길이 × Sin(P3P5(β))
카) 시점각 = arctangent { P1(y) / C(y) ÷ P1(x) / C(x) }
종점각 = arctangent { P2(y) / C(y) ÷ P2(x) / C(x) }
타) 코딩에서 주의할 점은, cad에서는 각도가 0 ~ 2π 라디안 범위이므로, arc가 1/4분면과 4/4분면을 교차할 때는 음수(-, negative)에 유의하여 에외처리 code를 추가하여야 합니다.
e.g.
If filterent.GetBulge(i / 2) > 0 And 종점각 < 시점각 Then 종점각 = 종점각 + (pi * 2)
If filterent.GetBulge(i / 2) < 0 And 종점각 > 시점각 Then 시점각 = 시점각 + (pi * 2)
파) Polyline에 포함된 마지막 객체가 아크이고, Object.Closed = true 일때, bulge값이 있는 경우이므로, ElseIf i = (UBound(삽입점) - 1) Then으로 예외처리 코드를 추가했다.
※ 2024.07.21(일) 두 개의 arc로 이루어 진(圓과 같은 형상) polyline의 표현코드 수정했다. AcDb2dPolyline은 안 고침.
④ CODE가 계속 추가되고, 변경되다 보니 file 이름도 헷갈리고 해서 파일명을 바꾸었습니다. project에 지정된 파일명과 다르면 혹시 작업중인 다른 엑셀파일에 영향을 줄까봐 실행을 중지하게 하였는데, 쓸데없는 짓을 한 것 같습니다. 이제는 헷갈려서 지울 수도 없네요. 바꾼 파일명은 "20240329 Autocad용 kamap_Gmap_생태자연도.xlsm"으로,
본문 8-⑨를 다운로드 하세요.
끝.