From ec79e1201d73d1730e36fde135a1f608850b0ddd Mon Sep 17 00:00:00 2001 From: Basile Bruneau Date: Sat, 9 May 2020 11:39:17 +0200 Subject: [PATCH] =?UTF-8?q?chore:=20replace=20point-in-geopolygon=20by=20@?= =?UTF-8?q?turf=20for=20improved=20performances=20(=C3=973)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- index.js | 15 +++++++++++++-- package-lock.json | 31 ++++++++++++++++++++++++------- package.json | 4 ++-- 3 files changed, 39 insertions(+), 11 deletions(-) diff --git a/index.js b/index.js index d993250..e3a20e2 100644 --- a/index.js +++ b/index.js @@ -1,5 +1,5 @@ const proj4 = require('proj4'); -const inside = require('point-in-geopolygon'); +const inside = require('@turf/boolean-point-in-polygon').default; const geojsonWorld = require('./countries.geo.json'); const geojsonByCountry = geojsonWorld.features.reduce((countries, feature) => { @@ -7,6 +7,15 @@ const geojsonByCountry = geojsonWorld.features.reduce((countries, feature) => { return countries; }, {}); +const geojsonToMultiPolygons = (geojson) => { + const coordinates = geojson.features.reduce( + (poly, feature) => + poly.concat(feature.geometry.type === 'Polygon' ? [feature.geometry.coordinates] : feature.geometry.coordinates), + [], + ); + return { type: 'Feature', geometry: { type: 'MultiPolygon', coordinates } }; +}; + const CACHE = {}; const DEFAULT_WORLD_REGION = { @@ -70,6 +79,8 @@ function DottedMap({ height = 0, width = 0, countries = [], region, grid = 'vert region = DEFAULT_WORLD_REGION; } + const poly = geojsonToMultiPolygons(geojson); + const cacheKey = [JSON.stringify(region), grid, height, width, JSON.stringify(countries)].join(' '); const [X_MIN, Y_MIN] = proj4(proj4.defs('GOOGLE'), [region.lng.min, region.lat.min]); @@ -95,7 +106,7 @@ function DottedMap({ height = 0, width = 0, countries = [], region, grid = 'vert const pointGoogle = [(localx / width) * X_RANGE + X_MIN, Y_MAX - (localy / height) * Y_RANGE]; const wgs84Point = proj4(proj4.defs('GOOGLE'), proj4.defs('WGS84'), pointGoogle); - if (inside.feature(geojson, wgs84Point) !== -1) { + if (inside(wgs84Point, poly)) { points[[x, y].join(';')] = { x: localx, y: localy }; } } diff --git a/package-lock.json b/package-lock.json index c0b48d4..5c949d8 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,19 +1,36 @@ { - "name": "dotted-map-generator", - "version": "1.0.0", + "name": "dotted-map", + "version": "1.1.1", "lockfileVersion": 1, "requires": true, "dependencies": { + "@turf/boolean-point-in-polygon": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/@turf/boolean-point-in-polygon/-/boolean-point-in-polygon-6.0.1.tgz", + "integrity": "sha512-FKLOZ124vkJhjzNSDcqpwp2NvfnsbYoUOt5iAE7uskt4svix5hcjIEgX9sELFTJpbLGsD1mUbKdfns8tZxcMNg==", + "requires": { + "@turf/helpers": "6.x", + "@turf/invariant": "6.x" + } + }, + "@turf/helpers": { + "version": "6.1.4", + "resolved": "https://registry.npmjs.org/@turf/helpers/-/helpers-6.1.4.tgz", + "integrity": "sha512-vJvrdOZy1ngC7r3MDA7zIGSoIgyrkWcGnNIEaqn/APmw+bVLF2gAW7HIsdTxd12s5wQMqEpqIQrmrbRRZ0xC7g==" + }, + "@turf/invariant": { + "version": "6.1.2", + "resolved": "https://registry.npmjs.org/@turf/invariant/-/invariant-6.1.2.tgz", + "integrity": "sha512-WU08Ph8j0J2jVGlQCKChXoCtI50BB3yEH21V++V0T4cR1T27HKCxkehV2sYMwTierfMBgjwSwDIsxnR4/2mWXg==", + "requires": { + "@turf/helpers": "6.x" + } + }, "mgrs": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/mgrs/-/mgrs-1.0.0.tgz", "integrity": "sha1-+5FYjnjJACVnI5XLQLJffNatGCk=" }, - "point-in-geopolygon": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/point-in-geopolygon/-/point-in-geopolygon-1.0.1.tgz", - "integrity": "sha1-InEbCCna4qpXyTk/Mw2//jEfb90=" - }, "prettier": { "version": "2.0.5", "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.0.5.tgz", diff --git a/package.json b/package.json index 6d92203..b35295e 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "dotted-map", - "version": "1.1.1", + "version": "1.2.0", "description": "", "main": "index.js", "scripts": { @@ -10,7 +10,7 @@ "author": "", "license": "ISC", "dependencies": { - "point-in-geopolygon": "^1.0.1", + "@turf/boolean-point-in-polygon": "^6.0.1", "proj4": "^2.6.1" }, "devDependencies": {