JSFiddle - React, Tailwind, and code Playground

HTML

<!DOCTYPE html>
<html lang="ru">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>
    <link rel="stylesheet" href="./styles.css">
</head>
<body>
    <div id="window">
        <img id="map" style="zoom: 0.5; transform: translate(0, 0);" src="https://www.tripsavvy.com/thmb/4ZAqNzgjRpAghhiVtjyMgdGHwc8=/3648x2052/smart/filters:no_upscale()/P4080411WEB-ab2cac6c987246f0b4d0b80bd42c6914.jpg" alt="">
    </div>

    <script type="text/javascript" src="./script.js"></script>
</body>
</html>

CSS

* {
    margin: 0;
    padding: 0;
}

body, html {
    width: 100%;
    height: 100vh;
    background: #0f0f0f;
    display: flex;
    justify-content: center;
    align-items: center;
}

#window {
    width: 900px;
    height: 600px;
    overflow: hidden;
}

#map {
    visibility: visible;
}

JavaScript

const _window = document.getElementById("window");
const map = document.getElementById("map")

let zoom = 0.5;


_window.onmousedown = (mouseDown) => {
    let positionDown = getPositionCursor(mouseDown);

    // Блокирую встроенный Drag'n Drop
    document.ondragstart = () => { return false };

    let coord = map.style.transform.match(/[0-9]*\.?[0-9]+/g);

    _window.onmousemove = (mouseMove) => {
        let positionMove = getPositionCursor(mouseMove);

        let dX = positionMove.x - positionDown.x;
        let dY = positionMove.y - positionDown.y;

        map.style.transform = `translate(${+coord[0] + dX}px, ${+coord[1] + dY}px)`
    };

    window.onmouseup = (mouseUp) => {
        _window.onmousemove = null;
        _window.onmouseup = null;
        document.ondragstart = null;
        document.body.onselectstart = null;
    };
};

function getPositionCursor(event) {
    let fieldOffsetDinamic = _window.getBoundingClientRect();
    return {
        x: event.pageX / zoom - fieldOffsetDinamic.left,
        y: event.pageY / zoom - fieldOffsetDinamic.top
    };
};