Created
March 12, 2017 23:00
-
-
Save jelmervdl/d779bee5b385457accff0f14fd8aadc5 to your computer and use it in GitHub Desktop.
Leaflet function to get a layer at a certain point. Supports polygons and multipolygons with holes.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
function pointInRing(point, vs) | |
{ | |
var x = point[0], y = point[1]; | |
var inside = 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]; | |
var intersect = ((yi > y) != (yj > y)) | |
&& (x < (xj - xi) * (y - yi) / (yj - yi) + xi); | |
if (intersect) inside = !inside; | |
} | |
return inside; | |
} | |
function pointInPolygon(point, polygon) | |
{ | |
// Test if it is inside the polygon | |
if (!pointInRing(point, polygon[0])) | |
return false; | |
// Test if it is inside a hole | |
for (var i = 1; i < polygon.length; ++i) | |
if (pointInRing(point, polygon[i])) | |
return false; | |
return true; | |
} | |
function pointInMultiPolygon(point, multipolygon) | |
{ | |
for (var i = 0; i < multipolygon.length; ++i) | |
if (pointInPolygon(point, multipolygon[i])) | |
return true; | |
return false; | |
} | |
function getLayerAtPoint(latlng, layergroup) | |
{ | |
var p = [latlng.lng, latlng.lat]; | |
for (var layer_id in layergroup._layers) { | |
var layer = layergroup._layers[layer_id]; | |
var type = layer.feature.geometry.type; | |
if (['Polygon', 'MultiPolygon'].indexOf(type) === -1) | |
continue; | |
var coordinates = layer.toGeoJSON().geometry.coordinates; | |
// normalize to MultiPolygon | |
if (type == 'Polygon') | |
coordinates = [coordinates]; | |
if (pointInMultiPolygon(p, coordinates)) | |
return layer; | |
} | |
return null; | |
} | |
var layergroup = L.geoJSON(...); | |
var layer = getLayerAtPoint(marker.getLatLng(), layergroup); |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment