您需要先安装一个扩展,例如 篡改猴、Greasemonkey 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 Userscripts ,之后才能安装此脚本。
您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。
您需要先安装用户脚本管理器扩展后才能安装此脚本。
get poi data from osm
当前为
// ==UserScript== // @name Feature Your Map beta // @namespace http://tampermonkey.net/ // @version 0.1 // @description get poi data from osm // @author KaKa // @match https://map-making.app/maps/* // @grant GM_setValue // @grant GM_getValue // @grant GM_setClipboard // @license MIT // @icon https://www.google.com/s2/favicons?domain=geoguessr.com // ==/UserScript== (function() { 'use strict'; const API_URL = "https://overpass-api.de/api/interpreter"; async function fetchData(query, isString,feature) { const requestBody = isString ? `[out:json][timeout:180]; area[name="${query}"]; (nwr(area)[${feature}]; );out geom;` : `[bbox:${query[1]},${query[0]},${query[3]},${query[2]}][out:json][timeout:180] ;( nwr[${feature}](${query[1]},${query[0]},${query[3]},${query[2]}););out geom;`; const response = await fetch(API_URL, { method: "POST", body: "data=" + encodeURIComponent(requestBody), }); if (!response.ok) { throw new Error("Network response was not ok"); } return response.json(); } async function getData(query) { try { const js = { "name": "", "customCoordinates": [], "extra": { "tags": {}, "infoCoordinates": [] } }; for (let feature of features) { let requests = []; let elements = []; if (typeof query === 'string') { requests.push(fetchData(query, true, feature[1])); } else { requests = query.map(b => fetchData(b, false, feature[1])); } const responses = await Promise.all(requests); responses.forEach(response => { if (response.elements && response.elements.length > 0) { elements.push(...response.elements); } }); writeData(elements, feature[0],js); } GM_setClipboard(JSON.stringify(js)); alert("JSON data has been copied to your clipboard!"); } catch (error) { console.error("Error fetching data:", error); } } function writeData(coordinates, feature,js) { for (let i = 0; i < coordinates.length; i++) { if (coordinates[i].geometry) { let nodes = coordinates[i].geometry; let randomIndex = Math.floor(Math.random() * nodes.length); let randomCoordinate = nodes[randomIndex]; let tag = coordinates[i].tags && coordinates[i].tags.highway ? coordinates[i].tags.highway : feature; js.customCoordinates.push({ "lat": randomCoordinate.lat, "lng": randomCoordinate.lon, "extra": { "tags": [tag,feature] } }); }else if (!isCoordinateExists(js.customCoordinates, coordinates[i].lat, coordinates[i].lon)) { js.customCoordinates.push({ "lat": coordinates[i].lat, "lng": coordinates[i].lon, "extra": { "tags": [feature] } }); } } } function isCoordinateExists(coordinates, lat, lon) { for (let i = 0; i < coordinates.length; i++) { if (coordinates[i].lat === lat && coordinates[i].lng === lon) { return true; } } return false; } function getInput() { const option = confirm('Do you want to upload a Geojson file? If you click "Cancel",you will need to enter a location name'); if (option) { const input = document.createElement('input'); input.type = 'file'; input.accept = '.geojson'; input.addEventListener('change', event => { const file = event.target.files[0]; if (file) { readFile(file); document.body.removeChild(input); } }); document.body.appendChild(input); } else { const query = prompt('Please enter a location name(eg:Paris)'); getData(query); } } function readFile(file) { const reader = new FileReader(); reader.onload = function(event) { const jsonContent = event.target.result; try { const data = JSON.parse(jsonContent); if (data.features && data.features.length > 0) { const boundary = data.features.map(feature => feature.bbox); getData(boundary); } else { console.error('Invalid Geojson format.'); } } catch (error) { console.error('Error parsing Geojson:', error); } }; reader.readAsText(file); } let features=[] var mainButtonContainer = document.createElement('div'); mainButtonContainer.style.position = 'fixed'; mainButtonContainer.style.right = '20px'; mainButtonContainer.style.top = '20px'; document.body.appendChild(mainButtonContainer); var buttonContainer = document.createElement('div'); buttonContainer.style.position = 'fixed'; buttonContainer.style.right = '20px'; buttonContainer.style.bottom = '60px'; buttonContainer.style.display = 'none'; document.body.appendChild(buttonContainer); function createCheckbox(text, tags) { var label = document.createElement('label'); var checkbox = document.createElement('input'); checkbox.type = 'checkbox'; checkbox.value = text; checkbox.name = 'tags'; checkbox.id = tags; label.appendChild(checkbox); label.appendChild(document.createTextNode(text)); buttonContainer.appendChild(label); return checkbox; } var triggerButton = document.createElement('button'); triggerButton.textContent = 'Star Featuring'; triggerButton.addEventListener('click', function() { var checkboxes = document.getElementsByName('tags'); for (var i=0; i<checkboxes.length; i++) { if (checkboxes[i].checked) { if (!features.includes(checkboxes[i].id)) { features.push([checkboxes[i].value,checkboxes[i].id]); } } } getInput(); }); buttonContainer.appendChild(triggerButton); var mainButton = document.createElement('button'); mainButton.textContent = 'Feature Your Map'; mainButton.addEventListener('click', function() { if (buttonContainer.style.display === 'none') { buttonContainer.style.display = 'block'; } else { buttonContainer.style.display = 'none'; } }); mainButtonContainer.appendChild(mainButton); createCheckbox('bridge', '"bridge"="yes"'); createCheckbox('bus stop', '"highway"="bus_stop"'); })();