2011-02-08 42 views
9

Busco una forma de calcular el amanecer y -set para una ubicación de zona horaria dada aka. Me gustaría algo similar a Zend_Date.Cálculo de salida y puesta del sol con java

La idea es tener una aplicación donde se puede seleccionar una ubicación y en función de eso se obtiene la hora real y también el amanecer, -configuración del tiempo.

Saludos y gracias,
-lony

+1

¿Cuál es el problema aquí? –

+0

La forma en que haría esto 'en Swing' es exactamente la misma que lo haría en una aplicación de línea de comandos, servlet, tarea o prueba unitaria. Usa Java Eliminando la etiqueta 'Swing'. –

+0

La pregunta es cómo calcular el atardecer y el amanecer. Es cierto que nada relacionado con el swing, Nate ya eliminó la etiqueta. – lony

Respuesta

10

Tome un vistazo a sunrisesunsetlib-java que calcula las horas del amanecer/atardecer desde las coordenadas GPS y una fecha.

+0

Gracias, eso parece ser lo que quiero. – lony

+2

Esta biblioteca usa un modelo extremadamente simple para predecir el amanecer y el ocaso y dará resultados inexactos. Eso está bien para muchas aplicaciones pero no estará de acuerdo con otras fuentes publicadas. Si está buscando una solución precisa, le recomiendo buscar en otro lado. –

4

Comprender el amanecer y el atardecer es en realidad un problema muy difícil de resolver y la mayoría de las bibliotecas que afirman hacerlo utilizan modelos demasiado simples del sistema solar que en realidad no producen resultados precisos.

Las órbitas de la Tierra sobre el Sol y la Luna sobre la Tierra son irregulares, el eje de rotación de la Tierra se tambalea de dos maneras diferentes (precesión y nutación) y las escalas de tiempo utilizadas por los astrónomos no concuerdan hora universal coordinada (UTC). Además de eso, la refracción atmosférica distorsiona la posición percibida de los cuerpos celestes (especialmente cerca del horizonte); el levantamiento y el ajuste del Sol y la Luna se definen típicamente por la primera aparición del disco sobre el horizonte, no el paso del centro del disco; y el tamaño percibido del disco varía con el tiempo según su distancia del observador.

Necesitaba un cálculo preciso de esto para un proyecto en el que estaba trabajando y escribí una biblioteca para hacerlo que incorpora todos los modelos de vanguardia.

También ofrecemos una API web para esto y tanto la API Web y la Biblioteca de Java se puede encontrar en:

http://askgeo.com/

Ese sitio también ofrece una gran cantidad de otra información que depende de la latitud y longitud . Usted puede leer acerca de los detalles de la Biblioteca aquí:

http://askgeo.com/database/Astronomy

La biblioteca y la web de la API son comerciales, pero que dan acceso gratuito a la API Web de calificar sin fines de lucro, investigadores y proyectos de código abierto. Para los usuarios comerciales, la información de precios está en:

http://askgeo.com/#pricing

La biblioteca que da la salida y la puesta del sol (entre otras cosas) es la "astronomía" uno en la lista.

+3

Parece realmente prometedor, pero tiene que ser de código abierto. No es tan importante que tenga que ser perfecto. ¿Es incluso difícil calcular el aumento del sol y la puesta del sol si la desviación de 5-10 minutos está bien? – lony

+0

La mayoría de los métodos que he visto tienen una precisión de aproximadamente 10 minutos, por lo que si eso es suficiente para usted, entonces no necesita ser exigente con la biblioteca. Si quiere obtener la precisión de nivel sub-minuto, necesita mejores modelos. Como la topología local (por ejemplo, colinas/montañas locales) tiene un gran impacto en el amanecer y el atardecer y no está incluida en ningún modelo que haya visto, es fácil suponer que la precisión no importa demasiado. Pero si sus resultados están orientados al usuario, se trata de una calidad percibida si la suya no está de acuerdo con una autoridad establecida. –

+0

Buen punto. Gracias. – lony

0

podría utilizar este servicio web gratis para conseguir sunsrise and sunset times

Es muy fácil de usar. Responde los tiempos en GMT, por lo que necesita hacer la conversión de lat/lon a zona horaria si lo necesita.

2

Justo ahora, he lanzado Time4J-v4.29 que también admite sunrise/sunset-calculations.Ejemplo:

SolarTime hamburg = SolarTime.ofLocation(53.55, 10.0); 
Optional<Moment> result = PlainDate.nowInSystemTime().get(hamburg.sunrise()); 
System.out.println(result.get().toZonalTimestamp(() -> "Europe/Berlin")); 

Java-8-compatibilidad:

Los resultados de clase SolarTime (de tipo Moment o PlainTimestamp) se puede convertir fácilmente a Java-8-tipos como Instant o LocalDateTime, generalmente por llamando al método toTemporalAccessor().

Sobre el algoritmo:

El algoritmo principal es el mismo que el utilizado por NOAA (con la principal diferencia de que Delta-T-cálculos también se tienen en cuenta por Time4J). El algoritmo NOAA (que es prácticamente el mismo desarrollado por Jean Meeus) es más preciso que el algoritmo Williams utilizado por la biblioteca sunrisesunsetlib mencionado en la respuesta de @dogbane, especialmente cerca o en las regiones polares. Sin embargo, Time4J también admite el algoritmo Williams especificando el nombre de la calculadora. Este algoritmo simple todavía se puede utilizar en ubicaciones geográficas normales y rinde una precisión de 1-2 minutos.

Otras características:

Algunos trucos como la hora azul, diversas definiciones crepúsculo, longitud de sol o determinar polar noche/sol de medianoche o el impacto de los observadores altitud también son compatibles, consulte la API.

Nota sobre la precisión:

lo que nunca, siempre debemos tener en cuenta que los hechos topológicos como montañas o condiciones climáticas especiales tienen un fuerte impacto en los tiempos reales de la salida del sol/puesta del sol y no pueden ser modeladas en cualquier Biblioteca que apoya los cálculos del amanecer/atardecer.

1

Es posible que desee utilizar commons-suncalc, una biblioteca libre de la dependencia para Java ⩾7:

Date date = // date of calculation 
double lat, lng = // geolocation 
SunTimes times = SunTimes.compute() 
      .on(date)  // set a date 
      .at(lat, lng) // set a location 
      .execute();  // get the results 
System.out.println("Sunrise: " + times.getRise()); 
System.out.println("Sunset: " + times.getSet()); 
Cuestiones relacionadas