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
Log in again to this web interface because i cant find an easy way to open GPX using Vespucci in Android.
Anyone editing OSM using Android? Please suggest better alternative than Vespucci.
Thank you.
Anyone editing OSM using Android? Please suggest better alternative than Vespucci.
Thank you.
Hello. I created this account for one reason: to plead with the creators to delete this software’s source code entirely. Its existence is an affront to humanity. If we erase every trace of it. pretend it was never even conceived.
Fairview is comprised of smaller former real estate ventures. When a new area was built it was given a name by its developers. I am slowly researching those development names and adding them to OSM as I go. My neighborhood, for example, was called Hill-N-Dale. Tonight I’m working on Hayward Heights, which still displays its sign where it branches off from East Avenue.
Neighborhoods
Fairview is comprised of smaller former real estate ventures. When a new area was built it was given a name by its developers. I am slowly researching those development names and adding them to OSM as I go.OpenStreetMap
Not a lot to say, other than “I’m glad to be starting!” I set up the following in my profile, which seemed as good a place to start as any:
GIS amateur in rural Maine, United States
Hi there! I’m Geo, and I’m thrilled to contribute to public GIS data & resources! I’ve been editing Wikipedia since 2005, but despite registering in 2008, I’ve only started editing OSM in late 2025!
I can bring local knowledge from my area of Maine - Waldo County - and possibly more.
Overview
GIS amateur in rural Maine, United States
Introduction
Hi there! I’m Geo, and I’m thrilled to contribute to public GIS data & resources! I’ve been editing Wikipedia since 2005, but despite registering in 2008, I’ve only started editing OSM in late 2025!
I can bring local knowledge from my area of Maine - Waldo County - and possibly more.
Just starting!
Not a lot to say, other than Im glad to be starting! I set up the following in my profile, which seemed as good a place to start as any:OpenStreetMap
Recently Ive made some logos for the Italian community (https://wiki.openstreetmap.org/wiki/Logos#in_Italy) and today I want to tell you how to I make this logos.
How I make logos for the community
Recently Ive made some logos for the Italian community (https://wiki.openstreetmap.org/wiki/Logos#in_Italy) and today I want to tell you how to I make this logos.OpenStreetMap
OpenStreetMap is a map of the world, created by people like you and free to use under an open license.
I’ve lived in this unincorporated neighborhood since 2004. Earlier this year, the U.S. Post Office with feedback from the Fairview Municipal Advisory Council (and surveys sent to residents) reverted our place name from “Unincorporated Hayward” to Fairview while leaving the zip code the same: 94541.
Twenty-one years of living here I’ve learned that you either know about this area and how it works or you’ve never heard of it. I was originally of the “never heard of it.” In 2010 I worked as a census enumerator sent to addresses that hadn’t mailed in their census packet. That’s when I really got to learn how Fairview works and how to use local data to better understand the area.
Now I am slowly working through my neighborhood in OSM to map it. I started with my house (my second residence here) and I’m working my way out. I am learning by doing (and reading the wiki).
Twenty-one years of living here I’ve learned that you either know about this area and how it works or you’ve never heard of it. I was originally of the “never heard of it.” In 2010 I worked as a census enumerator sent to addresses that hadn’t mailed in their census packet. That’s when I really got to learn how Fairview works and how to use local data to better understand the area.
Now I am slowly working through my neighborhood in OSM to map it. I started with my house (my second residence here) and I’m working my way out. I am learning by doing (and reading the wiki).
Hello from Fairview
Ive lived in this unincorporated neighborhood since 2004. Earlier this year, the U.S. Post Office with feedback from the Fairview Municipal Advisory Council (and surveys sent to residents) reverted our place name from Unincorporated Hayward to Fairvi…OpenStreetMap
My diary entries all all my own thoughts and do not represent OpenStreetMap, The Humanitarian OpenStreetMap Team (HOT) or any organisation using the HOT systems. Any errors are all my own work.
Haihole Dam is constructed across Kanee halla river near Haihole village about 12 Km from Shimoga city. Kane halla is a small tributary to Tunga River which originates in Shankaragudda hills and flows mostly in thick forest. This dam is located at longitude 75deg 28’ 45” E and Latitude 13deg 53’ 08” N in the limits of Haihole village in Shimoga taluk and district. This dam has been constructed during the period 1976-79 and is in operation since then The independent catchment area of the river at the dam site is 37.81 sqkm. The stream has its origin in a fairly heavy rainfall area with its entire catchment being in hilly and forest region and hence considered as Good for yield calculation. There are gauge stations situated near to the catchment area. However four influencing rain gauge station visa, (1) Malur (2) Aynur (3) Shimoga (4) Umblebylu have been considered for yield calculation. These polygons has been drawn on the basis of these four influencing rain gauge stations and the average rain falls have been calculated for these four rain gauge stations taking into consideration the rain fall of Ten years (1952 to 1963). The average rain fall works out to 98.55 cm with 70% dependability (year 1956) Considering the catchment area as Good for average annual rainfall of 98.55 cm the yield available at dam site is 13.52 cum (477.00 mcft.) apart from this perennially flowing two small streams across which the dam is constructed discharge about 0.11 to 0.14 Cumecs during the summer months due to the existence of some springs in the Shankaragudda hills also contribute to yield. There is good flow during the monsoon months and fair flow during November and December.
anyone in my area want to help me learn this. Having touble piping in my gps puck into OSM. I do SKYWARN and use my laptop and gps regulalry with other applications with no issues. I just want to learn osm.
Does anyone on here know the history of families in the area? Where they lived? May still live? I have tracked my Caskey ancestors to this area and am seeking info on them. My great great grandfather was from this place and moved to Yarmouth, Nova Scotia, Canada. His name was William Caskey. Cheers.
The osm.org website currently has two OSM-hosted map styles on it - the Standard style (raster tiles) and a Shortbread one. The schema for Shortbread is here, and the display style shown is Colorful from Versatiles. It looks like this:
osm