地図ライブラリとジオコーダーライブラリのJavaScript互換対応

フロントエンドのコードは、地図ライブラリ、ジオコーダーウィジェット、課金が絡み合っているため、プロバイダーの変更で最も苦労する部分です。これらのローダーと設定を使えば、今あるライブラリのコードをそのまま使えます。その裏側で、タイル、ジオコーディング、オートコンプリート、標高は当社から提供されます。地図の読み込みとタイルは無料で、割り当てに数えられるのはジオコーディングの呼び出しだけです。

REST側については、17ホストすべての一覧表と移行チェックリストを互換ホストの仕組みに掲載しています。

このページの内容

Google Maps JavaScript API(地図ライブラリ)

地図ライブラリをmaps.googleapis.comではなくgapi.mygeocode.comから読み込みます。google.maps名前空間が提供され、地図タイル、マーカー、Geocoder、Places Autocomplete、ElevationServiceを当社が配信します。地図の読み込みは割り当てに数えられません。

変更前
<script async defer
  src="https://maps.googleapis.com/maps/api/js?key=YOUR_GOOGLE_KEY&libraries=places&callback=initMap">
</script>
変更後
<script async defer
  src="https://gapi.mygeocode.com/maps/api/js?key=YOUR_MYGEOCODE_KEY&libraries=places&callback=initMap">
</script>
あとはこれまでどおりに使えます
// Nothing below this line changes.
function initMap() {
  const map = new google.maps.Map(document.getElementById("map"), {
    center: { lat: 51.5074, lng: -0.1278 },
    zoom: 12
  });

  const geocoder = new google.maps.Geocoder();
  geocoder.geocode({ address: "221B Baker Street, London" }, (results, status) => {
    if (status === "OK") {
      map.setCenter(results[0].geometry.location);
      new google.maps.Marker({ map, position: results[0].geometry.location });
    }
  });

  const input = document.getElementById("search");
  const autocomplete = new google.maps.places.Autocomplete(input, { fields: ["geometry", "formatted_address"] });
  autocomplete.addListener("place_changed", () => {
    const place = autocomplete.getPlace();
    if (place.geometry) map.panTo(place.geometry.location);
  });
}

含まれるもの

  • 当社のタイルを使ったgoogle.maps.Map(roadmap、satellite、terrainの地図タイプ)
  • Marker、InfoWindow、Polyline、Polygon、Circle、Rectangle、LatLng、LatLngBoundsとevent
  • Geocoder(ジオコーディングと逆ジオコーディング)
  • places.Autocompleteウィジェットとplaces.AutocompleteService
  • ElevationService
  • コントロール、ジェスチャー、同じスタイル配列形式によるスタイル付き地図

含まれないもの

  • ストリートビュー
  • Directions、Distance Matrix、Routes
  • Places Details、Photos、Nearby Search
  • Drawing、Visualization、Geometryの各ライブラリ
  • 3DとWebGLのオーバーレイビュー

リクエストとして数えられるもの。地図の読み込みとタイルのリクエストは無料です。Geocoderの呼び出し、Autocompleteのセッション、ElevationServiceの呼び出しは、それぞれ1リクエストとして数えられます。

Bing Maps V8 Web Control(地図コントロール)

V8コントロールは、Bing Maps for Enterpriseのほかの部分とともに提供終了となります。コントロールをbing.mygeocode.comから読み込めば、Microsoft.Maps名前空間は引き続き動作し、その裏側で当社のタイル、ジオコーディング、オートサジェストが使われます。

変更前
<script async defer
  src="https://www.bing.com/api/maps/mapcontrol?key=YOUR_BING_KEY&callback=loadMap">
</script>
変更後
<script async defer
  src="https://bing.mygeocode.com/api/maps/mapcontrol?key=YOUR_MYGEOCODE_KEY&callback=loadMap">
</script>
あとはこれまでどおりに使えます
function loadMap() {
  const map = new Microsoft.Maps.Map("#map", { center: new Microsoft.Maps.Location(47.6396, -122.13), zoom: 12 });

  Microsoft.Maps.loadModule("Microsoft.Maps.Search", () => {
    const search = new Microsoft.Maps.Search.SearchManager(map);
    search.geocode({
      where: "1 Microsoft Way, Redmond, WA",
      callback: (result) => {
        const loc = result.results[0].location;
        map.setView({ center: loc, zoom: 15 });
        map.entities.push(new Microsoft.Maps.Pushpin(loc));
      }
    });
  });
}

含まれるもの

  • Microsoft.Maps.Map、Location、LocationRect、Pushpin、Infobox、Polyline、PolygonとLayer
  • Searchモジュール:SearchManager.geocodeとreverseGeocode
  • Autosuggestモジュール:AutosuggestManagerと入力欄への紐付け
  • 当社のタイルを使った道路、航空写真、グレースケールの地図タイプ
  • イベント、ナビゲーションバー、地図オプション

含まれないもの

  • Directionsモジュール
  • Traffic、Spatial Data Services、Spatial Mathの高度な機能
  • Bird's eyeとStreetsideの画像
  • Well Known Text、GeoJSON、GeoXmlの各モジュール(代わりにLeafletまたはMapLibreのGeoJSONモジュールをお使いください)

リクエストとして数えられるもの。地図の読み込みとタイルは無料です。geocode、reverseGeocode、オートサジェストのセッションは、それぞれ1リクエストとして数えられます。

Mapbox GL JSとmapbox-gl-geocoder

地図のコードはそのままで、スタイルとジオコーダーのoriginという2つのURLを差し替えます。推奨のレンダラーはMapLibre GL JS(オープンソースのフォーク)で、Mapbox GL JS v1も動作します。mapbox-gl-geocoderにはoriginオプションがあるため、ジオコーダーのコントロールはそれ以外のコード変更を必要としません。

変更前
const map = new mapboxgl.Map({
  container: "map",
  style: "mapbox://styles/mapbox/streets-v12",
  accessToken: "YOUR_MAPBOX_TOKEN"
});
map.addControl(new MapboxGeocoder({
  accessToken: "YOUR_MAPBOX_TOKEN",
  mapboxgl: mapboxgl
}));
変更後
const map = new maplibregl.Map({
  container: "map",
  style: "https://mapbox.mygeocode.com/styles/v1/mygeocode/streets?access_token=YOUR_MYGEOCODE_KEY"
});
map.addControl(new MapboxGeocoder({
  accessToken: "YOUR_MYGEOCODE_KEY",
  origin: "https://mapbox.mygeocode.com",
  mapboxgl: maplibregl
}));
あとはこれまでどおりに使えます
// Direct calls keep the same shape too
const res = await fetch(
  "https://mapbox.mygeocode.com/geocoding/v5/mapbox.places/Oxford%20Street%20London.json?access_token=YOUR_MYGEOCODE_KEY",
  { headers: { "X-API-Key": "YOUR_KEY" } }
);
const { features } = await res.json();
map.flyTo({ center: features[0].center, zoom: 15 });

含まれるもの

  • ベクタータイルのスタイル:streets、light、dark、outdoors(Mapboxスタイル仕様準拠)
  • originオプションを使ったmapbox-gl-geocoder(proximity、bbox、countries、typesを含む)
  • 静的画像:/styles/v1/mygeocode/{style}/static/{lon},{lat},{zoom}/{width}x{height}
  • LeafletとOpenLayers向けのラスタータイル:/v4/mygeocode.streets/{z}/{x}/{y}.png

含まれないもの

  • Mapbox GL JS v2以降(ライセンス上Mapboxのトークンが必要なため、MapLibreをお使いください)
  • Directions、Isochrone、Matrix、OptimizationのAPI
  • Mapbox Studioのカスタムスタイル(代わりにスタイルJSONをアカウントにアップロードしてください)

リクエストとして数えられるもの。タイルと静的画像は無料です。ジオコーダーのリクエストはそれぞれ1リクエストとして数えられます。オートコンプリートのキー入力は、通常どおりコントロール側でデバウンスされます。

Leafletのジオコーダープラグイン

Leafletはプラグインを通じてジオコーダーとやり取りし、主要なプラグインはサービスURLを受け付けます。Leaflet Control Geocoderまたはleaflet-geosearchの接続先をosm.mygeocode.comに向け、ベースマップには当社のタイルをお使いください。

変更前
L.tileLayer("https://tile.openstreetmap.org/{z}/{x}/{y}.png", {
  attribution: "&copy; OpenStreetMap contributors"
}).addTo(map);

L.Control.geocoder({
  geocoder: L.Control.Geocoder.nominatim()
}).addTo(map);
変更後
L.tileLayer("https://tiles.mygeocode.com/streets/{z}/{x}/{y}.png?key=YOUR_MYGEOCODE_KEY", {
  attribution: "&copy; My Geocode"
}).addTo(map);

L.Control.geocoder({
  geocoder: L.Control.Geocoder.nominatim({
    serviceUrl: "https://osm.mygeocode.com/",
    geocodingQueryParams: { key: "YOUR_MYGEOCODE_KEY" }
  })
}).addTo(map);
あとはこれまでどおりに使えます
// leaflet-geosearch works the same way
import { OpenStreetMapProvider, GeoSearchControl } from "leaflet-geosearch";

const provider = new OpenStreetMapProvider({
  searchUrl: "https://osm.mygeocode.com/search",
  reverseUrl: "https://osm.mygeocode.com/reverse",
  params: { key: "YOUR_MYGEOCODE_KEY", addressdetails: 1 }
});
map.addControl(new GeoSearchControl({ provider, style: "bar" }));

含まれるもの

  • Leaflet Control Geocoder:nominatim、google、bing、mapbox、here、opencage、latLng、mapquestの各ジオコーダーを、それぞれ対応するwww.mygeocode.comのホストに向けて使用
  • leaflet-geosearch:OpenStreetMapProvider、GoogleProvider、BingProvider、HereProvider、LocationIQProvider、OpenCageProviderとGeoapifyProvider
  • streets、light、darkスタイルのラスタータイル
  • NominatimのURLを設定できるその他のプラグイン

含まれないもの

  • ルート検索プラグイン(Leaflet Routing Machineなど)
  • 記載の3つ以外のタイルスタイル

リクエストとして数えられるもの。タイルは無料です。ジオコーディングと逆ジオコーディングは、それぞれ1リクエストとして数えられます。

HERE Maps API for JavaScript(地図ライブラリ)

mapsjsのバンドルをhere.mygeocode.comから読み込み、通常どおりplatformを作成します。H.Map、H.service.Platform、検索サービスはシグネチャを変えずに、当社のベクタータイルとジオコーディングで動作します。

変更前
<script src="https://js.api.here.com/v3/3.1/mapsjs-core.js"></script>
<script src="https://js.api.here.com/v3/3.1/mapsjs-service.js"></script>
<script src="https://js.api.here.com/v3/3.1/mapsjs-ui.js"></script>
<script src="https://js.api.here.com/v3/3.1/mapsjs-mapevents.js"></script>
変更後
<script src="https://here.mygeocode.com/v3/3.1/mapsjs-core.js"></script>
<script src="https://here.mygeocode.com/v3/3.1/mapsjs-service.js"></script>
<script src="https://here.mygeocode.com/v3/3.1/mapsjs-ui.js"></script>
<script src="https://here.mygeocode.com/v3/3.1/mapsjs-mapevents.js"></script>
あとはこれまでどおりに使えます
const platform = new H.service.Platform({ apikey: "YOUR_MYGEOCODE_KEY" });
const layers = platform.createDefaultLayers();
const map = new H.Map(document.getElementById("map"), layers.vector.normal.map, {
  center: { lat: 52.5304, lng: 13.3853 }, zoom: 13
});

platform.getSearchService().geocode(
  { q: "Invalidenstraße 116, Berlin" },
  (result) => {
    const { position } = result.items[0];
    map.setCenter(position);
    map.addObject(new H.map.Marker(position));
  },
  (err) => console.error(err)
);

含まれるもの

  • H.Map, H.map.Marker, H.map.Polyline, H.map.Polygon, H.map.Group
  • createDefaultLayers付きのH.service.Platform(ベクターのnormal、satellite、terrain)
  • SearchService:geocode、reverseGeocodeとautosuggest
  • H.ui.UIの標準コントロールとH.mapevents.Behavior
  • H.geo.Point、H.geo.Rectとヘルパー

含まれないもの

  • Routing、Isoline、Public Transitの各サービス
  • 交通情報と事故情報のレイヤー
  • Places DiscoverとBrowse
  • HERE Style Editorのカスタム地図スタイル(当社のスタイルJSON形式をお使いください)

リクエストとして数えられるもの。地図の読み込みとタイルは無料です。geocode、reverseGeocode、autosuggestの呼び出しは、それぞれ1リクエストとして数えられます。

MapQuest.js

MapQuest.jsはLeafletをラップし、L.mapquest.geocoding()を追加したものです。バンドルをmapquest.mygeocode.comから読み込み、これまでどおりキーを設定してください。

変更前
<script src="https://api.mqcdn.com/sdk/mapquest-js/v1.3.2/mapquest.js"></script>
<link type="text/css" rel="stylesheet" href="https://api.mqcdn.com/sdk/mapquest-js/v1.3.2/mapquest.css"/>
変更後
<script src="https://mapquest.mygeocode.com/sdk/mapquest-js/v1.3.2/mapquest.js"></script>
<link type="text/css" rel="stylesheet" href="https://mapquest.mygeocode.com/sdk/mapquest-js/v1.3.2/mapquest.css"/>
あとはこれまでどおりに使えます
L.mapquest.key = "YOUR_MYGEOCODE_KEY";

const map = L.mapquest.map("map", {
  center: [41.8789, -87.6359],
  layers: L.mapquest.tileLayer("map"),
  zoom: 12
});

L.mapquest.geocoding().geocode("233 S Wacker Dr, Chicago, IL", (err, response) => {
  const loc = response.results[0].locations[0].latLng;
  map.setView(loc, 15);
  L.marker(loc, { icon: L.mapquest.icons.marker() }).addTo(map);
});

含まれるもの

  • L.mapquest.mapとtileLayer(map、hybrid、satellite、light、dark)
  • geocodeとreverseを備えたL.mapquest.geocoding
  • L.mapquest.searchAhead(オートコンプリート)コントロール
  • アイコン、コントロールの位置、標準のLeaflet API

含まれないもの

  • 経路案内とルートのレイヤー
  • 交通情報レイヤー
  • Static Map API(静的地図)

リクエストとして数えられるもの。タイルは無料です。geocode、reverse、search-aheadのリクエストは、それぞれ1リクエストとして数えられます。

地図タイルとスタイル

上記のローダーはすべて同じタイルサービスを使っており、このサービスはどのライブラリからでも直接利用できます。

形式URL
ラスター、256pxhttps://tiles.mygeocode.com/{style}/{z}/{x}/{y}.png
ラスター、512px(高密度ディスプレイ向け)https://tiles.mygeocode.com/{style}/{z}/{x}/{y}@2x.png
ベクタータイル(MVT)https://tiles.mygeocode.com/v/{z}/{x}/{y}.pbf
MapLibreとMapbox GL向けのスタイルJSONhttps://tiles.mygeocode.com/styles/{style}.json

スタイルはstreetslightdarkoutdoorssatelliteです。タイルのトラフィックは課金されず、キーも不要です。当社のタイルはOpenStreetMapのデータと当社独自のデータから描画されています。帰属表示コントロールには© OpenStreetMap contributorsMy Geocodeを表示する必要があり、上記のローダーがこれを自動で追加します。

ブラウザでのキーの扱い

クライアント側のコードにAPIキーを入れないでください。ページのソースにあるキーは誰でも読めるキーです。また、キーは同時に2つか3つのIPアドレスからしか使えないため、いずれにしても2人目か3人目の訪問者の時点で動作しなくなります。

地図タイル、スタイル、上記のライブラリローダーにはキーが一切不要なので、地図そのものは常に動作します。ライブラリが行うジオコーディング、オートコンプリート、標高の呼び出しは、自社のサーバーを経由させてください:ローダーはproxyパラメーター(gapi.mygeocode.com/maps/api/js?proxy=https://yoursite.com/geo)を受け付け、それらの呼び出しをそこに送ります。サーバーがキーを付加して、リクエストを当社に中継します。その場合、上記のYOUR_MYGEOCODE_KEYのプレースホルダーは空のままにします。

  • プロキシでは、ブラウザではできないキャッシュや独自の制限を追加できます。
  • リクエストはサーバーのアドレスから届くようになるため、1つのキーで何人の訪問者にも対応できます。