8 votos

Mapa de países visitados con diferentes proyecciones de mapas

Hay un par de sitios web donde puedes crear un mapa de los países que has visitado, por ejemplo, http://www.amcharts.com/visited_countries. Creo que sería algo genial para añadir a mi blog de viajes. Sin embargo, todas las páginas que pude encontrar utilizan una proyección de Mercator para el mapa, la cual no me gusta particularmente. Me preguntaba si alguien sabe cómo crear este tipo de mapas con diferentes proyecciones (como Hobo-Dyer o Gall-Peters).

2 votos

Ah, Gall-Peters, la proyección de elección si tienes que usar una proyección de área igual pero quieres evitar una que distorsione visiblemente Europa central. Y Hobo-Dyer es lo mismo, pero favoreciendo las latitudes de los Estados Unidos continentales en lugar de Europa.

1 votos

Si deseas crear uno por ti mismo, puedes descargar la imagen de contorno gratuita de hobo dyer en odt.org/Pictures/hdpoutlinelarge.jpg

6voto

ElGringoGrande Puntos 432

Te sugeriría utilizar algo como python + matplotlib y su librería basemap.

Basemap ofrece una amplia gama de proyecciones (ver aquí), y luego puedes trazar los lugares a los que has ido en el mapa. Esto luego se puede guardar en una variedad de formatos para publicar en tu blog o puedes usar algo como plot.ly para producirlos en línea. Un buen ejemplo en un cuaderno iPython (pero usando las temperaturas globales) se encuentra aquí con buenas explicaciones de cómo se hizo.

Un ejemplo del código necesario para hacer una proyección (con un solo punto):

from mpl_toolkits.basemap import Basemap
import numpy as np
import matplotlib.pyplot as plt
width = 28000000; lon_0 = -105; lat_0 = 40  # Cambiar la latitud/longitud de origen aquí
m = Basemap(width=width,height=width,projection='aeqd', # Cambiar la proyección aquí
            lat_0=lat_0,lon_0=lon_0)
# rellenar fondo
m.drawmapboundary(fill_color='aqua')
# dibujar costas y rellenar continentes
m.drawcoastlines(linewidth=0.5)
m.fillcontinents(color='coral',lake_color='aqua')
# graticule de 20 grados
m.drawparallels(np.arange(-80,81,20))
m.drawmeridians(np.arange(-180,180,20))
# dibujar un punto negro en el centro
xpt, ypt = m(lon_0, lat_0)
m.plot([xpt],[ypt],'ko')
# dibujar el título
plt.title('Proyección Azimutal Equidistante')
plt.show()

Los resultados: Ejemplo ARP Una vez que tengas configurado el proceso básico, puedes cambiar la proyección o el centro de la proyección en segundos.

Proyecciones disponibles:

Proyección Azimutal Equidistante, Proyección Gnomónica, Proyección Ortográfica, Proyección Geostacionaria, Proyección de Perspectiva de Lado Cercano, Proyección de Mollweide, Proyección de Hammer, Proyección de Robinson, Proyección de Eckert IV, Proyección de Kavrayskiy VII, Polar Cuártica Plana McBryde-Thomas, Proyección Sinusoidal, Proyección Cilíndrica Equidistante, Proyección Cassini, Proyección Mercator, Proyección Mercator Transversal, Proyección Mercator Oblicua, Proyección Policónica, Proyección Cilíndrica de Miller, Proyección Estereográfica de Gall, Proyección Cilíndrica de Área Igual, Proyección Cónica de Lambert, Proyección Azimutal de Área Igual de Lambert, Proyección Estereográfica, Proyección Cónica Equidistante, Proyección de Área Igual de Albers, Proyección Estereográfica Polar, Proyección Azimutal de Área Igual Polar, Proyección van der Grinten

Todas las herramientas mencionadas son completamente gratuitas, tanto en términos de sin costo como en términos de ser herramientas de código abierto sin restricciones.

0 votos

Épico, y voté positivo, pero un no programador va a tener problemas con esto :/

0 votos

@MarkMayo - Python es gratuito, fácil de empezar, rápido de comenzar a aprender, tiene muchos ejemplos en línea, puede ser adictivo y hay muchas personas muy útiles por ahí.

1 votos

Por supuesto, yo sé esto (he tenido contratos de python) pero para muchas personas, cualquier programación es intimidante :( Sin embargo, para cualquiera que esté leyendo esto, Python es un lenguaje divertido y relativamente fácil de aprender. :)

2voto

Harry Wood Puntos 121

Si deseas algo más interactivo hecho en javascript, la librería d3js tiene algunos ejemplos encantadores de "choropleth"

Lo siento, esta es otra respuesta de programación, por lo que tendrás que adaptarlo a tus necesidades, así como persuadir a que todo funcione dentro del sistema de blogs que uses.

Aquí he adaptado este ejemplo de choropleth, cambiado a una proyección diferente, eliminado la fuente de datos csv "world populations" y reemplazado con unas cuantas líneas básicas más de datos de "países visitados" (en una escala de 0 a 2)

// El svg
var svg = d3.select("svg"),
  width = +svg.attr("width"),
  height = +svg.attr("height");

// Mapa y proyección
var path = d3.geoPath();
var projection = d3.geoNaturalEarth()
    .scale(width / 2 / Math.PI)
    .translate([width / 2, height / 2])

// Datos y escala de colores
var data = d3.map();
var colorScale = d3.scaleThreshold()
  .domain([0, 1, 2])
  .range(d3.schemeBlues[3]);

// Cargar datos externos y activar
d3.queue()
  .defer(d3.json, "https://raw.githubusercontent.com/holtzy/D3-graph-gallery/master/DATA/world.geojson")
  .await(ready);

function ready(error, topo) {
  // Códigos de países visitados. 1 vez / 2 o más veces.
  data.set("GBR", 2);
  data.set("IRL", 1);
  data.set("FRA", 2);
  data.set("ESP", 2);
  data.set("BRA", 2);
  data.set("ARG", 1);
  data.set("CHN", 1);
  data.set("EGY", 1);

  let mouseOver = function(d) {
    d3.selectAll(".Country")
      .transition()
      .duration(200)
      .style("opacity", .5)
    d3.select(this)
      .transition()
      .duration(200)
      .style("opacity", 1)
  }

  let mouseLeave = function(d) {
    d3.selectAll(".Country")
      .transition()
      .duration(200)
      .style("opacity", .8)
    d3.select(this)
      .transition()
      .duration(200)
      .style("stroke", "transparent")
  }

  // Dibujar el mapa
  svg.append("g")
    .selectAll("path")
    .data(topo.features)
    .enter()
    .append("path")
      // dibujar cada país
      .attr("d", d3.geoPath()
        .projection(projection)
      )
      // establecer el color de cada país
      .attr("fill", function (d) {
        d.total = data.get(d.id) || 0;
        return colorScale(d.total);
      })
      .style("stroke", "transparent")
      .attr("class", function(d){ return "Country" } )
      .style("opacity", .8)
      .on("mouseover", mouseOver )
      .on("mouseleave", mouseLeave )
    }

Para menos programación, supongo que idealmente querrías algo así como un plugin de wordpress.

ViajeroSabio.com

ViajeroSabio es una comunidad de viajeros en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros viajeros, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X