PS: There have been a few questions about the tiling system used. It's based on https://leafletjs.com/ and you will find it all in the Github repo. Its one of the more interesting parts of the project:
The tiles were pre-generated from the source image using generate_tiles.py — a Python script that slices the big map into 256x256 JPEG tiles at three zoom levels . Leaflet loads them with zoomOffset: 2, so directory zoom 0 = Leaflet zoom -2, directory zoom 2 = Leaflet zoom 0 (the highest native zoom). Below and above that range, Leaflet scales tiles up or down automatically.
The satellite tiles were generated by generate_sat_ai.py using Stable Diffusion img2img. It assembles the zoom-2 tiles into a full image, processes 512x512 overlapping patches through SD, blends them back together, then slices into the tile pyramid.
The generated satellite tiles are interesting. The sea is very dry. And some mountains are looking very strange. At least for some places (e.g. Mount Doom) the AI should have been able to generate more "realistic" images.
Interesting project. I might "steal" that for teaching purposes.
Ha ha. Yeah. That was a first wild attempt. If I get time I will figure out how to fine tune the mock-satellite imagery to properly reflect ocean, lakes, trees, castles etc.
This is pretty cool man, I appreciate you sharing what you did on GitHub. I’m just a codelet script kiddie crashing around the Google Maps api for fun and I love seeing projects like this.
It's great but it's the Map of Middle-Earth in the Third Age, right? During the First and Second Ages Middle-Earth looked very different and this makes showing events from the Silmarillion for example very confusing.
A few of the markers seem to be misplaced. I just noticed with the Cirith Ungol markers and Henneth Annûn, which are too far north and east compared to their location in the books (Cirith Ungol should be more or less directly above Minas Morgul; Henneth Annûn would be closer to the riverbank I think and in any case definitely not inside the mountain range)
There is also a bit of a mix of different semantics with the markers, I think. I see at least three different categories: Book plot lines, historical events and locations. The Hobbit and LotR markers seem to be mostly the first category, Silmarillion the second and Appendices the last (but not always). This makes sense, but is also a bit confusing, as a lot of locations only have book chapter or event descriptions, but no distinct description of the location itself. Some locations also have multiple markers if multiple things happened there.
I wonder if this could be structured a bit more, e.g. a marker for each location, with text subsections or "sub markers" for events and plotlines in that location.
Also, why the map looks good, I'd experiment with a few different ones (like the one from the books) that are more detailed. E.g. in this map, most of the roads are missing, which makes the markers for Tharbad or the Crossroads a bit awkward.
The crowning achievement would be of course to integrate Karen Wynn Fonstad's "high-resolution" maps from the atlas - but I imagine copyright makes that impossible.
The satellite view is a really cool idea, but, as others have said, doesn't reall work right now.
(I think this might be an interesting LLM benchmark: How well can a model generate a satellite view of middle earth that is both accurate to the map and to the descriptions in the books - e.g. not putting any vegetation into Gorgoroth, depicting the various ruined cities as ruins, etc)
But in any case, it's a really fun and well-designed project.
Thanks for the thoughtful feedback. Yes, i literally threw the faux-satellite version together in response to suggestions on this thread. Plenty of room for improvement there!
Thanks for the notes on marker positioning. Let me look into that.
Each source map has its pros and cons, but Fonstad's canonical version would be ideal. Copyright could be an issue as you point out.
The first thing that poped in my head when seeing this: it must have taken quite some time to thoroughly go thought all this to make it. The developer must have a huge passion for LOTR. Seeing all the message that it was build using AI it hugely deminishes this feeling.
Still a very nice looking map.
I totally get that. Sorry if it was a letdown. In reality I built this map as part of a personal exploration of the lore and background of Tolkien's lore, because i am fascinated by it. This felt like a productive way to share my learnings with others in a fun way. I certainly learnt a lot from going through the process.
LotrProject[1] has several interactive maps and visualizations, including a family tree, time/distance chart of the fellowship's journey, maps of Beleriand and Middle-Earth, historical timeline maps, and demographic posts on Middle-Earth's inhabitants. Sadly doesn't seem to have been maintained recently, the cracks in WordPress are starting to show, and AFAICT the source content isn't open.
Hi @frasermarlow, this is a nice start! Of course the water here is land which is an issue, but I think it's fun. I think the brown color of the map made it all desert when it should probably be more New Zealand - like. Might not be super doable with img2img but I'll definitely check out any other attempts!
Yep. When I get some time I will do a metadata layer to clarify water vs land vs prairies vs forest etc... then I will rerun the process with that additional Context. Should be fun. Thanks for the suggestion.
Arda was supposed to be drastically changed after the First Age. This map is from the Second/Third Ages. Do the events from the First Age map currently into what is shown? Do some have to be excluded?
Well I included 13 Silmarillion events, but most are actually Second Age events that map perfectly fine. Three of them are First age so it's a bit fudgy.
The project has no Beleriand events... they literally cannot be placed because Beleriand sank beneath the sea after the War of Wrath.
Cuiviénen it tricky. The Sea of Helcar where it sat was reshaped when Morgoth's strongholds were taken out, so that is approximate.
Would love to make age-appropriate (ha ha) maps, but I only had this one to work from.
The First Age / Second Age boundary is not unlike the K/T boundary...
Compared to that, Second Age / Third Age isn't that different (places like Dunland and Tharbad were forested, according to Treebeard). So if you wish to make the map a bit more ageless, you could just add a few alternate names.
- Dol Guldur was Amon Lanc in the Second Age
- Lothlorien was Laurelindorenan in the Second Age
- Mirkwood, Minas Tirith and Minas Morgul are late-Third-Age-isms too.
This is awesome! Can you make the zoom in and out smoother? I have to pinch every single time to get to the next zoom level instead of continuously zooming as I pinch.
Honestly the hardest thing for this was getting the pins in the right place. I had Claude create a tool for me to get the location and have it correct placements. Even after a dozen 'pins' were on the map, it still had problems placing the next pin (relative to the ones it had). Claude has gotten better and honestly I had not figured out Claude in the browser when I built this.
Yes, I ran across that issue. There's also been the issue of collision avoidance for me! (By the way, check out the superpowers brainstorming skill and yume--implementer skill -- I would have gone insane without them)
Good question. Check out Reddit - that is where I found the original. I understand it was made for the movies but I have not been able to locate the exact source or a place to order it from.
The tiling pipeline is the easy part to underestimate; documenting how you sliced and served zoom levels is genuinely useful for anyone doing map-style UIs. Nice work.
As much hate as vibe-coding gets (and most of it is justified), it has also allowed all of us to vibe-code our thoughts to small single-page web apps very easily.
Shameless vibe-coded plugs for my own regular usage:
70 comments
https://github.com/frasermarlow/middle-earth-map
The tiles were pre-generated from the source image using generate_tiles.py — a Python script that slices the big map into 256x256 JPEG tiles at three zoom levels . Leaflet loads them with zoomOffset: 2, so directory zoom 0 = Leaflet zoom -2, directory zoom 2 = Leaflet zoom 0 (the highest native zoom). Below and above that range, Leaflet scales tiles up or down automatically.
The satellite tiles were generated by generate_sat_ai.py using Stable Diffusion img2img. It assembles the zoom-2 tiles into a full image, processes 512x512 overlapping patches through SD, blends them back together, then slices into the tile pyramid.
Interesting project. I might "steal" that for teaching purposes.
Some nitpicks/ideas:
A few of the markers seem to be misplaced. I just noticed with the Cirith Ungol markers and Henneth Annûn, which are too far north and east compared to their location in the books (Cirith Ungol should be more or less directly above Minas Morgul; Henneth Annûn would be closer to the riverbank I think and in any case definitely not inside the mountain range)
There is also a bit of a mix of different semantics with the markers, I think. I see at least three different categories: Book plot lines, historical events and locations. The Hobbit and LotR markers seem to be mostly the first category, Silmarillion the second and Appendices the last (but not always). This makes sense, but is also a bit confusing, as a lot of locations only have book chapter or event descriptions, but no distinct description of the location itself. Some locations also have multiple markers if multiple things happened there.
I wonder if this could be structured a bit more, e.g. a marker for each location, with text subsections or "sub markers" for events and plotlines in that location.
Also, why the map looks good, I'd experiment with a few different ones (like the one from the books) that are more detailed. E.g. in this map, most of the roads are missing, which makes the markers for Tharbad or the Crossroads a bit awkward.
The crowning achievement would be of course to integrate Karen Wynn Fonstad's "high-resolution" maps from the atlas - but I imagine copyright makes that impossible.
The satellite view is a really cool idea, but, as others have said, doesn't reall work right now.
(I think this might be an interesting LLM benchmark: How well can a model generate a satellite view of middle earth that is both accurate to the map and to the descriptions in the books - e.g. not putting any vegetation into Gorgoroth, depicting the various ruined cities as ruins, etc)
But in any case, it's a really fun and well-designed project.
http://lotrproject.com
Maybe when describing historical events you should also put the year (it is given only for some of them).
Anyway, very nice work! I think it's appropriate especially for casual fans (especially movie fans) to delve (sorry) deeper into the lore.
The First Age / Second Age boundary is not unlike the K/T boundary...
Compared to that, Second Age / Third Age isn't that different (places like Dunland and Tharbad were forested, according to Treebeard). So if you wish to make the map a bit more ageless, you could just add a few alternate names. - Dol Guldur was Amon Lanc in the Second Age - Lothlorien was Laurelindorenan in the Second Age - Mirkwood, Minas Tirith and Minas Morgul are late-Third-Age-isms too.
My new favorite insult towards web services that are badly done is: "even fully vibe-coded Codex would've done better".
Any chance you would be willing to share the source code?
Did the LLM suggest using some pre-existing standard like MBTiles for the tiles?
Shameless vibe-coded plugs for my own regular usage:
1. https://llm-token-cost-calculator.pagey.site/
2. https://metrics-memory-usage.pagey.site/