package conversionToKML;

import java.io.BufferedWriter;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;

public class KMLCircle {

void GenCircle(double centerlat_form, double centerlong_form, int num_points, double radius_form, String outputFile){
double lat1, long1, lat2, long2;
double dlat, dlong, d_rad;
double a, c, d;
double delta_pts;
double radial, lat_rad, dlon_rad, lon_rad;

double degreeToRadian = Math.PI/180.0;

// convert coordinates to radians
lat1 = Math.toRadians(centerlat_form);
long1 = Math.toRadians(centerlong_form);

//Earth measures
//Year Name a (meters) b (meters) 1/f Where Used
//1980 International 6,378,137 6,356,752 298.257 Worldwide
d = radius_form;
d_rad = d/6378137;

try{
File fileOutput = new File(outputFile);
BufferedWriter writer = new BufferedWriter(new FileWriter(fileOutput));

writer.write("<Document>\n<name>$Document</name>\n<Folder>\n<name>$Folder</name>\n<visibility>1</visibility>\n<Placemark>\n<name>$Circle_name</name>\n<visibility>$visibility</visibility>\n<Style>\n<geomColor>$geomColor1$geomColor2</geomColor>\n<geomScale>$geomScale</geomScale></Style>\n<LineString>\n<coordinates>\n");
//System.out.write(c);
//System.out.println(c);

// loop through the array and write path linestrings
for(int i=0; i<=num_points; i++) {
//delta_pts = 360/(double)num_points;
//radial = Math.toRadians((double)i*delta_pts);
radial = Math.toRadians((double)i);

//This algorithm is limited to distances such that dlon <pi/2
lat_rad = Math.asin(Math.sin(lat1)* Math.cos(d_rad) + Math.cos(lat1)* Math.sin(d_rad)* Math.cos(radial));
dlon_rad = Math.atan2(Math.sin(radial)* Math.sin(d_rad)* Math.cos(lat1), Math.cos(d_rad)- Math.sin(lat1)* Math.sin(lat_rad));
lon_rad = ((long1 + dlon_rad + Math.PI) % (2*Math.PI)) - Math.PI;

//write results
writer.write( Math.toDegrees(lon_rad) + ", ");
writer.write( Math.toDegrees(lat_rad) + ", 0");
writer.write('\n');
}
// output footer
writer.write("</coordinates>\n</LineString>\n</Placemark>\n</Folder>\n</Document>");

writer.close();
}catch (IOException e){
return;
}
}
/**
* @param args
*/
public static void main(String[] args) {
KMLCircle myCircle = new KMLCircle();
myCircle.GenCircle(37.422000, -122.084073, 360, 10000, "CircleTest.kml");
}

}