Reemplazos compatibles en JavaScript para bibliotecas de mapas y de geocodificación

El código de front-end es donde más duele cambiar de proveedor, porque la biblioteca de mapas, el widget de geocodificación y la facturación están entrelazados. Estos cargadores y ajustes te permiten conservar el código de biblioteca que ya tienes. Detrás, los mapas base, la geocodificación, el autocompletado y la elevación los ponemos nosotros. Las cargas de mapa y los mapas base son gratuitos; solo las llamadas de geocodificación cuentan para tu cuota.

Para la parte REST, la tabla de los diecisiete hosts y la lista de comprobación de migración están en cómo funcionan los hosts compatibles.

En esta página

Google Maps JavaScript API

Carga la biblioteca de mapas desde gapi.mygeocode.com en lugar de maps.googleapis.com. Se proporciona el espacio de nombres google.maps, con los mapas base, los marcadores, el Geocoder, Places Autocomplete y el ElevationService servidos por nosotros. Las cargas de mapa no cuentan para tu cuota.

Antes
<script async defer
  src="https://maps.googleapis.com/maps/api/js?key=YOUR_GOOGLE_KEY&libraries=places&callback=initMap">
</script>
Después
<script async defer
  src="https://gapi.mygeocode.com/maps/api/js?key=YOUR_MYGEOCODE_KEY&libraries=places&callback=initMap">
</script>
Después, úsala como antes
// 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);
  });
}

Incluido

  • google.maps.Map con nuestros mapas base (tipos de mapa roadmap, satellite y terrain)
  • Marker, InfoWindow, Polyline, Polygon, Circle, Rectangle, LatLng, LatLngBounds y event
  • Geocoder (directo e inverso)
  • Widget places.Autocomplete y places.AutocompleteService
  • ElevationService
  • Controles, gestos y mapas con estilo con el mismo formato de array de estilos

No incluido

  • Street View
  • Directions, Distance Matrix y Routes
  • Places Details, Photos y Nearby Search
  • Bibliotecas Drawing, Visualization y Geometry
  • Vistas 3D y superposiciones WebGL

Qué cuenta como solicitud. Las cargas de mapa y las solicitudes de mapas base son gratuitas. Cada llamada a Geocoder, cada sesión de Autocomplete y cada llamada a ElevationService cuenta como una solicitud.

Bing Maps V8 Web Control

El control V8 se retira junto con el resto de Bing Maps for Enterprise. Carga el control desde bing.mygeocode.com y el espacio de nombres Microsoft.Maps sigue funcionando, con nuestros mapas base, geocodificación y autosugerencias detrás.

Antes
<script async defer
  src="https://www.bing.com/api/maps/mapcontrol?key=YOUR_BING_KEY&callback=loadMap">
</script>
Después
<script async defer
  src="https://bing.mygeocode.com/api/maps/mapcontrol?key=YOUR_MYGEOCODE_KEY&callback=loadMap">
</script>
Después, úsala como antes
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));
      }
    });
  });
}

Incluido

  • Microsoft.Maps.Map, Location, LocationRect, Pushpin, Infobox, Polyline, Polygon y Layer
  • Módulo Search: SearchManager.geocode y reverseGeocode
  • Módulo Autosuggest: AutosuggestManager y la vinculación al campo de entrada
  • Tipos de mapa de carreteras, aéreo y en escala de grises con nuestros mapas base
  • Eventos, barra de navegación y opciones del mapa

No incluido

  • Módulo Directions
  • Traffic, Spatial Data Services y las funciones avanzadas de Spatial Math
  • Imágenes Bird's eye y Streetside
  • Módulos Well Known Text, GeoJSON y GeoXml (usa en su lugar el módulo GeoJSON de Leaflet o MapLibre)

Qué cuenta como solicitud. Las cargas de mapa y los mapas base son gratuitos. Cada geocode, cada reverseGeocode y cada sesión de autosuggest cuenta como una solicitud.

Mapbox GL JS y mapbox-gl-geocoder

Conserva el código de tu mapa y cambia las dos URL: la del estilo y el origen del geocodificador. MapLibre GL JS (el fork de código abierto) es el motor de renderizado recomendado; Mapbox GL JS v1 también funciona. mapbox-gl-geocoder tiene una opción origin, así que el control de geocodificación no necesita más cambios de código que ese.

Antes
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
}));
Después
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
}));
Después, úsala como antes
// 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 });

Incluido

  • Estilos de teselas vectoriales: streets, light, dark y outdoors, según la especificación de estilos de Mapbox
  • mapbox-gl-geocoder con la opción origin, incluidos proximity, bbox, countries y types
  • Imágenes estáticas en /styles/v1/mygeocode/{style}/static/{lon},{lat},{zoom}/{width}x{height}
  • Teselas ráster en /v4/mygeocode.streets/{z}/{x}/{y}.png para Leaflet y OpenLayers

No incluido

  • Mapbox GL JS v2 y posteriores (su licencia exige tokens de Mapbox; usa MapLibre)
  • API Directions, Isochrone, Matrix y Optimization
  • Estilos personalizados de Mapbox Studio (en su lugar, sube el JSON de tu estilo a tu cuenta)

Qué cuenta como solicitud. Las teselas y las imágenes estáticas son gratuitas. Cada solicitud al geocodificador cuenta como una solicitud; el control aplica debounce a las pulsaciones del autocompletado como de costumbre.

Plugins de geocodificación de Leaflet

Leaflet se comunica con los geocodificadores mediante plugins, y los más populares aceptan una URL de servicio. Apunta Leaflet Control Geocoder o leaflet-geosearch a osm.mygeocode.com y usa nuestras teselas para el mapa base.

Antes
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);
Después
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);
Después, úsala como antes
// 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" }));

Incluido

  • Leaflet Control Geocoder: geocodificadores nominatim, google, bing, mapbox, here, opencage, latLng y mapquest, cada uno apuntando al host de www.mygeocode.com correspondiente
  • leaflet-geosearch: OpenStreetMapProvider, GoogleProvider, BingProvider, HereProvider, LocationIQProvider, OpenCageProvider y GeoapifyProvider
  • Teselas ráster en los estilos streets, light y dark
  • Cualquier otro plugin que te permita configurar la URL de Nominatim

No incluido

  • Plugins de cálculo de rutas (Leaflet Routing Machine y similares)
  • Estilos de teselas distintos de los tres indicados

Qué cuenta como solicitud. Las teselas son gratuitas. Cada geocodificación directa y cada geocodificación inversa cuenta como una solicitud.

HERE Maps API for JavaScript

Carga los paquetes mapsjs desde here.mygeocode.com y crea la plataforma como de costumbre. H.Map, H.service.Platform y el servicio de búsqueda conservan sus firmas, con teselas vectoriales y geocodificación nuestras.

Antes
<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>
Después
<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>
Después, úsala como antes
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)
);

Incluido

  • H.Map, H.map.Marker, H.map.Polyline, H.map.Polygon, H.map.Group
  • H.service.Platform con createDefaultLayers (vector normal, satélite, terreno)
  • SearchService: geocode, reverseGeocode y autosuggest
  • Controles predeterminados de H.ui.UI y H.mapevents.Behavior
  • H.geo.Point, H.geo.Rect y funciones auxiliares

No incluido

  • Servicios Routing, Isoline y Public Transit
  • Capas de tráfico e incidencias
  • Places Discover y Browse
  • Estilos de mapa personalizados de HERE Style Editor (usa nuestro formato JSON de estilos)

Qué cuenta como solicitud. Las cargas de mapa y los mapas base son gratuitos. Cada llamada a geocode, reverseGeocode y autosuggest cuenta como una solicitud.

MapQuest.js

MapQuest.js envuelve Leaflet y añade L.mapquest.geocoding(). Carga el paquete desde mapquest.mygeocode.com y configura tu clave como antes.

Antes
<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"/>
Después
<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"/>
Después, úsala como antes
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);
});

Incluido

  • L.mapquest.map y tileLayer (map, hybrid, satellite, light, dark)
  • L.mapquest.geocoding con geocode y reverse
  • Control L.mapquest.searchAhead (autocompletado)
  • Iconos, posiciones de los controles y la API estándar de Leaflet

No incluido

  • Capas de indicaciones y rutas
  • Capa de tráfico
  • Static Map API

Qué cuenta como solicitud. Las teselas son gratuitas. Cada solicitud de geocode, reverse y search-ahead cuenta como una solicitud.

Mapas base y estilos

Todos los cargadores anteriores usan el mismo servicio de teselas, que también puedes usar directamente desde cualquier biblioteca.

FormatoURL
Ráster, 256pxhttps://tiles.mygeocode.com/{style}/{z}/{x}/{y}.png
Ráster, 512px para pantallas de alta densidadhttps://tiles.mygeocode.com/{style}/{z}/{x}/{y}@2x.png
Teselas vectoriales (MVT)https://tiles.mygeocode.com/v/{z}/{x}/{y}.pbf
JSON de estilo para MapLibre y Mapbox GLhttps://tiles.mygeocode.com/styles/{style}.json

Los estilos son streets, light, dark, outdoors y satellite. El tráfico de teselas no se factura y no necesita clave. Nuestras teselas se generan a partir de datos de OpenStreetMap y datos propios; el control de atribución debe mostrar © OpenStreetMap contributors y My Geocode, algo que los cargadores anteriores añaden por ti.

Claves en el navegador

No pongas una clave de API en el código del lado del cliente. Una clave en el código fuente de una página es una clave que cualquiera puede leer y, como una clave funciona desde dos o tres direcciones IP a la vez, de todos modos deja de funcionar después del segundo o tercer visitante.

Los mapas base, los estilos y los cargadores de bibliotecas anteriores no necesitan ninguna clave, así que el mapa en sí siempre funciona. Para las llamadas de geocodificación, autocompletado y elevación que hacen las bibliotecas, pásalas por tu propio servidor: los cargadores aceptan un parámetro proxy (gapi.mygeocode.com/maps/api/js?proxy=https://yoursite.com/geo) y envían esas llamadas allí; tu servidor añade la clave y nos reenvía la solicitud. Los marcadores YOUR_MYGEOCODE_KEY de los ejemplos anteriores se dejan entonces vacíos.

  • Tu proxy puede añadir caché y sus propios límites, algo que los navegadores no pueden hacer.
  • Las solicitudes llegan entonces desde la dirección de tu servidor, así que una sola clave cubre cualquier número de visitantes.