Compare commits
2 Commits
f73677139d
...
361a826e4f
| Author | SHA1 | Date | |
|---|---|---|---|
|
361a826e4f
|
|||
|
ff01d54fdd
|
@@ -36,6 +36,9 @@ We are building **Marco**, a decentralized maps application using **Ember.js** (
|
||||
- **Persistence:** Saves and restores map center and zoom level using `localStorage` (key: `marco:map-view`).
|
||||
- **Controls:** Enabled standard OpenLayers Rotate control (re-north) and custom Locate control.
|
||||
- **Pin Animation:** Selected pins are highlighted with a custom **Red Pin** overlay that drops in with an animation. The center dot is styled as a solid dark red circle (`#b31412`).
|
||||
- **Smart Zoom:** Implemented `zoomToBbox` to automatically fit complex geometries (ways/relations) within the visible viewport.
|
||||
- **Dynamic Padding:** Calculates padding based on active UI elements (Sidebar on Desktop, Bottom Sheet on Mobile) to ensure the geometry is perfectly centered in the _visible_ map area.
|
||||
- **Data Processing:** `OsmService` now calculates bounding boxes for ways and relations by aggregating member node coordinates.
|
||||
|
||||
### 2. RemoteStorage Module (`@remotestorage/module-places`)
|
||||
|
||||
@@ -103,6 +106,16 @@ We are building **Marco**, a decentralized maps application using **Ember.js** (
|
||||
- Responsive crosshair sizing (48px desktop / 24px mobile).
|
||||
- **Persistence:** Form data (Title, Description) and Map coordinates are securely saved to RemoteStorage via `storage.storePlace`.
|
||||
|
||||
### 6. Search Functionality
|
||||
|
||||
- **Provider:** Integrated **Photon API** (by Komoot) via `app/services/photon.js` for high-quality, typo-tolerant OpenStreetMap search.
|
||||
- **UI:** `SearchBoxComponent` implements a responsive search bar with instant autocomplete.
|
||||
- **Debounced Input:** 300ms delay to prevent excessive API calls.
|
||||
- **Location Bias:** Automatically biases search results towards the current map center to show relevant local places first.
|
||||
- **Direct Navigation:** Selecting a result with a valid OSM ID navigates directly to the specific place details (`/place/osm:type:id`).
|
||||
- **Resilience:** Implemented retry logic (exponential backoff/fixed delay) for network errors and rate limits (429).
|
||||
- **Data Normalization:** Search results are normalized to match the internal POI schema, ensuring consistent rendering across Search and Map views.
|
||||
|
||||
## Current State
|
||||
|
||||
- **Repo:** The app runs via `pnpm start`.
|
||||
|
||||
@@ -83,7 +83,7 @@ export default class PlaceDetails extends Component {
|
||||
}
|
||||
parts.push(city);
|
||||
}
|
||||
|
||||
|
||||
// State + Country (if not already covered)
|
||||
const state = get('addr:state', 'state');
|
||||
const country = get('addr:country', 'country');
|
||||
@@ -151,7 +151,7 @@ export default class PlaceDetails extends Component {
|
||||
if (!id) return null;
|
||||
return `https://www.google.com/maps/search/?api=1&query=${this.name}&query=${this.place.lat},${this.place.lon}`;
|
||||
}
|
||||
|
||||
|
||||
get showDescription() {
|
||||
// If it's a Photon result, the description IS the address.
|
||||
// Since we are showing the address in the meta section (bottom),
|
||||
|
||||
@@ -24,14 +24,31 @@ export default class OsmService extends Service {
|
||||
this.controller = new AbortController();
|
||||
const signal = this.controller.signal;
|
||||
|
||||
const typeKeys = [
|
||||
'amenity',
|
||||
'amenity',
|
||||
'shop',
|
||||
'tourism',
|
||||
'historic',
|
||||
'leisure',
|
||||
'office',
|
||||
'craft',
|
||||
'building',
|
||||
'landuse',
|
||||
'public_transport',
|
||||
'aeroway'
|
||||
]
|
||||
const typeKeysQuery = [`~"^(${typeKeys.join("|")})$"~".*"`];
|
||||
|
||||
const query = `
|
||||
[out:json][timeout:25];
|
||||
(
|
||||
nw["amenity"](around:${radius},${lat},${lon});
|
||||
nw["shop"](around:${radius},${lat},${lon});
|
||||
nw["tourism"](around:${radius},${lat},${lon});
|
||||
nw["leisure"](around:${radius},${lat},${lon});
|
||||
nw["historic"](around:${radius},${lat},${lon});
|
||||
node(around:${radius},${lat},${lon})
|
||||
[${typeKeysQuery}][name~"."];
|
||||
way(around:${radius},${lat},${lon})
|
||||
[${typeKeysQuery}][name~"."];
|
||||
relation(around:${radius},${lat},${lon})
|
||||
[${typeKeysQuery}][name~"."];
|
||||
);
|
||||
out center;
|
||||
`.trim();
|
||||
|
||||
Reference in New Issue
Block a user