Skip to content
Snippets Groups Projects
Commit 5570491d authored by noeljanes's avatar noeljanes
Browse files

First set of files

parent 9e6d6902
No related branches found
No related tags found
No related merge requests found
Showing
with 8132 additions and 0 deletions
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="CompilerConfiguration">
<annotationProcessing>
<profile name="Maven default annotation processors profile" enabled="true">
<sourceOutputDir name="target/generated-sources/annotations" />
<sourceTestOutputDir name="target/generated-test-sources/test-annotations" />
<outputRelativeToContentRoot value="true" />
<module name="orbitdetermination" />
</profile>
</annotationProcessing>
</component>
<component name="JavacSettings">
<option name="DEPRECATION" value="false" />
<option name="ADDITIONAL_OPTIONS_OVERRIDE">
<module name="orbitdetermination" options="-Xlint:deprecation" />
</option>
</component>
</project>
\ No newline at end of file
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="ExternalStorageConfigurationManager" enabled="true" />
<component name="MavenProjectsManager">
<option name="originalFiles">
<list>
<option value="$PROJECT_DIR$/pom.xml" />
</list>
</option>
</component>
<component name="ProjectRootManager" version="2" languageLevel="JDK_1_8" project-jdk-name="12" project-jdk-type="JavaSDK">
<output url="file://$PROJECT_DIR$/out" />
</component>
</project>
\ No newline at end of file
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="Palette2">
<group name="Swing">
<item class="com.intellij.uiDesigner.HSpacer" tooltip-text="Horizontal Spacer" icon="/com/intellij/uiDesigner/icons/hspacer.png" removable="false" auto-create-binding="false" can-attach-label="false">
<default-constraints vsize-policy="1" hsize-policy="6" anchor="0" fill="1" />
</item>
<item class="com.intellij.uiDesigner.VSpacer" tooltip-text="Vertical Spacer" icon="/com/intellij/uiDesigner/icons/vspacer.png" removable="false" auto-create-binding="false" can-attach-label="false">
<default-constraints vsize-policy="6" hsize-policy="1" anchor="0" fill="2" />
</item>
<item class="javax.swing.JPanel" icon="/com/intellij/uiDesigner/icons/panel.png" removable="false" auto-create-binding="false" can-attach-label="false">
<default-constraints vsize-policy="3" hsize-policy="3" anchor="0" fill="3" />
</item>
<item class="javax.swing.JScrollPane" icon="/com/intellij/uiDesigner/icons/scrollPane.png" removable="false" auto-create-binding="false" can-attach-label="true">
<default-constraints vsize-policy="7" hsize-policy="7" anchor="0" fill="3" />
</item>
<item class="javax.swing.JButton" icon="/com/intellij/uiDesigner/icons/button.png" removable="false" auto-create-binding="true" can-attach-label="false">
<default-constraints vsize-policy="0" hsize-policy="3" anchor="0" fill="1" />
<initial-values>
<property name="text" value="Button" />
</initial-values>
</item>
<item class="javax.swing.JRadioButton" icon="/com/intellij/uiDesigner/icons/radioButton.png" removable="false" auto-create-binding="true" can-attach-label="false">
<default-constraints vsize-policy="0" hsize-policy="3" anchor="8" fill="0" />
<initial-values>
<property name="text" value="RadioButton" />
</initial-values>
</item>
<item class="javax.swing.JCheckBox" icon="/com/intellij/uiDesigner/icons/checkBox.png" removable="false" auto-create-binding="true" can-attach-label="false">
<default-constraints vsize-policy="0" hsize-policy="3" anchor="8" fill="0" />
<initial-values>
<property name="text" value="CheckBox" />
</initial-values>
</item>
<item class="javax.swing.JLabel" icon="/com/intellij/uiDesigner/icons/label.png" removable="false" auto-create-binding="false" can-attach-label="false">
<default-constraints vsize-policy="0" hsize-policy="0" anchor="8" fill="0" />
<initial-values>
<property name="text" value="Label" />
</initial-values>
</item>
<item class="javax.swing.JTextField" icon="/com/intellij/uiDesigner/icons/textField.png" removable="false" auto-create-binding="true" can-attach-label="true">
<default-constraints vsize-policy="0" hsize-policy="6" anchor="8" fill="1">
<preferred-size width="150" height="-1" />
</default-constraints>
</item>
<item class="javax.swing.JPasswordField" icon="/com/intellij/uiDesigner/icons/passwordField.png" removable="false" auto-create-binding="true" can-attach-label="true">
<default-constraints vsize-policy="0" hsize-policy="6" anchor="8" fill="1">
<preferred-size width="150" height="-1" />
</default-constraints>
</item>
<item class="javax.swing.JFormattedTextField" icon="/com/intellij/uiDesigner/icons/formattedTextField.png" removable="false" auto-create-binding="true" can-attach-label="true">
<default-constraints vsize-policy="0" hsize-policy="6" anchor="8" fill="1">
<preferred-size width="150" height="-1" />
</default-constraints>
</item>
<item class="javax.swing.JTextArea" icon="/com/intellij/uiDesigner/icons/textArea.png" removable="false" auto-create-binding="true" can-attach-label="true">
<default-constraints vsize-policy="6" hsize-policy="6" anchor="0" fill="3">
<preferred-size width="150" height="50" />
</default-constraints>
</item>
<item class="javax.swing.JTextPane" icon="/com/intellij/uiDesigner/icons/textPane.png" removable="false" auto-create-binding="true" can-attach-label="true">
<default-constraints vsize-policy="6" hsize-policy="6" anchor="0" fill="3">
<preferred-size width="150" height="50" />
</default-constraints>
</item>
<item class="javax.swing.JEditorPane" icon="/com/intellij/uiDesigner/icons/editorPane.png" removable="false" auto-create-binding="true" can-attach-label="true">
<default-constraints vsize-policy="6" hsize-policy="6" anchor="0" fill="3">
<preferred-size width="150" height="50" />
</default-constraints>
</item>
<item class="javax.swing.JComboBox" icon="/com/intellij/uiDesigner/icons/comboBox.png" removable="false" auto-create-binding="true" can-attach-label="true">
<default-constraints vsize-policy="0" hsize-policy="2" anchor="8" fill="1" />
</item>
<item class="javax.swing.JTable" icon="/com/intellij/uiDesigner/icons/table.png" removable="false" auto-create-binding="true" can-attach-label="false">
<default-constraints vsize-policy="6" hsize-policy="6" anchor="0" fill="3">
<preferred-size width="150" height="50" />
</default-constraints>
</item>
<item class="javax.swing.JList" icon="/com/intellij/uiDesigner/icons/list.png" removable="false" auto-create-binding="true" can-attach-label="false">
<default-constraints vsize-policy="6" hsize-policy="2" anchor="0" fill="3">
<preferred-size width="150" height="50" />
</default-constraints>
</item>
<item class="javax.swing.JTree" icon="/com/intellij/uiDesigner/icons/tree.png" removable="false" auto-create-binding="true" can-attach-label="false">
<default-constraints vsize-policy="6" hsize-policy="6" anchor="0" fill="3">
<preferred-size width="150" height="50" />
</default-constraints>
</item>
<item class="javax.swing.JTabbedPane" icon="/com/intellij/uiDesigner/icons/tabbedPane.png" removable="false" auto-create-binding="true" can-attach-label="false">
<default-constraints vsize-policy="3" hsize-policy="3" anchor="0" fill="3">
<preferred-size width="200" height="200" />
</default-constraints>
</item>
<item class="javax.swing.JSplitPane" icon="/com/intellij/uiDesigner/icons/splitPane.png" removable="false" auto-create-binding="false" can-attach-label="false">
<default-constraints vsize-policy="3" hsize-policy="3" anchor="0" fill="3">
<preferred-size width="200" height="200" />
</default-constraints>
</item>
<item class="javax.swing.JSpinner" icon="/com/intellij/uiDesigner/icons/spinner.png" removable="false" auto-create-binding="true" can-attach-label="true">
<default-constraints vsize-policy="0" hsize-policy="6" anchor="8" fill="1" />
</item>
<item class="javax.swing.JSlider" icon="/com/intellij/uiDesigner/icons/slider.png" removable="false" auto-create-binding="true" can-attach-label="false">
<default-constraints vsize-policy="0" hsize-policy="6" anchor="8" fill="1" />
</item>
<item class="javax.swing.JSeparator" icon="/com/intellij/uiDesigner/icons/separator.png" removable="false" auto-create-binding="false" can-attach-label="false">
<default-constraints vsize-policy="6" hsize-policy="6" anchor="0" fill="3" />
</item>
<item class="javax.swing.JProgressBar" icon="/com/intellij/uiDesigner/icons/progressbar.png" removable="false" auto-create-binding="true" can-attach-label="false">
<default-constraints vsize-policy="0" hsize-policy="6" anchor="0" fill="1" />
</item>
<item class="javax.swing.JToolBar" icon="/com/intellij/uiDesigner/icons/toolbar.png" removable="false" auto-create-binding="false" can-attach-label="false">
<default-constraints vsize-policy="0" hsize-policy="6" anchor="0" fill="1">
<preferred-size width="-1" height="20" />
</default-constraints>
</item>
<item class="javax.swing.JToolBar$Separator" icon="/com/intellij/uiDesigner/icons/toolbarSeparator.png" removable="false" auto-create-binding="false" can-attach-label="false">
<default-constraints vsize-policy="0" hsize-policy="0" anchor="0" fill="1" />
</item>
<item class="javax.swing.JScrollBar" icon="/com/intellij/uiDesigner/icons/scrollbar.png" removable="false" auto-create-binding="true" can-attach-label="false">
<default-constraints vsize-policy="6" hsize-policy="0" anchor="0" fill="2" />
</item>
</group>
</component>
</project>
\ No newline at end of file
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="VcsDirectoryMappings">
<mapping directory="$PROJECT_DIR$/satnogs-orbit-determination" vcs="Git" />
</component>
</project>
\ No newline at end of file
This diff is collapsed.
<?xml version="1.0" encoding="UTF-8"?>
<module type="JAVA_MODULE" version="4" />
\ No newline at end of file
pom.xml 0 → 100644
This diff is collapsed.
/* Copyright 2002-2019 CS Systèmes d'Information
* Licensed to CS Systèmes d'Information (CS) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* CS licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package fr.cs.examples;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.lang.reflect.Array;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.NoSuchElementException;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import org.hipparchus.exception.DummyLocalizable;
import org.hipparchus.exception.Localizable;
import org.hipparchus.geometry.euclidean.threed.Vector3D;
import org.hipparchus.util.FastMath;
import org.orekit.errors.OrekitException;
import org.orekit.errors.OrekitMessages;
import org.orekit.frames.Frame;
import org.orekit.frames.FramesFactory;
import org.orekit.frames.Predefined;
import org.orekit.time.AbsoluteDate;
import org.orekit.time.TimeComponents;
import org.orekit.time.TimeScale;
/** Simple parser for key/value files.
* @param Key type of the parameter keys
*/
public class KeyValueFileParser<Key extends Enum<Key>> {
/** Error message for unknown frame. */
private static final Localizable UNKNOWN_FRAME =
new DummyLocalizable("unknown frame {0}");
/** Error message for not Earth frame. */
private static final Localizable NOT_EARTH_FRAME =
new DummyLocalizable("frame {0} is not an Earth frame");
/** Enum type. */
private final Class<Key> enumType;
/** Key/scalar value map. */
private final Map<Key, String> scalarMap;
/** Key/array value map. */
private final Map<Key, List<String>> arrayMap;
/** Simple constructor.
* @param enumType type of the parameters keys enumerate
*/
public KeyValueFileParser(Class<Key> enumType) {
this.enumType = enumType;
this.scalarMap = new HashMap<Key, String>();
this.arrayMap = new HashMap<Key, List<String>>();
}
/** Parse an input file.
* <p>
* The input file syntax is a set of {@code key=value} lines or
* {@code key[i]=value} lines. Blank lines and lines starting with '#'
* (after whitespace trimming) are silently ignored. The equal sign may
* be surrounded by space characters. Keys must correspond to the
* {@link Key} enumerate constants, given that matching is not case
* sensitive and that '_' characters may appear as '.' characters in
* the file. This means that the lines:
* <pre>
* # this is the semi-major axis
* orbit.circular.a = 7231582
* </pre>
* are perfectly right and correspond to key {@code Key#ORBIT_CIRCULAR_A} if
* such a constant exists in the enumerate.
* </p>
* <p>
* When the key[i] notation is used, all the values extracted from lines
* with the same key will be put in a general array that will be retrieved
* using one of the {@code getXxxArray(key)} methods. They will <em>not</em>
* be available with the {@code getXxx(key)} methods without the {@code Array}.
* </p>
* @param input input stream
* @exception IOException if input file cannot be read
*/
public void parseInput(final String name, final InputStream input)
throws IOException, OrekitException {
final Pattern arrayPattern = Pattern.compile("([\\w\\.]+)\\s*\\[([0-9]+)\\]");
try (final BufferedReader reader = new BufferedReader(new InputStreamReader(input, "UTF-8"))) {
int lineNumber = 0;
for (String line = reader.readLine(); line != null; line = reader.readLine()) {
++lineNumber;
line = line.trim();
// we ignore blank lines and line starting with '#'
if ((line.length() > 0) && !line.startsWith("#")) {
String[] fields = line.split("\\s*=\\s*");
if (fields.length != 2) {
throw new OrekitException(OrekitMessages.UNABLE_TO_PARSE_LINE_IN_FILE,
lineNumber, name, line);
}
final Matcher matcher = arrayPattern.matcher(fields[0]);
if (matcher.matches()) {
// this is a key[i]=value line
String canonicalized = matcher.group(1).toUpperCase().replaceAll("\\.", "_");
Key key = Key.valueOf(enumType, canonicalized);
Integer index = Integer.valueOf(matcher.group(2));
List<String> list = arrayMap.get(key);
if (list == null) {
list = new ArrayList<String>();
arrayMap.put(key, list);
}
while (index >= list.size()) {
// insert empty strings for missing elements
list.add("");
}
list.set(index, fields[1]);
} else {
// this is a key=value line
String canonicalized = fields[0].toUpperCase().replaceAll("\\.", "_");
Key key = Key.valueOf(enumType, canonicalized);
scalarMap.put(key, fields[1]);
}
}
}
}
}
/** Check if a key is contained in the map.
* @param key parameter key
* @return true if the key is contained in the map
*/
public boolean containsKey(final Key key) {
return scalarMap.containsKey(key) || arrayMap.containsKey(key);
}
/** Get a raw string value from a parameters map.
* @param key parameter key
* @return string value corresponding to the key
* @exception NoSuchElementException if key is not in the map
*/
public String getString(final Key key) throws NoSuchElementException {
final String value = scalarMap.get(key);
if (value == null) {
throw new NoSuchElementException(key.toString());
}
return value.trim();
}
/** Get a raw string values array from a parameters map.
* @param key parameter key
* @return string values array corresponding to the key
* @exception NoSuchElementException if key is not in the map
*/
public String[] getStringArray(final Key key) throws NoSuchElementException {
final List<String> list = arrayMap.get(key);
if (list == null) {
throw new NoSuchElementException(key.toString());
}
String[] array = new String[list.size()];
for (int i = 0; i < array.length; ++i) {
array[i] = list.get(i).trim();
}
return array;
}
/** Get a raw double value from a parameters map.
* @param key parameter key
* @return double value corresponding to the key
* @exception NoSuchElementException if key is not in the map
*/
public double getDouble(final Key key) throws NoSuchElementException {
return Double.parseDouble(getString(key));
}
/** Get a raw double values array from a parameters map.
* @param key parameter key
* @return double values array corresponding to the key
* @exception NoSuchElementException if key is not in the map
*/
public double[] getDoubleArray(final Key key) throws NoSuchElementException {
String[] strings = getStringArray(key);
double[] array = new double[strings.length];
for (int i = 0; i < array.length; ++i) {
if (!strings[i].isEmpty())
array[i] = Double.parseDouble(strings[i]);
else {
array[i] = 0.;
}
}
return array;
}
/** Get a raw int value from a parameters map.
* @param key parameter key
* @return int value corresponding to the key
* @exception NoSuchElementException if key is not in the map
*/
public int getInt(final Key key) throws NoSuchElementException {
return Integer.parseInt(getString(key));
}
/** Get a raw int values array from a parameters map.
* @param key parameter key
* @return int values array corresponding to the key
* @exception NoSuchElementException if key is not in the map
*/
public int[] getIntArray(final Key key) throws NoSuchElementException {
String[] strings = getStringArray(key);
int[] array = new int[strings.length];
for (int i = 0; i < array.length; ++i) {
array[i] = Integer.parseInt(strings[i]);
}
return array;
}
/** Get a raw boolean value from a parameters map.
* @param key parameter key
* @return boolean value corresponding to the key
* @exception NoSuchElementException if key is not in the map
*/
public boolean getBoolean(final Key key) throws NoSuchElementException {
return Boolean.parseBoolean(getString(key));
}
/** Get a raw boolean values array from a parameters map.
* @param key parameter key
* @return boolean values array corresponding to the key
* @exception NoSuchElementException if key is not in the map
*/
public boolean[] getBooleanArray(final Key key) throws NoSuchElementException {
String[] strings = getStringArray(key);
boolean[] array = new boolean[strings.length];
for (int i = 0; i < array.length; ++i) {
array[i] = Boolean.parseBoolean(strings[i]);
}
return array;
}
/** Get an angle value from a parameters map.
* <p>
* The angle is considered to be in degrees in the file, it will be returned in radians
* </p>
* @param key parameter key
* @return angular value corresponding to the key, in radians
* @exception NoSuchElementException if key is not in the map
*/
public double getAngle(final Key key) throws NoSuchElementException {
return FastMath.toRadians(getDouble(key));
}
/** Get an angle values array from a parameters map.
* @param key parameter key
* @return angle values array corresponding to the key
* @exception NoSuchElementException if key is not in the map
*/
public double[] getAngleArray(final Key key) throws NoSuchElementException {
double[] array = getDoubleArray(key);
for (int i = 0; i < array.length; ++i) {
array[i] = FastMath.toRadians(array[i]);
}
return array;
}
/** Get a date value from a parameters map.
* @param key parameter key
* @param scale time scale in which the date is to be parsed
* @return date value corresponding to the key
* @exception NoSuchElementException if key is not in the map
*/
public AbsoluteDate getDate(final Key key, TimeScale scale) throws NoSuchElementException {
return new AbsoluteDate(getString(key), scale);
}
/** Get a date values array from a parameters map.
* @param key parameter key
* @param scale time scale in which the date is to be parsed
* @return date values array corresponding to the key
* @exception NoSuchElementException if key is not in the map
*/
public AbsoluteDate[] getDateArray(final Key key, TimeScale scale) throws NoSuchElementException {
String[] strings = getStringArray(key);
AbsoluteDate[] array = new AbsoluteDate[strings.length];
for (int i = 0; i < array.length; ++i) {
array[i] = new AbsoluteDate(strings[i], scale);
}
return array;
}
/** Get a time value from a parameters map.
* @param key parameter key
* @return time value corresponding to the key
* @exception NoSuchElementException if key is not in the map
*/
public TimeComponents getTime(final Key key) throws NoSuchElementException {
return TimeComponents.parseTime(getString(key));
}
/** Get a time values array from a parameters map.
* @param key parameter key
* @return time values array corresponding to the key
* @exception NoSuchElementException if key is not in the map
*/
public TimeComponents[] getTimeArray(final Key key) throws NoSuchElementException {
String[] strings = getStringArray(key);
TimeComponents[] array = new TimeComponents[strings.length];
for (int i = 0; i < array.length; ++i) {
array[i] = TimeComponents.parseTime(strings[i]);
}
return array;
}
/** Get a vector value from a parameters map.
* @param xKey parameter key for abscissa
* @param yKey parameter key for ordinate
* @param zKey parameter key for height
* @param scale time scale in which the date is to be parsed
* @return date value corresponding to the key
* @exception NoSuchElementException if key is not in the map
*/
public Vector3D getVector(final Key xKey, final Key yKey, final Key zKey)
throws NoSuchElementException {
return new Vector3D(getDouble(xKey), getDouble(yKey), getDouble(zKey));
}
/** Get a vector values array from a parameters map.
* @param xKey parameter key for abscissa
* @param yKey parameter key for ordinate
* @param zKey parameter key for height
* @param scale time scale in which the date is to be parsed
* @return date value corresponding to the key
* @exception NoSuchElementException if key is not in the map
*/
public Vector3D[] getVectorArray(final Key xKey, final Key yKey, final Key zKey)
throws NoSuchElementException {
String[] xStrings = getStringArray(xKey);
String[] yStrings = getStringArray(yKey);
String[] zStrings = getStringArray(zKey);
Vector3D[] array = new Vector3D[xStrings.length];
for (int i = 0; i < array.length; ++i) {
array[i] = new Vector3D(Double.parseDouble(xStrings[i]),
Double.parseDouble(yStrings[i]),
Double.parseDouble(zStrings[i]));
}
return array;
}
/** Get a strings list from a parameters map.
* @param key parameter key
* @param separator elements separator
* @return strings list value corresponding to the key
* @exception NoSuchElementException if key is not in the map
*/
public List<String> getStringsList(final Key key, final char separator)
throws NoSuchElementException {
final String value = scalarMap.get(key);
if (value == null) {
throw new NoSuchElementException(key.toString());
}
return Arrays.asList(value.trim().split("\\s*" + separator + "\\s*"));
}
/** Get a strings list array from a parameters map.
* @param key parameter key
* @param separator elements separator
* @return strings list array corresponding to the key
* @exception NoSuchElementException if key is not in the map
*/
public List<String>[] getStringsListArray(final Key key, final char separator)
throws NoSuchElementException {
final String[] strings = getStringArray(key);
@SuppressWarnings("unchecked")
final List<String>[] array = (List<String>[]) Array.newInstance(List.class, strings.length);
for (int i = 0; i < array.length; ++i) {
array[i] = Arrays.asList(strings[i].trim().split("\\s*" + separator + "\\s*"));
}
return array;
}
/** Get an inertial frame from a parameters map.
* @param key parameter key
* @return inertial frame corresponding to the key
* @exception NoSuchElementException if key is not in the map
*/
public Frame getInertialFrame(final Key key) throws NoSuchElementException, OrekitException {
// get the name of the desired frame
final String frameName = getString(key);
// check the name against predefined frames
for (Predefined predefined : Predefined.values()) {
if (frameName.equals(predefined.getName())) {
if (FramesFactory.getFrame(predefined).isPseudoInertial()) {
return FramesFactory.getFrame(predefined);
} else {
throw new OrekitException(OrekitMessages.NON_PSEUDO_INERTIAL_FRAME,
frameName);
}
}
}
// none of the frames match the name
throw new OrekitException(UNKNOWN_FRAME, frameName);
}
/** Get an Earth frame from a parameters map.
* <p>
* We consider Earth frames are the frames with name starting with "ITRF".
* </p>
* @param key parameter key
* @param parameters key/value map containing the parameters
* @return Earth frame corresponding to the key
* @exception NoSuchElementException if key is not in the map
*/
public Frame getEarthFrame(final Key key)
throws NoSuchElementException, OrekitException {
// get the name of the desired frame
final String frameName = getString(key);
// check the name against predefined frames
for (Predefined predefined : Predefined.values()) {
if (frameName.equals(predefined.getName())) {
if (predefined.toString().startsWith("ITRF") ||
predefined.toString().startsWith("GTOD")) {
return FramesFactory.getFrame(predefined);
} else {
throw new OrekitException(NOT_EARTH_FRAME, frameName);
}
}
}
// none of the frames match the name
throw new OrekitException(UNKNOWN_FRAME, frameName);
}
}
package fr.cs.examples.estimation;
import org.hipparchus.util.FastMath;
import org.orekit.estimation.measurements.AngularAzEl;
import org.orekit.estimation.measurements.ObservableSatellite;
import org.orekit.estimation.measurements.Range;
import org.orekit.estimation.measurements.modifiers.Bias;
import java.util.Map;
public class AzElParser extends OrbitDetermination.MeasurementsParser<AngularAzEl>{
/** Parser for azimuth-elevation measurements. */
/** {@inheritDoc} */
@Override
public AngularAzEl parseFields(final String[] fields,
final Map<String, StationData> stations,
final PVData pvData,
final ObservableSatellite satellite,
final Bias<Range> satRangeBias,
final Weights weights,
final String line,
final int lineNumber,
final String fileName) {
checkFields(5, fields, line, lineNumber, fileName);
final StationData stationData = getStationData(fields[2], stations, line, lineNumber, fileName);
final AngularAzEl azEl = new AngularAzEl(stationData.station,
getDate(fields[0], line, lineNumber, fileName),
new double[] {
FastMath.toRadians(Double.parseDouble(fields[3])),
FastMath.toRadians(Double.parseDouble(fields[4]))
},
stationData.azElSigma,
weights.azElBaseWeight,
satellite);
if (stationData.refractionCorrection != null) {
azEl.addModifier(stationData.refractionCorrection);
}
if (stationData.azELBias != null) {
azEl.addModifier(stationData.azELBias);
}
return azEl;
}
}
This diff is collapsed.
package fr.cs.examples.estimation;
import org.orekit.estimation.measurements.modifiers.RangeIonosphericDelayModifier;
import org.orekit.estimation.measurements.modifiers.RangeRateIonosphericDelayModifier;
import org.orekit.gnss.Frequency;
import org.orekit.models.earth.ionosphere.IonosphericModel;
import org.orekit.models.earth.ionosphere.KlobucharIonoCoefficientsLoader;
import org.orekit.models.earth.ionosphere.KlobucharIonoModel;
import org.orekit.time.AbsoluteDate;
import org.orekit.time.DateComponents;
import org.orekit.time.TimeScalesFactory;
import java.util.HashMap;
import java.util.Map;
public class Iono {
/** Ionospheric modifiers. */
/** Flag for two-way range-rate. */
public final boolean twoWay;
/** Map for range modifiers. */
public final Map<Frequency, Map<DateComponents, RangeIonosphericDelayModifier>> rangeModifiers;
/** Map for range-rate modifiers. */
public final Map<Frequency, Map<DateComponents, RangeRateIonosphericDelayModifier>> rangeRateModifiers;
/** Simple constructor.
* @param twoWay flag for two-way range-rate
*/
Iono(final boolean twoWay) {
this.twoWay = twoWay;
this.rangeModifiers = new HashMap<>();
this.rangeRateModifiers = new HashMap<>();
}
/** Get range modifier for a measurement.
* @param frequency frequency of the signal
* @param date measurement date
* @return range modifier
*/
public RangeIonosphericDelayModifier getRangeModifier(final Frequency frequency,
final AbsoluteDate date)
{
final DateComponents dc = date.getComponents(TimeScalesFactory.getUTC()).getDate();
ensureFrequencyAndDateSupported(frequency, dc);
return rangeModifiers.get(frequency).get(dc);
}
/** Get range-rate modifier for a measurement.
* @param frequency frequency of the signal
* @param date measurement date
* @return range-rate modifier
*/
public RangeRateIonosphericDelayModifier getRangeRateModifier(final Frequency frequency,
final AbsoluteDate date)
{
final DateComponents dc = date.getComponents(TimeScalesFactory.getUTC()).getDate();
ensureFrequencyAndDateSupported(frequency, dc);
return rangeRateModifiers.get(frequency).get(dc);
}
/** Create modifiers for a frequency and date if needed.
* @param frequency frequency of the signal
* @param dc date for which modifiers are required
*/
private void ensureFrequencyAndDateSupported(final Frequency frequency, final DateComponents dc)
{
if (!rangeModifiers.containsKey(frequency)) {
rangeModifiers.put(frequency, new HashMap<>());
rangeRateModifiers.put(frequency, new HashMap<>());
}
if (!rangeModifiers.get(frequency).containsKey(dc)) {
// load Klobuchar model for the L1 frequency
final KlobucharIonoCoefficientsLoader loader = new KlobucharIonoCoefficientsLoader();
loader.loadKlobucharIonosphericCoefficients(dc);
final IonosphericModel model = new KlobucharIonoModel(loader.getAlpha(), loader.getBeta());
// scale for current frequency
final double f = frequency.getMHzFrequency();
// create modifiers
rangeModifiers.get(frequency).put(dc, new RangeIonosphericDelayModifier(model, f));
rangeRateModifiers.get(frequency).put(dc, new RangeRateIonosphericDelayModifier(model, f, twoWay));
}
}
}
This diff is collapsed.
package fr.cs.examples.estimation;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintStream;
import java.io.UnsupportedEncodingException;
import java.net.URISyntaxException;
import java.text.ParseException;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.HashMap;
import java.util.List;
import java.util.Locale;
import java.util.Map;
import java.util.NoSuchElementException;
import java.util.SortedSet;
import java.util.TreeSet;
import java.util.regex.Pattern;
import org.hipparchus.exception.LocalizedCoreFormats;
import org.hipparchus.geometry.euclidean.threed.Vector3D;
import org.hipparchus.linear.QRDecomposer;
import org.hipparchus.optim.nonlinear.vector.leastsquares.GaussNewtonOptimizer;
import org.hipparchus.optim.nonlinear.vector.leastsquares.LeastSquaresOptimizer;
import org.hipparchus.optim.nonlinear.vector.leastsquares.LeastSquaresProblem;
import org.hipparchus.optim.nonlinear.vector.leastsquares.LevenbergMarquardtOptimizer;
import org.hipparchus.stat.descriptive.StreamingStatistics;
import org.hipparchus.util.FastMath;
import org.hipparchus.util.Precision;
import org.orekit.attitudes.AttitudeProvider;
import org.orekit.attitudes.BodyCenterPointing;
import org.orekit.attitudes.LofOffset;
import org.orekit.attitudes.NadirPointing;
import org.orekit.attitudes.YawCompensation;
import org.orekit.attitudes.YawSteering;
import org.orekit.bodies.CelestialBody;
import org.orekit.bodies.CelestialBodyFactory;
import org.orekit.bodies.GeodeticPoint;
import org.orekit.bodies.OneAxisEllipsoid;
import org.orekit.data.DataProvidersManager;
import org.orekit.data.DirectoryCrawler;
import org.orekit.errors.OrekitException;
import org.orekit.errors.OrekitMessages;
import org.orekit.estimation.leastsquares.BatchLSEstimator;
import org.orekit.estimation.leastsquares.BatchLSObserver;
import org.orekit.estimation.measurements.AngularAzEl;
import org.orekit.estimation.measurements.EstimatedMeasurement;
import org.orekit.estimation.measurements.EstimationsProvider;
import org.orekit.estimation.measurements.GroundStation;
import org.orekit.estimation.measurements.ObservableSatellite;
import org.orekit.estimation.measurements.ObservedMeasurement;
import org.orekit.estimation.measurements.PV;
import org.orekit.estimation.measurements.Range;
import org.orekit.estimation.measurements.RangeRate;
import org.orekit.estimation.measurements.modifiers.AngularRadioRefractionModifier;
import org.orekit.estimation.measurements.modifiers.Bias;
import org.orekit.estimation.measurements.modifiers.OnBoardAntennaRangeModifier;
import org.orekit.estimation.measurements.modifiers.OutlierFilter;
import org.orekit.estimation.measurements.modifiers.RangeIonosphericDelayModifier;
import org.orekit.estimation.measurements.modifiers.RangeRateIonosphericDelayModifier;
import org.orekit.estimation.measurements.modifiers.RangeTroposphericDelayModifier;
import org.orekit.forces.PolynomialParametricAcceleration;
import org.orekit.forces.drag.DragForce;
import org.orekit.forces.drag.DragSensitive;
import org.orekit.forces.drag.IsotropicDrag;
import org.orekit.forces.gravity.HolmesFeatherstoneAttractionModel;
import org.orekit.forces.gravity.OceanTides;
import org.orekit.forces.gravity.Relativity;
import org.orekit.forces.gravity.SolidTides;
import org.orekit.forces.gravity.ThirdBodyAttraction;
import org.orekit.forces.gravity.potential.GravityFieldFactory;
import org.orekit.forces.gravity.potential.NormalizedSphericalHarmonicsProvider;
import org.orekit.forces.radiation.IsotropicRadiationSingleCoefficient;
import org.orekit.forces.radiation.RadiationSensitive;
import org.orekit.forces.radiation.SolarRadiationPressure;
import org.orekit.frames.EOPHistory;
import org.orekit.frames.Frame;
import org.orekit.frames.FramesFactory;
import org.orekit.frames.LOFType;
import org.orekit.frames.TopocentricFrame;
import org.orekit.gnss.Frequency;
import org.orekit.gnss.MeasurementType;
import org.orekit.gnss.ObservationData;
import org.orekit.gnss.ObservationDataSet;
import org.orekit.gnss.RinexLoader;
import org.orekit.gnss.SatelliteSystem;
import org.orekit.models.AtmosphericRefractionModel;
import org.orekit.models.earth.EarthITU453AtmosphereRefraction;
import org.orekit.models.earth.atmosphere.Atmosphere;
import org.orekit.models.earth.atmosphere.DTM2000;
import org.orekit.models.earth.atmosphere.data.MarshallSolarActivityFutureEstimation;
import org.orekit.models.earth.displacement.OceanLoading;
import org.orekit.models.earth.displacement.OceanLoadingCoefficientsBLQFactory;
import org.orekit.models.earth.displacement.StationDisplacement;
import org.orekit.models.earth.displacement.TidalDisplacement;
import org.orekit.models.earth.ionosphere.IonosphericModel;
import org.orekit.models.earth.ionosphere.KlobucharIonoCoefficientsLoader;
import org.orekit.models.earth.ionosphere.KlobucharIonoModel;
import org.orekit.models.earth.troposphere.DiscreteTroposphericModel;
import org.orekit.models.earth.troposphere.EstimatedTroposphericModel;
import org.orekit.models.earth.troposphere.GlobalMappingFunctionModel;
import org.orekit.models.earth.troposphere.MappingFunction;
import org.orekit.models.earth.troposphere.NiellMappingFunctionModel;
import org.orekit.models.earth.troposphere.SaastamoinenModel;
import org.orekit.orbits.CartesianOrbit;
import org.orekit.orbits.CircularOrbit;
import org.orekit.orbits.EquinoctialOrbit;
import org.orekit.orbits.KeplerianOrbit;
import org.orekit.orbits.Orbit;
import org.orekit.orbits.PositionAngle;
import org.orekit.propagation.SpacecraftState;
import org.orekit.propagation.analytical.tle.TLE;
import org.orekit.propagation.analytical.tle.TLEPropagator;
import org.orekit.propagation.conversion.DormandPrince853IntegratorBuilder;
import org.orekit.propagation.conversion.NumericalPropagatorBuilder;
import org.orekit.time.AbsoluteDate;
import org.orekit.time.DateComponents;
import org.orekit.time.TimeScalesFactory;
import org.orekit.utils.Constants;
import org.orekit.utils.IERSConventions;
import org.orekit.utils.PVCoordinates;
import org.orekit.utils.ParameterDriver;
import org.orekit.utils.ParameterDriversList;
import fr.cs.examples.KeyValueFileParser;
public class PVData {
/** Container for Position-velocity data. */
/** Container for Position-velocity data. */
/** Position sigma. */
public final double positionSigma;
/** Velocity sigma. */
public final double velocitySigma;
/** Simple constructor.
* @param positionSigma position sigma
* @param velocitySigma velocity sigma
*/
public PVData(final double positionSigma, final double velocitySigma) {
this.positionSigma = positionSigma;
this.velocitySigma = velocitySigma;
}
}
package fr.cs.examples.estimation;
import org.hipparchus.geometry.euclidean.threed.Vector3D;
import org.orekit.estimation.measurements.ObservableSatellite;
import org.orekit.estimation.measurements.PV;
import org.orekit.estimation.measurements.Range;
import org.orekit.estimation.measurements.modifiers.Bias;
import java.util.Map;
public class PVParser extends OrbitDetermination.MeasurementsParser<PV> {
/** Parser for PV measurements. */
@Override
public PV parseFields(final String[] fields,
final Map<String, StationData> stations,
final PVData pvData,
final ObservableSatellite satellite,
final Bias<Range> satRangeBias,
final Weights weights,
final String line,
final int lineNumber,
final String fileName) {
// field 2, which corresponds to stations in other measurements, is ignored
// this allows the measurements files to be columns aligned
// by inserting something like "----" instead of a station name
checkFields(9, fields, line, lineNumber, fileName);
return new org.orekit.estimation.measurements.PV(getDate(fields[0], line, lineNumber, fileName),
new Vector3D(Double.parseDouble(fields[3]) * 1000.0,
Double.parseDouble(fields[4]) * 1000.0,
Double.parseDouble(fields[5]) * 1000.0),
new Vector3D(Double.parseDouble(fields[6]) * 1000.0,
Double.parseDouble(fields[7]) * 1000.0,
Double.parseDouble(fields[8]) * 1000.0),
pvData.positionSigma,
pvData.velocitySigma,
weights.pvBaseWeight,
satellite);
}
}
package fr.cs.examples.estimation;
import java.util.Map;
import org.orekit.estimation.measurements.ObservableSatellite;
import org.orekit.estimation.measurements.Range;
import org.orekit.estimation.measurements.modifiers.Bias;
public class RangeParser extends OrbitDetermination.MeasurementsParser<Range> {
/** Parser for range measurements */
/** {@inheritDoc} */
@Override
public Range parseFields(final String[] fields,
final Map<String, StationData> stations,
final PVData pvData,
final ObservableSatellite satellite,
final Bias<Range> satRangeBias,
final Weights weights,
final String line,
final int lineNumber,
final String fileName) {
checkFields(4, fields, line, lineNumber, fileName);
final StationData stationData = getStationData(fields[2], stations, line, lineNumber, fileName);
final Range range = new Range(stationData.station, true,
getDate(fields[0], line, lineNumber, fileName),
Double.parseDouble(fields[3]) * 1000.0,
stationData.rangeSigma,
weights.rangeBaseWeight,
satellite);
if (stationData.rangeBias != null) {
range.addModifier(stationData.rangeBias);
}
if (satRangeBias != null) {
range.addModifier(satRangeBias);
}
if (stationData.rangeTroposphericCorrection != null) {
range.addModifier(stationData.rangeTroposphericCorrection);
}
return range;
}
}
package fr.cs.examples.estimation;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintStream;
import java.io.UnsupportedEncodingException;
import java.net.URISyntaxException;
import java.text.ParseException;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.HashMap;
import java.util.List;
import java.util.Locale;
import java.util.Map;
import java.util.NoSuchElementException;
import java.util.SortedSet;
import java.util.TreeSet;
import java.util.regex.Pattern;
import org.hipparchus.exception.LocalizedCoreFormats;
import org.hipparchus.geometry.euclidean.threed.Vector3D;
import org.hipparchus.linear.QRDecomposer;
import org.hipparchus.optim.nonlinear.vector.leastsquares.GaussNewtonOptimizer;
import org.hipparchus.optim.nonlinear.vector.leastsquares.LeastSquaresOptimizer;
import org.hipparchus.optim.nonlinear.vector.leastsquares.LeastSquaresProblem;
import org.hipparchus.optim.nonlinear.vector.leastsquares.LevenbergMarquardtOptimizer;
import org.hipparchus.stat.descriptive.StreamingStatistics;
import org.hipparchus.util.FastMath;
import org.hipparchus.util.Precision;
import org.orekit.attitudes.AttitudeProvider;
import org.orekit.attitudes.BodyCenterPointing;
import org.orekit.attitudes.LofOffset;
import org.orekit.attitudes.NadirPointing;
import org.orekit.attitudes.YawCompensation;
import org.orekit.attitudes.YawSteering;
import org.orekit.bodies.CelestialBody;
import org.orekit.bodies.CelestialBodyFactory;
import org.orekit.bodies.GeodeticPoint;
import org.orekit.bodies.OneAxisEllipsoid;
import org.orekit.data.DataProvidersManager;
import org.orekit.data.DirectoryCrawler;
import org.orekit.errors.OrekitException;
import org.orekit.errors.OrekitMessages;
import org.orekit.estimation.leastsquares.BatchLSEstimator;
import org.orekit.estimation.leastsquares.BatchLSObserver;
import org.orekit.estimation.measurements.AngularAzEl;
import org.orekit.estimation.measurements.EstimatedMeasurement;
import org.orekit.estimation.measurements.EstimationsProvider;
import org.orekit.estimation.measurements.GroundStation;
import org.orekit.estimation.measurements.ObservableSatellite;
import org.orekit.estimation.measurements.ObservedMeasurement;
import org.orekit.estimation.measurements.PV;
import org.orekit.estimation.measurements.Range;
import org.orekit.estimation.measurements.RangeRate;
import org.orekit.estimation.measurements.modifiers.AngularRadioRefractionModifier;
import org.orekit.estimation.measurements.modifiers.Bias;
import org.orekit.estimation.measurements.modifiers.OnBoardAntennaRangeModifier;
import org.orekit.estimation.measurements.modifiers.OutlierFilter;
import org.orekit.estimation.measurements.modifiers.RangeIonosphericDelayModifier;
import org.orekit.estimation.measurements.modifiers.RangeRateIonosphericDelayModifier;
import org.orekit.estimation.measurements.modifiers.RangeTroposphericDelayModifier;
import org.orekit.forces.PolynomialParametricAcceleration;
import org.orekit.forces.drag.DragForce;
import org.orekit.forces.drag.DragSensitive;
import org.orekit.forces.drag.IsotropicDrag;
import org.orekit.forces.gravity.HolmesFeatherstoneAttractionModel;
import org.orekit.forces.gravity.OceanTides;
import org.orekit.forces.gravity.Relativity;
import org.orekit.forces.gravity.SolidTides;
import org.orekit.forces.gravity.ThirdBodyAttraction;
import org.orekit.forces.gravity.potential.GravityFieldFactory;
import org.orekit.forces.gravity.potential.NormalizedSphericalHarmonicsProvider;
import org.orekit.forces.radiation.IsotropicRadiationSingleCoefficient;
import org.orekit.forces.radiation.RadiationSensitive;
import org.orekit.forces.radiation.SolarRadiationPressure;
import org.orekit.frames.EOPHistory;
import org.orekit.frames.Frame;
import org.orekit.frames.FramesFactory;
import org.orekit.frames.LOFType;
import org.orekit.frames.TopocentricFrame;
import org.orekit.gnss.Frequency;
import org.orekit.gnss.MeasurementType;
import org.orekit.gnss.ObservationData;
import org.orekit.gnss.ObservationDataSet;
import org.orekit.gnss.RinexLoader;
import org.orekit.gnss.SatelliteSystem;
import org.orekit.models.AtmosphericRefractionModel;
import org.orekit.models.earth.EarthITU453AtmosphereRefraction;
import org.orekit.models.earth.atmosphere.Atmosphere;
import org.orekit.models.earth.atmosphere.DTM2000;
import org.orekit.models.earth.atmosphere.data.MarshallSolarActivityFutureEstimation;
import org.orekit.models.earth.displacement.OceanLoading;
import org.orekit.models.earth.displacement.OceanLoadingCoefficientsBLQFactory;
import org.orekit.models.earth.displacement.StationDisplacement;
import org.orekit.models.earth.displacement.TidalDisplacement;
import org.orekit.models.earth.ionosphere.IonosphericModel;
import org.orekit.models.earth.ionosphere.KlobucharIonoCoefficientsLoader;
import org.orekit.models.earth.ionosphere.KlobucharIonoModel;
import org.orekit.models.earth.troposphere.DiscreteTroposphericModel;
import org.orekit.models.earth.troposphere.EstimatedTroposphericModel;
import org.orekit.models.earth.troposphere.GlobalMappingFunctionModel;
import org.orekit.models.earth.troposphere.MappingFunction;
import org.orekit.models.earth.troposphere.NiellMappingFunctionModel;
import org.orekit.models.earth.troposphere.SaastamoinenModel;
import org.orekit.orbits.CartesianOrbit;
import org.orekit.orbits.CircularOrbit;
import org.orekit.orbits.EquinoctialOrbit;
import org.orekit.orbits.KeplerianOrbit;
import org.orekit.orbits.Orbit;
import org.orekit.orbits.PositionAngle;
import org.orekit.propagation.SpacecraftState;
import org.orekit.propagation.analytical.tle.TLE;
import org.orekit.propagation.analytical.tle.TLEPropagator;
import org.orekit.propagation.conversion.DormandPrince853IntegratorBuilder;
import org.orekit.propagation.conversion.NumericalPropagatorBuilder;
import org.orekit.time.AbsoluteDate;
import org.orekit.time.DateComponents;
import org.orekit.time.TimeScalesFactory;
import org.orekit.utils.Constants;
import org.orekit.utils.IERSConventions;
import org.orekit.utils.PVCoordinates;
import org.orekit.utils.ParameterDriver;
import org.orekit.utils.ParameterDriversList;
import fr.cs.examples.KeyValueFileParser;
public class RangeRateParser extends OrbitDetermination.MeasurementsParser<RangeRate> {
/** Parser for range rate measurements. */
/** {@inheritDoc} */
@Override
public RangeRate parseFields(final String[] fields,
final Map<String, StationData> stations,
final PVData pvData,
final ObservableSatellite satellite,
final Bias<Range> satRangeBias,
final Weights weights,
final String line,
final int lineNumber,
final String fileName) {
checkFields(4, fields, line, lineNumber, fileName);
final StationData stationData = getStationData(fields[2], stations, line, lineNumber, fileName);
final RangeRate rangeRate = new RangeRate(stationData.station,
getDate(fields[0], line, lineNumber, fileName),
Double.parseDouble(fields[3]) * 1000.0,
stationData.rangeRateSigma,
weights.rangeRateBaseWeight,
true, satellite);
if (stationData.rangeRateBias != null) {
rangeRate.addModifier(stationData.rangeRateBias);
}
return rangeRate;
}
}
This diff is collapsed.
This diff is collapsed.
58646.304173 145962210.000 5.371 4171
58646.304231 145962180.000 8.223 4171
58646.304254 145962160.000 5.476 4171
58646.304312 145962130.000 5.291 4171
58646.304324 145962120.000 5.368 4171
58646.304336 145962110.000 6.923 4171
58646.304382 145962080.000 5.418 4171
58646.304417 145962060.000 15.827 4171
58646.304428 145962050.000 13.311 4171
58646.304440 145962040.000 15.206 4171
58646.304451 145962030.000 7.715 4171
58646.304463 145962030.000 9.768 4171
58646.304474 145962020.000 11.667 4171
58646.304486 145962010.000 9.890 4171
58646.304509 145962000.000 9.514 4171
58646.304521 145961980.000 6.858 4171
58646.304532 145961980.000 11.531 4171
58646.304544 145961970.000 11.504 4171
58646.304555 145961960.000 9.055 4171
58646.304567 145961950.000 8.791 4171
58646.304636 145961900.000 6.795 4171
58646.304648 145961900.000 9.906 4171
58646.304671 145961880.000 9.044 4171
58646.304752 145961820.000 10.615 4171
58646.304764 145961810.000 9.198 4171
58646.304775 145961800.000 6.661 4171
58646.304787 145961800.000 6.166 4171
58646.304810 145961770.000 12.379 4171
58646.304821 145961770.000 11.807 4171
58646.304833 145961760.000 12.113 4171
58646.304845 145961750.000 9.376 4171
58646.304868 145961730.000 9.331 4171
58646.304880 145961720.000 10.534 4171
58646.304891 145961710.000 11.571 4171
58646.304903 145961700.000 5.538 4171
58646.304914 145961690.000 6.518 4171
58646.304926 145961690.000 9.471 4171
58646.304949 145961670.000 7.734 4171
58646.304960 145961660.000 14.159 4171
58646.304972 145961650.000 10.393 4171
58646.305007 145961620.000 9.610 4171
58646.305018 145961620.000 7.129 4171
58646.305030 145961610.000 7.430 4171
58646.305041 145961600.000 5.571 4171
58646.305227 145961450.000 6.243 4171
58646.305261 145961420.000 6.171 4171
58646.305597 145961130.000 7.022 4171
58646.305620 145961120.000 12.500 4171
58646.305643 145961100.000 6.509 4171
58646.305655 145961090.000 9.171 4171
58646.305666 145961080.000 7.437 4171
58646.305678 145961070.000 9.494 4171
58646.305690 145961060.000 6.626 4171
58646.305701 145961050.000 24.296 4171
58646.305724 145961030.000 6.916 4171
58646.305736 145961020.000 7.957 4171
58646.305747 145961010.000 16.993 4171
58646.305782 145960980.000 10.309 4171
58646.305794 145960970.000 18.693 4171
58646.305806 145960960.000 21.715 4171
58646.305817 145960950.000 23.130 4171
58646.305840 145960930.000 35.412 4171
58646.305851 145960920.000 29.167 4171
58646.305863 145960910.000 46.276 4171
58646.305875 145960900.000 28.153 4171
58646.305886 145960890.000 20.156 4171
58646.305898 145960870.000 12.644 4171
58646.305910 145960870.000 25.449 4171
58646.305933 145960840.000 6.899 4171
58646.305944 145960840.000 6.267 4171
58646.305991 145960800.000 5.641 4171
58646.306002 145960790.000 8.290 4171
58646.306025 145960760.000 9.980 4171
58646.306037 145960760.000 7.454 4171
58646.306083 145960720.000 12.868 4171
58646.306095 145960710.000 19.479 4171
58646.306118 145960680.000 5.550 4171
58646.306199 145960620.000 7.478 4171
58646.306210 145960610.000 7.087 4171
58646.306222 145960590.000 13.583 4171
58646.306338 145960490.000 5.114 4171
58646.306361 145960470.000 5.141 4171
58646.306373 145960460.000 10.557 4171
58646.306384 145960460.000 10.347 4171
58646.306396 145960440.000 5.380 4171
58646.306419 145960420.000 9.578 4171
58646.306430 145960420.000 6.498 4171
58646.306454 145960400.000 6.560 4171
58646.306465 145960390.000 8.383 4171
58646.306477 145960370.000 19.249 4171
58646.306511 145960340.000 11.290 4171
58646.306523 145960330.000 5.457 4171
58646.306616 145960250.000 6.443 4171
58646.306639 145960230.000 7.456 4171
58646.306650 145960230.000 10.956 4171
58646.306662 145960210.000 6.617 4171
58646.306754 145960140.000 5.442 4171
58646.306974 145959960.000 6.989 4171
58646.307391 145959640.000 6.029 4171
58646.307403 145959630.000 5.983 4171
58646.307495 145959550.000 5.868 4171
This diff is collapsed.
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment