Danmark I Minecraft
Danmark I Minecraft
I 2014 blev Danmark genskabt i Minecraft ved hjælp af 4 billioner virtuelle byggeklodser. Dette projekt brugte data fra GeoDanmark, Dagi, Danmarks Adresser og Danmarks Højdemodel. Modellen inkluderer alle landets veje, bygninger, jernbanespor lygtepæle og selv hegn. Den blev oprindeligt lavet for at vise potentialet i de store mængder frit tilgængelige data og kunne bruges i skolesammenhæng. Du kan læse hele pressemeddelelsen her: 2014_pressemeddelelse_DK_i_MC.pdf.
2024
Her i sommer 2024, faldt jeg over Det Kongelige Bibliotek og fandt det interessant da jeg har selv haft Odense hentet i 2014 da “Danmark i Minecraft” udkom.
mcdk.ha1fdan.xyz
d. 3-4. august 2024 arbjede jeg på at lave en “lommeregner” til de minecraft kort filer man kan hente. På hjemmesiden kan man indtaste bredde- og længdegrader (som kan findes på eg. Google Maps), og få udleveret hvilke Minecraft koordinater samt hvilken zip fil man skal bruge ud fra de WGS84 koordinater man har indtastet.
Men hvordan kom jeg så langt?
Jeg startede med noget meget manuelt arbjede, som inkludere at skrabe Det Kongelige Biblioteks hjemmeside for links til download af zip filerne.
const links = document.querySelectorAll('a');
const matchingLinks = new Set();
links.forEach(link => {
const href = link.href;
if (href.startsWith('https://loar.kb.dk/items/')) {
matchingLinks.add(href);
}
});
console.log(Array.from(matchingLinks));
Efter at have samlet alle links for zip filerne, skrev jeg et python crawler program der gik alle urls gennem og gemte zip fil navnet samt direkte download link i en database:
from selenium import webdriver
driver = webdriver.Firefox()
with open('urls.txt', 'r') as f:
urls = f.readlines()
def search(url):
driver.get(url)
driver.execute_script('let xhr = new XMLHttpRequest(); xhr.open("GET", "http://localhost:8080?url="+encodeURIComponent(document.querySelector("a.dont-break-out").href)+"&filename="+encodeURIComponent(document.querySelector("span.ng-star-inserted").textContent)+"", true); xhr.send(); console.log("Status: " + xhr.status);')
print("Done: " + url)
progress=0 #add number using + if script breaks
for i in range(progress):
urls.pop(0)
for url in urls:
search(url)
import flask
import json
app = flask.Flask(__name__)
with open('urls.txt', 'r') as f:
amount = f.readlines()
print(f"urls.txt has {len(amount)} links")
data = {}
with open('db.json', 'r') as f:
data = json.load(f)
@app.route('/')
def index():
url = flask.request.args.get('url')
filename = flask.request.args.get('filename')
data[filename] = url
with open('db.json', 'w') as f:
json.dump(data, f, indent=4)
print(f"Progress: {len(data)}/{len(amount)} ({len(data) / len(amount) * 100:.2f}%)")
return "ok"
app.run(host='0.0.0.0', port=8080)
Jeg skrev matematikken om fra denne omregner til PHP. Samt lave en stor database (Opslagstabel) via dette python kode:
import json
with open('db.json', 'r') as f:
data = json.load(f)
new = {}
with open('new_db.json', 'w') as f:
for key, url in data.items():
items = ""+str(key)
items = items.strip().replace(".zip","").split("_")
x = items[0]
z = items[1]
x=int(x)*512+5120
z=int(z)*512+5120
new.update({key:[str(x),str(z),url]})
f.write(json.dumps(new))