Tuesday, September 27, 2016

log2map: Upload your logs and look at pretty maps!

Over the last few days I've slapped together a web app for turning your logs into SVG format interactive equidistant azimuthal maps.
It's pretty much demo quality but I thought you guys might like this and it works on my machine with my cabrillo v2 logs from na.exe! Works pretty good on a phone too if you send the map link to yourself after you create it.
The app georeferences the QSOs via in order of preference:
  1. QRZ.com (global lat/lot, best accuracy, optional, requires subscription (no affiliation))
  2. Callook.info (US-only; zip code area or better)
  3. ctydat (DXCC entities, kinda boring for DX maps)
The app front end is Durandal.js and D3.js. The backend is Python Flask.
You can download both the SVG (with pan/zoom intact) and the GeoJSON file populated with all the QSOs and log attributes.
You can also bookmark the map URL and come back to it later but beware this is a demo and I will be wiping the DB periodically so download the SVG and geojson if you want to save it.
You can also fork me on github: https://github.com/n1ywb/log2map
Please give me your feedback! I have a long feature list in my head. There are all sorts of ways you can visualize this data and d3.js doesn't hold you back.

    Friday, September 23, 2016

    d3 v2 to v3: replacing geo projection origin() with rotate()

    d3 v3 took away the origin() method for GIS projections and replaced it with the rotate() method which works just slightly differently. This all took me way to long to figure this out. The docs suck on this subject and Mike Bostock seems more concerned with snark.

    d3.js v2 example:

    var projection = d3.geo.azimuthal()
        .scale(380)
        .origin([-71.03, 42.37])
        .mode("orthographic")
        .translate([640, 400]);


    d3.js. v3 example: 

    var projection = d3.geoAzimuthalEquidistant()
        .scale(380)
        .rotate([71.03, -42.37]) // Note the flipped signs
        .translate([640, 400]);

    It's almost a 1:1 but note the reversed signed-ness; you normal lon/lat becomes a relative offset instead of an absolute position.