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 e1907bb4ead3f5c5f743d9bc50e4ca2617af4ac4 Author: Rijn Buve <[email protected]> Date: Fri Aug 29 20:35:37 2014 +0200 Added boundaries check --- mapcode | Bin 713200 -> 0 bytes mapcode.c | 158 ++++++++++++++++++++++++++++++++++++++++++++++++++------------ 2 files changed, 128 insertions(+), 30 deletions(-) diff --git a/mapcode b/mapcode deleted file mode 100755 index 3dd3aee..0000000 Binary files a/mapcode and /dev/null differ diff --git a/mapcode.c b/mapcode.c index 169b670..3d02efd 100644 --- a/mapcode.c +++ b/mapcode.c @@ -9,6 +9,7 @@ static const double PI = 3.14159265358979323846; static const int RESULTS_MAX = 64; +static const int SHOW_PROGRESS = 250; static void usage(const char* appName) { printf("MAPCODE (C library version %s)\n", mapcode_cversion); @@ -25,11 +26,13 @@ static void usage(const char* appName) { printf(" Encode a lat/lon to a Mapcode. If the territory code is specified, the\n"); printf(" encoding will only succeeed if the lat/lon is located in the territory.\n"); printf("\n"); - printf(" %s [-g | --grid] <nrPoints> [<seed>]\n", appName); + printf(" %s [-b | --boundaries]\n", appName); + printf(" %s [-g | --grid] <nrPoints>\n", appName); printf(" %s [-r | --random] <nrPoints> [<seed>]\n", appName); printf("\n"); - printf(" Create a test set of a number of a grid or random uniformly distributed\n"); - printf(" lat/lon pairs, (x, y, z) points and the Mapcode aliases.\n"); + printf(" Create a test set of lat/lon pairs based on the Mapcode boundaries database\n"); + printf(" as a fixed 3D grid or random uniformly distributed set of lat/lons with their\n"); + printf(" (x, y, z) coordinates and all Mapcode aliases.\n"); printf("\n"); printf(" The output format is:\n"); printf(" <number-of-aliases> <lat-deg> <lon-deg> <x> <y> <z>\n"); @@ -46,30 +49,67 @@ static void usage(const char* appName) { printf(" and the (x, y, z) coordinates are placed on a sphere with radius 1.\n"); } +static double radToDeg(double rad){ + return (rad / PI) * 180.0; +} + +static double degToRad(double deg){ + return (deg / 180.0) * PI; +} + /** * Given a single number between 0..1, generate a latitude, longitude (in degrees) and a 3D * (x, y, z) point on a sphere with a radius of 1. */ -static void unitToLatLonDegXYZ( - const double unit1, const double unit2, - double* latDeg, double* lonDeg, double* x, double* y, double* z) { +static void unitToLatLonDeg( + const double unit1, const double unit2, double* latDeg, double* lonDeg) { // Calculate uniformly distributed 3D point on sphere (radius = 1.0): // http://mathproofs.blogspot.co.il/2005/04/uniform-random-distribution-on-sphere.html const double theta0 = (2.0 * PI) * unit1; const double theta1 = acos(1.0 - (2.0 * unit2)); - *x = sin(theta0) * sin(theta1); - *y = cos(theta0) * sin(theta1); - *z = cos(theta1); + double x = sin(theta0) * sin(theta1); + double y = cos(theta0) * sin(theta1); + double z = cos(theta1); // Convert Carthesian 3D point into lat/lon (radius = 1.0): // http://stackoverflow.com/questions/1185408/converting-from-longitude-latitude-to-cartesian-coordinates - const double latRad = asin(*z); - const double lonRad = atan2(*y, *x); + const double latRad = asin(z); + const double lonRad = atan2(y, x); // Convert radians to degrees. - *latDeg = isnan(latRad) ? 90.0 : (latRad * (180.0 / PI)); - *lonDeg = isnan(lonRad) ? 180.0 : (lonRad * (180.0 / PI)); + *latDeg = isnan(latRad) ? 90.0 : radToDeg(latRad); + *lonDeg = isnan(lonRad) ? 180.0 : radToDeg(lonRad); +} + +static void convertLatLonToXYZ(double latDeg, double lonDeg, double* x, double* y, double* z) { + double latRad = degToRad(latDeg); + double lonRad = degToRad(lonDeg); + *x = cos(latRad) * cos(lonRad); + *y = cos(latRad) * sin(lonRad); + *z = sin(latRad); +} + +static int printMapcodes(double lat, double lon, int iShowError) { + const char* results[RESULTS_MAX]; + int context = 0; + const int nrResults = coord2mc(results, lat, lon, context); + if (nrResults <= 0) { + if (iShowError) { + fprintf(stderr, "error: cannot encode lat=%f, lon=%f)\n", lat, lon); + } + return -1; + } + double x; + double y; + double z; + convertLatLonToXYZ(lat, lon, &x, &y, &z); + printf("%d %lf %lf %lf %lf %lf\n", nrResults, lat, lon, x, y, z); + for (int j = 0; j < nrResults; ++j) { + printf("%s %s\n", results[(j * 2) + 1], results[(j * 2)]); + } + printf("\n"); + return nrResults; } int main(const int argc, const char** argv) @@ -135,6 +175,76 @@ int main(const int argc, const char** argv) printf("%s %s\n", results[(i * 2) + 1], results[(i * 2)]); } } + else if ((strcmp(cmd, "-b") == 0) || (strcmp(cmd, "--boundaries") == 0)) { + + // ------------------------------------------------------------------ + // Generate a test set based on the Mapcode boundaries. + // ------------------------------------------------------------------ + if (argc != 2) { + fprintf(stderr, "error: incorrect number of arguments\n\n"); + usage(appName); + return -1; + } + for (int i = 0; i < NR_RECS; ++i) { + long minLonE6; + long maxLonE6; + long minLatE6; + long maxLatE6; + double minLon; + double maxLon; + double minLat; + double maxLat; + double lat; + double lon; + + get_boundaries(i, &minLonE6, &minLatE6, &maxLonE6, &maxLatE6); + minLon = ((double) minLonE6) / 1.0E6; + maxLon = ((double) maxLonE6) / 1.0E6; + minLat = ((double) minLatE6) / 1.0E6; + maxLat = ((double) maxLatE6) / 1.0E6; + + // Try center. + lat = (maxLat - minLat ) / 2.0; + lon = (maxLon - minLon ) / 2.0; + + // Try center. + printMapcodes(lat, lon, 0); + + // Try corners. + printMapcodes(minLat, minLon, 0); + printMapcodes(minLat, maxLon, 0); + printMapcodes(maxLat, minLon, 0); + printMapcodes(maxLat, maxLon, 0); + + // Try JUST inside. + double factor = 1.0; + for (int j = 1; j < 6; ++j) { + + double d = 1.0 / factor; + printMapcodes(minLat + d, minLon + d, 0); + printMapcodes(minLat + d, maxLon - d, 0); + printMapcodes(maxLat - d, minLon + d, 0); + printMapcodes(maxLat - d, maxLon - d, 0); + + // Try JUST outside. + printMapcodes(minLat - d, minLon - d, 0); + printMapcodes(minLat - d, maxLon + d, 0); + printMapcodes(maxLat + d, minLon - d, 0); + printMapcodes(maxLat + d, maxLon + d, 0); + factor = factor * 10.0; + } + + // Try 22m outside. + printMapcodes(minLat - 22, (maxLon - minLon) / 2, 0); + printMapcodes(minLat - 22, (maxLon - minLon) / 2, 0); + printMapcodes(maxLat + 22, (maxLon - minLon) / 2, 0); + printMapcodes(maxLat + 22, (maxLon - minLon) / 2, 0); + + if ((i % SHOW_PROGRESS) == 0) { + fprintf(stderr, "Processed %d of %d regions...\r", i, NR_RECS); + } + } + } else if ((strcmp(cmd, "-g") == 0) || (strcmp(cmd, "--grid") == 0) || (strcmp(cmd, "-r") == 0) || (strcmp(cmd, "--random") == 0)) { @@ -177,18 +287,12 @@ int main(const int argc, const char** argv) double lonLargestNrOfResults = 0.0; int totalNrOfResults = 0; - const char* results[RESULTS_MAX]; - int context = 0; - int gridX = 0; int gridY = 0; int line = round(sqrt(nrPoints)); for (int i = 0; i < nrPoints; ++i) { double lat; double lon; - double x; - double y; - double z; double unit1; double unit2; @@ -209,25 +313,19 @@ int main(const int argc, const char** argv) } } - unitToLatLonDegXYZ(unit1, unit2, &lat, &lon, &x, &y, &z); - const int nrResults = coord2mc(results, lat, lon, context); - if (nrResults <= 0) { - fprintf(stderr, "error: cannot encode lat=%f, lon=%f)\n", lat, lon); - return -1; - } + unitToLatLonDeg(unit1, unit2, &lat, &lon); + const int nrResults = printMapcodes(lat, lon, 1); if (nrResults > largestNrOfResults) { largestNrOfResults = nrResults; latLargestNrOfResults = lat; lonLargestNrOfResults = lon; } totalNrOfResults += nrResults; - printf("%d %lf %lf %lf %lf %lf\n", nrResults, lat, lon, x, y, z); - for (int j = 0; j < nrResults; ++j) { - printf("%s %s\n", results[(j * 2) + 1], results[(j * 2)]); + if ((i % SHOW_PROGRESS) == 0) { + fprintf(stderr, "Created %d of %d 3D %s data points...\r", i, nrPoints, random ? "random" : "grid"); } - printf("\n"); } - fprintf(stderr, "Statistics:\n"); + fprintf(stderr, "\nStatistics:\n"); fprintf(stderr, "Total number of 3D points generated = %d\n", nrPoints); fprintf(stderr, "Total number of Mapcodes generated = %d\n", totalNrOfResults); fprintf(stderr, "Average number of Mapcodes per 3D point = %f\n", ((float) totalNrOfResults) / ((float) nrPoints)); -- Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/pkg-grass/mapcode.git _______________________________________________ Pkg-grass-devel mailing list [email protected] http://lists.alioth.debian.org/cgi-bin/mailman/listinfo/pkg-grass-devel

