Есть opensource-библиотека https://github.com/tyrasd/osmtogeojson (веб-интерфейс https://tyrasd.github.io/osmtogeojson/) - она написана на JavaScript.
Необходимо переписать функцию _overpassJSON2geoJSON из данной библиотеки на языке PHP.
Сама эта функция с учётом вложенных в неё - занимает 164 строки кода https://github.com/tyrasd/osmtogeojson/blob/e05ddb01942758bcdc14c782c7e9b0e17eb9dfa4/index.js#L65-L229
плюс в конце вызывает функцию _convert2geoJSON которая 527 строк кода, и ещё функцию из библиотеки @mapbox/geojson-rewind (44 строки).
Нужно взять уже реализованную логику работы этой фукции и переписать её на языке PHP (совместимость min с версией 7.4), используя стандарт кода Symfony https://symfony.com/doc/current/contributing/code/standards.html.
К логике текущей JS-библиотеки добавить фильтрацию элементов объекта members по полю 'role', если в перменной $role передан массив со строками, и аналогично по полю 'type'.
которая принимает объект из json_decode и выполняет преборазования, возвращает преобразованный объект.
Вспомогательную функцию назвать convertToGeojson, остальные функции называть аналогичным образом по правилам camelCase.
При отсутствии каких-то данных в элементах (например координат) - пропускать данные элементы, добавляя предупреждения в переменную $warnings (вместо console.log в js).
При фатальных ошибках разбора объекта - вызывать OsmToolsParseException с кратким описанием причины на английском, чтобы можно было понять где именно ошибка.
JSON-объекты могут быть довольно большими (до 50 мб и больше), поэтому желательно минимизировать дублирование данных в памяти и сразу высвобождать память в циклах.
Тестировать функцию можно на результатах Overpass-запросов по странам, например по России (около 8 мб):
[out:json] [timeout:180]; relation ['name'='Россия'] ['admin_level'='2'] ['boundary'='administrative'] ["ISO3166-1:alpha2"]; out geom;
Или по районам Минской области:
[out:json] [timeout:180]; rel(59752); map_to_area->.myArea; relation(area.myArea) ['admin_level'='6'] ['boundary'='administrative'] ; out geom;
Получить результаты по этому запросу можно тут https://overpass-turbo.eu/
Проверить итоговый GeoJSON можно тут: https://geojsonlint.com/
В итоге должна получиться PHP-библиотека, которая принимает объект с данными о границах объекта в формате Overpass geom (в 'members'), возвращает аналогичный объект, в котором эти данные преобразованы в формат объекта GeoJSON. Т.е. полностью повторять работу своего JS-аналога, но с фильтрацией по type.
Плюс к ней маленький index.php файл демонстрирующий корректную работу - читает из файла примеры Overpass-ответа и выводит GeoJSON данные.