turf-inside
Advanced tools
Comparing version 0.1.4 to 1.0.0
44
index.js
@@ -5,18 +5,42 @@ // http://en.wikipedia.org/wiki/Even%E2%80%93odd_rule | ||
module.exports = function(point, polygon){ | ||
var x = point.geometry.coordinates[0] | ||
var y = point.geometry.coordinates[1] | ||
var vs = polygon.geometry.coordinates[0] | ||
module.exports = function(point, polygon) { | ||
var polys = polygon.geometry.coordinates; | ||
var pt = [point.geometry.coordinates[0], point.geometry.coordinates[1]]; | ||
// normalize to multipolygon | ||
if(polygon.geometry.type === 'Polygon') polys = [polys]; | ||
var insidePoly = false; | ||
var i = 0; | ||
while (i < polys.length && !insidePoly) { | ||
// check if it is in the outer ring first | ||
if(inRing(pt, polys[i][0])) { | ||
var inHole = false; | ||
var k = 1; | ||
// check for the point in any of the holes | ||
while(k < polys[i].length && !inHole) { | ||
if(inRing(pt, polys[i][k])) { | ||
inHole = true; | ||
} | ||
k++ | ||
} | ||
if(!inHole) insidePoly = true; | ||
} | ||
i++; | ||
} | ||
return insidePoly; | ||
} | ||
// pt is [x,y] and ring is [[x,y], [x,y],..] | ||
function inRing (pt, ring) { | ||
var isInside = false; | ||
for (var i = 0, j = vs.length - 1; i < vs.length; j = i++) { | ||
var xi = vs[i][0], yi = vs[i][1]; | ||
var xj = vs[j][0], yj = vs[j][1]; | ||
for (var i = 0, j = ring.length - 1; i < ring.length; j = i++) { | ||
var xi = ring[i][0], yi = ring[i][1]; | ||
var xj = ring[j][0], yj = ring[j][1]; | ||
var intersect = ((yi > y) != (yj > y)) | ||
&& (x < (xj - xi) * (y - yi) / (yj - yi) + xi); | ||
var intersect = ((yi > pt[1]) != (yj > pt[1])) | ||
&& (pt[0] < (xj - xi) * (pt[1] - yi) / (yj - yi) + xi); | ||
if (intersect) isInside = !isInside; | ||
} | ||
return isInside | ||
return isInside; | ||
} | ||
{ | ||
"name": "turf-inside", | ||
"version": "0.1.4", | ||
"version": "1.0.0", | ||
"description": "turf inside module", | ||
@@ -31,3 +31,9 @@ "main": "index.js", | ||
"turf-polygon" | ||
] | ||
], | ||
"bin": { | ||
"turf-point": "bin/point.js" | ||
}, | ||
"dependencies": { | ||
"minimist": "^0.2.0" | ||
} | ||
} |
@@ -5,3 +5,3 @@ turf-inside | ||
Checks to see if a point is inside of a polygon. The polygon can be convex or concave. | ||
Checks to see if a point is inside of a polygon. The polygon can be convex or concave. The function accepts any valid polygon or multipolygon and accounts for holes. | ||
@@ -18,3 +18,3 @@ ###Install | ||
|---|---| | ||
|point|A FeatureCollection of Point Features| | ||
|point|A Point Feature| | ||
|polygon|Determines if the point is inside the polygon or not| | ||
@@ -41,2 +41,9 @@ | ||
console.log(isInside) // true | ||
``` | ||
``` | ||
###CLI | ||
```bash | ||
npm install turf-inside -g | ||
turf-inside point.geojson polygon.geojson | ||
``` |
64
test.js
var test = require('tape'); | ||
var inside = require('./') | ||
var point = require('turf-point') | ||
var polygon = require('turf-polygon') | ||
var inside = require('./'); | ||
var point = require('turf-point'); | ||
var polygon = require('turf-polygon'); | ||
var fs = require('fs'); | ||
test('featureCollection', function(t){ | ||
t.plan(4) | ||
test('featureCollection', function (t) { | ||
// test for a simple polygon | ||
var poly = polygon([[[0,0], [0,100], [100,100], [100,0]]]) | ||
var ptIn = point(50, 50) | ||
var ptOut = point(140, 150) | ||
var poly = polygon([[[0,0], [0,100], [100,100], [100,0]]]); | ||
var ptIn = point(50, 50); | ||
var ptOut = point(140, 150); | ||
t.true(inside(ptIn, poly), 'point inside simple polygon') | ||
t.false(inside(ptOut, poly), 'point outside simple polygon') | ||
t.true(inside(ptIn, poly), 'point inside simple polygon'); | ||
t.false(inside(ptOut, poly), 'point outside simple polygon'); | ||
// test for a concave polygon | ||
var concavePoly = polygon([[[0,0], [50, 50], [0,100], [100,100], [100,0]]]) | ||
var ptConcaveIn = point(75, 75) | ||
var ptConcaveOut = point(25, 50) | ||
var concavePoly = polygon([[[0,0], [50, 50], [0,100], [100,100], [100,0]]]); | ||
var ptConcaveIn = point(75, 75); | ||
var ptConcaveOut = point(25, 50); | ||
t.true(inside(ptConcaveIn, concavePoly), 'point inside concave polygon') | ||
t.false(inside(ptConcaveOut, concavePoly), 'point outside concave polygon') | ||
}); | ||
t.true(inside(ptConcaveIn, concavePoly), 'point inside concave polygon'); | ||
t.false(inside(ptConcaveOut, concavePoly), 'point outside concave polygon'); | ||
t.end(); | ||
}); | ||
test('poly with hole', function (t) { | ||
var ptInHole = point(-86.69208526611328, 36.20373274711739); | ||
var ptInPoly = point(-86.72229766845702, 36.20258997094334); | ||
var ptOutsidePoly = point(-86.75079345703125, 36.18527313913089); | ||
var polyHole = JSON.parse(fs.readFileSync('./fixtures/poly-with-hole.geojson')); | ||
t.false(inside(ptInHole, polyHole)); | ||
t.true(inside(ptInPoly, polyHole)); | ||
t.false(inside(ptOutsidePoly, polyHole)) | ||
t.end(); | ||
}); | ||
test('multipolygon with hole', function (t) { | ||
var ptInHole = point(-86.69208526611328, 36.20373274711739); | ||
var ptInPoly = point(-86.72229766845702, 36.20258997094334); | ||
var ptInPoly2 = point(-86.75079345703125, 36.18527313913089); | ||
var ptOutsidePoly = point(-86.75302505493164, 36.23015046460186); | ||
var multiPolyHole = JSON.parse(fs.readFileSync('./fixtures/multipoly-with-hole.geojson')); | ||
t.false(inside(ptInHole, multiPolyHole)); | ||
t.true(inside(ptInPoly, multiPolyHole)); | ||
t.true(inside(ptInPoly2, multiPolyHole)); | ||
t.true(inside(ptInPoly, multiPolyHole)); | ||
t.false(inside(ptOutsidePoly, multiPolyHole)) | ||
t.end(); | ||
}); |
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
Filesystem access
Supply chain riskAccesses the file system, and could potentially read sensitive data.
Found 1 instance in 1 package
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
No v1
QualityPackage is not semver >=1. This means it is not stable and does not support ^ ranges.
Found 1 instance in 1 package
10343
10
101
0
47
1
1
+ Addedminimist@^0.2.0
+ Addedminimist@0.2.4(transitive)