Оптимизация полигонов Google карт - PullRequest
7 голосов
/ 14 марта 2011

Я извлек данные об очертаниях страны откуда-то и успешно сумел преобразовать их в массив координат широты, который я могу передать в API карт Google для рисования полилиний или многоугольников.

Проблема в том, что в этой форме есть около 1200+ точек.Он отлично отрисовывается на картах Google, но мне нужно уменьшить количество точек с 1200 до менее 100. Мне не нужен очень плавный контур, мне просто нужно выбросить точки, без которых я могу жить.Требуется любой алгоритм или онлайн-инструмент, который поможет мне уменьшить количество баллов.

Ответы [ 6 ]

7 голосов
/ 06 февраля 2013

Нашел этот простой javascript от Билла Чедвика. Просто введите LatLng в массив и передайте аргументы источника в функции здесь Процедура упрощения строки Дугласа Пекера

будет выведен массив с меньшим количеством точек для многоугольника.

 var ArrayforPolygontoUse= GDouglasPeucker(theArrayofLatLng,2000) 
 var polygon=new google.maps.Polygon({ 

    path:ArrayforPolygontoUse,
    geodesic:true,
    strokeColor:"#0000FF",
    strokeOpacity:0.8,
    strokeWeight:2,
    fillColor:"#0000FF",
    fillOpacity:0.4,
    editable:true
  });

theArrayofLatLng - это массив значений, собранных с помощью API Google Maps. Значение 2000 - это излом в метрах. Я предполагаю, что чем выше значение, тем больше точек будет удалено в качестве вывода.

Для настоящих начинающих: Убедитесь, что вы объявили JS-файл на своей HTML-странице, прежде чем использовать его. :)

<script type="text/javascript" src="js/GDouglasPeucker.js"></script>
4 голосов
/ 14 марта 2011

Я думаю MapShaper может сделать это онлайн

В противном случае реализовать алгоритм

1 голос
/ 14 марта 2011

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

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

Надеюсь, это поможет

0 голосов
/ 16 февраля 2019

Я искал точно такую ​​же вещь и нашел Simplify.js . Он делает именно то, что вы хотите, и невероятно прост в использовании. Вы просто передаете свои координаты, и это удалит все лишние точки.

simplify(points, tolerance, highQuality)

Аргумент points должен содержать массив ваших координат, отформатированный как {x: 123, y: 123}. (После этого вы можете преобразовать его обратно в нужный формат.)

tolerance должно быть точностью в десятичных градусах . Например. 0.0001 на 11 метров. Увеличение этого числа приведет к уменьшению размера вывода.

Установите highQuality на true для лучших результатов, если вы не против подождать несколько миллисекунд.

0 голосов
/ 25 февраля 2016

Я согласен с ответом Unreason, сайт поддерживает GeoJson, я использовал его на своем сайте, и он урезал мой geoJson, но я думаю, что вам также нужен этот world country geo Json

0 голосов
/ 14 марта 2011

Скорее всего, вы хотите разделить точки на 2 половины и попробовать мою функцию Javascript:

function shortenAndShow ( polyline, color ) {
  var dist = 0, copyPoints = Array ( );
  for ( var n = 0, var end = polyline.getVertexCount ( ) - 1; n < end ; n++ ) {
    dist += polyline.getVertex ( n ).distanceFrom ( polyline.getVertex ( n +1 ) );
    copyPoints.push ( polyline.getVertex (n) );
   }
   var lastPoint = copyPoints [copyPoints.length-1];
   var newLine = new GPolyline (copyPoints, color, 2, 1);
   gmap2.addOverlay ( newLine );
} 
...