I was a bit too sleepy to post last night, but I got coffee and wandered by Long Dog Coffee and Treats, a delightful dachshund-themed café (with treats for both two-legged and four-legged friends) because that POI was not on the map. :)
So as I was mapping some rooftop solar, I noticed that some of the houses were all offset from the Bing image data by the same amount. I’m pretty sure there’s a way to resolve this without turning my GPS on and driving around a bunch, but where’s the fun in that? I also wanted to play around with Go Map!! and get comfortable with uploading traces in general, so I turned on Go Map!!’s GPS and drove around a bunch while listening to a podcast. Seeing the GPS data later on in JOSM was neat! It was also a reminder that GPS has a sampling frequency, and moving in a car, even at 25 miles per hour, spreads those samples out.
I’m guessing this is an imagery offset problem (I think that’s usually more likely to be incorrect), but I want to be sure so the solar panels are correct. I have to dig in some more. I know there are various ways to do it, but I’m entirely too sleepy to figure them out right now, which means it is officially a tomorrow thing. :)
Edit: I got a brief second wind. I learned that there is an imagery offset database, although neither of the two options available helped in this instance. I also noticed that both Bing and ESRI imagery comport, so the buildings are offset by the same amount compared to both images.
I checked the history of one of the buildings, and it was created in 2018 from Bing imagery. I then checked the buildings against ESRI Clarity, and they match much better. Now it’s officially a tomorrow thing. ;)
I’m guessing this is an imagery offset problem (I think that’s usually more likely to be incorrect), but I want to be sure so the solar panels are correct. I have to dig in some more. I know there are various ways to do it, but I’m entirely too sleepy to figure them out right now, which means it is officially a tomorrow thing. :)
Edit: I got a brief second wind. I learned that there is an imagery offset database, although neither of the two options available helped in this instance. I also noticed that both Bing and ESRI imagery comport, so the buildings are offset by the same amount compared to both images.
I checked the history of one of the buildings, and it was created in 2018 from Bing imagery. I then checked the buildings against ESRI Clarity, and they match much better. Now it’s officially a tomorrow thing. ;)
I started mapping my community last month. Looking at how the map is filling in, I think I’m about 1/4 to a 1/3 done with getting Fairview on the map. I’m focusing on homes, property boundaries, trees, pools and other out buildings.
Tonight I also worked on sidewalks and crossings.
Tonight I also worked on sidewalks and crossings.
Fairview: 1/4 done?
I started mapping my community last month. Looking at how the map is filling in, I think Im about 1/4 to a 1/3 done with getting Fairview on the map. Im focusing on homes, property boundaries, trees, pools and other out buildings.OpenStreetMap
Was a map user with Mapinfo for years at work, and added Google Earth Pro to that skill set. AllTrails uses OSM for their base map. Recommended by Carey Spies.
Enjoying the learning process so far. Have edited the course cart path at the Grizzly. And have added the path/driveway to Dale Spies’ house.
Enjoying the learning process so far. Have edited the course cart path at the Grizzly. And have added the path/driveway to Dale Spies’ house.
Starting Out
Was a map user with Mapinfo for years at work, and added Google Earth Pro to that skill set. AllTrails uses OSM for their base map. Recommended by Carey Spies.OpenStreetMap
Last weekend I gave a talk about OpenStreetMap and biking at the Madison Bike Advocacy Meetup. This is a monthly meeting of people interested in biking and local bike advocacy.
আজ আমি OpenStreetMap-এ নাগা বাজার ব্রিজের অবস্থান এবং নাম সংযোজন করেছি। নাগা বাজার ব্রিজ স্থানীয়ভাবে পরিচিত একটি গুরুত্বপূর্ণ সেতু, যা নাগা বাজার এবং আশেপাশের এলাকা সংযোগে ব্যবহৃত হয়। সেতুটি একটি প্রধান স্থানীয় রাস্তা পারাপারের জন্য ব্যবহৃত হয় এবং এলাকাবাসীর দৈনন্দিন জীবনে গুরুত্বপূর্ণ ভূমিকা রাখে।
আমি সঠিক অবস্থান নির্ধারণ করার জন্য স্থানীয় তথ্য ও GPS ব্যবহার করেছি। আশা করছি এই সংযোজন স্থানীয় মানচিত্রকে আরও তথ্যসমৃদ্ধ এবং ব্যবহারযোগ্য করবে।
আমি সঠিক অবস্থান নির্ধারণ করার জন্য স্থানীয় তথ্য ও GPS ব্যবহার করেছি। আশা করছি এই সংযোজন স্থানীয় মানচিত্রকে আরও তথ্যসমৃদ্ধ এবং ব্যবহারযোগ্য করবে।
নাগা বাজার ব্রিজের তথ্য সংযোজন
আজ আমি OpenStreetMap-এ নাগা বাজার ব্রিজের অবস্থান এবং নাম সংযোজন করেছি। নাগা বাজার ব্রিজ স্থানীয়ভাবে পরিচিত একটি গুরুত্বপূর্ণ সেতু, যা নাগা বাজার এবং আশেপাশের এলাকা সংযোগে ব্যবহৃত হয়। সেতুটি একটি প্রধান স্থানীয় রাস্তা পারাপারের জন্য ব্যবহৃত হয় এব…OpenStreetMap
Im finding it difficult to pick a particular mapping task to focus on, because even in my corner of Orange, there seems to be so much to do. For example, Ive noticed that the sidewalk ways sort of peter out a few blocks away from the Circle.
RETEX: Encounters Along My Mapping Walks
(translation by ChatGpt)
to be continued, maybe:
- journal entry (upcoming): Existential Questions About My Encounter with Panoramax
- journal entry (upcoming): Existential Questions About OSM and the Wikimedia World
- journal entry (upcoming): My First Experiences With an RTK Rover and an RTK Base
My urban recycling trek is now complete (at least regarding the attempt to map all voluntary drop-off points in the GPS&O intercommunality). I still need to clear up some fixme tags. This journal entry isn’t about mapping information but simply about a few encounters I had during my walks. They are just brief flashes of emotion, smiles, or frustration.
To understand the atmosphere of these encounters, picture me as:
- 70 years old, usually in shorts (except below 11°C)
- with a backpack (20L)
- always carrying at least one hiking pole in one hand and a camera in the other
- sometimes with a pole sticking out of my backpack holding a GNSS antenna at head height
The Best of the Best: Hunting for AEDs
in a micro-crèche
2025-09-08 in Médan I’m looking for a micro-daycare facility to verify the presence of an AED (Osmose suggestion). I wander a bit around the assumed location at the end of a residential cul-de-sac and eventually identify the daycare. I hesitate to enter the garden and ring the doorbell when an educator opens a ground-floor window, leans out, and asks whether I’m looking for something and if she can help (a polite way of saying “we’re watching, please move along”).
We exchange a couple of rather friendly minutes during which I silently give up on asking whether I may come in to photograph the AED (didn’t seem very wise). Instead, I hand her my phone and ask if she can photograph the AED on their wall (at least we both know she will avoid putting any children in the frame).
A brief hesitation, a few back-and-forths between me (standing outside the window) and her supervisor… and she brings my phone back, with two photos of the AED and a big smile.
I think I brightened her day — she’s probably still talking about it…
in my train station
2025-09-08 in Villennes-sur-Seine I’m strolling along the platforms of my town’s train station searching for an outdoor AED that supposedly exists there. I don’t find it (found it fifteen days later on the other side of the station), stop by the exit in front of an outdoor wall sign reading “AED,” and grumble in my nonexistent beard: “What’s the point of putting up an AED sign if the device isn’t visible and accessible nearby? Pffff…”
A small voice behind me, from a 12- or 13-year-old leaning on his scooter:
- sir, do you need a defibrillator?
- Oh no, I just wanted to photograph it, everything is fine, thanks!
- because if you need one, there’s one across the square, on the library wall, on the right
Bravo, and thank you (to the kid and to his educators, parents and/or teachers). I wouldn’t have bet a cent on this kind of reaction at that age, and I walked away with a breath of hope about young people’s attention to others.
in a hypermarket
survey 2025-10-02 Buchelay I’m looking for an indoor AED indicated by Osmose in a hypermarket gallery. Not finding it, I ask a security guard if he knows where it is, making sure to say that there’s no emergency. He knows. Without hesitation, he takes me to it, leaves me in front of it, and returns to his security job (I wouldn’t swear he didn’t keep a cautious eye on what I was doing with “his” AED).
I take photos and notice a blinking orange light (later confirmed at home to be a routine maintenance indicator due within two months). Unsure, I try to find the guard again, but he’s gone, so I alert one of his colleagues. Far less receptive. Polite nod. Promise of action…
I left only moderately confident that anything would be done.
in a church
survey 2025-09-30 Mantes-la-Ville Osmose indicates an indoor AED in a church. I’m not Catholic, and rather non-practicing in my own religion, but I decide to enter while respecting the customs and expectations of the place. No AED visibly apparent, and I assume it may be in the back areas inaccessible to regular visitors. I’m about to leave when a man in a chasuble comes out from those back rooms and sits on one of the sparsely filled benches. I gently ask whether I may photograph the AED supposedly in his church. Slightly surprised look, then: “of course, why not?” and he returns to his meditations.
I wait a bit, thinking he might guide me there, but he doesn’t move, and I eventually figure that I should just leave.
At the back of the church, as I prepare to exit, a worshipper seated on a bench who had clearly observed my little dance — without understanding it — smiles and invites me to sit on one of the many empty benches. I decline and explain my search. Big smile, he stands up and shows me the AED, perfectly visible right next to the entrance. I still don’t know — and probably neither the worshipper nor the man in the chasuble knows — how I managed not to see it.
Photos, big smiles, silent nods of respect, and I left with both photo and geolocation.
But What Are You Doing? — and Various Questions
about my photos of garbage containers
survey 2025-07-04 Carrières-sous-Poissy I’m photographing a household waste drop-off container. An older neighborhood resident carrying several bags approaches to dispose of her load. I step aside so she doesn’t think I’m photographing her, then realize she may have trouble pressing the foot pedal used to open the container. So I return and press it for her. She didn’t seem to expect it. She thanked me quite naturally, then started a small conversation to ask what I was doing (besides pressing pedals). Attempts at explanation. Her biggest confusion: “but who do you work for?”
I definitely need to work on explaining the purpose and value of collaborative work for free and shared knowledge…
about my GNSS antenna
survey RTK 2025-10-10 Villennes My first mapping session with an RTK rover (quick outing at my town’s sports complex). I cross paths with three sports instructors on break, puzzled by the pole and antenna sticking out of my backpack. It does look a bit Martian (or at least alien — Mars not necessarily involved).
Short chat about OSM, its purpose, its free and collaborative nature. Small detour into RTK and its usefulness (beyond OSM).
I’m not sure my explanations about OSM or RTK left any lasting impression… but I tried. I wonder whether it would be useful to keep a few simple OSM flyers in my pockets for this kind of impromptu street-corner conversation.
And… I just checked the Wiki and found Category:Flyer, where I should be able to find something helpful (haven’t done it yet). Never underestimate the Wiki :)
Knowing When to Stop
Can I help you?
survey 2025-09-30 Magnanville The situation: slightly bent, leaning on my hiking pole, looking down at my smartphone to choose my next point to check/create… but standing at the edge of a pedestrian crossing with a red light on a busy avenue where pedestrians are rare.
“Do you need help crossing?” (a woman my age, full of kindness, probably thinking my hiking pole was a white cane).
I declined with many thanks but promised myself not to stop right at the edge of pedestrian crossings anymore (also remembering there are always drivers who stop the instant they see someone near a crosswalk).
Knock Knock Knock
survey 2025-12-08 Villennes-sur-Seine Stopped on a very narrow, rarely used sidewalk at the end of a bridge over the highway, trying to reposition the GNSS antenna poking out of my backpack behind my neck. Soft taps on my backpack, without a word: a woman I was blocking who hadn’t dared call out (maybe the antenna was intimidating :) ).
and others…
Little Free Libraries
During my outings, I map the little free libraries I encounter. With photos on Panoramax (and sometimes on Wikimedia Commons).
I was pleasantly surprised (2025-10-03) to receive a thank-you message from someone who built a website dedicated to little free libraries sourced from OpenStreetMap (with proper credits). His site can be seen as a thematic rendering application for OSM data. He promotes the idea that OSM data is free, ideally long-lasting, and updated through field surveys.
Nice…
a driver–cleaning-agent altercation
survey 2025-09-11 Mantes I’m walking on the sidewalk, looking for my next container to map. On the opposite side of the street, a verbal altercation between an irritable driver and a street-cleaning worker. From what I can gather, the driver seemed annoyed by the worker’s presence and activity (safety vest, broom…).
There was no physical violence, but I’m not particularly brave. I simply stopped, planted firmly on my two hiking poles, and watched the scene, camera in hand.
The argument slowed down, a glance exchanged between the driver and me (or perhaps my camera)… and the grumbler sped off loudly.
A final glance between the cleaning worker and me, a small smile and nod of solidarity, and we each returned to our tasks.
Sometimes it doesn’t take much…
a street-artist
I also map street-art murals I pass by, especially because the intercommunality sponsors around forty of them, so they’re quite common. I photograph them and upload the photos to Panoramax. When I tried uploading them to Wikimedia Commons, I realized that the licenses don’t allow it under current French law (we’ll have to wait for the death of the — usually young — artists plus 70 years, by which time the murals (and I) will be gone. These constraints also apply to Panoramax, of course).
Out of curiosity, I emailed one of the mural artists about this issue. His reply (quoted verbatim):
Good evening, To be honest, I can’t really answer you. My position and my opinion are that once a mural is in the street, it spreads and has “its own life”. The only thing is to credit the artist and maybe date it (year of creation). That’s it. In any case, well done for your initiative. If you have a link, don’t hesitate. Have a good evening
This doesn’t change the impossibility of publishing the photos (unless one could certify/authenticate this response… which would likely be more trouble for the artist than painting the mural). There is progress to be made regarding public artworks…
These RETEX (feedback) journal entries reflect my beginner’s choices, hesitations, discoveries, and questions. These texts represent only my experience and are not Wiki entries. Some of these choices have been discussed on the France forum, but not all. I remain open to any comments and have no intention of giving recommendations here.
It was a lovely day outside today. I added some fire hydrants along East Almond, and also adjusted the crossing at Almond and Center, which I believe must’ve been edited based on out-of-date aerial imagery. The previous nodes and ways specified unmarked, uncontrolled intersections for all but one crossing, which matches the existing Bing imagery. I walk through this area all the time, though, and the city installed more stop signs and painted the remaining three crossings with yellow ladder crosswalks some months back. So, I’ve updated the map to reflect this.
Some of the hydrants along (or just off of) Almond were Clow hydrants, as I’ve seen before, but instead of a more recognizable model number, these all just read “5” underneath “Clow”. A quick search didn’t turn up any “Clow 5” hydrants, although it is, admittedly, hard to Google, and I was outside on my phone when I searched.
That being said, I did another quick search just now on my computer, and I found a PDF that mentions a “Clow #5” hydrant. Mystery solved! I tagged these as “model: 5” at the time, so there’s nothing to do!
Some of the hydrants along (or just off of) Almond were Clow hydrants, as I’ve seen before, but instead of a more recognizable model number, these all just read “5” underneath “Clow”. A quick search didn’t turn up any “Clow 5” hydrants, although it is, admittedly, hard to Google, and I was outside on my phone when I searched.
That being said, I did another quick search just now on my computer, and I found a PDF that mentions a “Clow #5” hydrant. Mystery solved! I tagged these as “model: 5” at the time, so there’s nothing to do!
Ways and Means
It was a lovely day outside today. I added some fire hydrants along East Almond, and also adjusted the crossing at Almond and Center, which I believe mustve been edited based on out-of-date aerial imagery.OpenStreetMap
Manguinhos Bay, Armação dos Búzios, Rio de Janeiro, Brazil, viewed in the overpass turbo, filtering tag barrier=gate (red). Mapa data © OpenStreetMap contributors, Nov. 15, 2025.
New development completed and occupied.
Consists of:
1 - 7 Norman Close, ST. ALBANS, AL1 2DW
1 - 5 King Offa Terrace, Wallingford Walk, ST. ALBANS, AL1 2EL
18A - 18B Abbots Avenue West, ST. ALBANS, AL1 2EJ
Consists of:
1 - 7 Norman Close, ST. ALBANS, AL1 2DW
1 - 5 King Offa Terrace, Wallingford Walk, ST. ALBANS, AL1 2EL
18A - 18B Abbots Avenue West, ST. ALBANS, AL1 2EJ
New properties to be added
New development completed and occupied. Consists of: 1 - 7 Norman Close, ST. ALBANS, AL1 2DW 1 - 5 King Offa Terrace, Wallingford Walk, ST. ALBANS, AL1 2EL 18A - 18B Abbots Avenue West, ST. ALBANS, AL1 2EJOpenStreetMap
While I mapped driveways years ago in my neighborhood, I didnt include access tags. I saw that later someone added access=private tags, and I thought nothing of it assuming it was the correct tag.
Not much to report today. I stopped by Play Coffee with a friend and added some POI tags while we were in line. There’s always something to map if you have a little downtime!
I also discovered that the building Cali Tacos is in has no POIs to speak of, so I’ll focus on adding those next, along with ever more fire hydrants. (I found some possibly interesting information about Van Deventer fire hydrants, but I’m not sure it’s enough to answer the question firehydrant.org posed about whether or not it was a company or just a licensed design.) In fact, the geometry on the map just shows one singular building, which is true, but there are individual units for each business. I think it makes sense to break them up, I just need to make sure I’m doing it correctly.
I also discovered that the building Cali Tacos is in has no POIs to speak of, so I’ll focus on adding those next, along with ever more fire hydrants. (I found some possibly interesting information about Van Deventer fire hydrants, but I’m not sure it’s enough to answer the question firehydrant.org posed about whether or not it was a company or just a licensed design.) In fact, the geometry on the map just shows one singular building, which is true, but there are individual units for each business. I think it makes sense to break them up, I just need to make sure I’m doing it correctly.
Chill Sunday
Not much to report today. I stopped by Play Coffee with a friend and added some POI tags while we were in line. Theres always something to map if you have a little downtime!OpenStreetMap
Using a phone running Android OS as a data collector for an RTK-enabled GNSS receiver, I ran into a fairly small but annoying inconvenience with getting data files from it on a Windows machine.
On Windows, you can’t mount a phone’s file system as an actual removable drive (don’t confuse that with seeing its file system in the File Explorer), so automating it with built-in command-line file tools isn’t an option. File paths to the data folders of Android apps are ridiculously long, so traversing them manually is another hassle.
However, it’s still possible to do that using the Android Debug Bridge tool, a part of the SDK Platform Tools.
After installing SDK Platform Tools, you should be able to use the
Knowing the full path to a folder where your data collector app (LocusGIS, SW Maps, etc.) stores files you need to download regularly, you can get a list of that folder’s contents by calling
Downloading a file is as easy as calling
For all that to work, you’d have to enable USB debugging on your mobile device and grant permission for the Windows machine to use it when you first attempt to utilize the
This information might look trivial to someone familiar with Android development and setup, but there are plenty of people who have no idea of what
On Windows, you can’t mount a phone’s file system as an actual removable drive (don’t confuse that with seeing its file system in the File Explorer), so automating it with built-in command-line file tools isn’t an option. File paths to the data folders of Android apps are ridiculously long, so traversing them manually is another hassle.
However, it’s still possible to do that using the Android Debug Bridge tool, a part of the SDK Platform Tools.
After installing SDK Platform Tools, you should be able to use the
adb command in PowerShell or classic Command Prompt batch files.Knowing the full path to a folder where your data collector app (LocusGIS, SW Maps, etc.) stores files you need to download regularly, you can get a list of that folder’s contents by calling
adb shell ls command with the full path to that folder as a parameter.Downloading a file is as easy as calling
adb pull with the full path to the file you want to download. This process can be made more or less interactive if you create a script that lists all the folder contents, then prompts you for a name, and then downloads the file by the name you entered. The target file name or path can also be specified as another parameter. It’s even easier if the data collector app uses the same filename every time, or if you save it under the same name.For all that to work, you’d have to enable USB debugging on your mobile device and grant permission for the Windows machine to use it when you first attempt to utilize the
adb. However, it would save you the hassle of switching on the File Transfer mode every time you want to access the phone’s file system.This information might look trivial to someone familiar with Android development and setup, but there are plenty of people who have no idea of what
adb is capable of.LUA - An Interesting Problem When Iterating with `for ... pairs` and the Lua Function `next`
Hello, guys. I am trying to map a neighborhood of León, in Spain.
I need a lot of help, as there are plenty of buildings not mapped or not mapped correctly, so any help would be much appreciated.
I need a lot of help, as there are plenty of buildings not mapped or not mapped correctly, so any help would be much appreciated.
It was another beautiful, sunny day in Orange. Im toying with the idea of conjuring up some sort of regular Saturday mapping activity, solely so I can use the word Mapurday, even though Ive mapped at least one thing every day for the last five days.
YIPPIEEEEEEEEEE! I’m already at 65 edits! This is the start of something very great and beautiful. Speaking of great and beautiful, I love my girlfriend so much!
Flickr is how I learned about Open Street Map. They use OSM data for their maps. Places that haven’t been worked on can only be found via coordinates. It’s frustrating.
Parma, Ohio, for example could use some love and attention.
Parma, Ohio, for example could use some love and attention.
Flickr
Flickr is how I learned about Open Street Map. They use OSM data for their maps. Places that havent been worked on can only be found via coordinates. Its frustrating.OpenStreetMap
About a week ago, vandals began defacing the map in South Korea. Over the course of that week, I rolled back hundreds of changes, and with the help of the sites moderators, I banned over 50 malicious accounts.
Sometimes some maps are more satisfying than others. What I did on Cho-do (초도) — Cho island — is definitely one of them!
I worked a little more on Crowder. It may be a small town compared to my home town but it takes a lot more concentration. I don’t know the area and there isn’t as much on line information meaning I have to be slow and deliberate with how I map. I want to do right by Crowder.
I worked on two city blocks.
I worked on two city blocks.
Crowder OK
I worked a little more on Crowder. It may be a small town compared to my home town but it takes a lot more concentration. I dont know the area and there isnt as much on line information meaning I have to be slow and deliberate with how I map.OpenStreetMap
The #30DayMapChallenge is a social media event where map enthusiasts create daily maps based on a set theme throughout November. You can find more details on the website 30daymapchallenge.com.
#30DayMapChallenge 2025
The #30DayMapChallenge is a social media event where map enthusiasts create daily maps based on a set theme throughout November. You can find more details on the website 30daymapchallenge.com.OpenStreetMap
- Map yerragattu area first
- followed by bheemaram
- move towards KU X Road
- move towards public garden
Its relatively common for various national and regional GNSS correction networks to be referenced in a CRS other than WGS84 used in OpenStreetMap.
I look after a map style thats designed to show rural pedestrian-focused information (hiking routes etc.).
As usual, I dont remember what site got me interested in the topic, but here we are anyways.
(function() {
const Node = Java.type("org.openstreetmap.josm.data.osm.Node");
const Way = Java.type("org.openstreetmap.josm.data.osm.Way");
const MainApplication = Java.type("org.openstreetmap.josm.gui.MainApplication");
const ProjectionRegistry = Java.type("org.openstreetmap.josm.data.projection.ProjectionRegistry");
const EastNorth = Java.type("org.openstreetmap.josm.data.coor.EastNorth");
const Logging = Java.type("org.openstreetmap.josm.tools.Logging");
// Parameters
const SNAP_DISTANCE_M = 1.5; // snapping tolerance
const MAX_SEARCH_DISTANCE = 200; // maximum distance to consider road segments
const ALLOWED_HIGHWAYS = ["residential", "unclassified", "tertiary"];
// Helpers for coordinate conversion
function enOf(node) { return ProjectionRegistry.getProjection().latlon2eastNorth(node.getCoor()); }
function llOf(en) { return ProjectionRegistry.getProjection().eastNorth2latlon(en); }
// Project a point onto a segment (returns a Node at projection)
function projectPointOnSegment(p, a, b) {
const ep = enOf(p), ea = enOf(a), eb = enOf(b);
const ax = ea.east(), ay = ea.north();
const bx = eb.east(), by = eb.north();
const px = ep.east(), py = ep.north();
const dx = bx - ax, dy = by - ay;
const t = Math.max(0, Math.min(1, ((px-ax)*dx + (py-ay)*dy) / (dx*dx + dy*dy)));
return new Node(llOf(new EastNorth(ax + t*dx, ay + t*dy)));
}
// Simple Euclidean distance in EastNorth space
function distanceEN(n1, n2) {
const e1 = enOf(n1), e2 = enOf(n2);
return Math.hypot(e1.east() - e2.east(), e1.north() - e2.north());
}
// Find nearest allowed road segment
function findNearestSegment(node, ds) {
let best = null, bestDist = Infinity, bestProj = null, bestRoad = null, bestIndex = -1;
ds.getWays().forEach(function(road) {
const hw = road.get("highway");
if (!ALLOWED_HIGHWAYS.includes(hw)) return;
const nodes = road.getNodes().toArray();
for (let i=0; i<nodes.length-1; i++) {
const a = nodes[i], b = nodes[i+1];
const proj = projectPointOnSegment(node, a, b);
const d = distanceEN(node, proj);
if (d > MAX_SEARCH_DISTANCE) continue;
if (d < bestDist) {
bestDist = d; bestProj = proj; bestRoad = road; bestIndex = i+1;
}
}
});
return bestRoad ? {road: bestRoad, projected: bestProj, dist: bestDist, insertIndex: bestIndex} : null;
}
// Snap or insert node
function snapOrInsert(road, projected, insertIndex, ds) {
const snapNode = road.getNodes().toArray().find(rn => distanceEN(rn, projected) <= SNAP_DISTANCE_M);
if (snapNode) return snapNode;
ds.addPrimitive(projected);
road.addNode(insertIndex, projected);
return projected;
}
// Create driveway way (reversed: start at road, end at endpoint)
function createDrivewayReversed(startNode, roadNode, ds) {
const w = new Way();
w.addNode(roadNode); // start at main road
w.addNode(startNode); // end at driveway endpoint
w.put("highway","service");
w.put("service","driveway");
w.put("access","private");
ds.addPrimitive(w);
}
// Main
const ds = MainApplication.getLayerManager().getEditDataSet();
if (ds == null) { Logging.info("No active dataset."); return; }
const selectedNodes = ds.getSelectedNodes();
if (selectedNodes.isEmpty()) { Logging.info("Select one or more driveway endpoints first."); return; }
selectedNodes.forEach(function(start) {
const nearest = findNearestSegment(start, ds);
if (!nearest) {
Logging.info("No nearby allowed road found for node " + start.getId());
return;
}
const junction = snapOrInsert(nearest.road, nearest.projected, nearest.insertIndex, ds);
createDrivewayReversed(start, junction, ds);
Logging.info("Driveway created (road�𨬓ndpoint) for node " + start.getId());
});
Logging.info("Driveway creation finished for all selected nodes.");
})();
const Node = Java.type("org.openstreetmap.josm.data.osm.Node");
const Way = Java.type("org.openstreetmap.josm.data.osm.Way");
const MainApplication = Java.type("org.openstreetmap.josm.gui.MainApplication");
const ProjectionRegistry = Java.type("org.openstreetmap.josm.data.projection.ProjectionRegistry");
const EastNorth = Java.type("org.openstreetmap.josm.data.coor.EastNorth");
const Logging = Java.type("org.openstreetmap.josm.tools.Logging");
// Parameters
const SNAP_DISTANCE_M = 1.5; // snapping tolerance
const MAX_SEARCH_DISTANCE = 200; // maximum distance to consider road segments
const ALLOWED_HIGHWAYS = ["residential", "unclassified", "tertiary"];
// Helpers for coordinate conversion
function enOf(node) { return ProjectionRegistry.getProjection().latlon2eastNorth(node.getCoor()); }
function llOf(en) { return ProjectionRegistry.getProjection().eastNorth2latlon(en); }
// Project a point onto a segment (returns a Node at projection)
function projectPointOnSegment(p, a, b) {
const ep = enOf(p), ea = enOf(a), eb = enOf(b);
const ax = ea.east(), ay = ea.north();
const bx = eb.east(), by = eb.north();
const px = ep.east(), py = ep.north();
const dx = bx - ax, dy = by - ay;
const t = Math.max(0, Math.min(1, ((px-ax)*dx + (py-ay)*dy) / (dx*dx + dy*dy)));
return new Node(llOf(new EastNorth(ax + t*dx, ay + t*dy)));
}
// Simple Euclidean distance in EastNorth space
function distanceEN(n1, n2) {
const e1 = enOf(n1), e2 = enOf(n2);
return Math.hypot(e1.east() - e2.east(), e1.north() - e2.north());
}
// Find nearest allowed road segment
function findNearestSegment(node, ds) {
let best = null, bestDist = Infinity, bestProj = null, bestRoad = null, bestIndex = -1;
ds.getWays().forEach(function(road) {
const hw = road.get("highway");
if (!ALLOWED_HIGHWAYS.includes(hw)) return;
const nodes = road.getNodes().toArray();
for (let i=0; i<nodes.length-1; i++) {
const a = nodes[i], b = nodes[i+1];
const proj = projectPointOnSegment(node, a, b);
const d = distanceEN(node, proj);
if (d > MAX_SEARCH_DISTANCE) continue;
if (d < bestDist) {
bestDist = d; bestProj = proj; bestRoad = road; bestIndex = i+1;
}
}
});
return bestRoad ? {road: bestRoad, projected: bestProj, dist: bestDist, insertIndex: bestIndex} : null;
}
// Snap or insert node
function snapOrInsert(road, projected, insertIndex, ds) {
const snapNode = road.getNodes().toArray().find(rn => distanceEN(rn, projected) <= SNAP_DISTANCE_M);
if (snapNode) return snapNode;
ds.addPrimitive(projected);
road.addNode(insertIndex, projected);
return projected;
}
// Create driveway way (reversed: start at road, end at endpoint)
function createDrivewayReversed(startNode, roadNode, ds) {
const w = new Way();
w.addNode(roadNode); // start at main road
w.addNode(startNode); // end at driveway endpoint
w.put("highway","service");
w.put("service","driveway");
w.put("access","private");
ds.addPrimitive(w);
}
// Main
const ds = MainApplication.getLayerManager().getEditDataSet();
if (ds == null) { Logging.info("No active dataset."); return; }
const selectedNodes = ds.getSelectedNodes();
if (selectedNodes.isEmpty()) { Logging.info("Select one or more driveway endpoints first."); return; }
selectedNodes.forEach(function(start) {
const nearest = findNearestSegment(start, ds);
if (!nearest) {
Logging.info("No nearby allowed road found for node " + start.getId());
return;
}
const junction = snapOrInsert(nearest.road, nearest.projected, nearest.insertIndex, ds);
createDrivewayReversed(start, junction, ds);
Logging.info("Driveway created (road�𨬓ndpoint) for node " + start.getId());
});
Logging.info("Driveway creation finished for all selected nodes.");
})();
Create driveway using endpoint and connected to nearest main road
OpenStreetMap is a map of the world, created by people like you and free to use under an open license.OpenStreetMap
// JOSM Scripting plugin (GraalJS, JavaScript API v3)
// Split a closed polygon (even number of unique nodes) into adjoining units,
// using two adjacent CORN=Determined nodes as one corner pair and the
// two nodes exactly opposite them (N/2 apart) as the other corner pair.
// Adjacent units share nodes (no new nodes created).
const Way = Java.type('org.openstreetmap.josm.data.osm.Way');
const MainApplication = Java.type('org.openstreetmap.josm.gui.MainApplication');
const ds = MainApplication.getLayerManager().getEditDataSet();
if (!ds) {
throw new Error('No editable data set found. Open an editable layer first.');
}
// Helpers
function getNodes(way) {
return way.getNodes(); // Java List<Node>
}
function sameNode(a, b) {
return a === b || (a.getUniqueId && b.getUniqueId && a.getUniqueId() === b.getUniqueId());
}
function mod(i, n) {
let r = i % n;
return r < 0 ? r + n : r;
}
// Inclusive forward range along ring indices
function rangeForward(start, endInclusive, n) {
const out = [];
let i = start;
while (true) {
out.push(mod(i, n));
if (mod(i, n) === mod(endInclusive, n)) break;
i++;
}
return out;
}
// Iterate selected ways
const selectedWays = ds.getSelectedWays();
const it = selectedWays.iterator();
while (it.hasNext()) {
const way = it.next();
// Ensure way is closed (duplicate the first node if necessary)
let nodesFull = getNodes(way);
let totalNodesFull = nodesFull.size();
if (totalNodesFull < 2) {
way.put('gen', 'fail'); continue;
}
const first = nodesFull.get(0);
const last = nodesFull.get(totalNodesFull - 1);
if (!sameNode(first, last)) {
way.addNode(first);
nodesFull = getNodes(way);
totalNodesFull = nodesFull.size();
}
// Work on unique ring nodes (exclude closing duplicate)
const N = totalNodesFull - 1;
if (N < 4 || N % 2 !== 0) { // must be even and at least 4
way.put('gen', 'fail'); continue;
}
const ringNodes = [];
for (let i = 0; i < N; i++) ringNodes.push(nodesFull.get(i));
// Find exactly two CORN=Determined nodes
const cornerIdxs = [];
for (let i = 0; i < N; i++) {
if (ringNodes[i].get('CORN') === 'Determined') cornerIdxs.push(i);
}
if (cornerIdxs.length !== 2) {
way.put('gen', 'fail'); continue;
}
// Normalize to adjacent order along ring (allow wrap-around)
let c0 = cornerIdxs[0], c1 = cornerIdxs[1];
const diffForward = mod(c1 - c0, N);
const diffBackward = mod(c0 - c1, N);
if (diffForward === 1) {
// already c1 is next after c0
} else if (diffBackward === 1) {
// swap so c1 is next after c0
const tmp = c0; c0 = c1; c1 = tmp;
} else {
// Not adjacent along ring �� required by your rule
way.put('gen', 'fail'); continue;
}
// Opposite corner pair: N/2 steps ahead
const o0 = mod(c0 + N / 2, N); // opposite of c0
const o1 = mod(c1 + N / 2, N); // opposite of c1
// Build sides:
// side1 goes from c0 -> o0 (inclusive)
// side2 goes from o1 -> c1 (inclusive), then reversed to mirror side1
const side1Idxs = rangeForward(c0, o0, N);
const side2IdxsFwd = rangeForward(o1, c1, N);
const side2Idxs = side2IdxsFwd.slice().reverse();
const side1 = side1Idxs.map(i => ringNodes[i]);
const side2 = side2Idxs.map(i => ringNodes[i]);
// Each side should have N/2 + 1 nodes; blocks = N/2
if (side1.length !== side2.length || side1.length !== (N / 2 + 1)) {
way.put('gen', 'fail'); continue;
}
const blocks = side1.length - 1;
// Create adjoining units with shared nodes
for (let i = 0; i < blocks; i++) {
const n1 = side1[i];
const n2 = side1[i + 1];
const n3 = side2[i + 1];
const n4 = side2[i];
const newWay = new Way();
newWay.addNode(n1);
newWay.addNode(n2);
newWay.addNode(n3);
newWay.addNode(n4);
newWay.addNode(n1); // close
newWay.put('amenity', 'parking_space'); // or newWay.put('building', 'terrace');
ds.addPrimitive(newWay);
}
way.put('gen', 'ok');
}
// Split a closed polygon (even number of unique nodes) into adjoining units,
// using two adjacent CORN=Determined nodes as one corner pair and the
// two nodes exactly opposite them (N/2 apart) as the other corner pair.
// Adjacent units share nodes (no new nodes created).
const Way = Java.type('org.openstreetmap.josm.data.osm.Way');
const MainApplication = Java.type('org.openstreetmap.josm.gui.MainApplication');
const ds = MainApplication.getLayerManager().getEditDataSet();
if (!ds) {
throw new Error('No editable data set found. Open an editable layer first.');
}
// Helpers
function getNodes(way) {
return way.getNodes(); // Java List<Node>
}
function sameNode(a, b) {
return a === b || (a.getUniqueId && b.getUniqueId && a.getUniqueId() === b.getUniqueId());
}
function mod(i, n) {
let r = i % n;
return r < 0 ? r + n : r;
}
// Inclusive forward range along ring indices
function rangeForward(start, endInclusive, n) {
const out = [];
let i = start;
while (true) {
out.push(mod(i, n));
if (mod(i, n) === mod(endInclusive, n)) break;
i++;
}
return out;
}
// Iterate selected ways
const selectedWays = ds.getSelectedWays();
const it = selectedWays.iterator();
while (it.hasNext()) {
const way = it.next();
// Ensure way is closed (duplicate the first node if necessary)
let nodesFull = getNodes(way);
let totalNodesFull = nodesFull.size();
if (totalNodesFull < 2) {
way.put('gen', 'fail'); continue;
}
const first = nodesFull.get(0);
const last = nodesFull.get(totalNodesFull - 1);
if (!sameNode(first, last)) {
way.addNode(first);
nodesFull = getNodes(way);
totalNodesFull = nodesFull.size();
}
// Work on unique ring nodes (exclude closing duplicate)
const N = totalNodesFull - 1;
if (N < 4 || N % 2 !== 0) { // must be even and at least 4
way.put('gen', 'fail'); continue;
}
const ringNodes = [];
for (let i = 0; i < N; i++) ringNodes.push(nodesFull.get(i));
// Find exactly two CORN=Determined nodes
const cornerIdxs = [];
for (let i = 0; i < N; i++) {
if (ringNodes[i].get('CORN') === 'Determined') cornerIdxs.push(i);
}
if (cornerIdxs.length !== 2) {
way.put('gen', 'fail'); continue;
}
// Normalize to adjacent order along ring (allow wrap-around)
let c0 = cornerIdxs[0], c1 = cornerIdxs[1];
const diffForward = mod(c1 - c0, N);
const diffBackward = mod(c0 - c1, N);
if (diffForward === 1) {
// already c1 is next after c0
} else if (diffBackward === 1) {
// swap so c1 is next after c0
const tmp = c0; c0 = c1; c1 = tmp;
} else {
// Not adjacent along ring �� required by your rule
way.put('gen', 'fail'); continue;
}
// Opposite corner pair: N/2 steps ahead
const o0 = mod(c0 + N / 2, N); // opposite of c0
const o1 = mod(c1 + N / 2, N); // opposite of c1
// Build sides:
// side1 goes from c0 -> o0 (inclusive)
// side2 goes from o1 -> c1 (inclusive), then reversed to mirror side1
const side1Idxs = rangeForward(c0, o0, N);
const side2IdxsFwd = rangeForward(o1, c1, N);
const side2Idxs = side2IdxsFwd.slice().reverse();
const side1 = side1Idxs.map(i => ringNodes[i]);
const side2 = side2Idxs.map(i => ringNodes[i]);
// Each side should have N/2 + 1 nodes; blocks = N/2
if (side1.length !== side2.length || side1.length !== (N / 2 + 1)) {
way.put('gen', 'fail'); continue;
}
const blocks = side1.length - 1;
// Create adjoining units with shared nodes
for (let i = 0; i < blocks; i++) {
const n1 = side1[i];
const n2 = side1[i + 1];
const n3 = side2[i + 1];
const n4 = side2[i];
const newWay = new Way();
newWay.addNode(n1);
newWay.addNode(n2);
newWay.addNode(n3);
newWay.addNode(n4);
newWay.addNode(n1); // close
newWay.put('amenity', 'parking_space'); // or newWay.put('building', 'terrace');
ds.addPrimitive(newWay);
}
way.put('gen', 'ok');
}
Split a closed polygon (even number of unique nodes) into adjoining units, using predefined CORN=Determined nodes at the corner
OpenStreetMap is a map of the world, created by people like you and free to use under an open license.OpenStreetMap
(function() {
const Node = Java.type("org.openstreetmap.josm.data.osm.Node");
const Way = Java.type("org.openstreetmap.josm.data.osm.Way");
const LatLon = Java.type("org.openstreetmap.josm.data.coor.LatLon");
const EastNorth = Java.type("org.openstreetmap.josm.data.coor.EastNorth");
const MainApplication = Java.type("org.openstreetmap.josm.gui.MainApplication");
const ProjectionRegistry = Java.type("org.openstreetmap.josm.data.projection.ProjectionRegistry");
const Logging = Java.type("org.openstreetmap.josm.tools.Logging");
function enOf(node) { return ProjectionRegistry.getProjection().latlon2eastNorth(node.getCoor()); }
function llOf(en) { return ProjectionRegistry.getProjection().eastNorth2latlon(en); }
function sub(a, b) { return new EastNorth(a.east() - b.east(), a.north() - b.north()); }
function add(a, b) { return new EastNorth(a.east() + b.east(), a.north() + b.north()); }
function scale(v, s) { return new EastNorth(v.east() * s, v.north() * s); }
function length(v) { return Math.hypot(v.east(), v.north()); }
function normalize(v) { const L = length(v); return scale(v, 1.0 / L); }
const ds = MainApplication.getLayerManager().getEditDataSet();
if (ds == null) { Logging.info("No active dataset."); return; }
ds.getSelectedWays().forEach(function(way) {
const ccTag = way.get("CC");
if (ccTag == null) return;
let nUnits = parseInt(ccTag, 10);
if (!Number.isFinite(nUnits) || nUnits <= 0) return;
if (!way.isClosed() || way.getNodes().size() !== 5) return;
const nodes = way.getNodes().toArray();
const p0 = nodes[0], p1 = nodes[1], p3 = nodes[3];
const e0 = enOf(p0), e1 = enOf(p1), e3 = enOf(p3);
const v1 = sub(e1, e0);
const v2 = sub(e3, e0);
const L1 = length(v1), L2 = length(v2);
const longV = (L1 >= L2) ? v1 : v2;
const shortV = (L1 >= L2) ? v2 : v1;
const Llong = Math.max(L1, L2), Lshort = Math.min(L1, L2);
const uLong = normalize(longV), uShort = normalize(shortV);
const step = Llong / nUnits;
// Build grid of nodes
const bottomNodes = [], topNodes = [];
for (let i = 0; i <= nUnits; i++) {
const base = add(e0, scale(uLong, i * step));
const bottomEN = base;
const topEN = add(base, scale(uShort, Lshort));
const nBottom = new Node(llOf(bottomEN));
const nTop = new Node(llOf(topEN));
ds.addPrimitive(nBottom);
ds.addPrimitive(nTop);
bottomNodes.push(nBottom);
topNodes.push(nTop);
}
// Build ways using shared nodes
for (let i = 0; i < nUnits; i++) {
const newWay = new Way();
newWay.addNode(bottomNodes[i]);
newWay.addNode(bottomNodes[i+1]);
newWay.addNode(topNodes[i+1]);
newWay.addNode(topNodes[i]);
newWay.addNode(bottomNodes[i]); // close
newWay.put("amenity", "parking_space");
ds.addPrimitive(newWay);
}
Logging.info("Created " + nUnits + " parking_space blocks with shared nodes for way " + way.getId());
});
})();
const Node = Java.type("org.openstreetmap.josm.data.osm.Node");
const Way = Java.type("org.openstreetmap.josm.data.osm.Way");
const LatLon = Java.type("org.openstreetmap.josm.data.coor.LatLon");
const EastNorth = Java.type("org.openstreetmap.josm.data.coor.EastNorth");
const MainApplication = Java.type("org.openstreetmap.josm.gui.MainApplication");
const ProjectionRegistry = Java.type("org.openstreetmap.josm.data.projection.ProjectionRegistry");
const Logging = Java.type("org.openstreetmap.josm.tools.Logging");
function enOf(node) { return ProjectionRegistry.getProjection().latlon2eastNorth(node.getCoor()); }
function llOf(en) { return ProjectionRegistry.getProjection().eastNorth2latlon(en); }
function sub(a, b) { return new EastNorth(a.east() - b.east(), a.north() - b.north()); }
function add(a, b) { return new EastNorth(a.east() + b.east(), a.north() + b.north()); }
function scale(v, s) { return new EastNorth(v.east() * s, v.north() * s); }
function length(v) { return Math.hypot(v.east(), v.north()); }
function normalize(v) { const L = length(v); return scale(v, 1.0 / L); }
const ds = MainApplication.getLayerManager().getEditDataSet();
if (ds == null) { Logging.info("No active dataset."); return; }
ds.getSelectedWays().forEach(function(way) {
const ccTag = way.get("CC");
if (ccTag == null) return;
let nUnits = parseInt(ccTag, 10);
if (!Number.isFinite(nUnits) || nUnits <= 0) return;
if (!way.isClosed() || way.getNodes().size() !== 5) return;
const nodes = way.getNodes().toArray();
const p0 = nodes[0], p1 = nodes[1], p3 = nodes[3];
const e0 = enOf(p0), e1 = enOf(p1), e3 = enOf(p3);
const v1 = sub(e1, e0);
const v2 = sub(e3, e0);
const L1 = length(v1), L2 = length(v2);
const longV = (L1 >= L2) ? v1 : v2;
const shortV = (L1 >= L2) ? v2 : v1;
const Llong = Math.max(L1, L2), Lshort = Math.min(L1, L2);
const uLong = normalize(longV), uShort = normalize(shortV);
const step = Llong / nUnits;
// Build grid of nodes
const bottomNodes = [], topNodes = [];
for (let i = 0; i <= nUnits; i++) {
const base = add(e0, scale(uLong, i * step));
const bottomEN = base;
const topEN = add(base, scale(uShort, Lshort));
const nBottom = new Node(llOf(bottomEN));
const nTop = new Node(llOf(topEN));
ds.addPrimitive(nBottom);
ds.addPrimitive(nTop);
bottomNodes.push(nBottom);
topNodes.push(nTop);
}
// Build ways using shared nodes
for (let i = 0; i < nUnits; i++) {
const newWay = new Way();
newWay.addNode(bottomNodes[i]);
newWay.addNode(bottomNodes[i+1]);
newWay.addNode(topNodes[i+1]);
newWay.addNode(topNodes[i]);
newWay.addNode(bottomNodes[i]); // close
newWay.put("amenity", "parking_space");
ds.addPrimitive(newWay);
}
Logging.info("Created " + nUnits + " parking_space blocks with shared nodes for way " + way.getId());
});
})();
Batchly spilting parking spaces or terraced houses at evenly size using JOSM scripting plugin, GraalJS script at JDK 21
OpenStreetMap is a map of the world, created by people like you and free to use under an open license.OpenStreetMap
বিষয়বস্তু (Content): আজ আমি OpenStreetMap-এ Naga Bazar – Bhobanigonj Road এলাকার একটি গুরুত্বপূর্ণ তথ্য হালনাগাদ করেছি। সড়কের নির্দিষ্ট অবস্থান অনুযায়ী এর অক্ষাংশ (Latitude) 24.5685592 এবং দ্রাঘিমাংশ (Longitude) 88.9447541 যুক্ত করা হয়েছে।
এই रাস্তাটি স্থানীয় যাতায়াত, বাজারযাত্রা ও আশপাশের গ্রামের সংযোগের জন্য অত্যন্ত গুরুত্বপূর্ণ। বিশেষ করে Naga Bazar থেকে Bhobanigonj যাওয়ার পথে সড়কটি মানুষকে সরাসরি বাজার, স্কুল এবং স্বাস্থ্যকেন্দ্রে পৌঁছাতে সহায়তা করে।
এই হালনাগাদ তথ্য ভবিষ্যতে ম্যাপ ব্যবহারকারী, গবেষক, পথচারী এবং স্থানীয় ভ্রমণকারীদের আরও সঠিক পথ নির্দেশনায় সাহায্য করবে। সামনের দিনে আরও নতুন জিপিএস পয়েন্ট এবং আশেপাশের স্থাপনাগুলো ম্যাপিং করার পরিকল্পনা রয়েছে।
ধন্যবাদ।
এই रাস্তাটি স্থানীয় যাতায়াত, বাজারযাত্রা ও আশপাশের গ্রামের সংযোগের জন্য অত্যন্ত গুরুত্বপূর্ণ। বিশেষ করে Naga Bazar থেকে Bhobanigonj যাওয়ার পথে সড়কটি মানুষকে সরাসরি বাজার, স্কুল এবং স্বাস্থ্যকেন্দ্রে পৌঁছাতে সহায়তা করে।
এই হালনাগাদ তথ্য ভবিষ্যতে ম্যাপ ব্যবহারকারী, গবেষক, পথচারী এবং স্থানীয় ভ্রমণকারীদের আরও সঠিক পথ নির্দেশনায় সাহায্য করবে। সামনের দিনে আরও নতুন জিপিএস পয়েন্ট এবং আশেপাশের স্থাপনাগুলো ম্যাপিং করার পরিকল্পনা রয়েছে।
ধন্যবাদ।
Naga Bazar–Bhobanigonj সড়কের উচ্চতা ও অবস্থান হালনাগাদ
বিষয়বস্তু (Content): আজ আমি OpenStreetMap-এ Naga Bazar – Bhobanigonj Road এলাকার একটি গুরুত্বপূর্ণ তথ্য হালনাগাদ করেছি। সড়কের নির্দিষ্ট অবস্থান অনুযায়ী এর অক্ষাংশ (Latitude) 24.5685592 এবং দ্রাঘিমাংশ (Longitude) 88.9447541 যুক্ত করা হয়েছে।OpenStreetMap
ভূমিকা: আজ আমি রাজশাহীর বাগমারা উপজেলার নাগা বাজার এলাকায় মাঠপর্যায়ে তথ্য সংগ্রহ করে OpenStreetMap-এ নতুন তথ্য যোগ করেছি। সেই অভিজ্ঞতা এবং তথ্যগুলো এখানে লিখছি। বিস্তারিত বর্ণনা: আজ আমি রাজশাহী জেলার বাগমারা উপজেলার ঐতিহ্যবাহী নাগা বাজার এলাকায় মাঠপর্যায়ে ঘুরে OpenStreetMap-এর জন্য বেশ কিছু নতুন তথ্য আপডেট করেছি। স্থানীয় মানুষের সাথে কথা বলে এবং নিজস্ব সার্ভের মাধ্যমে বাজারের চারপাশের রাস্তা, দোকান, শিক্ষা প্রতিষ্ঠান, ধর্মীয় স্থাপনা ও জনবসতির বিস্তারিত সংগ্রহ করেছি।
নাগা বাজারটি জোগীপাড়া ইউনিয়নের একটি গুরুত্বপূর্ণ ব্যবসায়িক কেন্দ্র। প্রতিদিন আশেপাশের গ্রামগুলো—বিশেষ করে কাতিলা, নখোপাড়া,ভাগনদি,কোলা,শান্তিপুর,বীরকুৎসা,বনগ্রাম,মাধাইমুড়ি থেকে মানুষ এখানে বাণিজ্যিক কাজে আসেন। বাজারটিতে মুদি দোকান, ইলেকট্রনিক্স দোকান, ফলের দোকান, কাঁচাবাজার, চায়ের দোকানসহ বিভিন্ন ধরনের ব্যবসাপ্রতিষ্ঠান রয়েছে।
আজকের ম্যাপিং-এ আমি নিচের পরিবর্তনগুলো করেছি:
নাগা বাজার এলাকার প্রধান ও উপ-সড়কগুলো রাস্তার ক্যাটাগরি অনুযায়ী পুনঃট্যাগ করেছি
কাতিলা সরকারি প্রাথমিক বিদ্যালয় ও কাতিলা হাই স্কুলের নির্ভুল অবস্থান সংশোধন করেছি
কাতিলা বিলের সঠিক আকৃতি ও জলের এলাকা আপডেট করেছি
২টি মসজিদ, ১টি কলেজ এবং ইউনিয়ন পরিষদের অবস্থান পুনর্নির্ধারণ করেছি
বাজার এলাকার দোকানগুলোকে আলাদা আলাদা shop ট্যাগ দিয়ে যুক্ত করেছি
কয়েকটি নতুন বাড়িঘর ও জনবসতির এলাকা যোগ করেছি
আমি মনে করি, এই আপডেটগুলো স্থানীয় পরিবহন, শিক্ষা, জরুরি সেবা এবং যাতায়াতকারী মানুষের জন্য যথেষ্ট উপকারী হবে।
আগামী সপ্তাহে আমি নাগা বাজারের পশ্চিমদিকে অবস্থিত কাতিলা গ্রাম এবং ইউনিয়ন পরিষদ এলাকায় আরও বিস্তারিত সার্ভে করতে চাই। কোনো ম্যাপার যদি এই এলাকায় কাজ করে থাকেন, অথবা স্থানীয় কেউ যদি বাজারের পুরোনো ইতিহাস, জনসংখ্যা বা গুরুত্বপূর্ণ স্থাপনা সম্পর্কে অতিরিক্ত তথ্য জানেন—তাহলে মন্তব্যে জানালে খুব উপকৃত হবো।
ধন্যবাদ, — Md Abdul Alim
নাগা বাজারটি জোগীপাড়া ইউনিয়নের একটি গুরুত্বপূর্ণ ব্যবসায়িক কেন্দ্র। প্রতিদিন আশেপাশের গ্রামগুলো—বিশেষ করে কাতিলা, নখোপাড়া,ভাগনদি,কোলা,শান্তিপুর,বীরকুৎসা,বনগ্রাম,মাধাইমুড়ি থেকে মানুষ এখানে বাণিজ্যিক কাজে আসেন। বাজারটিতে মুদি দোকান, ইলেকট্রনিক্স দোকান, ফলের দোকান, কাঁচাবাজার, চায়ের দোকানসহ বিভিন্ন ধরনের ব্যবসাপ্রতিষ্ঠান রয়েছে।
আজকের ম্যাপিং-এ আমি নিচের পরিবর্তনগুলো করেছি:
নাগা বাজার এলাকার প্রধান ও উপ-সড়কগুলো রাস্তার ক্যাটাগরি অনুযায়ী পুনঃট্যাগ করেছি
কাতিলা সরকারি প্রাথমিক বিদ্যালয় ও কাতিলা হাই স্কুলের নির্ভুল অবস্থান সংশোধন করেছি
কাতিলা বিলের সঠিক আকৃতি ও জলের এলাকা আপডেট করেছি
২টি মসজিদ, ১টি কলেজ এবং ইউনিয়ন পরিষদের অবস্থান পুনর্নির্ধারণ করেছি
বাজার এলাকার দোকানগুলোকে আলাদা আলাদা shop ট্যাগ দিয়ে যুক্ত করেছি
কয়েকটি নতুন বাড়িঘর ও জনবসতির এলাকা যোগ করেছি
আমি মনে করি, এই আপডেটগুলো স্থানীয় পরিবহন, শিক্ষা, জরুরি সেবা এবং যাতায়াতকারী মানুষের জন্য যথেষ্ট উপকারী হবে।
আগামী সপ্তাহে আমি নাগা বাজারের পশ্চিমদিকে অবস্থিত কাতিলা গ্রাম এবং ইউনিয়ন পরিষদ এলাকায় আরও বিস্তারিত সার্ভে করতে চাই। কোনো ম্যাপার যদি এই এলাকায় কাজ করে থাকেন, অথবা স্থানীয় কেউ যদি বাজারের পুরোনো ইতিহাস, জনসংখ্যা বা গুরুত্বপূর্ণ স্থাপনা সম্পর্কে অতিরিক্ত তথ্য জানেন—তাহলে মন্তব্যে জানালে খুব উপকৃত হবো।
ধন্যবাদ, — Md Abdul Alim
নাগা বাজারের নতুন ম্যাপিং: আমার তথ্যসংগ্রহ
ভূমিকা: আজ আমি রাজশাহীর বাগমারা উপজেলার নাগা বাজার এলাকায় মাঠপর্যায়ে তথ্য সংগ্রহ করে OpenStreetMap-এ নতুন তথ্য যোগ করেছি। সেই অভিজ্ঞতা এবং তথ্যগুলো এখানে লিখছি। বিস্তারিত বর্ণনা: আজ আমি রাজশাহী জেলার বাগমারা উপজেলার ঐতিহ্যবাহী নাগা বাজার এলাকায় মাঠপর…OpenStreetMap