Revision 8c4bbd4f
Added by Niels Hoffmann over 13 years ago
cdmlib-model/src/main/java/eu/etaxonomy/cdm/model/location/Point.java | ||
---|---|---|
139 | 139 |
public static final class CoordinateParser { |
140 | 140 |
|
141 | 141 |
/** |
142 |
* Pattern zum parsen von Sexagesimalen Grad: 145?
|
|
142 |
* Pattern zum parsen von Sexagesimalen Grad: 145°
|
|
143 | 143 |
*/ |
144 |
private static final String DEGREE_REGEX = "([0-9]*)?";
|
|
144 |
private static final String DEGREE_REGEX = "([0-9]*)\u00B0";
|
|
145 | 145 |
/** |
146 | 146 |
* Pattern zum parsen von Sexagesimalen Minuten: 65' |
147 | 147 |
*/ |
... | ... | |
151 | 151 |
*/ |
152 | 152 |
private static final String SECONDS_REGEX = "(?:([0-9]*)(?:''|\"))?"; |
153 | 153 |
/** |
154 |
* Himmelsrichtung L?ngengrad
|
|
154 |
* Himmelsrichtung Längengrad
|
|
155 | 155 |
*/ |
156 | 156 |
private static final String LONGITUDE_DIRECTION_REGEX = "([OEW])"; |
157 | 157 |
/** |
... | ... | |
167 | 167 |
+ LATITUDE_DIRECTION_REGEX); |
168 | 168 |
|
169 | 169 |
/** |
170 |
* Pattern zum Parsen von L?ngengraden.
|
|
170 |
* Pattern zum Parsen von Längengraden.
|
|
171 | 171 |
*/ |
172 | 172 |
private static final Pattern LONGITUDE_PATTERN = Pattern |
173 | 173 |
.compile(DEGREE_REGEX + MINUTES_REGEX + SECONDS_REGEX |
... | ... | |
179 | 179 |
|
180 | 180 |
/** |
181 | 181 |
* Parst einen Breitengrad der Form<br> |
182 |
* G?M'S""(OEW)<br>
|
|
182 |
* G°M'S""(OEW)<br>
|
|
183 | 183 |
* Die Formen<br> |
184 |
* G?(OEW)<br>
|
|
185 |
* G?M'(OEW)<br>
|
|
184 |
* G°(OEW)<br>
|
|
185 |
* G°M'(OEW)<br>
|
|
186 | 186 |
* sind ebenfalls erlaubt. |
187 | 187 |
* |
188 | 188 |
* @param strg |
... | ... | |
196 | 196 |
} |
197 | 197 |
|
198 | 198 |
/** |
199 |
* Parst einen L?ngengrad der Form<br>
|
|
200 |
* G?M'S"(NS)<br>
|
|
199 |
* Parst einen Längengrad der Form<br>
|
|
200 |
* G°M'S"(NS)<br>
|
|
201 | 201 |
* Die Formen<br> |
202 |
* G?(NS)<br>
|
|
203 |
* G?M'(NS)<br>
|
|
202 |
* G°(NS)<br>
|
|
203 |
* G°M'(NS)<br>
|
|
204 | 204 |
* sind ebenfalls erlaubt. |
205 | 205 |
* |
206 | 206 |
* @param strg |
... | ... | |
334 | 334 |
} |
335 | 335 |
} |
336 | 336 |
|
337 |
// Decimal in ?'" umrechnen
|
|
337 |
// Decimal in \u00B0'" umrechnen
|
|
338 | 338 |
double d = Math.abs(decimalDegree); |
339 | 339 |
d += HALF_SECOND; // add a second for rounding |
340 | 340 |
sexagesimal.degree = (int) Math.floor(d); |
... | ... | |
371 | 371 |
} |
372 | 372 |
public String toString(boolean includeEmptySeconds){ |
373 | 373 |
String result; |
374 |
result = String.valueOf(CdmUtils.Nz(degree)) + "?";
|
|
374 |
result = String.valueOf(CdmUtils.Nz(degree)) + "\u00B0";
|
|
375 | 375 |
if (seconds != null || minutes != null){ |
376 | 376 |
result += String.valueOf(CdmUtils.Nz(minutes)) + "'"; |
377 | 377 |
} |
cdmlib-model/src/main/java/eu/etaxonomy/cdm/strategy/parser/location/CoordinateConverter.java | ||
---|---|---|
73 | 73 |
patterns.add(pattern); |
74 | 74 |
|
75 | 75 |
|
76 |
//Variations of DD(?|d)MM.MMM' with whitespace characters
|
|
76 |
//Variations of DD(\u00B0|d)MM.MMM' with whitespace characters
|
|
77 | 77 |
pattern = new CoordinatePattern(); |
78 |
pattern.description = "Variation of DD(?|d)MM.MMM('|m)";
|
|
78 |
pattern.description = "Variation of DD(\u00B0|d)MM.MMM('|m)";
|
|
79 | 79 |
pattern.pattern = |
80 | 80 |
"(^" + |
81 | 81 |
"(\\s)*(\\+|-|W|w|E|e|N|n|S|s)?(\\s)*" + |
82 |
"((\\d{1,3}(\\s)*(?|?|D|d)?(\\s)*$)|(\\d{1,3}(\\s)*(?|?|D|d)(\\s)*\\d{1,2}(\\.|\\,)?(\u02B9|'|M|m)?$)|(\\d{1,3}(\\s)*(?|?|D|d)(\\s)*\\d{1,2}(\\.|\\,)\\d+(\\s)*(\u02B9|'|M|m)?(\\s)*$))" +
|
|
82 |
"((\\d{1,3}(\\s)*(\u00B0|\u00BA|D|d)?(\\s)*$)|(\\d{1,3}(\\s)*(\u00B0|\u00BA|D|d)(\\s)*\\d{1,2}(\\.|\\,)?(\u02B9|'|M|m)?$)|(\\d{1,3}(\\s)*(\u00B0|\u00BA|D|d)(\\s)*\\d{1,2}(\\.|\\,)\\d+(\\s)*(\u02B9|'|M|m)?(\\s)*$))" +
|
|
83 | 83 |
")" + |
84 | 84 |
"|(^" + |
85 |
"(\\s)*((\\d{1,3}(\\s)*(?|?|D|d)?(\\s)*)|(\\d{1,3}(\\s)*(?|?|D|d)(\\s)*\\d{1,2}(\\.|\\,)?(\u02B9|'|M|m)?)|(\\d{1,3}(\\s)*(?|?|D|d)(\\s)*\\d{1,2}(\\.|\\,)\\d+(\\s)*(\u02B9|'|M|m)?(\\s)*))" +
|
|
85 |
"(\\s)*((\\d{1,3}(\\s)*(\u00B0|\u00BA|D|d)?(\\s)*)|(\\d{1,3}(\\s)*(\u00B0|\u00BA|D|d)(\\s)*\\d{1,2}(\\.|\\,)?(\u02B9|'|M|m)?)|(\\d{1,3}(\\s)*(\u00B0|\u00BA|D|d)(\\s)*\\d{1,2}(\\.|\\,)\\d+(\\s)*(\u02B9|'|M|m)?(\\s)*))" +
|
|
86 | 86 |
"(W|w|E|e|N|n|S|s)?(\\s)*$" + |
87 | 87 |
")"; |
88 | 88 |
patterns.add(pattern); |
89 | 89 |
|
90 | 90 |
|
91 |
//Variations of DD?MM'SS.SSS" with whitespace characters
|
|
91 |
//Variations of DD\u00B0MM'SS.SSS" with whitespace characters
|
|
92 | 92 |
pattern = new CoordinatePattern(); |
93 |
pattern.description = "Variation of DD(?|d)MM(\u02B9|m)SS.SSS(\u02BA|s)";
|
|
93 |
pattern.description = "Variation of DD(\u00B0|d)MM(\u02B9|m)SS.SSS(\u02BA|s)";
|
|
94 | 94 |
pattern.pattern = |
95 |
//+/-/Nn/Ss/Ww/EeDD?MM\u02B9SS.SSS
|
|
95 |
//+/-/Nn/Ss/Ww/EeDD\u00B0MM\u02B9SS.SSS
|
|
96 | 96 |
"(^" + |
97 | 97 |
"(\\s)*(\\+|-|W|w|E|e|N|n|S|s)?(\\s)*" + |
98 |
"((\\d{1,3}(\\s)*(?|?|D|d)?(\\s)*$)|(\\d{1,3}(\\s)*(?|?|D|d)(\\s)*\\d{1,2}(\\s)*(\u02B9|'|M|m)?(\\s)*$)|(\\d{1,3}(\\s)*(?|?|D|d)(\\s)*\\d{1,2}(\\s)*(\u02B9|'|M|m)(\\s)*\\d{1,2}(\\.|\\,)?(\\s)*(\u02BA|\"|''|S|s)?(\\s)*$)|(\\d{1,3}(\\s)*(?|?|D|d)(\\s)*\\d{1,2}(\\s)*(\u02B9|'|M|m)(\\s)*\\d{1,2}(\\.|\\,)\\d+(\\s)*(\u02BA|\"|''|S|s)?(\\s)*$))" +
|
|
98 |
"((\\d{1,3}(\\s)*(\u00B0|\u00BA|D|d)?(\\s)*$)|(\\d{1,3}(\\s)*(\u00B0|\u00BA|D|d)(\\s)*\\d{1,2}(\\s)*(\u02B9|'|M|m)?(\\s)*$)|(\\d{1,3}(\\s)*(\u00B0|\u00BA|D|d)(\\s)*\\d{1,2}(\\s)*(\u02B9|'|M|m)(\\s)*\\d{1,2}(\\.|\\,)?(\\s)*(\u02BA|\"|''|S|s)?(\\s)*$)|(\\d{1,3}(\\s)*(\u00B0|\u00BA|D|d)(\\s)*\\d{1,2}(\\s)*(\u02B9|'|M|m)(\\s)*\\d{1,2}(\\.|\\,)\\d+(\\s)*(\u02BA|\"|''|S|s)?(\\s)*$))" +
|
|
99 | 99 |
")" + |
100 |
//DD?MM\u02B9SS.SSSNn/Ss/Ww/Ee
|
|
100 |
//DD°MM\u02B9SS.SSSNn/Ss/Ww/Ee
|
|
101 | 101 |
"|(^" + |
102 |
"(\\s)*((\\d{1,3}(\\s)*(?|?|D|d)?(\\s)*)|(\\d{1,3}(\\s)*(?|?|D|d)(\\s)*\\d{1,2}(\\s)*(\u02B9|'|M|m)?(\\s)*)|(\\d{1,3}(\\s)*(?|?|D|d)(\\s)*\\d{1,2}(\\s)*(\u02B9|'|M|m)(\\s)*\\d{1,2}(\\.|\\,)?(\\s)*(\u02BA|\"|''|S|s)?(\\s)*)|(\\d{1,3}(\\s)*(?|?|D|d)(\\s)*\\d{1,2}(\\s)*(\u02B9|'|M|m)(\\s)*\\d{1,2}(\\.|\\,)\\d+(\\s)*(\u02BA|\"|''|S|s)?(\\s)*))" +
|
|
102 |
"(\\s)*((\\d{1,3}(\\s)*(\u00B0|\u00BA|D|d)?(\\s)*)|(\\d{1,3}(\\s)*(\u00B0|\u00BA|D|d)(\\s)*\\d{1,2}(\\s)*(\u02B9|'|M|m)?(\\s)*)|(\\d{1,3}(\\s)*(\u00B0|\u00BA|D|d)(\\s)*\\d{1,2}(\\s)*(\u02B9|'|M|m)(\\s)*\\d{1,2}(\\.|\\,)?(\\s)*(\u02BA|\"|''|S|s)?(\\s)*)|(\\d{1,3}(\\s)*(\u00B0|\u00BA|D|d)(\\s)*\\d{1,2}(\\s)*(\u02B9|'|M|m)(\\s)*\\d{1,2}(\\.|\\,)\\d+(\\s)*(\u02BA|\"|''|S|s)?(\\s)*))" +
|
|
103 | 103 |
"(W|w|E|e|N|n|S|s)?(\\s)*$" + |
104 | 104 |
")"; |
105 | 105 |
patterns.add(pattern); |
... | ... | |
436 | 436 |
checkDegreeRange(dd, results); |
437 | 437 |
doConvertWithCheck(sign, dd, mm, mmm, ss, sss, results); |
438 | 438 |
|
439 |
}else if (pattern.description.equals("Variation of DD(?|d)MM.MMM('|m)")){
|
|
439 |
}else if (pattern.description.equals("Variation of DD(\u00B0|d)MM.MMM('|m)")){
|
|
440 | 440 |
|
441 | 441 |
//Sets pattern machted, successful, pattern type and pattern info |
442 | 442 |
initializeResult(results, pattern); |
... | ... | |
454 | 454 |
|
455 | 455 |
//do some further replacing |
456 | 456 |
//Replace degree symbol |
457 |
str = str.replaceAll("(?|?|D|d)", ":");
|
|
457 |
str = str.replaceAll("(\u00B0|\u00B0|D|d)", ":");
|
|
458 | 458 |
|
459 | 459 |
//remove minute symbol |
460 | 460 |
str = str.replaceAll("(\u02B9|'|M|m)", ""); |
... | ... | |
486 | 486 |
checkDegreeRange(dd, results); |
487 | 487 |
checkMinuteRange(mm, results); |
488 | 488 |
doConvertWithCheck(sign, dd, mm, mmm, ss, sss, results); |
489 |
|
|
490 |
}else if (pattern.description.equals("Variation of DD(?|d)MM(\u02B9|m)SS.SSS(\u02BA|s)")){
|
|
489 |
|
|
490 |
}else if (pattern.description.equals("Variation of DD(\u00B0|d)MM(\u02B9|m)SS.SSS(\u02BA|s)")){
|
|
491 | 491 |
|
492 | 492 |
/* |
493 | 493 |
* Note: |
... | ... | |
521 | 521 |
|
522 | 522 |
//do some further replacing |
523 | 523 |
//Replace degree symbol |
524 |
str = str.replaceAll("(?|?|D|d|\u02B9|'|M|m)",":");
|
|
524 |
str = str.replaceAll("(\u00B0|\u00B0|D|d|\u02B9|'|M|m)",":");
|
|
525 | 525 |
|
526 | 526 |
//Extract decimal part |
527 | 527 |
decimalBit = str.split(decSeparatorRegEx); |
cdmlib-services/src/test/java/eu/etaxonomy/cdm/api/facade/DerivedUnitFacadeTest.java | ||
---|---|---|
391 | 391 |
public void testSetExactLocationByParsing(){ |
392 | 392 |
Point point1; |
393 | 393 |
try { |
394 |
specimenFacade.setExactLocationByParsing("11°34'20\"W", "34°30,34'N", null, null);
|
|
394 |
specimenFacade.setExactLocationByParsing("112\u00B034'20\"W", "34\u00B030,34'N", null, null);
|
|
395 | 395 |
point1 = specimenFacade.getExactLocation(); |
396 | 396 |
Assert.assertNotNull("", point1.getLatitude()); |
397 | 397 |
System.out.println(point1.getLatitude().toString()); |
Also available in: Unified diff
UTF8 for Coordinate Conversion