Hong Kong Campsite Directory
Creating a better campsite directory for Hong Kong
By Chi Kit Yeung in Python LLM Web Design AI
May 1, 2025
Updated: May 27, 2026

Introduction
Camping is a popular outdoor activity in Hong Kong. It is also well supported by the Agriculture, Fisheries, and Conservation Department (AFCD). A google search for campsites in Hong Kong would usually see their own directory ranked quite highly on the search results. Their site is quite informative with adequate information to get started on planning a camping trip. But frankly, it is outdated and can be much better.
I often find myself needing to look up more information to get the information I need for my trip. That’s where the idea for this project came.
Plan
I wanted to create a one-stop destination of hong kong campsite information source
Target Audience
Anyone who is looking for a campsite in Hong Kong
Website
From my research, there are a few ways to go about making a directory website. The easiest way is to use WordPress and a directory plugin like GeoDirectory. I’ve actually gone with this route for almost a year but found it to be clunky and too costly for a side project. The current site is built on the static site generator framework Eleventy and deployed via Netlify. The free tier is quite generous and should last me a good long while.
Data Enrichment
Campsites from AFCD Amenities from AFCD Reviews from Google Maps Weather from Hong Kong Observatory Review Summary, site copy using local LLM models
- Campsites from AFCD
- Amenities from AFCD
- Reviews from Google Maps
- Weather from Hong Kong Observatory
- Elevation from open-elevation.com’s API
- Review Summary, site copy using local LLM models
Elevation
# Get elevation data
if 'lat' in data.columns and 'long' in data.columns:
# Fetch elevation for each row
def fetch_elevation(row):
url = f"https://api.open-elevation.com/api/v1/lookup?locations={row['lat']},{row['long']}"
response = requests.get(url)
if response.status_code == 200:
return response.json()['results'][0]['elevation']
return None
data['elevation'] = data.apply(fetch_elevation, axis=1)
else:
print("Latitude and/or Longitude columns are missing in the dataset.")
data.head()
Review Summarization using Local LLMs
This is a snippet from my first iteration using the small llama3.2 3B model. I am planning to use a newer and larger (hopefully smarter) model to rewrite the summaries now that I have access to better hardware.
# Function to generate summary for a location's reviews
def summarize_reviews(reviews, location_name):
prompt = f"""
You are an expert summarizer. Below are reviews for a location named '{location_name}':
{reviews}
Provide a 3 sentence summary capturing the key insights from these reviews, focusing on common themes, strengths, or weaknesses.
Don't need to include things like 'Here's a 3 sentence summary capturing the key insights from these reviews:' or 'Here's a summary' in your response. Provide the summary directly.
Write the summary in a friendly and engaging tone, as if you are recommending this location to a friend. Extract general sentence summary based on what reviewers are saying. Don't mention names and don't plagiarize directly from the review. Use unique words and keep it casual. The goal is to give a neutral description of the campsite. Avoid using the word 'review' in the summary. Only include things that are mentioned in the reviews. Don't make up things that are not mentioned in the reivews.
Make sure to include the {location_name} in the first sentence of the summary.
"""
try:
response = ollama.generate(model='llama3.2:3b', prompt=prompt)
return response['response'].strip()
except Exception as e:
logging.error(f"Summary failed for {location_name}: {e}")
return "Summary unavailable due to processing error."
Features
- Search & Filters
- Campsite comparison tool
- Weather forecast
- Light Pollution Index
- Elevation
- Multilingual
- User reviews
- and more…
Cost Breakdown
Before
WordPress + GeoDirectories + WPML
| Name | Cost (USD) | Frequency |
|---|---|---|
| Domain | 39.99 | Annual |
| Web Hosting | 50 | Annual |
| WPML | 200 | Annual |
| GeoDirectories | 139 | Annual |
After
Static site generator using Eleventy framework deployed via Netlify (free tier).
| Name | Cost (USD) | Frequency |
|---|---|---|
| Domain | 39.99 | Annual |
| Netlify | Free | - |
| Eleventy | Free | - |
Other Costs
OutScraper
Google Maps data scraping service. I’ve used this for reviews and photo scraping.
Further Plans
- Research and scrape wild (unofficial) campsite locations
- Find a data source for signal strength
- more …
Please feel free to browse the site, share any feedback, dole out some criticism. Thanks!
- Posted on:
- May 1, 2025
- Length:
- 4 minute read, 669 words
- Categories:
- Python LLM Web Design AI
- See Also: