From a2060299c9b6c898bcc4a0bfc242c511d62d7e38 Mon Sep 17 00:00:00 2001 From: Eric Fischer Date: Tue, 20 Dec 2016 15:07:10 -0800 Subject: [PATCH] Fix arithmetic overflow that was breaking some prefilter polygons --- write_json.cpp | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/write_json.cpp b/write_json.cpp index e5b2287b..ebcbd552 100644 --- a/write_json.cpp +++ b/write_json.cpp @@ -12,10 +12,10 @@ struct lonlat { int op; double lon; double lat; - int x; - int y; + long long x; + long long y; - lonlat(int nop, double nlon, double nlat, int nx, int ny) { + lonlat(int nop, double nlon, double nlat, long long nx, long long ny) { this->op = nop; this->lon = nlon; this->lat = nlat; @@ -196,17 +196,18 @@ void layer_to_geojson(FILE *fp, mvt_layer const &layer, unsigned z, unsigned x, long double area = 0; for (size_t k = 0; k < rings[i].size(); k++) { if (rings[i][k].op != VT_CLOSEPATH) { - area += rings[i][k].x * rings[i][(k + 1) % rings[i].size()].y; - area -= rings[i][k].y * rings[i][(k + 1) % rings[i].size()].x; + area += (long double) rings[i][k].x * (long double) rings[i][(k + 1) % rings[i].size()].y; + area -= (long double) rings[i][k].y * (long double) rings[i][(k + 1) % rings[i].size()].x; } } + area /= 2; areas[i] = area; if (areas[i] >= 0 || i == 0) { outer++; } - // fprintf(fp, "area %f\n", area / .00000274 / .00000274); + // fprintf(fp, "\"area\": %Lf,", area); } if (outer > 1) {