2006/11/03

원문 : http://www.joinc.co.kr/modules/moniwiki/wiki.php/Site/Google/Service/GoogleMapAPI

1 구글의 개발자 포용 정책

구글은 다양한 개발자를 자신의 영역으로 끌어들이기 위한 개방정책을 사용한다. 그래서 대부분의 서비스들이 서비스를 제어할 수 있는 API를 공개적으로 제공하고 있다. 개발자는 이 API를 이용해서 구글이 선보인 서비스를 단순히 둘러보는 정도에 그치지 않고, 다양한 응용을 시도해볼 수 있다. 구글 MAP같은 경우 구글에서 서비스를 만들어내기도 전에, 구글이 제공한 API를 이용해서 자신들만의 독특한 서비스를 만들어낸 사용자들이 있다. http://HousingMaps.com 의 경우 미국 주요도시의 집값 정보를 보여주며, http://ChicagoCrime.org 는 도시내의 범죄와 범행위치를 검색하는 서비스를 제공하고 있다.

자신의 제품을 사용하거나 테스트해줄 많은 개발자들을 확보하는건 소프트웨어 회사가 성장하기 위한 가장 중요한 동력원임은 말할필요도 없을 것이다. 기존에도 개발자를 자신의 영역으로 끌어들이기 위한 노력을 해왔던건 사실이지만, 많은 제한을 둔 폐쇄적인 형태로 이루어졌었다. 구글은 정보를 완전히 공개하고 있으며, 많은 우호적인 개발자 세력을 만들어냈다. 이들 개발자는 구글매니아로 불리우는 중요 고객이기도 하다. 최근에는 국내 대형포탈들도 이러한 공개 개발자 포용정책을 펴나가는 추세다.

2 구글 Map API

구글 Map은 Ajax기 술을 사용하는 구글의 대표적인 서비스들 중 하나이다. 구글은 단순히 서비스를 제공하는데 그치지 않고 개발자의 참여를 끌어들이기 위해 API를 공개하고 있다. 구글 Map API를 이용하면 자신의 사이트에 구글 Map을 붙이고, 테스트하면서 새로운 응용을 만들 수 있다. Map API를 사용하기 위해서는 Map Key를 받아야 하는데, http://www.google.com/apis/maps 를 방문해서 Map을 사용할 URL만 명시해주면 바로 Key를 받을 수 있다. 그다음 생성된 코드를 가져다 붙이기만 하면 자신의 사이트에서 바로 구글 Map을 붙일 수 있다.

gmap.png

Map Key는 구글 maps 자바스크립트를 불러올때 key에 명시하면 된다.




3 구글 MAP API 분석

구글 MAP API는 JavaScript로 제어된다. 여기에서는 완전한 형태의 HTML 파일을 보여주지는 않을 것이다. 완전한 HTML 페이지를 만드는건 Map Key를 생성할 때 만들어지는 HTML 코드를 이해하는 것만으로 충분할 것이다.

3.1 기본

구글 Map을 불러오기 위한 가장 기본이 되는코드다. 서울주변을 보여준다.
var map = new GMap2(document.getElementById("map"));
map.setCenter(new GLatLng(36.615527631349245, 127.353515625), 4);

setCenter을 이용해서 보여줄 위치를 지정한다. 첫번째 인자는 좌표를 지정하기 위해서 사용한다. 두번째 인자는 지도의 해상도를 결정하기 위해서 사용한다. 숫자가 클 수록 더 자세한 결과를 보여준다.
[http]simple.html 예제

3.2 Map에서의 이동

다음은 맵에서 중심을 이동하는 예제다. panTo 메서드를 이용하면 해당 중심으로 지도를 부드럽게 이동시킨다. 길찾기등의 기능구현에 유용하게 사용할 수 있을 거 같다.
var map = new GMap2(document.getElementById("map"));
map.setCenter(new GLatLng(36.615527631349245, 127.353515625), 4);
window.setTimeout(function() {
map.panTo(new GLatLng(42.615527631349245, 128.353515625));
}, 2000);

[http]animate.html 예제

3.3 Control 버튼 추가하기

맵을 확대기시커나 모드를 바꾸거나 하는등의 제어를 위한 컨트롤 버튼을 추가한다. 참고로 구글 맵은 , 위성, 합성의 3가지 모드를 제공한다.
var map = new GMap2(document.getElementById("map"));
map.addControl(new GSmallMapControl());
map.addControl(new GMapTypeControl());
map.setCenter(new GLatLng(36.615527631349245, 127.353515625), 4);

[http]control.html 예제

3.4 Event Listener

event listener는 GEvent.addListener를 호출해서 생성한다. 이것은 맵에서 발생하는 이벤트를 알려준다. 아래의 예제에서 맵을 움직일 경우 변경된 좌표가 출력되는걸 확인할 수 있을 것이다.
var map = new GMap2(document.getElementById("map"));
GEvent.addListener(map, "moveend", function() {
var center = map.getCenter();
document.getElementById("message").innerHTML = center.toString();
});
map.addControl(new GSmallMapControl());
map.addControl(new GMapTypeControl());
map.setCenter(new GLatLng(36.615527631349245, 127.353515625), 4);

[http]event.html 예제

3.5 정보창 열기

openInfoWindow를 이용하면 원하는 지역에 DOM정보를 출력할 수 있다. 다음은 맵중앙에 저는 여기에 살아요메시지를 출력하는 코드다.
map.setCenter(new GLatLng(36.615527631349245, 127.353515625), 4);
map.openInfoWindow(map.getCenter(),
document.createTextNode("저는 여기에 살아요"));

[http]infowindow.html 예제

3.6 맵에 표시하기

이번 예제는 overlay기능을 이용해서 지도에 랜덤하게 10개의 마크를 표시한다. 마크에 사용되는 이미지는 기본 이미지이며, 사용자 정의 아이콘을 만들 수도 있다. 우리나라는 아직 상세지도가 제공되지 않은 관계로 일본의 동경시를 기준으로 예제를 만들었다.
map.setCenter(new GLatLng(35.76873101871279, 139.5413875579834), 12);

var bounds = map.getBounds();
var southWest = bounds.getSouthWest();
var northEast = bounds.getNorthEast();
var lngSpan = northEast.lng() - southWest.lng();
var latSpan = northEast.lat() - southWest.lat();

// 랜덤 포인트를 만들고 각각의 포인트에 마킹을 한다.
for (var i = 0; i < 10; i++) {
var point = new GLatLng(southWest.lat() + latSpan * Math.random(),
southWest.lng() + lngSpan * Math.random());
map.addOverlay(new GMarker(point));
}
// 랜덤 포인트를 만들고 이것을 연결한다.
var points = [];
for (var i = 0; i < 5; i++) {
points.push(new GLatLng(southWest.lat() + latSpan * Math.random(),
southWest.lng() + lngSpan * Math.random()));
}
points.sort(function(p1, p2) {
return p1.lng() - p2.lng();
});
map.addOverlay(new GPolyline(points));

[http]overlay.html 예제

3.7 클릭 이벤트 제어

맵에 클릭을 할경우 이벤트를 받아서 마킹을 하는 예제다. 앞서 배웠던 addListenr메서드를 이용해서 click 이벤트를 기다리고, 클릭이 발생하면 addOverlay메서드를 이용해서 마킹을 한다.
map.addControl(new GSmallMapControl());
map.addControl(new GMapTypeControl());
map.setCenter(new GLatLng(35.76873101871279, 139.5413875579834), 12);
GEvent.addListener(map, "click", function(marker, point)
{
if (marker)
{
map.removeOverlay(marker);
} else {
map.addOverlay(new GMarker(point));
}
});

[http]click.html 예제

3.8 마커에 정보 창 출력하기

10개의 마커를 랜덤하게 표시하고, 마커를 클릭하면 클릭이벤트에 대한 Listener가 작동하도록 해보자. Listener 함수는 openInfoWindowHtml메서드를 이용해서 정보창을 출력한다.
var map = new GMap2(document.getElementById("map"));
map.addControl(new GSmallMapControl());
map.addControl(new GMapTypeControl());
map.setCenter(new GLatLng(35.76873101871279, 139.5413875579834), 12);
function createMarker(point, number)
{
var marker = new GMarker(point);
GEvent.addListener(marker, "click", function()
{
marker.openInfoWindowHtml("Marker #" + number + "");
});
return marker;
}

var bounds = map.getBounds();
var southWest = bounds.getSouthWest();
var northEast = bounds.getNorthEast();
var lngSpan = northEast.lng() - southWest.lng();
var latSpan = northEast.lat() - southWest.lat();
for (var i = 0; i < 10; i++)
{
var point = new GLatLng(southWest.lat() + latSpan * Math.random(),
southWest.lng() + lngSpan * Math.random());
map.addOverlay(createMarker(point, i + 1));
}

[http]markerinfo.html 예제

2006/10/30

구글을 이용한 나만의 검색엔진 만들기


구글은 특정 사이트에서 이용가능한 검색이 가능한 서비스를 지원하고 있다. 개인화 검색이라고 할만한데, 이러한 서비스들을 이용하면 자신의 사이트를 위한 검색창을을 붙일 수 있다. 이미 field 별 검색을 오래전부터 지원하고 있는 구글임을 생각할 때, 이러한 서비스를 개발하는건 크게 문제가 되지 않았을 것이다. 예를 들어서 pthread를 포함한 문서를 www.joinc.co.kr 사이트내에서만 검색하길 원한다면 site:www.joinc.co.kr pthread 하는 식으로 field를 지정할 수 있었다. 그렇다면 iframe만 적용하면 되니, 구글 입장에서도 이러한 사이트 전용 검색서비스를 만드는게 어렵진 않았을 것이다. 다음은 사이트 전용 검색엔진을 만드는 방법들로 필자의 사이트에 실제 활용하고 있는 서비스들이다.

검색을 위한 Adsense

Adsense는 구글의 광고서비스중에서 전체 광고 수익의 50%가량을 차지하는 중요한 서비스다. 이 서비스는 사용자의 페이지의 성격에 맞는 광고를 게재하고 이를 클릭하면 과금하는 방식인데, 검색창을 통해서 광고수익을 낼 수 있도록 하고 있다. 사이트에 검색창을 달아 놓고, 이를 통해서 검색하면, 검색어와 관련있는 광고가 뜨고 이를 클릭하도록 유도하는 방식이다.

검색을 위한 Adsense를 사용하기 위해서는 먼저 Adsense에 가입해야 된다. 과정은 매우 간단하다. 그러면 Wizard 형식으로 간단하게 사이트에 삽입가능한 HTML 형식의 검색코드를 만들 수 있는데, 이걸 가져다가 붙이기만 하면 된다. 검색코드에는 검색결과를 어떤 사이트에서 찾을 건지를 결정할 수 있다. 또한 자신의 사이트내에 검색결과가 삽입되게 할 수도 있다. 아래는 필자의 사이트에 있는 검색을 위한 Adsense인데, 직접 검색을 해보기 바란다. 어떤 형식으로 사이트에 붙이는지 알 수 있을 것이다.


Web joinc

구글 co-op

검색을 위한 Adsense를 이용하는 방법도 괜찮기는 하지만, 애초에 광고를 위한 서비스라서 개인화 검색 지원에 좀 취약한면이 있다. 또한 과금과 관련된 서비스라서 이것 저것 기입해야 하는 것이 많은 것도 불만이다. 그렇다면 구글 co-op를 이용하길 바란다.

gmail 계정만 가지고 있으면, 간단하게 만들 수 있다. 검색에 포함시킬 사이트, 검색에서 제외시킬 사이트 등을 지정할 수 있으며, Look and Feel 도 변경가능하다. Adsense 계정이 있을 경우 광고를 노출 시킬 수도 있다. 그리고 Collaboration 이라는 기능도 있는데, 이걸 이용하면 검색창을 다른 사이트에도 게재할 수 있다. 기본적인 성능으로 봤을 때는 검색을 위한 Adsense로도 필요한 것을 다 할 수 있기는 하지만, 구글 co-op가 아직 베타서비스이고 개인화 전용 서비스라는걸 감안한다면 앞으로 더 유용하게 사용할 수 있으리라 생각된다.

다음은 필자의 구글 co-op 테스트 페이지다. http://www.joinc.co.kr/custom.html 기존에 구축해논게 있어서 당분간은 검색을 위한 Adsense를 사용할 계획이다.