Ваши координаты расположены в направлении против часовой стрелки.
Поскольку исходный Geo JSON 1.0 spe c ничего не сказал по порядку намотки, поэтому d3-geo сделано до своего собственного правила :
Сферические многоугольники также требуют соглашения о порядке намотки, чтобы определить, какая сторона многоугольника находится внутри: внешнее кольцо для многоугольников, меньших, чем полусфера, должно быть по часовой стрелке, в то время как внешнее кольцо для многоугольников, больших чем полусфера, должно быть против часовой стрелки.
Следовательно, с точки зрения d3-geo, ваши многоугольники являются дырками; функции охватывают все везде, кроме тех отверстий. Вот наглядный пример того, что происходит .
К сожалению, Geo JSON spe c в RFC7946 позже определил это и указал с точностью до наоборот :
Линейное кольцо ДОЛЖНО следовать правилу правой руки относительно области, которую оно ограничивает, то есть внешние кольца против часовой стрелки, а отверстия по часовой стрелке.
Согласно краткому прочтению набора тестов , кажется, что листовка-пипс принимает этот порядок намотки, поэтому она понимает ваши полигоны.
Если мы расположите кольца по часовой стрелке, ответы будут top_right
:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<!--d3 -->
<script src='https://d3js.org/d3.v4.min.js'></script>
<!-- leaflet -->
<link rel="stylesheet" href="https://unpkg.com/leaflet@1.0.3/dist/leaflet.css"/>
<script src="https://unpkg.com/leaflet@1.0.3/dist/leaflet-src.js"></script>
<script src="https://unpkg.com/leaflet-pip@1.1.0/leaflet-pip.js"></script>
</head>
<body>
<script>
var my_squares = {
"type": "FeatureCollection",
"features": [
{
"type": "Feature",
"properties": {"id": "bottom_left"},
"geometry": {
"type": "Polygon",
"coordinates": [[[0.0, 0.0], [0.0, 0.5], [0.5, 0.5], [0.5, 0.0], [0.0, 0.0]]],
}
},
{
"type": "Feature",
"properties": {"id": "bottom_right"},
"geometry": {
"type": "Polygon",
"coordinates": [[[0.5, 0.0], [0.5, 0.5], [1.0, 0.5], [1.0, 0.0], [0.5, 0.0]]],
}
},
{
"type": "Feature",
"properties": {"id": "top_right"},
"geometry": {
"type": "Polygon",
"coordinates": [[[0.5, 0.5], [0.5, 1.0], [1.0, 1.0], [1.0, 0.5], [0.5, 0.5]]],
}
},
{
"type": "Feature",
"properties": {"id": "top_left"},
"geometry": {
"type": "Polygon",
"coordinates": [[[0.0, 0.5], [0.0, 1.0], [0.5, 1.0], [0.5, 0.5], [0.0, 0.5]]],
}
},
]
}
var my_point = [0.7, 0.7];
console.log('Point is: ' + my_point)
var geo_out = my_squares.features.filter(function(d) {return d3.geoContains(d, my_point)});
console.log('From d3.geoContains');
geo_out.forEach(function(d){console.log(d.properties.id)});
console.log('')
var polygons = L.geoJson(my_squares, {});
var res = leafletPip.pointInLayer(my_point, polygons)[0].feature.properties.id;
console.log('From pip');
console.log(res)
</script>
</body>
</html>
(Я был удивлен, что ответ Пипса не изменился. Возможно, он просто предполагал, что вы имели в виду внешнее кольцо в любом случае, или, возможно, он не поддерживает многоугольники с отверстиями в первое место.)