OSM2IPFS/earth/Umap.html

108 lines
4.4 KiB
HTML
Raw Normal View History

2023-08-24 18:26:16 +02:00
<!DOCTYPE html>
<html>
<head>
<title>UPlanet Map</title>
<link rel="stylesheet" href="leaflet.css" />
2023-09-01 03:50:04 +02:00
<style>
.map-container {
position: fixed;
top: 0;
left: 0;
width: 100%;
height: 100%;
}
</style>
2023-08-24 18:26:16 +02:00
</head>
<body>
2023-09-01 03:50:04 +02:00
<div id="map" class="map-container"></div>
2023-08-24 18:26:16 +02:00
<br>
<script src="leaflet.js"></script>
2023-08-24 18:26:16 +02:00
<script>
// const desiredImageWidthInKm = 11; // Now Is calculated from northEastLon - southWestLon
const tileSizeInPixels = 256;
function calculateZoomLevel(desiredImageWidthInKm, latitude) {
const earthEquatorialCircumference = 40075016.686; // Earth's equatorial circumference in meters
// Calculate the distance covered by one degree of longitude at the given latitude
const metersPerLongitudeDegree = earthEquatorialCircumference * Math.cos((Math.PI / 180) * latitude) / 360;
const metersPerPixel = metersPerLongitudeDegree * 360 / (tileSizeInPixels * Math.pow(2, 20));
// Calculate the number of pixels needed to achieve the desired width
const numberOfPixelsHorizontally = (desiredImageWidthInKm * 1000) / metersPerPixel;
// Calculate the appropriate zoom level
const zoomLevel = Math.log2(tileSizeInPixels * Math.pow(2, 20) / numberOfPixelsHorizontally);
return zoomLevel;
}
// Function to extract URL parameters
function getUrlParameter(name) {
name = name.replace(/[\[]/, '\\[').replace(/[\]]/, '\\]');
const regex = new RegExp('[\\?&]' + name + '=([^&#]*)');
const results = regex.exec(location.search);
return results === null ? '' : decodeURIComponent(results[1].replace(/\+/g, ' '));
}
const defaultSouthWestLat = 44.000;
2023-08-24 18:26:16 +02:00
const defaultSouthWestLon = -1.000;
const defaultOffsetDegrees = 10.000; // 10° offset
2023-08-24 18:26:16 +02:00
const southWestLat = parseFloat(getUrlParameter('southWestLat')) || defaultSouthWestLat;
console.log('Lat:', southWestLat);
2023-08-24 18:26:16 +02:00
const southWestLon = parseFloat(getUrlParameter('southWestLon')) || defaultSouthWestLon;
console.log('Lon:', southWestLon);
2023-08-24 18:26:16 +02:00
const deg = parseFloat(getUrlParameter('deg')) || defaultOffsetDegrees;
console.log('Offset:', deg);
2023-08-24 18:26:16 +02:00
// Calculate northEastLat and northEastLon with deg° offset only if parameters are empty
const northEastLatParam = getUrlParameter('northEastLat');
const northEastLonParam = getUrlParameter('northEastLon');
const northEastLat = northEastLatParam ? parseFloat(northEastLatParam) : southWestLat + deg;
const northEastLon = northEastLonParam ? parseFloat(northEastLonParam) : southWestLon + deg;
// Calculate the longitudinal distance in degrees
const lonDistanceInDegrees = Math.abs(northEastLon - southWestLon);
console.log('lonDistanceInDegrees:', lonDistanceInDegrees);
// Calculate the desired image width in kilometers
const earthEquatorialCircumference = 40075016.686; // Earth's equatorial circumference in meters
const metersPerLongitudeDegree = Math.abs(earthEquatorialCircumference * Math.cos((Math.PI / 180) * southWestLat) / 360);
const desiredImageWidthInMeters = lonDistanceInDegrees * metersPerLongitudeDegree;
const desiredImageWidthInKm = desiredImageWidthInMeters / 1000;
console.log('desiredImageWidthInKm:', desiredImageWidthInKm);
2023-08-24 18:26:16 +02:00
const centerLat = (southWestLat + northEastLat) / 2;
const centerLon = (southWestLon + northEastLon) / 2;
// Provide the latitude for adjustment
const latitude = centerLat;
const zoomLevel = calculateZoomLevel(desiredImageWidthInKm, latitude);
console.log('Recommended zoom level:', zoomLevel);
2023-09-01 13:16:38 +02:00
const map = L.map('map', {
zoomControl: false // Disable the default zoom control
}).setView([centerLat, centerLon], zoomLevel);
2023-08-24 18:26:16 +02:00
// Use the Mapbox Satellite tile layer
//~ L.tileLayer('https://api.mapbox.com/styles/v1/mapbox/satellite-v9/tiles/{z}/{x}/{y}?access_token=YOUR_MAPBOX_ACCESS_TOKEN', {
//~ attribution: '© Mapbox',
//~ tileSize: 512,
//~ zoomOffset: -1,
//~ accessToken: 'YOUR_MAPBOX_ACCESS_TOKEN'
//~ }).addTo(map);
//~ // Use the OpenAerialMap (OAM) tile layer for satellite view
//~ L.tileLayer('https://tiles.openaerialmap.org/5d6d1e370f437a00106e06ef/0/{z}/{x}/{y}.jpg', {
//~ attribution: '© OpenAerialMap',
//~ maxZoom: 18
//~ }).addTo(map);
2023-09-01 03:50:04 +02:00
const tileLayer = L.tileLayer('https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png', {
2023-09-01 13:16:38 +02:00
attribution: `U Planet | Astroport | ${southWestLat} : ${southWestLon}`
2023-08-24 18:26:16 +02:00
}).addTo(map);
</script>
</body>
</html>