2016-11-15 1 views
2

Как определить точку, центральную для нескольких полигонов?Определить центральную точку нескольких многоугольников в листовке

Что я имею в виду, это точка, обозначенная красной точкой на прилагаемой фигуре. PS: Количество полигонов может варьироваться. Алгоритм должен иметь возможность определить приблизительную точку, которая является центральной для большинства полигонов.

enter image description here

ответ

2

Есть несколько подходов к этому, в зависимости от того, что вы точно хотите.

Самый простой способ - рассчитать центроид полигонов в целом. Много геопространственных программного обеспечения способен рассчитать центроиды multipolygons, многоугольники с несколькими наружными кольцами и т.д.

Если вы используете листовка и в формате GeoJSON, мой личный выбор будет использовать Turf.js для геообработке, например:

var poly1 = { 
    type: 'Feature', 
    geometry: { 
    type: 'Polygon', 
    coordinates: [[[10, 10], [10, 20], [20, 15]]] 
    } 
}; 

var poly2 = { 
    type: 'Feature', 
    geometry: { 
    type: 'Polygon', 
    coordinates: [[[10, 45], [20, 40], [20, 50]]] 
    } 
}; 

var featCollection = { 
    type: 'FeatureCollection', 
    features: [poly1, poly2] 
} 

L.geoJSON(featCollection).addTo(map) 

// Magic happens here: 
var centroid = turf.centroid(featCollection); 

L.geoJSON(centroid).addTo(map); 

Вы можете видеть это как working example.

Теперь центр тяжести - это центр Плотность из многоугольников. Если вы помните геометрию средней школы, вы помните, что есть lots of centers for something as simple as a triangle, каждый со своими собственными свойствами.

Это верно для более сложных полигонов: some times you don't want the centroid. Если вы учитываете геодезические (т. Е. Тот факт, что Земля не является двумерной плоскостью), все становится еще сложнее.

Так что, в зависимости от того, что вы хотите сделать, вам может понадобиться более продуманное решение, чтобы найти не центроид, а точку, которая минимизирует расстояние до любого из полигонов (понимается как минимальное расстояние до любого из вершины к этому многоугольнику).

+0

Как я могу автоматически регулировать уровень масштабирования карты, чтобы соответствовать всем/большинству полигонов? – codejunkie

+1

Получите оценки для каждого многоугольника и создайте экземпляр 'L.Bounds', который распространяется по всем границам. Прочтите документальные листы, это должно быть просто сделать самостоятельно. – IvanSanchez

+0

http://stackoverflow.com/questions/16845614/zoom-to-fit-all-markers-in-mapbox-or-leaflet ---> помог мне – codejunkie