API MAP Yandex 3: Отрисовка районов на карте области
Пока на работе выдалась небольшая творческая пауза, решил потыкать API версии 3, который приходит на смену версии 2.1 И рано или поздно как я понимаю версия 2.1 будет отключена. А проекты на «старой» версии есть.
Так вот, что не понравилось: все примеры в «песочнице», на typescript, а не на чистом javascript. Ну и полностью всё конечно поломано, т.е. не получится просто взять старый код, и чуть адаптировать — нужно всё переписывать. Вплоть до того что, они даже координаты «перевернули» местами, пришлось для того чтобы наложить полигоны районов со старой карты на новую, их «переворачивать».

Ну собственно, вот код,
<script crossorigin src="https://cdn.jsdelivr.net/npm/@babel/standalone@7/babel.min.js"></script>
<script src="https://api-maps.yandex.ru/v3/?apikey=уууу&lang=ru_RU" type="text/javascript"></script>
<div id="app"></div>
<script data-plugins="transform-modules-umd" data-presets="typescript" type="text/babel" src="ts/variables.ts"></script>
<script data-plugins="transform-modules-umd" data-presets="typescript" type="text/babel" src="ts/common.ts"></script>
<script data-plugins="transform-modules-umd" data-presets="typescript" type="text/babel" src="ts/receipts.ts"></script>
<script data-plugins="transform-modules-umd" data-presets="typescript" type="text/babel">
import * as common from '../common';
async function main() {
await ymaps3.ready;
const {YMap, YMapDefaultSchemeLayer,YMapFeature,YMapDefaultFeaturesLayer} = ymaps3;
map = new YMap(
document.getElementById('app'),
{location:
{
center: [39.8491648, 59.2084992],
zoom: 9
},
showScaleInCopyrights: true
},
[
new YMapDefaultSchemeLayer({}),
new YMapDefaultFeaturesLayer({})
],
);
//получаем список районов
common.AjaxPost("index.php?r=site2/get-areas","").then(async areas_list=>{
console.log("-прочитал список районов ",areas_list);
if (areas_list.error==false){
for (var i = 0; i < areas_list.result.length; i++) {
await common.AjaxPost("areas/"+areas_list.result[i].poly_filename,"aa").then(res2=>{
console.log(areas_list.result[i].name);
res2=common.ReverseCoors(res2);
console.log(areas_list.result[i].poly_fill_color);
const polygon = new YMapFeature({
geometry: {
type: 'Polygon',
coordinates: res2
},
properties:{
hintContent: areas_list.result[i].name
},
// Описание тут: https://yandex.ru/maps-api/docs/js-api/ref/index.html#interface-drawingstyle
style: {
stroke: [
{
color: '#196DFF99',
dash: [5, 10],
width: 3
}
],
fillOpacity: 0.2,
fill: "#"+areas_list.result[i].poly_fill_color
}
});
console.log(polygon);
map.addChild(polygon);
});
};
};
});
};
window.map = null;
main();
</script>
common.ts:
/**
Получаем информацию об очертаниях районов (округов)
*/
export async function AjaxPost(url : string,payload: any): any {
try {
const response = await fetch(url, {
method: 'POST',
headers: {'Content-Type': 'application/json; charset=UTF-8' },
body: JSON.stringify(payload)
});
if (!response.ok) {
throw new Error(HTTP error! Status: ${response.status});
}
return response.json();
} catch (error) {
console.error('Error:', error);
throw error;
}
}
/**
Сделать паузу в милисекундах
*/
export async function sleep(ms: number): Promise<void> {
return new Promise(resolve => setTimeout(resolve, ms));
}
/**
Перевернуть все координаты в массиве
*/
export function ReverseCoors(coors : any): any {
for (var ii = 0; ii < coors.length; ii++) {
for (var iii = 0; iii < coors[ii].length; iii++) {
var x=0;
var y=0;
x=coors[ii][iii][0];
y=coors[ii][iii][1];
coors[ii][iii][1]=x;
coors[ii][iii][0]=y;
};
};
return coors;
}