Thursday, August 20, 2026
HomeNetflix NewsWhere Was ‘Outer Banks’ Filmed? Complete Seasons 1-5 Filming Locations Guide

Where Was ‘Outer Banks’ Filmed? Complete Seasons 1-5 Filming Locations Guide

- Advertisment -

outer banks series filming locations

Cr. Courtesy of Netflix © 2026

Netflix’s hit treasure-hunting series Outer Banks has finally come to a close after five huge seasons, taking us on a wild ride from the marshy coastlines of Kildare Island to the far reaches of the globe.

As die-hard fans know, the biggest behind-the-scenes secret of the show’s early days is that the “OBX” wasn’t actually filmed in North Carolina. Due to inclusivity concerns over a controversial bathroom bill during the show’s early development, production instead set up shop in Charleston, South Carolina. For the first three seasons, the stunning Lowcountry—including spots like Mount Pleasant’s Shem Creek, Kiawah Island, and the historic Secessionville Historic District—perfectly doubled for the North Carolina barrier islands.

As John B and the Pogues’ hunt for gold escalated from local shipwrecks to legendary lost cities, the production’s footprint had to evolve, too. The series quickly went international, with the gorgeous island of Barbados stepping in to double for the sun-drenched streets of the Bahamas in Season 2, as well as the mythical jungles of South America in Season 3. By Season 4, the crew finally made their way to the real North Carolina to film the high-stakes Enduro dirt bike race, while simultaneously pushing the boundaries of “Pogue hell” with a grueling, cinematic shoot in the desert dunes and historic medinas of Morocco.

For the fifth and final season, the Pogues took their ultimate globe-trotting adventure to the Mediterranean. Swapping the Atlantic shoals for the Adriatic coast, production touched down in Croatia. The UNESCO-protected medieval streets of Dubrovnik, the rugged cliffs of Danče Beach, and the lush nature reserve of Lokrum Island provided an epic, jaw-dropping backdrop for the show’s final chapter.

Whether you’re looking to grab a bite at the real-life Wreck, trace the muddy tracks of the Enduro race, or plan a European getaway to follow the trail of the Blue Crown, we’ve got you covered. To help you live your best Pogue life, we’ve compiled a massive, interactive directory of every major spot used in the series.

Grab your compass and explore our ultimate Outer Banks filming tour widget below, featuring over 60 real-world locations across all five seasons!

Outer Banks Seasons 1-5 Filming Guide Tour

62 filming locations

Country




Tags





  1. 1



    The Chateau

    Central filming location
    Secessionville Historic District, Charleston, SC
    John B's iconic waterfront home and Pogue meeting ground.

    Directions
    Street View

  2. 2


    Tannyhill Plantation

    Lowndes Grove, Charleston, SC
    The Cameron family's extravagant waterfront estate.

    Directions
    Street View

  3. 3


    UNC Chapel Hill Law Library

    Charleston Gaillard Center, Charleston, SC
    John B and Sarah dig through Denmark Tanny archives.

    Directions
    Street View

  4. 4


    Ben Silver

    King Street, Charleston, SC
    John B gets a seersucker makeover for a Kook event.

    Directions
    Street View

  5. 5


    Carla Limbrey’s Home

    Edmondston-Alston House, Charleston, SC
    Pope meets with Carla Limbrey to discuss the Denmark Key.

    Directions
    Street View

  6. 6


    The Charleston Museum

    360 Meeting St, Charleston, SC
    Big John and John B pull off a heist to steal the Gnomon of Solana.

    Directions
    Street View

  7. 7


    Ferry Dock & First Kiss

    Charleston Maritime Center, Charleston, SC
    John B and Sarah share their first kiss in the rain.

    Directions
    Street View

  8. 8


    Freedman’s Assembly of God

    St. Thomas & St. Denis Parish, Cainhoy, SC
    Abandoned church hiding the Cross of Santo Domingo.

    Directions
    Street View

  9. 9


    Poguelandia 2.0

    Maybank Highway, Charleston, SC
    The Pogues' new home and bait shop built from scratch.

    Directions
    Street View

  10. 10


    7-Eleven

    Crosby’s Fish & Shrimp Company, Charleston, SC
    The local convenience store where the Pogues check their bank balance.

    Directions
    Street View

  11. 11


    Rockfish Bar

    Bowens Island Restaurant, Charleston, SC
    JJ trades his dirt bike for information on Blackbeard's treasure coordinates.

    Directions
    Street View

  12. 12


    The Catacombs

    Old Exchange Building, Charleston, SC
    Rat-filled crypts hiding clues to Blackbeard's treasure.

    Directions
    Street View

  13. 13


    The Shoals

    Fort Johnson, Charleston, SC
    Shallow landing where the Pogues crash their leaking boat.

    Directions
    Street View

  14. 14


    Ellie's High House / Big John's Tavern

    E. Bay Street, Charleston, SC
    Stood in for the French Quarter of New Orleans.

    Directions
    Street View

  15. 15


    Heyward’s Seafood

    Geechie Seafood, Mount Pleasant, SC
    Pope’s family seafood business on Shem Creek.

    Directions
    Street View

  16. 16


    The Wreck

    The Wreck of the Richard and Charlene, Mount Pleasant, SC
    Kiara's family restaurant and popular Pogue hangout.

    Directions
    Street View

  17. 17


    Hawk’s Nest Tower

    Palmetto Park Islands Observation Tower, Mount Pleasant, SC
    Topper pushes John B off this ledge in a jealous rage.

    Directions
    Street View

  18. 18


    Arthur Ravenel Jr. Bridge

    Charleston, SC
    The massive viaduct connecting Charleston to Mount Pleasant.

    Directions
    Street View

  19. 19


    Pitt St. Pharmacy

    Pitt Street, Mount Pleasant, SC
    Sarah takes a pregnancy test and confides in Kiara.

    Directions
    Street View

  20. 20


    Hollis' Boat

    Toler's Cove Marina, Mount Pleasant, SC
    Hollis invites Rafe to her boat with a real estate proposal.

    Directions
    Street View

  21. 21


    Kildare County Detention Center

    International Diving Institute, North Charleston, SC
    John B awaits his fate in jail while JJ plots his escape.

    Directions
    Street View

  22. 22


    Blackstone Manor on Goat Island

    Admiral’s House, North Charleston, SC
    Genrette's creepy estate on Sandfly Bluff.

    Directions
    Street View

  23. 23


    Zeasy Realty Co.

    Gatekeepers Inn, North Charleston, SC
    Dale Zeasy's real estate office which JJ trashes.

    Directions
    Street View

  24. 24


    Military Recruiter’s Office

    Quarters J, North Charleston, SC
    Pope’s tense meeting with the Marines.

    Directions
    Street View

  25. 25


    The Boneyard

    Hunting Island State Park, SC
    Driftwood-covered beaches used for the Boneyard and Surfrider cleanup.

    Directions
    Street View

  26. 26


    Redfield Lighthouse

    Hunting Island Lighthouse, SC
    Historic lighthouse John B and Kiara visit for clues.

    Directions
    Street View

  27. 27


    Island Club

    Kiawah Island Golf Resort, SC
    Lavish resort used for the Kook Midsummers party and Dale's golf game.

    Directions
    Street View

  28. 28


    Island Inn

    Seabrook Island Beach Club, SC
    The Kook location where JJ gets fired from his summer job.

    Directions
    Street View

  29. 29


    Kitty Hawk Adventure Therapy

    St. Christopher Camp, Seabrook Island, SC
    The behavioral camp Kiara is ambushed and sent to.

    Directions
    Street View

  30. 30


    John B’s Bell Tower

    Old Bethel AME Church, McClellanville, SC
    Abandoned Civil War-era church that eventually burns down.

    Directions
    Street View

  31. 31


    Guerin’s Pharmacy

    Main Street, Summerville, SC
    Pope finds the Denmark Key hidden in his grandmother's ceiling.

    Directions
    Street View

  32. 32


    Mr. Sunn’s House

    Johns Island, SC
    The Pogues' favorite teacher's residence where they decipher the amulet.

    Directions
    Street View

  33. 33


    Barry’s Compound

    Johns Island, SC
    The rural drug compound where John B runs into major trouble.

    Directions
    Street View

  34. 34


    Groff’s Boathouse & The Castle

    Richmond Plantation, Cordesville, SC
    Used for Groff's hideout and Ellie's English countryside-style estate.

    Directions
    Street View

  35. 35


    Wincloss House

    Josie Ridge Lane, Wadmalaw Island, SC
    The quiet, unspoiled estate hosting the masquerade ball.

    Directions
    Street View

  36. 36


    The Enduro Race (Beach)

    Fort Fisher State Recreation Area, Kure Beach, NC
    Location of the high-stakes Enduro dirt bike race on the sand.

    Directions
    Street View

  37. 37


    The Enduro Race (Woods)

    Copperhead Ranch, Rocky Point, NC
    Muddy woodland portion of the dirt bike race.

    Directions
    Street View

  38. 38


    Nassau Streets

    Careenage, Bridgetown, Barbados
    Stood in for the Bahamas when John B and Sarah escape.

    Directions
    Street View

  39. 39


    Fairmont Hotel

    Fairmont Royal Pavilion, Barbados
    The Cameron family luxury vacation hotel.

    Directions
    Street View

  40. 40


    Paradise Island Mansion

    Royal Westmoreland, Barbados
    Luxury home the Pogues break into looking for stolen gold.

    Directions
    Street View

  41. 41


    Poguelandia

    Bathsheba Beach, Barbados
    Deserted island with dramatic rock formations where the Pogues wash ashore.

    Directions
    Street View

  42. 42


    Plane Crash

    Port St. Charles, Barbados
    The Pogues ambush their pilot and crash the plane into the ocean.

    Directions
    Street View

  43. 43


    The Camerons’ Guadalupe Estate

    Cattlewash Beach, Barbados
    Ward and Rafe hide out with the Cross of Santo Domingo.

    Directions
    Street View

  44. 44


    Carlos Singh’s Estate

    Lion Castle Estate, Barbados
    Historic site standing in for Singh's heavily guarded compound.

    Directions
    Street View

  45. 45


    Big John’s Bell Tower

    St. John Parish Church, Barbados
    Big John rings the historic church bell to signal his son.

    Directions
    Street View

  46. 46


    El Dorado Cave

    Welchman Hall Gully, Barbados
    Tropical nature park representing South America's mythical city of gold.

    Directions
    Street View

  47. 47


    The Moroccan Beach

    Cap Hadid, Morocco
    The Pogues wash up on desert dunes after surviving an Atlantic storm.

    Directions
    Street View

  48. 48


    Essaouira

    Essaouira, Morocco
    Port city where the Pogues explore the medina and wharf looking for Groff.

    Directions
    Street View

  49. 49


    Agapenta / The Blue Crown

    Ouarzazate, Morocco
    The door of the desert labyrinth where JJ ultimately finds the Blue Crown.

    Directions
    Street View

  50. 50


    Old Town Dubrovnik

    Dubrovnik, Croatia
    The UNESCO-protected Old Town served as the main base for several days of filming. Its narrow stone streets used for motorcycle chase and preserved medieval look make it suitable for different settings without major modifications.

    Directions
    Street View

  51. 51


    Stradun

    Stradun, Dubrovnik, Croatia
    Dubrovnik’s main promenade was closed during parts of the filming schedule. With its polished limestone pavement and historic façades, Stradun offers a cinematic backdrop immediately recognizable to viewers.

    Directions
    Street View

  52. 52


    Old Port (Porat)

    Old Port, Dubrovnik, Croatia
    The picturesque old harbor, framed by Saint John Fortress, was used for multiple scenes involving boats and waterfront action — a natural choice for a series deeply connected to boats and coastal life.

    Directions
    Street View

  53. 53


    Luža Square

    Luža Square, Dubrovnik, Croatia
    One of the most iconic squares in Dubrovnik, located next to Sponza Palace and the Church of St. Blaise. A popular filming location thanks to its open layout and historical buildings.

    Directions
    Street View

  54. 54


    Sponza Palace

    Sponza Palace, Dubrovnik, Croatia
    A striking 16th-century palace used in many international productions. The courtyard and façade are ideal for scenes requiring historical ambience.

    Directions
    Street View

  55. 55


    Jesuit Staircase

    Jesuit Staircase, Dubrovnik, Croatia
    One of the most famous staircases in Croatia, leading to the Church of St. Ignatius. Known worldwide from Game of Thrones, the stairs have once again become a star filming location.

    Directions
    Street View

  56. 56


    Franciscan Monastery

    Franciscan Monastery, Dubrovnik, Croatia
    Located near Pile Gate, the monastery and its cloister provide a visually rich setting with impressive stone architecture.

    Directions
    Street View

  57. 57


    Danče Beach

    Danče Beach, Dubrovnik, Croatia
    A rugged, rocky beach west of the Old Town. Danče is known for dramatic waves and cliffs — a perfect match for action-focused scenes.

    Directions
    Street View

  58. 58


    Sesame Restaurant Area

    Dante Alighierija, Dubrovnik, Croatia
    The small park and pathways near Restaurant Sesame were used for part of the outdoor sequences.

    Directions
    Street View

  59. 59


    Lapad Marina in Gruž Harbour

    Gruž Harbour, Dubrovnik, Croatia
    A modern marina area frequently used for logistics and filming involving boats. The contrast between historic Old Town and the Gruž harbor gives the production diversity in visual style.

    Directions
    Street View

  60. 60


    Srđ Mountain

    Mount Srđ, Dubrovnik, Croatia
    The panoramic viewpoint above Dubrovnik, reachable by cable car, offers one of the best views in Croatia. A natural choice for wide establishing shots.

    Directions
    Street View

  61. 61


    Lokrum Island

    Lokrum Island, Dubrovnik, Croatia
    Just 10 minutes from Old Town by boat, this lush nature reserve was used for several outdoor scenes. Lokrum’s botanical gardens, rocky coastline, and monastery ruins are favorites among film crews.

    Directions
    Street View

  62. 62


    Cavtat

    Cavtat, Croatia
    The charming coastal town south of Dubrovnik served as an additional filming location. Known for its waterfront promenade and old center, Cavtat provides a quieter but equally photogenic setting.

    Directions
    Street View



1
/
62

[ allStops = JSON.parse(dataEl.textContent ,,,,,,, ‘[]’); ,
var code = stop.country_code ,,,
var code = btn.getAttribute(‘data-country’) ,
var hash = (window.location.hash ,, ‘[]’); ,,,
var tag = btn.getAttribute(‘data-tag’) ,, '').replace(/^#/, '');
var match = hash.match(/^stop-(\d+)$/);
return match ? match[1] : '';
,
searchQuery = String(raw , ‘[]’); ,
var code = stop.country_code ,
var hay = searchHaystacks[idx] , ”;
var isAll = tag === ”;
var active = isAll ? selectedTags.length === 0 : selectedTags.indexOf(tag) !== -1;
btn.classList.toggle(‘is-active’, active);
btn.setAttribute(‘aria-pressed’, active ? ‘true’ : ‘false’);
, ”;
var isAll = code === ”;
var active = isAll ? selectedCountries.length === 0 : selectedCountries.indexOf(code) !== -1;
btn.classList.toggle(‘is-active’, active);
btn.setAttribute(‘aria-pressed’, active ? ‘true’ : ‘false’);
,, ”).toLowerCase().replace(/\s+/g, ‘ ‘).trim();
searchTokens = searchQuery ? searchQuery.split(‘ ‘).filter(Boolean) : [];
if (searchClear) searchClear.hidden = searchQuery === ”;
,{“id”:29,”name”:”Kitty Hawk Adventure Therapy”,”address”:”St. Christopher Camp, Seabrook Island, SC”,”tagline”:”The behavioral camp Kiara is ambushed and sent to.”,”scene_note”:””,”visit_tip”:””,”access”:”public”,”access_label”:”Public”,”photo”:””,”lat”:32.58550000000000324007487506605684757232666015625,”lng”:-80.162000000000006139089236967265605926513671875,”tags”:[“season-3″],”country_code”:”us”,”country”:”United States”,”central”:false},{“id”:30,”name”:”John B\u2019s Bell Tower”,”address”:”Old Bethel AME Church, McClellanville, SC”,”tagline”:”Abandoned Civil War-era church that eventually burns down.”,”scene_note”:””,”visit_tip”:””,”access”:”public”,”access_label”:”Public”,”photo”:””,”lat”:33.08409999999999939745976007543504238128662109375,”lng”:-79.4677999999999968849806464277207851409912109375,”tags”:[“season-1″,”season-2″],”country_code”:”us”,”country”:”United States”,”central”:false},{“id”:31,”name”:”Guerin\u2019s Pharmacy”,”address”:”Main Street, Summerville, SC”,”tagline”:”Pope finds the Denmark Key hidden in his grandmother\u0027s ceiling.”,”scene_note”:””,”visit_tip”:””,”access”:”public”,”access_label”:”Public”,”photo”:””,”lat”:33.01830000000000353566065314225852489471435546875,”lng”:-80.175399999999996225596987642347812652587890625,”tags”:[“season-2″],”country_code”:”us”,”country”:”United States”,”central”:false},{“id”:32,”name”:”Mr. Sunn\u2019s House”,”address”:”Johns Island, SC”,”tagline”:”The Pogues\u0027 favorite teacher\u0027s residence where they decipher the amulet.”,”scene_note”:””,”visit_tip”:””,”access”:”public”,”access_label”:”Public”,”photo”:””,”lat”:32.73029999999999972715158946812152862548828125,”lng”:-80.0544000000000011141310096718370914459228515625,”tags”:[“season-4″],”country_code”:”us”,”country”:”United States”,”central”:false},{“id”:33,”name”:”Barry\u2019s Compound”,”address”:”Johns Island, SC”,”tagline”:”The rural drug compound where John B runs into major trouble.”,”scene_note”:””,”visit_tip”:””,”access”:”public”,”access_label”:”Public”,”photo”:””,”lat”:32.74000000000000198951966012828052043914794921875,”lng”:-80.06000000000000227373675443232059478759765625,”tags”:[“season-5″],”country_code”:”us”,”country”:”United States”,”central”:false},{“id”:34,”name”:”Groff\u2019s Boathouse \u0026 The Castle”,”address”:”Richmond Plantation, Cordesville, SC”,”tagline”:”Used for Groff\u0027s hideout and Ellie\u0027s English countryside-style estate.”,”scene_note”:””,”visit_tip”:””,”access”:”public”,”access_label”:”Public”,”photo”:””,”lat”:33.14920000000000044337866711430251598358154296875,”lng”:-79.897300000000001318767317570745944976806640625,”tags”:[“season-4″,”season-5″],”country_code”:”us”,”country”:”United States”,”central”:false},{“id”:35,”name”:”Wincloss House”,”address”:”Josie Ridge Lane, Wadmalaw Island, SC”,”tagline”:”The quiet, unspoiled estate hosting the masquerade ball.”,”scene_note”:””,”visit_tip”:””,”access”:”public”,”access_label”:”Public”,”photo”:””,”lat”:32.63969999999999771489456179551780223846435546875,”lng”:-80.159999999999996589394868351519107818603515625,”tags”:[“season-5″],”country_code”:”us”,”country”:”United States”,”central”:false},{“id”:36,”name”:”The Enduro Race (Beach)”,”address”:”Fort Fisher State Recreation Area, Kure Beach, NC”,”tagline”:”Location of the high-stakes Enduro dirt bike race on the sand.”,”scene_note”:””,”visit_tip”:””,”access”:”public”,”access_label”:”Public”,”photo”:””,”lat”:33.9534000000000020236257114447653293609619140625,”lng”:-77.9351999999999947021933621726930141448974609375,”tags”:[“season-4″],”country_code”:”us”,”country”:”United States”,”central”:false},{“id”:37,”name”:”The Enduro Race (Woods)”,”address”:”Copperhead Ranch, Rocky Point, NC”,”tagline”:”Muddy woodland portion of the dirt bike race.”,”scene_note”:””,”visit_tip”:””,”access”:”public”,”access_label”:”Public”,”photo”:””,”lat”:34.4266999999999967485564411617815494537353515625,”lng”:-77.885999999999995679900166578590869903564453125,”tags”:[“season-4″],”country_code”:”us”,”country”:”United States”,”central”:false},{“id”:38,”name”:”Nassau Streets”,”address”:”Careenage, Bridgetown, Barbados”,”tagline”:”Stood in for the Bahamas when John B and Sarah escape.”,”scene_note”:””,”visit_tip”:””,”access”:”public”,”access_label”:”Public”,”photo”:””,”lat”:13.0950000000000006394884621840901672840118408203125,”lng”:-59.61569999999999680539986002258956432342529296875,”tags”:[“season-2″],”country_code”:”bb”,”country”:”Barbados”,”central”:false},{“id”:39,”name”:”Fairmont Hotel”,”address”:”Fairmont Royal Pavilion, Barbados”,”tagline”:”The Cameron family luxury vacation hotel.”,”scene_note”:””,”visit_tip”:””,”access”:”public”,”access_label”:”Public”,”photo”:””,”lat”:13.2062000000000008270717444247566163539886474609375,”lng”:-59.6415999999999968395059113390743732452392578125,”tags”:[“season-2″],”country_code”:”bb”,”country”:”Barbados”,”central”:false},{“id”:40,”name”:”Paradise Island Mansion”,”address”:”Royal Westmoreland, Barbados”,”tagline”:”Luxury home the Pogues break into looking for stolen gold.”,”scene_note”:””,”visit_tip”:””,”access”:”public”,”access_label”:”Public”,”photo”:””,”lat”:13.2065000000000001278976924368180334568023681640625,”lng”:-59.627600000000001045918907038867473602294921875,”tags”:[“season-2″],”country_code”:”bb”,”country”:”Barbados”,”central”:false},{“id”:41,”name”:”Poguelandia”,”address”:”Bathsheba Beach, Barbados”,”tagline”:”Deserted island with dramatic rock formations where the Pogues wash ashore.”,”scene_note”:””,”visit_tip”:””,”access”:”public”,”access_label”:”Public”,”photo”:””,”lat”:13.213100000000000733280103304423391819000244140625,”lng”:-59.5217999999999989313437254168093204498291015625,”tags”:[“season-2″,”season-3″],”country_code”:”bb”,”country”:”Barbados”,”central”:false},{“id”:42,”name”:”Plane Crash”,”address”:”Port St. Charles, Barbados”,”tagline”:”The Pogues ambush their pilot and crash the plane into the ocean.”,”scene_note”:””,”visit_tip”:””,”access”:”public”,”access_label”:”Public”,”photo”:””,”lat”:13.262499999999999289457264239899814128875732421875,”lng”:-59.6467999999999989313437254168093204498291015625,”tags”:[“season-3″],”country_code”:”bb”,”country”:”Barbados”,”central”:false},{“id”:43,”name”:”The Camerons\u2019 Guadalupe Estate”,”address”:”Cattlewash Beach, Barbados”,”tagline”:”Ward and Rafe hide out with the Cross of Santo Domingo.”,”scene_note”:””,”visit_tip”:””,”access”:”public”,”access_label”:”Public”,”photo”:””,”lat”:13.2201000000000004064304448547773063182830810546875,”lng”:-59.5311999999999983401721692644059658050537109375,”tags”:[“season-3″],”country_code”:”bb”,”country”:”Barbados”,”central”:false},{“id”:44,”name”:”Carlos Singh\u2019s Estate”,”address”:”Lion Castle Estate, Barbados”,”tagline”:”Historic site standing in for Singh\u0027s heavily guarded compound.”,”scene_note”:””,”visit_tip”:””,”access”:”public”,”access_label”:”Public”,”photo”:””,”lat”:13.1895000000000006679101716144941747188568115234375,”lng”:-59.569400000000001682565198279917240142822265625,”tags”:[“season-3″],”country_code”:”bb”,”country”:”Barbados”,”central”:false},{“id”:45,”name”:”Big John\u2019s Bell Tower”,”address”:”St. John Parish Church, Barbados”,”tagline”:”Big John rings the historic church bell to signal his son.”,”scene_note”:””,”visit_tip”:””,”access”:”public”,”access_label”:”Public”,”photo”:””,”lat”:13.1763999999999992240873325499705970287322998046875,”lng”:-59.51610000000000155750967678613960742950439453125,”tags”:[“season-3″],”country_code”:”bb”,”country”:”Barbados”,”central”:false},{“id”:46,”name”:”El Dorado Cave”,”address”:”Welchman Hall Gully, Barbados”,”tagline”:”Tropical nature park representing South America\u0027s mythical city of gold.”,”scene_note”:””,”visit_tip”:””,”access”:”public”,”access_label”:”Public”,”photo”:””,”lat”:13.1956000000000006622258297284133732318878173828125,”lng”:-59.57679999999999864712663111276924610137939453125,”tags”:[“season-3″],”country_code”:”bb”,”country”:”Barbados”,”central”:false},{“id”:47,”name”:”The Moroccan Beach”,”address”:”Cap Hadid, Morocco”,”tagline”:”The Pogues wash up on desert dunes after surviving an Atlantic storm.”,”scene_note”:””,”visit_tip”:””,”access”:”public”,”access_label”:”Public”,”photo”:””,”lat”:31.6961000000000012732925824820995330810546875,”lng”:-9.8241999999999993775645634741522371768951416015625,”tags”:[“season-4″],”country_code”:”ma”,”country”:”Morocco”,”central”:false},{“id”:48,”name”:”Essaouira”,”address”:”Essaouira, Morocco”,”tagline”:”Port city where the Pogues explore the medina and wharf looking for Groff.”,”scene_note”:””,”visit_tip”:””,”access”:”public”,”access_label”:”Public”,”photo”:””,”lat”:31.508500000000001506350599811412394046783447265625,”lng”:-9.759499999999999175770426518283784389495849609375,”tags”:[“season-4″],”country_code”:”ma”,”country”:”Morocco”,”central”:false},{“id”:49,”name”:”Agapenta \/ The Blue Crown”,”address”:”Ouarzazate, Morocco”,”tagline”:”The door of the desert labyrinth where JJ ultimately finds the Blue Crown.”,”scene_note”:””,”visit_tip”:””,”access”:”public”,”access_label”:”Public”,”photo”:””,”lat”:30.91890000000000071622707764618098735809326171875,”lng”:-6.8933999999999997498889570124447345733642578125,”tags”:[“season-4″],”country_code”:”ma”,”country”:”Morocco”,”central”:false},{“id”:51,”name”:”Old Town Dubrovnik”,”address”:”Dubrovnik, Croatia”,”tagline”:”The UNESCO-protected Old Town served as the main base for several days of filming. Its narrow stone streets used for motorcycle chase and preserved medieval look make it suitable for different settings without major modifications.”,”scene_note”:””,”visit_tip”:””,”access”:”public”,”access_label”:”Public”,”photo”:””,”lat”:42.64030000000000342197381542064249515533447265625,”lng”:18.1082999999999998408384271897375583648681640625,”tags”:[“season-5″],”country_code”:”hr”,”country”:”Croatia”,”central”:false},{“id”:52,”name”:”Stradun”,”address”:”Stradun, Dubrovnik, Croatia”,”tagline”:”Dubrovnik\u2019s main promenade was closed during parts of the filming schedule. With its polished limestone pavement and historic fa\u00e7ades, Stradun offers a cinematic backdrop immediately recognizable to viewers.”,”scene_note”:””,”visit_tip”:””,”access”:”public”,”access_label”:”Public”,”photo”:””,”lat”:42.6409000000000020236257114447653293609619140625,”lng”:18.10900000000000176214598468504846096038818359375,”tags”:[“season-5″],”country_code”:”hr”,”country”:”Croatia”,”central”:false},{“id”:53,”name”:”Old Port (Porat)”,”address”:”Old Port, Dubrovnik, Croatia”,”tagline”:”The picturesque old harbor, framed by Saint John Fortress, was used for multiple scenes involving boats and waterfront action \u2014 a natural choice for a series deeply connected to boats and coastal life.”,”scene_note”:””,”visit_tip”:””,”access”:”public”,”access_label”:”Public”,”photo”:””,”lat”:42.640399999999999636202119290828704833984375,”lng”:18.111799999999998789235178264789283275604248046875,”tags”:[“season-5″],”country_code”:”hr”,”country”:”Croatia”,”central”:false},{“id”:54,”name”:”Lu\u017ea Square”,”address”:”Lu\u017ea Square, Dubrovnik, Croatia”,”tagline”:”One of the most iconic squares in Dubrovnik, located next to Sponza Palace and the Church of St. Blaise. A popular filming location thanks to its open layout and historical buildings.”,”scene_note”:””,”visit_tip”:””,”access”:”public”,”access_label”:”Public”,”photo”:””,”lat”:42.6407999999999987039700499735772609710693359375,”lng”:18.110600000000001585931386216543614864349365234375,”tags”:[“season-5″],”country_code”:”hr”,”country”:”Croatia”,”central”:false},{“id”:55,”name”:”Sponza Palace”,”address”:”Sponza Palace, Dubrovnik, Croatia”,”tagline”:”A striking 16th-century palace used in many international productions. The courtyard and fa\u00e7ade are ideal for scenes requiring historical ambience.”,”scene_note”:””,”visit_tip”:””,”access”:”public”,”access_label”:”Public”,”photo”:””,”lat”:42.6409000000000020236257114447653293609619140625,”lng”:18.11070000000000135287336888723075389862060546875,”tags”:[“season-5″],”country_code”:”hr”,”country”:”Croatia”,”central”:false},{“id”:56,”name”:”Jesuit Staircase”,”address”:”Jesuit Staircase, Dubrovnik, Croatia”,”tagline”:”One of the most famous staircases in Croatia, leading to the Church of St. Ignatius. Known worldwide from Game of Thrones, the stairs have once again become a star filming location.”,”scene_note”:””,”visit_tip”:””,”access”:”public”,”access_label”:”Public”,”photo”:””,”lat”:42.6390999999999991132426657713949680328369140625,”lng”:18.10940000000000082991391536779701709747314453125,”tags”:[“season-5″],”country_code”:”hr”,”country”:”Croatia”,”central”:false},{“id”:57,”name”:”Franciscan Monastery”,”address”:”Franciscan Monastery, Dubrovnik, Croatia”,”tagline”:”Located near Pile Gate, the monastery and its cloister provide a visually rich setting with impressive stone architecture.”,”scene_note”:””,”visit_tip”:””,”access”:”public”,”access_label”:”Public”,”photo”:””,”lat”:42.641300000000001091393642127513885498046875,”lng”:18.10770000000000123918653116561472415924072265625,”tags”:[“season-5″],”country_code”:”hr”,”country”:”Croatia”,”central”:false},{“id”:58,”name”:”Dan\u010de Beach”,”address”:”Dan\u010de Beach, Dubrovnik, Croatia”,”tagline”:”A rugged, rocky beach west of the Old Town. Dan\u010de is known for dramatic waves and cliffs \u2014 a perfect match for action-focused scenes.”,”scene_note”:””,”visit_tip”:””,”access”:”public”,”access_label”:”Public”,”photo”:””,”lat”:42.64059999999999917008608463220298290252685546875,”lng”:18.09909999999999996589394868351519107818603515625,”tags”:[“season-5″],”country_code”:”hr”,”country”:”Croatia”,”central”:false},{“id”:59,”name”:”Sesame Restaurant Area”,”address”:”Dante Alighierija, Dubrovnik, Croatia”,”tagline”:”The small park and pathways near Restaurant Sesame were used for part of the outdoor sequences.”,”scene_note”:””,”visit_tip”:””,”access”:”public”,”access_label”:”Public”,”photo”:””,”lat”:42.64269999999999782858139951713383197784423828125,”lng”:18.10379999999999967030817060731351375579833984375,”tags”:[“season-5″],”country_code”:”hr”,”country”:”Croatia”,”central”:false},{“id”:60,”name”:”Lapad Marina in Gru\u017e Harbour”,”address”:”Gru\u017e Harbour, Dubrovnik, Croatia”,”tagline”:”A modern marina area frequently used for logistics and filming involving boats. The contrast between historic Old Town and the Gru\u017e harbor gives the production diversity in visual style.”,”scene_note”:””,”visit_tip”:””,”access”:”public”,”access_label”:”Public”,”photo”:””,”lat”:42.65820000000000078443918027915060520172119140625,”lng”:18.084700000000001551825334900058805942535400390625,”tags”:[“season-5″],”country_code”:”hr”,”country”:”Croatia”,”central”:false},{“id”:61,”name”:”Sr\u0111 Mountain”,”address”:”Mount Sr\u0111, Dubrovnik, Croatia”,”tagline”:”The panoramic viewpoint above Dubrovnik, reachable by cable car, offers one of the best views in Croatia. A natural choice for wide establishing shots.”,”scene_note”:””,”visit_tip”:””,”access”:”public”,”access_label”:”Public”,”photo”:””,”lat”:42.6492999999999966576069709844887256622314453125,”lng”:18.111599999999999255351212923415005207061767578125,”tags”:[“season-5″],”country_code”:”hr”,”country”:”Croatia”,”central”:false},{“id”:62,”name”:”Lokrum Island”,”address”:”Lokrum Island, Dubrovnik, Croatia”,”tagline”:”Just 10 minutes from Old Town by boat, this lush nature reserve was used for several outdoor scenes. Lokrum\u2019s botanical gardens, rocky coastline, and monastery ruins are favorites among film crews.”,”scene_note”:””,”visit_tip”:””,”access”:”public”,”access_label”:”Public”,”photo”:””,”lat”:42.6287999999999982492226990871131420135498046875,”lng”:18.11970000000000169393388205207884311676025390625,”tags”:[“season-5″],”country_code”:”hr”,”country”:”Croatia”,”central”:false},{“id”:63,”name”:”Cavtat”,”address”:”Cavtat, Croatia”,”tagline”:”The charming coastal town south of Dubrovnik served as an additional filming location. Known for its waterfront promenade and old center, Cavtat provides a quieter but equally photogenic setting.”,”scene_note”:””,”visit_tip”:””,”access”:”public”,”access_label”:”Public”,”photo”:””,”lat”:42.58080000000000353566065314225852489471435546875,”lng”:18.219500000000000028421709430404007434844970703125,”tags”:[“season-5″],”country_code”:”hr”,”country”:”Croatia”,”central”:false}]

.won-filming-locations {
–won-fl-accent: #b9090b;
–won-fl-accent-hover: #9a0809;
–won-fl-bg: #ffffff;
–won-fl-surface: #fafafa;
–won-fl-border: #dcdcdc;
–won-fl-text: #221f1f;
–won-fl-muted: #666666;
–won-fl-star: #d4a017;
–won-fl-radius: 10px;
–won-fl-shadow: 0 4px 16px rgba(0, 0, 0, 0.08);
font-family: -apple-system, BlinkMacSystemFont, “Segoe UI”, Roboto, Helvetica, Arial, sans-serif;
width: 100%;
max-width: 100%;
margin: 1.5rem 0;
background: var(–won-fl-bg);
border: 1px solid var(–won-fl-border);
border-radius: var(–won-fl-radius);
box-shadow: var(–won-fl-shadow);
overflow: hidden;
color: var(–won-fl-text);
box-sizing: border-box;
}
.won-filming-locations *,
.won-filming-locations *::before,
.won-filming-locations *::after { box-sizing: border-box; }
.won-single–feature .won-filming-locations {
width: min(1120px, 96vw);
max-width: min(1120px, 96vw);
margin-left: calc(50% – min(560px, 48vw));
margin-right: 0;
}
.won-filming-locations–dark {
–won-fl-bg: #141414;
–won-fl-surface: #1a1a1a;
–won-fl-border: #2a2a2a;
–won-fl-text: #e8e8e8;
–won-fl-muted: #999999;
–won-fl-star: #f0c14b;
–won-fl-shadow: 0 4px 24px rgba(0, 0, 0, 0.4);
}
@media (prefers-color-scheme: dark) {
.won-filming-locations:not(.won-filming-locations–light) {
–won-fl-bg: #141414;
–won-fl-surface: #1a1a1a;
–won-fl-border: #2a2a2a;
–won-fl-text: #e8e8e8;
–won-fl-muted: #999999;
–won-fl-star: #f0c14b;
–won-fl-shadow: 0 4px 24px rgba(0, 0, 0, 0.4);
}
}
.won-fl-accent-bar { height: 3px; background: var(–won-fl-accent); }
.won-fl-header {
display: flex; align-items: flex-start; justify-content: space-between; gap: 1rem;
padding: 1.15rem 1.25rem 0.85rem;
}
.won-fl-heading { min-width: 0; }
.won-fl-title {
margin: 0; font-size: 1.2rem; font-weight: 700; line-height: 1.3;
color: var(–won-fl-text); font-family: inherit; letter-spacing: -0.02em; text-transform: none;
}
.won-fl-subtitle { margin: 0.2rem 0 0; font-size: 0.8rem; color: var(–won-fl-muted); }
.won-fl-tools {
display: flex; flex-direction: column; gap: 0.7rem;
padding: 0 1.25rem 1rem;
border-bottom: 1px solid var(–won-fl-border);
background: var(–won-fl-bg);
}
.won-fl-search {
position: relative; display: flex; align-items: center;
}
.won-fl-search-icon {
position: absolute; left: 0.75rem; display: flex; color: var(–won-fl-muted); pointer-events: none;
}
.won-fl-search-input {
width: 100%; appearance: none; -webkit-appearance: none;
border: 1px solid var(–won-fl-border); background: var(–won-fl-surface);
color: var(–won-fl-text); font-size: 0.9rem; font-family: inherit;
padding: 0.5rem 2.4rem 0.5rem 2.35rem; border-radius: 8px; min-height: 40px;
}
.won-fl-search-input:focus {
outline: none; border-color: var(–won-fl-accent);
box-shadow: 0 0 0 3px rgba(185, 9, 11, 0.12);
background: var(–won-fl-bg);
}
.won-fl-search-input::-webkit-search-cancel-button { display: none; }
.won-fl-search-clear {
appearance: none; position: absolute; right: 0.35rem;
width: 28px; height: 28px; border: 0; background: transparent;
color: var(–won-fl-muted); font-size: 1.2rem; line-height: 1;
border-radius: 6px; cursor: pointer; padding: 0;
}
.won-fl-search-clear:hover { color: var(–won-fl-text); background: var(–won-fl-border); }
.won-fl-filters-wrap { display: flex; flex-direction: column; gap: 0.45rem; }
.won-fl-filter-label {
flex: 0 0 4.4rem; font-size: 0.68rem; font-weight: 700; text-transform: uppercase;
letter-spacing: 0.06em; color: var(–won-fl-muted); line-height: 1;
}
.won-fl-filters {
display: flex; flex-wrap: wrap; align-items: center; gap: 0.35rem;
padding: 0;
}
.won-fl-filter {
appearance: none; border: 1px solid var(–won-fl-border); background: var(–won-fl-bg);
color: var(–won-fl-text); font-size: 0.75rem; font-weight: 600; padding: 0.28rem 0.7rem;
border-radius: 999px; cursor: pointer; min-height: 28px; line-height: 1.2;
}
.won-fl-filter:hover { border-color: var(–won-fl-accent); color: var(–won-fl-accent); }
.won-fl-filter.is-active,
.won-fl-filter.is-active:hover {
background: var(–won-fl-accent); border-color: var(–won-fl-accent); color: #fff;
}
.won-fl-list-item.is-filtered-out { display: none; }
.won-fl-body {
display: grid; grid-template-columns: minmax(0, 1.45fr) minmax(280px, 1fr);
gap: 0; min-height: 520px; background: var(–won-fl-surface);
}
.won-fl-map-wrap { position: relative; min-height: 520px; }
.won-fl-map { width: 100%; height: 100%; min-height: 520px; background: var(–won-fl-surface); z-index: 1; }
.won-fl-list {
list-style: none; margin: 0; padding: 0.75rem; overflow-y: auto; max-height: 520px;
display: flex; flex-direction: column; gap: 0.5rem;
border-left: 1px solid var(–won-fl-border); background: var(–won-fl-bg);
scrollbar-width: thin; scrollbar-color: var(–won-fl-accent) var(–won-fl-surface);
}
.won-fl-list-item {
display: flex; gap: 0.65rem; padding: 0.7rem; margin: 0;
border: 1px solid var(–won-fl-border); border-radius: 10px; background: var(–won-fl-surface);
cursor: pointer; transition: border-color 0.15s, box-shadow 0.15s, background 0.15s;
}
.won-fl-list-item:hover, .won-fl-list-item:focus {
border-color: var(–won-fl-accent); outline: none; background: var(–won-fl-bg);
}
.won-fl-list-item.is-active {
border-color: var(–won-fl-accent);
box-shadow: inset 3px 0 0 var(–won-fl-accent), 0 2px 10px rgba(185, 9, 11, 0.1);
background: var(–won-fl-bg);
}
.won-fl-list-badge {
flex-shrink: 0; width: 26px; height: 26px; display: flex; align-items: center; justify-content: center;
border-radius: 50%; background: var(–won-fl-accent); color: #fff; font-size: 0.72rem; font-weight: 700;
margin-top: 1px;
}
.won-fl-list-photo {
flex-shrink: 0; width: 56px; height: 56px; object-fit: cover; border-radius: 8px;
background: var(–won-fl-border);
}
.won-fl-list-content { display: flex; flex-direction: column; gap: 0.18rem; min-width: 0; flex: 1; }
.won-fl-list-name { font-size: 0.92rem; line-height: 1.3; color: var(–won-fl-text); }
.won-fl-star {
display: inline-block; color: var(–won-fl-star); font-size: 0.95em; line-height: 1;
margin-right: 0.15rem; vertical-align: baseline;
}
.won-fl-central-label {
display: inline-block; width: fit-content; font-size: 0.65rem; font-weight: 700;
letter-spacing: 0.04em; text-transform: uppercase; color: var(–won-fl-star);
}
.won-fl-access {
display: inline-block; width: fit-content; font-size: 0.65rem; font-weight: 700;
letter-spacing: 0.04em; text-transform: uppercase; color: var(–won-fl-muted);
}
.won-fl-access–private,
.won-fl-access–view-from-street { color: var(–won-fl-accent); }
.won-fl-list-address, .won-fl-list-tagline, .won-fl-list-scene, .won-fl-list-tip, .won-fl-walk-next {
font-size: 0.78rem; color: var(–won-fl-muted); line-height: 1.35;
}
.won-fl-list-address {
overflow: hidden; text-overflow: ellipsis; white-space: nowrap;
}
.won-fl-list-tagline { font-style: italic; }
.won-fl-list-scene,
.won-fl-list-tip,
.won-fl-list-actions { display: none; }
.won-fl-list-item.is-active .won-fl-list-scene,
.won-fl-list-item.is-active .won-fl-list-tip { display: block; }
.won-fl-list-item.is-active .won-fl-list-actions { display: flex; }
.won-fl-list-item.is-active .won-fl-list-address { white-space: normal; }
.won-fl-list-tip { font-weight: 600; }
.won-fl-walk-next { color: var(–won-fl-accent); font-weight: 600; }
.won-fl-list-actions {
flex-wrap: wrap; gap: 0.15rem 0.85rem; margin-top: 0.4rem;
padding-top: 0.45rem; border-top: 1px solid var(–won-fl-border);
}
.won-fl-directions, .won-fl-streetview, .won-fl-share {
display: inline-block; font-size: 0.75rem; font-weight: 600;
color: var(–won-fl-accent); text-decoration: none; background: none; border: 0;
padding: 0; cursor: pointer; font-family: inherit;
}
.won-fl-directions:hover, .won-fl-streetview:hover, .won-fl-share:hover { text-decoration: underline; }
.won-fl-empty {
list-style: none; margin: auto 0; padding: 2rem 0.75rem; text-align: center;
font-size: 0.9rem; color: var(–won-fl-muted); border: 0; background: transparent;
}
.won-fl-empty[hidden] { display: none; }
.won-fl-footer {
border-top: 1px solid var(–won-fl-border); background: var(–won-fl-bg);
}
.won-fl-progress {
height: 3px; background: var(–won-fl-border); margin: 0; overflow: hidden;
}
.won-fl-progress-bar {
display: block; height: 100%; width: 0; background: var(–won-fl-accent);
transition: width 0.2s ease;
}
.won-fl-controls {
display: flex; flex-wrap: wrap; align-items: center; justify-content: space-between; gap: 0.65rem 1rem;
padding: 0.7rem 1.25rem;
}
.won-fl-nav,
.won-fl-footer-actions { display: flex; flex-wrap: wrap; align-items: center; gap: 0.4rem; }
.won-fl-btn {
appearance: none; border: 1px solid var(–won-fl-border); background: var(–won-fl-bg);
color: var(–won-fl-text); font-size: 0.8rem; font-weight: 600; padding: 0.4rem 0.8rem;
border-radius: 7px; cursor: pointer; min-height: 34px; font-family: inherit;
}
.won-fl-btn:hover { border-color: var(–won-fl-accent); color: var(–won-fl-accent); }
.won-fl-btn:disabled { opacity: 0.4; cursor: default; border-color: var(–won-fl-border); color: var(–won-fl-muted); }
.won-fl-btn–tour {
background: var(–won-fl-accent); border-color: var(–won-fl-accent); color: #fff;
}
.won-fl-btn–tour:hover {
background: var(–won-fl-accent-hover); border-color: var(–won-fl-accent-hover); color: #fff;
}
.won-fl-btn–route.is-active {
border-color: var(–won-fl-accent); color: var(–won-fl-accent);
background: var(–won-fl-surface);
}
.won-fl-btn–all { margin-left: 0; }
.won-fl-counter {
min-width: 3.6rem; text-align: center; font-size: 0.8rem; font-weight: 700;
font-variant-numeric: tabular-nums; color: var(–won-fl-text);
}
.won-fl-counter-sep { color: var(–won-fl-muted); font-weight: 500; padding: 0 0.1rem; }
.won-fl-marker-pin {
width: 32px; height: 32px; border-radius: 50% 50% 50% 0; background: var(–won-fl-accent);
color: #fff; font-size: 0.85rem; font-weight: 700; display: flex; align-items: center; justify-content: center;
transform: rotate(-45deg); box-shadow: 0 2px 6px rgba(0, 0, 0, 0.35); border: 2px solid #fff;
}
.won-fl-marker-pin span { transform: rotate(45deg); }
.won-fl-marker-star {
width: 36px; height: 36px; border-radius: 50%; background: var(–won-fl-star);
color: #fff; display: flex; align-items: center; justify-content: center;
box-shadow: 0 2px 8px rgba(0, 0, 0, 0.35); border: 2px solid #fff;
}
.won-fl-marker-star svg { display: block; }
.won-fl-popup .leaflet-popup-content { margin: 0.75rem 0.9rem; min-width: 180px; }
.won-fl-popup strong { display: block; margin-bottom: 0.25rem; }
.won-fl-popup-photo { width: 100%; max-height: 110px; object-fit: cover; border-radius: 4px; margin-bottom: 0.4rem; display: block; }
.won-fl-popup-central {
display: block; font-size: 0.72rem; font-weight: 700; letter-spacing: 0.04em;
text-transform: uppercase; color: #b8860b; margin-bottom: 0.25rem;
}
.won-fl-popup-tag { display: block; font-size: 0.8rem; font-style: italic; color: #666; margin-bottom: 0.25rem; }
.won-fl-popup-scene, .won-fl-popup-tip { display: block; font-size: 0.78rem; color: #444; margin: 0.25rem 0; }
.won-fl-popup-links { display: flex; flex-wrap: wrap; gap: 0.6rem; margin-top: 0.4rem; }
.won-fl-popup-links a { font-size: 0.78rem; font-weight: 600; color: #b9090b; text-decoration: none; }
.won-fl-popup small { color: #666; }
.won-fl-marker.leaflet-div-icon {
background: none; border: 0;
}
.won-fl-error { color: #b9090b; font-weight: 600; }
@media (max-width: 768px) {
.won-fl-header, .won-fl-tools { padding-left: 1rem; padding-right: 1rem; }
.won-fl-body { grid-template-columns: 1fr; min-height: 0; }
.won-fl-map-wrap, .won-fl-map { min-height: 280px; }
.won-fl-list { border-left: 0; border-top: 1px solid var(–won-fl-border); max-height: 360px; }
.won-fl-controls { padding: 0.7rem 1rem; }
.won-fl-nav, .won-fl-footer-actions { width: 100%; }
.won-fl-footer-actions { justify-content: stretch; }
.won-fl-footer-actions .won-fl-btn { flex: 1; }
.won-fl-filter-label { flex-basis: 100%; margin-bottom: 0.1rem; }
}
@media print {
.won-fl-accent-bar,
.won-fl-tools,
.won-fl-footer,
.won-fl-map-wrap,
.won-fl-list-photo,
.won-fl-list-actions,
.won-fl-walk-next { display: none !important; }
.won-filming-locations {
box-shadow: none; border: 0; background: #fff; color: #111;
overflow: visible; max-width: 100%; margin: 0;
}
.won-fl-header { padding: 0 0 1rem; border: 0; }
.won-fl-body { display: block; min-height: 0; background: #fff; }
.won-fl-list {
max-height: none; overflow: visible; border: 0; padding: 0;
background: #fff; display: block;
}
.won-fl-list-item.is-filtered-out { display: none !important; }
.won-fl-list-item {
break-inside: avoid; box-shadow: none; cursor: default;
border: 1px solid #ccc; background: #fff; color: #111;
margin-bottom: 0.5rem;
}
.won-fl-list-scene,
.won-fl-list-tip { display: block !important; }
.won-fl-title, .won-fl-list-name, .won-fl-list-address, .won-fl-list-tagline,
.won-fl-list-scene, .won-fl-list-tip, .won-fl-access, .won-fl-subtitle {
color: #111;
}
.won-fl-star, .won-fl-central-label { color: #b8860b; }
}

(function () {
var containerId = “won-fl-2-1″;
var dataId = containerId + ‘-data’;

function initFilmingLocations() {
if (typeof L === ‘undefined’) {
setTimeout(initFilmingLocations, 50);
return;
}
var container = document.getElementById(containerId);
var dataEl = document.getElementById(dataId);
if (!container || !dataEl) return;

var allStops;
try { allStops = JSON.parse(dataEl.textContent || ‘[]’); } catch (e) { return; }
if (!allStops.length) return;

var zoomStart = parseInt(container.getAttribute(‘data-zoom-start’) || ’13’, 10) || 13;
var mapEl = container.querySelector(‘.won-fl-map’);
var prevBtn = container.querySelector(‘.won-fl-btn–prev’);
var nextBtn = container.querySelector(‘.won-fl-btn–next’);
var allBtn = container.querySelector(‘.won-fl-btn–all’);
var tourBtn = container.querySelector(‘.won-fl-btn–tour’);
var routeBtn = container.querySelector(‘.won-fl-btn–route’);
var printBtn = container.querySelector(‘.won-fl-btn–print’);
var counterCurrentEl = container.querySelector(‘.won-fl-counter-current’);
var counterTotalEl = container.querySelector(‘.won-fl-counter-total’);
var subtitleEl = container.querySelector(‘.won-fl-subtitle’);
var progressBar = container.querySelector(‘.won-fl-progress-bar’);
var listItems = container.querySelectorAll(‘.won-fl-list-item’);
var tagBtns = container.querySelectorAll(‘.won-fl-filters–tags .won-fl-filter’);
var countryBtns = container.querySelectorAll(‘.won-fl-filters–countries .won-fl-filter’);
var searchInput = container.querySelector(‘.won-fl-search-input’);
var searchClear = container.querySelector(‘.won-fl-search-clear’);
var emptyEl = container.querySelector(‘.won-fl-empty’);
var labelOne = container.getAttribute(‘data-label-one’) || ‘%d filming location’;
var labelMany = container.getAttribute(‘data-label-many’) || ‘%d filming locations’;
var labelWalk = container.getAttribute(‘data-label-walk’) || ‘%d min walk to next’;
var labelRouteShow = container.getAttribute(‘data-label-route-show’) || ‘Show route’;
var labelRouteHide = container.getAttribute(‘data-label-route-hide’) || ‘Hide route’;
var labelCentral = container.getAttribute(‘data-label-central’) || ‘Central filming location’;
var labelCopied = container.getAttribute(‘data-label-copied’) || ‘Copied’;
var labelShare = container.getAttribute(‘data-label-share’) || ‘Share stop’;
var labelDirections = container.getAttribute(‘data-label-directions’) || ‘Directions’;
var labelStreetView = container.getAttribute(‘data-label-streetview’) || ‘Street View’;
var showAccess = container.getAttribute(‘data-show-access’) === ‘1’;
var labelTip = container.getAttribute(‘data-label-tip’) || ‘Tip’;
var printTitle = container.getAttribute(‘data-print-title’) || ”;
var selectedTags = (container.getAttribute(‘data-initial-tags’) || ”)
.split(‘,’)
.map(function (t) { return t.trim(); })
.filter(Boolean);
var selectedCountries = [];
var searchQuery = ”;
var searchTokens = [];
var searchTimer = null;
var searchHaystacks = allStops.map(function (stop) {
var parts = [
stop.name, stop.address, stop.tagline, stop.scene_note,
stop.visit_tip, stop.country, stop.country_code
];
if (stop.tags && stop.tags.length) parts.push(stop.tags.join(‘ ‘));
return String(parts.join(‘ ‘)).toLowerCase().replace(/\s+/g, ‘ ‘).trim();
});
var visibleIndices = [];
var currentVisiblePos = 0;
var markers = [];
var markerGroup = L.layerGroup();
var focusZoom = Math.max(zoomStart, 13);
var skipHashWrite = false;
var showRoute = false;

var map = L.map(mapEl, { scrollWheelZoom: false, preferCanvas: true });
L.tileLayer(‘https://{s}.basemaps.cartocdn.com/light_all/{z}/{x}/{y}{r}.png’, {
maxZoom: 20,
subdomains: ‘abcd’,
attribution: ‘© OpenStreetMap contributors © CARTO’
}).addTo(map);
markerGroup.addTo(map);
var routeLine = L.polyline([], {
color: ‘#b9090b’,
weight: 3,
opacity: 0.45,
dashArray: ‘6 8’
}).addTo(map);

function stopMatches(stop, idx) {
if (selectedTags.length) {
var stopTags = stop.tags || [];
var tagOk = false;
for (var i = 0; i < selectedTags.length; i++) {
if (stopTags.indexOf(selectedTags[i]) !== -1) {
tagOk = true;
break;
}
}
if (!tagOk) return false;
}
if (selectedCountries.length) {
var code = stop.country_code || '';
if (selectedCountries.indexOf(code) === -1) return false;
}
if (searchTokens.length) {
var hay = searchHaystacks[idx] || '';
for (var t = 0; t 0 ? ((pos + 1) / total) * 100 : 0;
progressBar.style.width = pct + ‘%’;
}

function haversineMeters(a, b) {
var r = 6371000;
var toRad = Math.PI / 180;
var dLat = (b.lat – a.lat) * toRad;
var dLng = (b.lng – a.lng) * toRad;
var lat1 = a.lat * toRad;
var lat2 = b.lat * toRad;
var h = Math.sin(dLat / 2) * Math.sin(dLat / 2) +
Math.cos(lat1) * Math.cos(lat2) * Math.sin(dLng / 2) * Math.sin(dLng / 2);
return 2 * r * Math.asin(Math.min(1, Math.sqrt(h)));
}

function updateWalkTimes(activeOrigIdx) {
listItems.forEach(function (item) {
var el = item.querySelector(‘.won-fl-walk-next’);
if (!el) return;
el.hidden = true;
el.textContent=””;
});
if (currentVisiblePos >= visibleIndices.length – 1) return;
var here = allStops[activeOrigIdx];
var next = allStops[visibleIndices[currentVisiblePos + 1]];
if (!here || !next) return;
var meters = haversineMeters(here, next);
var mins = Math.max(1, Math.round(meters / 83.33));
var activeItem = listItems[activeOrigIdx];
var walkEl = activeItem ? activeItem.querySelector(‘.won-fl-walk-next’) : null;
if (walkEl) {
walkEl.hidden = false;
walkEl.textContent = labelWalk.replace(‘%d’, String(mins));
}
}

function googleTourUrl(locs) {
if (!locs.length) return ”;
var parts = locs.map(function (loc) { return loc.lat + ‘,’ + loc.lng; });
return ‘https://www.google.com/maps/dir/’ + parts.map(encodeURIComponent).join(‘/’);
}

function fitAllStops() {
var locs = visibleStops();
if (!locs.length) return;
var latlngs = locs.map(function (loc) { return [loc.lat, loc.lng]; });
map.closePopup();
map.fitBounds(L.latLngBounds(latlngs), { padding: [50, 50], maxZoom: zoomStart });
}

function renderRoute() {
if (!showRoute) {
routeLine.setLatLngs([]);
return;
}
var latlngs = visibleStops().map(function (loc) { return [loc.lat, loc.lng]; });
routeLine.setLatLngs(latlngs);
}

function syncRouteButton() {
if (!routeBtn) return;
routeBtn.textContent = showRoute ? labelRouteHide : labelRouteShow;
routeBtn.setAttribute(‘aria-pressed’, showRoute ? ‘true’ : ‘false’);
routeBtn.classList.toggle(‘is-active’, showRoute);
}

function escapeHtml(str) {
return String(str == null ? ” : str)
.replace(/&/g, ‘&’)
.replace(//g, ‘>’)
.replace(/”/g, ‘"’);
}

function popupHtml(loc) {
var html=””;
if (loc.photo) html += ‘‘;
html += ‘‘ + escapeHtml(loc.name) + ‘‘;
if (loc.central) html += ‘‘ + escapeHtml(labelCentral) + ‘‘;
if (showAccess && loc.access_label) html += ‘‘ + escapeHtml(loc.access_label) + ‘‘;
if (loc.tagline) html += ‘‘ + escapeHtml(loc.tagline) + ‘‘;
if (loc.scene_note) html += ‘‘ + escapeHtml(loc.scene_note) + ‘‘;
if (loc.visit_tip) html += ‘‘ + escapeHtml(loc.visit_tip) + ‘‘;
if (loc.address) html += ‘‘ + escapeHtml(loc.address) + ‘‘;
html += ‘

‘;
return html;
}

function renderMarkers() {
markerGroup.clearLayers();
markers = [];
visibleIndices.forEach(function (origIdx, visIdx) {
var loc = allStops[origIdx];
var icon;
if (loc.central) {
icon = L.divIcon({
className: ‘won-fl-marker won-fl-marker–central’,
html: ‘

‘,
iconSize: [36, 36],
iconAnchor: [18, 18],
popupAnchor: [0, -18]
});
} else {
icon = L.divIcon({
className: ‘won-fl-marker’,
html: ‘

‘ + (visIdx + 1) + ‘

‘,
iconSize: [32, 32],
iconAnchor: [16, 32],
popupAnchor: [0, -32]
});
}
var marker = L.marker([loc.lat, loc.lng], { icon: icon, zIndexOffset: loc.central ? 1000 : 0 });
marker.bindPopup(popupHtml(loc), { className: ‘won-fl-popup’, autoPan: false });
marker.on(‘click’, function () { updateTour(visIdx); });
marker.addTo(markerGroup);
markers.push(marker);
});
}

function writeStopHash(stopId) {
if (skipHashWrite || !stopId) return;
if (typeof history !== ‘undefined’ && history.replaceState) {
history.replaceState(null, ”, ‘#’ + ‘stop-‘ + stopId);
}
}

function updateTour(visiblePos, skipMapMove) {
if (!visibleIndices.length) {
if (counterCurrentEl) counterCurrentEl.textContent=”0″;
if (prevBtn) prevBtn.disabled = true;
if (nextBtn) nextBtn.disabled = true;
if (tourBtn) tourBtn.disabled = true;
if (printBtn) printBtn.disabled = true;
setProgress(0, 0);
listItems.forEach(function (item) {
item.classList.remove(‘is-active’);
item.setAttribute(‘aria-pressed’, ‘false’);
});
return;
}
if (tourBtn) tourBtn.disabled = false;
if (printBtn) printBtn.disabled = false;
currentVisiblePos = Math.max(0, Math.min(visibleIndices.length – 1, visiblePos));
var origIdx = visibleIndices[currentVisiblePos];
var loc = allStops[origIdx];
if (counterCurrentEl) counterCurrentEl.textContent = String(currentVisiblePos + 1);
setProgress(currentVisiblePos, visibleIndices.length);
listItems.forEach(function (item, idx) {
var isActive = idx === origIdx;
item.classList.toggle(‘is-active’, isActive);
item.setAttribute(‘aria-pressed’, isActive ? ‘true’ : ‘false’);
});
updateWalkTimes(origIdx);
if (loc && loc.id) writeStopHash(loc.id);
if (prevBtn) prevBtn.disabled = currentVisiblePos === 0;
if (nextBtn) nextBtn.disabled = currentVisiblePos === visibleIndices.length – 1;
if (skipMapMove) {
markers.forEach(function (m) { m.closePopup(); });
return;
}
map.setView([loc.lat, loc.lng], focusZoom, { animate: true });
markers.forEach(function (m, idx) {
if (idx === currentVisiblePos) m.openPopup();
else m.closePopup();
});
var activeItem = listItems[origIdx];
if (activeItem && typeof activeItem.scrollIntoView === ‘function’) {
activeItem.scrollIntoView({ behavior: ‘smooth’, block: ‘nearest’ });
}
}

function syncFilterButtons() {
tagBtns.forEach(function (btn) {
var tag = btn.getAttribute(‘data-tag’) || ”;
var isAll = tag === ”;
var active = isAll ? selectedTags.length === 0 : selectedTags.indexOf(tag) !== -1;
btn.classList.toggle(‘is-active’, active);
btn.setAttribute(‘aria-pressed’, active ? ‘true’ : ‘false’);
});
countryBtns.forEach(function (btn) {
var code = btn.getAttribute(‘data-country’) || ”;
var isAll = code === ”;
var active = isAll ? selectedCountries.length === 0 : selectedCountries.indexOf(code) !== -1;
btn.classList.toggle(‘is-active’, active);
btn.setAttribute(‘aria-pressed’, active ? ‘true’ : ‘false’);
});
}

function applyFilter(preferredOrigIdx) {
visibleIndices = [];
allStops.forEach(function (stop, idx) {
if (stopMatches(stop, idx)) visibleIndices.push(idx);
});
listItems.forEach(function (item, idx) {
var show = visibleIndices.indexOf(idx) !== -1;
item.classList.toggle(‘is-filtered-out’, !show);
item.tabIndex = show ? 0 : -1;
if (show) {
var visIdx = visibleIndices.indexOf(idx);
var badge = item.querySelector(‘.won-fl-list-badge’);
if (badge) badge.textContent = String(visIdx + 1);
}
});
if (emptyEl) emptyEl.hidden = visibleIndices.length > 0;
setCount(visibleIndices.length);
syncFilterButtons();
renderMarkers();
renderRoute();
var startPos = 0;
if (typeof preferredOrigIdx === ‘number’) {
var found = visibleIndices.indexOf(preferredOrigIdx);
if (found !== -1) startPos = found;
}
updateTour(startPos, true);
if (visibleIndices.length) {
setTimeout(function () {
map.invalidateSize();
fitAllStops();
}, 50);
} else {
map.closePopup();
}
}

function stopIndexById(id) {
for (var i = 0; i < allStops.length; i++) {
if (String(allStops[i].id) === String(id)) return i;
}
return -1;
}

function hashStopId() {
var hash = (window.location.hash || '').replace(/^#/, '');
var match = hash.match(/^stop-(\d+)$/);
return match ? match[1] : '';
}

function applyHashStop() {
var id = hashStopId();
if (!id) return;
var origIdx = stopIndexById(id);
if (origIdx < 0) return;
if (visibleIndices.indexOf(origIdx) === -1) {
selectedTags = [];
selectedCountries = [];
searchQuery = '';
searchTokens = [];
if (searchInput) searchInput.value = '';
if (searchClear) searchClear.hidden = true;
skipHashWrite = true;
applyFilter(origIdx);
skipHashWrite = false;
var visPos = visibleIndices.indexOf(origIdx);
if (visPos !== -1) updateTour(visPos);
return;
}
updateTour(visibleIndices.indexOf(origIdx));
}

listItems.forEach(function (item) {
var origIdx = parseInt(item.getAttribute('data-stop'), 10);
item.addEventListener('click', function () {
var visPos = visibleIndices.indexOf(origIdx);
if (visPos !== -1) updateTour(visPos);
});
item.addEventListener('keydown', function (e) {
if (e.key === 'Enter' || e.key === ' ') {
e.preventDefault();
var visPos = visibleIndices.indexOf(origIdx);
if (visPos !== -1) updateTour(visPos);
}
});
});
if (prevBtn) prevBtn.addEventListener('click', function () { updateTour(currentVisiblePos – 1); });
if (nextBtn) nextBtn.addEventListener('click', function () { updateTour(currentVisiblePos + 1); });
if (allBtn) allBtn.addEventListener('click', fitAllStops);
if (routeBtn) {
routeBtn.addEventListener('click', function () {
showRoute = !showRoute;
syncRouteButton();
renderRoute();
});
}
if (tourBtn) {
tourBtn.addEventListener('click', function () {
var url = googleTourUrl(visibleStops());
if (url) window.open(url, '_blank', 'noopener,noreferrer');
});
}
if (printBtn) {
printBtn.addEventListener('click', function () {
var locs = visibleStops();
if (!locs.length) return;
var countTmpl = locs.length === 1 ? labelOne : labelMany;
var rows = locs.map(function (loc, i) {
var html = '

‘;
html += ‘

‘ + (i + 1) + ‘. ‘ + (loc.central ? ‘★ ‘ : ”) + escapeHtml(loc.name) + ‘

‘;
if (loc.central) html += ‘

‘ + escapeHtml(labelCentral) + ‘

‘;
if (showAccess && loc.access_label) html += ‘

‘ + escapeHtml(loc.access_label) + ‘

‘;
if (loc.address) html += ‘

‘ + escapeHtml(loc.address) + ‘

‘;
if (loc.tagline) html += ‘

‘ + escapeHtml(loc.tagline) + ‘

‘;
if (loc.scene_note) html += ‘

‘ + escapeHtml(loc.scene_note) + ‘

‘;
if (loc.visit_tip) html += ‘

‘ + escapeHtml(labelTip) + ‘: ‘ + escapeHtml(loc.visit_tip) + ‘

‘;
html += ‘

‘ + escapeHtml(loc.lat + ‘, ‘ + loc.lng) + ‘

‘;
html += ‘

‘;
return html;
}).join(”);
var doc=”” + escapeHtml(printTitle) + ‘‘;
doc += ”;
doc += ‘body{font-family:-apple-system,BlinkMacSystemFont,”Segoe UI”,Roboto,Helvetica,Arial,sans-serif;color:#111;max-width:720px;margin:1.5rem auto;padding:0 1rem;}’;
doc += ‘h1{font-size:1.4rem;margin:0 0 .25rem;}’;
doc += ‘.sub{color:#555;margin:0 0 1.25rem;font-size:.95rem;}’;
doc += ‘.stop{display:flex;gap:.75rem;border-bottom:1px solid #ddd;padding:.85rem 0;break-inside:avoid;}’;
doc += ‘.tick{flex:0 0 18px;width:18px;height:18px;border:1.5px solid #333;margin-top:.2rem;}’;
doc += ‘.name{font-weight:700;margin:0 0 .2rem;font-size:1.05rem;}’;
doc += ‘p{margin:0 0 .2rem;font-size:.9rem;line-height:1.4;}’;
doc += ‘.meta{text-transform:uppercase;letter-spacing:.03em;font-size:.7rem;font-weight:700;color:#555;}’;
doc += ‘.tagline{font-style:italic;color:#444;}’;
doc += ‘.coords{color:#666;font-size:.8rem;}’;
doc += ‘@media print{body{margin:0;}}’;
doc += ”;
doc += ‘

‘ + escapeHtml(printTitle) + ‘

‘;
doc += ‘

‘ + escapeHtml(countTmpl.replace(‘%d’, String(locs.length))) + ‘

‘;
doc += rows + ”;
var win = window.open(”, ‘_blank’);
if (!win) {
window.print();
return;
}
win.document.open();
win.document.write(doc);
win.document.close();
win.focus();
setTimeout(function () {
win.print();
}, 250);
});
}

container.querySelectorAll(‘.won-fl-share’).forEach(function (btn) {
btn.addEventListener(‘click’, function (e) {
e.preventDefault();
e.stopPropagation();
var id = btn.getAttribute(‘data-stop-id’) || ”;
if (!id) return;
var url = window.location.href.split(‘#’)[0] + ‘#stop-‘ + id;
if (navigator.clipboard && navigator.clipboard.writeText) {
navigator.clipboard.writeText(url).then(function () {
btn.textContent = labelCopied;
setTimeout(function () { btn.textContent = labelShare; }, 1500);
});
}
});
});

function setSearch(raw) {
searchQuery = String(raw || ”).toLowerCase().replace(/\s+/g, ‘ ‘).trim();
searchTokens = searchQuery ? searchQuery.split(‘ ‘).filter(Boolean) : [];
if (searchClear) searchClear.hidden = searchQuery === ”;
}

if (searchInput) {
searchInput.addEventListener(‘input’, function () {
setSearch(searchInput.value);
clearTimeout(searchTimer);
searchTimer = setTimeout(function () { applyFilter(); }, 120);
});
searchInput.addEventListener(‘keydown’, function (e) {
if (e.key === ‘Escape’ && searchInput.value) {
e.preventDefault();
searchInput.value=””;
setSearch(”);
applyFilter();
}
});
}
if (searchClear) {
searchClear.addEventListener(‘click’, function () {
if (searchInput) searchInput.value=””;
setSearch(”);
applyFilter();
if (searchInput) searchInput.focus();
});
}

tagBtns.forEach(function (btn) {
btn.addEventListener(‘click’, function () {
var tag = btn.getAttribute(‘data-tag’) || ”;
if (tag === ”) {
selectedTags = [];
} else {
var pos = selectedTags.indexOf(tag);
if (pos === -1) selectedTags.push(tag);
else selectedTags.splice(pos, 1);
}
applyFilter();
});
});
countryBtns.forEach(function (btn) {
btn.addEventListener(‘click’, function () {
var code = btn.getAttribute(‘data-country’) || ”;
if (code === ”) {
selectedCountries = [];
} else {
var pos = selectedCountries.indexOf(code);
if (pos === -1) selectedCountries.push(code);
else selectedCountries.splice(pos, 1);
}
applyFilter();
});
});

window.addEventListener(‘hashchange’, applyHashStop);

setTimeout(function () {
map.invalidateSize();
skipHashWrite = true;
applyFilter();
skipHashWrite = false;
applyHashStop();
}, 100);
}

if (document.readyState === ‘loading’) {
document.addEventListener(‘DOMContentLoaded’, initFilmingLocations);
} else {
initFilmingLocations();
}
})();

Sources used for this article: Netflix TUDUM, Lively Charleston, Dubrovinik Tourist Guides, Collider, TimeOut

RELATED ARTICLES
- Advertisment -

Most Popular

Recent Comments