Fix arithmetic overflow that was breaking some prefilter polygons

This commit is contained in:
Eric Fischer 2016-12-20 15:07:10 -08:00
parent 854dc2bca5
commit a2060299c9

View File

@ -12,10 +12,10 @@ struct lonlat {
int op; int op;
double lon; double lon;
double lat; double lat;
int x; long long x;
int y; 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->op = nop;
this->lon = nlon; this->lon = nlon;
this->lat = nlat; 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; long double area = 0;
for (size_t k = 0; k < rings[i].size(); k++) { for (size_t k = 0; k < rings[i].size(); k++) {
if (rings[i][k].op != VT_CLOSEPATH) { if (rings[i][k].op != VT_CLOSEPATH) {
area += rings[i][k].x * rings[i][(k + 1) % rings[i].size()].y; area += (long double) rings[i][k].x * (long double) 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].y * (long double) rings[i][(k + 1) % rings[i].size()].x;
} }
} }
area /= 2;
areas[i] = area; areas[i] = area;
if (areas[i] >= 0 || i == 0) { if (areas[i] >= 0 || i == 0) {
outer++; outer++;
} }
// fprintf(fp, "area %f\n", area / .00000274 / .00000274); // fprintf(fp, "\"area\": %Lf,", area);
} }
if (outer > 1) { if (outer > 1) {