您需要先安装一个扩展,例如 篡改猴、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"');
- })();