[mapcode] 27/32: Added PGs changes to printing lat/lon
Stefan Fritsch
sf at moszumanska.debian.org
Wed Nov 2 23:27:17 UTC 2016
This is an automated email from the git hooks/post-receive script.
sf pushed a commit to annotated tag v1.33
in repository mapcode.
commit e0bb80c218d61d27cc9953d13bd0f86ee24f9644
Author: Rijn Buve <rijn at buve.nl>
Date: Wed Sep 3 19:36:54 2014 +0200
Added PGs changes to printing lat/lon
---
LICENSE | 0
NOTICE | 0
RELEASE_NOTES | 0
example/mapcode.cpp | 43 ++++++++++++++++++++++++++++++++++++-------
mapcodelib/basics.h | 0
mapcodelib/mapcoder.c | 18 +++++++++++++-----
mapcodelib/mapcoder.h | 27 +++++++++++++--------------
7 files changed, 62 insertions(+), 26 deletions(-)
diff --git a/LICENSE b/LICENSE
old mode 100644
new mode 100755
diff --git a/NOTICE b/NOTICE
old mode 100644
new mode 100755
diff --git a/RELEASE_NOTES b/RELEASE_NOTES
old mode 100644
new mode 100755
diff --git a/example/mapcode.cpp b/example/mapcode.cpp
old mode 100644
new mode 100755
index 20bd7b8..13b067c
--- a/example/mapcode.cpp
+++ b/example/mapcode.cpp
@@ -24,10 +24,14 @@
*/
#include <stdio.h>
-#include <time.h>
#include <math.h>
+#include <time.h>
#include "../mapcodelib/mapcoder.c"
+#define my_isnan(x) (false)
+#define my_round(x) ((long) (floor((x) + 0.5)))
+
+
static const char* VERSION = "1";
static const int SELF_CHECK = 1;
static const int SELF_CHECK_EXIT = 0;
@@ -145,8 +149,8 @@ static void unitToLatLonDeg(
const double lonRad = atan2(y, x);
// Convert radians to degrees.
- *latDeg = (latRad == NAN) ? 90.0 : radToDeg(latRad);
- *lonDeg = (lonRad == NAN) ? 180.0 : radToDeg(lonRad);
+ *latDeg = my_isnan(latRad) ? 90.0 : radToDeg(latRad);
+ *lonDeg = my_isnan(lonRad) ? 180.0 : radToDeg(lonRad);
}
@@ -159,7 +163,6 @@ static void convertLatLonToXYZ(double latDeg, double lonDeg, double* x, double*
double latRad = degToRad(latDeg);
double lonRad = degToRad(lonDeg);
*x = cos(latRad) * cos(lonRad);
- *y = cos(latRad) * sin(lonRad);
*z = sin(latRad);
}
@@ -240,6 +243,32 @@ static void selfCheckMapcodeToLatLon(const char* territory, const char* mapcode,
/**
+ * The method asCoordinate() generates and returns a printable coordinate
+ * precisely as it would be interpreted internally by Mapcode encoding
+ * (i.e. correctly rounded to the nearest one-millionth of a degree).
+ * As target, pass a buffer for at least 12 characters (including zero termination).
+ * If target = 0, an internal scratch buffer is used (the THIRD call will
+ * overwrite the first call).
+ */
+static char asCoordinateBuffer[24];
+static int ascoptr;
+static const char* asCoordinate(double coord, char* target)
+{
+ long c = (long) ((coord * 1000000) + ((coord < 0) ? -0.5 : 0.5));
+ int negative = (c < 0);
+ if (negative) {
+ c = -c;
+ }
+ if (target == 0) {
+ target = &asCoordinateBuffer[ascoptr];
+ ascoptr= ((ascoptr != 0) ? 0 : 12);
+ }
+ sprintf(target,"%s%d.%06d", (negative ? "-" : ""), c / 1000000, c % 1000000);
+ return target;
+}
+
+
+/**
* The method printMapcode() generates and outputs Mapcodes for a lat/lon pair.
* If iShowError != 0, then encoding errors are output to stderr, otherwise they
* are ignored.
@@ -251,7 +280,7 @@ static void generateAndOutputMapcodes(double lat, double lon, int iShowError) {
const int nrResults = encodeLatLonToMapcodes(results, lat, lon, context);
if (nrResults <= 0) {
if (iShowError) {
- fprintf(stderr, "error: cannot encode lat=%f, lon=%f)\n", lat, lon);
+ fprintf(stderr, "error: cannot encode lat=%s, lon=%s)\n", asCoordinate(lat, 0), asCoordinate(lon, 0));
exit(NORMAL_ERROR);
}
}
@@ -260,7 +289,7 @@ static void generateAndOutputMapcodes(double lat, double lon, int iShowError) {
double y;
double z;
convertLatLonToXYZ(lat, lon, &x, &y, &z);
- printf("%d %lf %lf %lf %lf %lf\n", nrResults, lat, lon, x, y, z);
+ printf("%d %s %s %lf %lf %lf\n", nrResults, asCoordinate(lat, 0), asCoordinate(lon, 0), x, y, z);
for (int j = 0; j < nrResults; ++j) {
const char* foundMapcode = results[(j * 2)];
const char* foundTerritory = results[(j * 2) + 1];
@@ -541,7 +570,7 @@ int main(const int argc, const char** argv)
int gridX = 0;
int gridY = 0;
- int line = (int) (sqrt(totalNrOfPoints) + 0.5);
+ int line = my_round(sqrt(totalNrOfPoints));
for (int i = 0; i < totalNrOfPoints; ++i) {
double lat;
double lon;
diff --git a/mapcodelib/basics.h b/mapcodelib/basics.h
old mode 100644
new mode 100755
diff --git a/mapcodelib/mapcoder.c b/mapcodelib/mapcoder.c
old mode 100644
new mode 100755
index 165b11a..aee1829
--- a/mapcodelib/mapcoder.c
+++ b/mapcodelib/mapcoder.c
@@ -42,7 +42,17 @@ int current_ccode=-1; // cache for setup_country
#define MAXGLOBALRESULTS 32 // The worst actually seems to be 14, which is at 52.050500, 113.468600
#define WORSTCASE_MAPCODE_BYTES 16 // worst case is high-precision earth xxxxx.yyyy-zz, rounded upwords to multiple of 4 bytes (assuming latin-only results)
-char global_buffer[MAXGLOBALRESULTS*2][WORSTCASE_MAPCODE_BYTES]; // cache for worst-case result
+char global_storage[2048]; // cyclic cache for results
+int storage_ptr;
+char *addstorage(const char *str)
+{
+ int len=strlen(str)+1; // bytes needed;
+ storage_ptr &= (2048-1);
+ if (storage_ptr<0 || storage_ptr+len>2048-2) storage_ptr=0;
+ strcpy(global_storage+storage_ptr,str);
+ storage_ptr+=len;
+ return global_storage+storage_ptr-len;
+}
char **global_results;
int nr_global_results;
@@ -1090,10 +1100,8 @@ void addresult(char *resultbuffer, char *result, long x,long y, int ccode)
if (result_override>=0) ccode=result_override; // 1.32 true recursive processing
#endif
if (*result && global_results && nr_global_results>=0 && nr_global_results+1<(2*MAXGLOBALRESULTS)) {
- global_results[nr_global_results]=global_buffer[nr_global_results];
- strcpy(global_results[nr_global_results++],result);
- global_results[nr_global_results]=global_buffer[nr_global_results];
- strcpy(global_results[nr_global_results++],makeiso(ccode,1));
+ global_results[nr_global_results++] = addstorage(result);
+ global_results[nr_global_results++] = addstorage(makeiso(ccode,1));
}
// add to buffer (if any)
if (resultbuffer)
diff --git a/mapcodelib/mapcoder.h b/mapcodelib/mapcoder.h
old mode 100644
new mode 100755
index ab483bc..a889ba1
--- a/mapcodelib/mapcoder.h
+++ b/mapcodelib/mapcoder.h
@@ -206,18 +206,17 @@ const UWORD* encodeToAlphabet(const char* mapcode, int alphabet);
/**
- * List of #defines to support legacy systems. These names are deprecated but supported for
- * existing systems. Please use the names above.
+ * list of #defines to support legacy systems
*/
-#define coord2mc encodeLatLonToMapcodes
-#define coord2mc1 encodeLatLonToSingleMapcode
-#define mc2coord decodeMapcodeToLatLon
-#define lookslikemapcode compareWithMapcodeFormat
-#define text2tc convertTerritoryIsoNameToCode
-#define tc2text convertTerritoryCodeToIsoName
-#define tccontext getCountryOrParentCountry
-#define tcparent getParentCountryOfState
-#define decode_to_roman decodeToRoman
-#define encode_to_alphabet encodeToAlphabet
-#define MAX_MAPCODE_TERRITORY_CODE MAX_CCODE
-#define NR_BOUNDARY_RECS NR_RECS
+#define coord2mc encodeLatLonToMapcodes
+#define coord2mc1 encodeLatLonToSingleMapcode
+#define mc2coord decodeMapcodeToLatLon
+#define lookslikemapcode compareWithMapcodeFormat
+#define text2tc convertTerritoryIsoNameToCode
+#define tc2text convertTerritoryCodeToIsoName
+#define tccontext getCountryOrParentCountry
+#define tcparent getParentCountryOfState
+#define decode_to_roman decodeToRoman
+#define encode_to_alphabet encodeToAlphabet
+#define MAX_MAPCODE_TERRITORY_CODE MAX_CCODE
+#define NR_BOUNDARY_RECS NR_RECS
--
Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/pkg-grass/mapcode.git
More information about the Pkg-grass-devel
mailing list