Download or view greatCircleMap.frink in plain text format
/** This program demonstrates the use of the country polygons in
Country.frink to draw a map of the world. It can be readily altered to
draw the map in your favorite projection. */
use Country.frink
use geometry.frink
use navigation.frink
g = new graphics
g.stroke[3]
g.color[.8,.9,1]
g.fillEllipseCenter[0, 0, 2 pi earthradius / km , 2 pi earthradius / km]
myLat = 40 degrees North
myLong = 105 degrees West
//myLat = 20.57 degrees South
// Tonga volcano
//myLong = 175.38 degrees West
//myLat = 41.29036 degrees South
// Wellington, New Zealand
//myLong = 174.78222 degrees East
// Iterate through all countries.
for [code, country] = Country.getCountryList[]
{
cc = new color[randomFloat[.2,.9], randomFloat[.2,.9], randomFloat[.2,.9], .8]
firstPolygon = true
for poly = country.borders // Iterate through polygons in a country.
{
p = new filledPolygon // This polygon is the filled country
po = new polygon // This is the outline of the country
// Some countries consist of many polygons. Only label the first one
// (which is sorted in Country.frink to be the largest.)
if firstPolygon
{
transformedPolygon = new array
untransformedPolygon = new array
}
for [long, lat] = poly // Iterate through points in polygon
{
[x,y] = latLongToXY[myLat, myLong, lat degree, long degree]
p.addPoint[x, y]
po.addPoint[x, y]
if firstPolygon
{
transformedPolygon.push[[x,y]]
untransformedPolygon.push[[lat, long]]
}
}
// Draw filled countries
g.color[cc]
g.add[p]
// Draw country outlines
g.color[0.2,0.2,0.2,.8]
g.add[po]
// Draw country names.
// This now centers names in the nontransformed polygons.
if firstPolygon
{
area = polygonArea[transformedPolygon]
[cxu, cyu] = polygonCentroid[untransformedPolygon]
[cx, cy] = latLongToXY[myLat, myLong, cxu degree, cyu degree]
g.color[0,0,0]
// Do some contortions to try and size the country name
longestWord = max[map[getFunction["length",1],
split[%r/\s+/, country.name]]]
countryName = country.name =~ %s/\s+/\n/g // Wrap country name
g.font["SansSerif", "bold", 6 (sqrt[area] / longestWord)^(0.7)]
g.text[countryName, cx, cy, arctan[cx,cy] + 180 deg]
firstPolygon = false
}
}
}
// Draw distance circles
g.stroke[6]
g.color[0,0,0]
for distance = 0 km to pi earthradius step 1000 miles
g.drawEllipseCenter[0, 0, 2 distance / km, 2 distance / km]
// Draw bearing lines
g.font["SansSerif", "bold", 600]
for bearing = 0 degrees to 359 degrees step 10 degrees
{
x = pi earthradius sin[bearing] / km
y = -pi earthradius cos[bearing] / km
g.line[0, 0, x, y]
g.text[round[bearing/deg] /* + "\u00B0"*/
, x , y, "center", "baseline", -bearing]
}
g.stroke[18]
// Draw single degree ticks
for bearing = 0 to 359
{
x1 = pi earthradius sin[bearing degrees] / km
y1 = -pi earthradius cos[bearing degrees] / km
x2 = 12000 miles sin[bearing degrees] / km
y2 = -12000 miles cos[bearing degrees] / km
g.line[x1, y1, x2, y2]
}
g.show[1]
g.write["greatCircle.svg", 1000, 1000]
g.write["greatCircle.png", 1000, 1000]
latLongToXY[myLat, myLong, lat, long] :=
{
[distance, bearing] = earthDistanceAndBearing[myLat, myLong, lat, long]
d1 = distance / km
y = -d1 cos[bearing]
x = d1 sin[bearing]
return [x,y]
}
Download or view greatCircleMap.frink in plain text format
This is a program written in the programming language Frink.
For more information, view the Frink
Documentation or see More Sample Frink Programs.
Alan Eliasen, eliasen@mindspring.com