Hacker Newsnew | past | comments | ask | show | jobs | submitlogin
Show HN: Closest Volcano (closestvolcano.com)
70 points by rontoes on Oct 18, 2019 | hide | past | favorite | 40 comments


It would be nice if there was a way to manually enter location, since the location API on desktop is for me inaccurate by hundreds of miles.


Agreed. Actually, I think the default behaviour should be to show a map with a Voronoi diagram so you can immediately see the closest volcano for any location.

Hm. The volcano locations are in a JSON list, and SciPy can do spherical Voronoi calculations...

Edit: Someone already did it for Iceland (though without marking the volcano positions): https://www.flickr.com/photos/78506020@N00/6807458402/


I worked out how to make matplotlib do it: https://imgur.com/lsxjRXP


Do you have any experience with the Google Maps API? I would love to implement this.


No I don't. All you need, though, is the ability to draw straight lines (well, great circle lines) between points. You could do the region generation once offline, in Python:

    import numpy as np
    from scipy.spatial import SphericalVoronoi

    import json

    with open('volcanos.json', 'rt') as f:
        volcanos = json.load(f)
        #There are some nulls in the data:
        volcanos = [v for v in volcanos if v['longitude'] != None and v['latitude'] != None]

    def longlat_to_xyz(longlat):
        longlat = longlat.reshape((-1, 2))*(np.pi/180.)
        r = np.cos(longlat[:, 1])
        return np.column_stack((r*np.cos(longlat[:, 0]), r*np.sin(longlat[:, 0]), np.sin(longlat[:, 1])))
    
    #go through set to remove duplicates:
    volcano_longlat = np.array(list(set((v['longitude'], v['latitude']) for v in volcanos)))
    volcano_xyz = longlat_to_xyz(volcano_longlat)

    sv = SphericalVoronoi(volcano_xyz)
    sv.sort_vertices_of_regions() #make the vertices go around each shape

    #find unique edges (they're shared between regions):
    edges = set()
    for region in sv.regions:
        region.append(region[0])
        for i in range(len(region)-1):
            edges.add((region[i], region[i+1]))

    long_min = -30.
    long_max = 330.
    def xyz_to_longlat(xyz, long_min=long_min, long_max=long_max):
        long = np.arctan2(xyz[:, 1], xyz[:, 0])*(180./np.pi)
        long[long<long_min] += 360.
        long[long>long_max] -= 360.
        return np.column_stack((long, np.arcsin(xyz[:, 2])*(180./np.pi)))

    vertices = xyz_to_longlat(sv.vertices)

    #To draw the regions on Google Maps etc., save edges and vertices as JSON and load into JS.

    #To draw the linked map with Matplotlib (very slow for hi-res, and it was fiddly setting up the right conda environment):
    import matplotlib.pyplot as plt
    from mpl_toolkits.basemap import Basemap

    fig, ax = plt.subplots(figsize=(16, 10))
    m = Basemap(projection='robin', lon_0=-200, resolution='h', ax=ax)
    m.drawcoastlines(linewidth=.1)
    m.drawcountries(linewidth=.1)
    volcano_longlat2 = xyz_to_longlat(volcano_xyz)
    x, y = m(volcano_longlat2[:, 0], volcano_longlat2[:, 1])
    m.plot(x, y, 'ro', markersize=.5)

    for edge in edges:
        m.drawgreatcircle(vertices[edge[0], 0], vertices[edge[0], 1],
                          vertices[edge[1], 0], vertices[edge[1], 1],
                          color='b', linewidth=.3)
    fig.tight_layout()
    fig.savefig('volcano_voronoi.png', dpi=600)


You have to use "is not None" instead of "!= None"


Or for those who disable the location requests. I never give websites permission to see my location (not that it's very useful on desktops without GPS). Almost all websites fall back to a search box when they can't get the location automatically.


For me it doesn't seem to return anything via the API, just says calculating indefinitely


Which browser/device are you using?


catalina safari


iOS SE safari


You can spoof it in the inspector, under application/sensors I think


Where I am, it seems it could be off hundreds of miles in any direction and I’d still be far away from any volcano whatsoever.


Looks off even on mobile with location enabled.


I will add this feature!


Closest one to me at the moment (in Pilsen, Czech Republic): Alban Hills [1]

"Fun" facts:

- it less than 30km from Rome, Italy

- it emits enough CO2 that it occasionally kills livestock

- last eruption is thought to be around 5000 BCE

- a magma chamber is believed to be building up 5-6km below the surface

[1] https://en.wikipedia.org/wiki/Alban_Hills


This is awesome, but the closest volcano it brought up for me is a dormant one. It would be nice to see closest active volcano.


I'm curious, when I was a kid we were taught about the active/dormant/extinct distinction, but my understanding has been that more modern thinking doesn't really go for the dormant label, because dormant on a human timescale doesn't really mean much on a geologic timescale.


Huh. It's just a black screen with a red "Calculating..." in the upper left corner and a Bitcoin wallet in the upper right. Nothing else. Safari 12.1.2


Happens on Chrome as well. Approve location permissions and refresh.


Closest to me (in Austin, TX) is the massive Carrizozo Lava Flow in NM. I've actually been there via the Valley of Fires State Park. It's an amazing place, and seems to be usually empty- definitely worth a visit if you're in the area!


Currently in a country with some excellent volcanoes: Ethiopia. Sadly this site isn't loading - I assume it is too big a download (not great internet up here in the mountains). A lightweight version would be great:)


That's the problem, if you're actually on a volcano your bandwidth is no good.


Will try to reduce the download size. Unfortunately I don't have much control over the embedded map but I assume Google has optimised this to a decent extent


I'm glad of living in a country (Costa Rica) with several volcanos and a lot of them active, so indeed the app shows the closest!


ATM this returns an incorrect answer for me (at Strasbourg, yet returning Dôme volcano circus in the center of France, 645km) as the closest volcano is actually the Nideck, a 250'000'000 year old volcano, a mere 35km from here.

(Photos, with geological layout at the end)

http://www.passion-escalade-et-montagne.com/2018/04/escapade...

http://www.randoalsacevosges.com/2015/03/le-volcan-du-nideck...


Thank you for the feedback! I am going to collate the inaccuracies and update the volcano database. I am also going to try to fix the errors a few of you have experienced.


Devils Tower for much of the east cost US I'm guessing?


Does Devil's Tower really qualify as a "volcano"?


“Although magma formed Devils Tower, it was probably never part of a volcano.” [1]

1. https://www.nationalgeographic.org/media/devils-tower-geolog...


There are lava flows from ancient rifts, dating to the separation of North America from Pangaea, all over the East Coast, for instance the Connecticut River Valley.

For active volcano, see Iceland or Montserrat or Yellowstone.


I got Capulin.


Looks like volcanos are provided by a giant static JSON file. I'm curious, where/how was this data compiled?

Regardless, very cool.



That's right. Honestly, web development is far from my expertise, I'm more of an AI guy. Data is mainly from http://volcano.oregonstate.edu/volcano_table and a few other sources.


Apparently Mono Lake Vol Field is the closest to Silicon Valley


No vulcano in Germany? Strange


TIL there are volcanoes in Australia


> tfw seattle


At least we're not Tacoma or Bellingham? Plus, as someone who's always really been into volcanoes since early childhood being able drive two hours and climb multiple volcanoes with exciting fumaroles and weird geology is pretty great...




Guidelines | FAQ | Lists | API | Security | Legal | Apply to YC | Contact

Search: