Last weekend I traveled to the west coast of Java, specifically Anyer in Banten. The journey was done by train from Jakarta to Cilegon, followed by a local shared minivan taxi to Anyer.
Throughout the trip, I collected field observations using Sakumap. The result was a raw GeoJSON file containing coordinates and timestamps for each entry.

For observations I considered significant, I wrote a detailed report on the OSM Wiki. Less critical features such as restaurants, fuel stations, farms, and forest areas were added directly to OpenStreetMap by importing the Sakumap GeoJSON into iD Editor or JOSM, without additional documentation on the wiki, as the overhead did not seem justified.
Using GeoJSON as a reference layer in JOSM turns out to be somewhat error-prone. Before uploading changes to OSM, the GeoJSON layer must be explicitly disabled. If it remains active during upload, JOSM issues a strong warning that the raw GeoJSON data itself is about to be pushed to the OSM database. As a result, the workflow becomes repetitive: enable the GeoJSON layer to inspect nodes, disable it, switch to the OSM data layer, create objects, upload, and then repeat the cycle.
Importing GeoJSON into iD Editor has a different set of problems. The reference layer is rendered as a transparent pink overlay, which has low contrast against existing OSM data and satellite imagery. This makes it difficult to visually align features. In contrast, JOSM allows hiding all layers except the GeoJSON layer, making it much easier to quickly locate and interpret collected points.
This is the main reason I still use both editors. Certain tasks are clearly more efficient in JOSM, while others are more convenient in iD. For mapping large areas such as forests, farmland, or buildings, JOSM is significantly more productive. This is especially true with additional plugins, such as the building tools I installed after participating in a mapping campaign a few months ago.
On the other hand, for adding simple points of interest like restaurants, banks, ATMs, or shops, iD Editor feels faster and more ergonomic. Its integration with the Name Suggestion Index makes it trivial to add branch locations of well-known national or global brands, something that is noticeably more cumbersome in JOSM. iD also excels at certain topology-related tasks. For example, in the iD editor, adding a river that crosses a railroad is very easy. You just draw a line, and a very friendly prompt appears: “Would you like to add a bridge here?” Well, yes please. Thank you very much.
I also experimented with direct field mapping using SCEE, which I tried after seeing it recommended in a blog post. From my understanding, it targets more advanced OSM contributors than StreetComplete and supports features such as raw tag editing. In practice, however, I still struggled to use it effectively in the field. I could not figure out how to add a new node with custom tags without relying on predefined presets, and I was unable to find presets matching my needs. I also could not determine how to create line or polygon features.
That said, its UX is really fun. It’s satisfying to be able to add increasingly detailed information about your surroundings, based on your own observations, to the OSM database very quickly. However, I think there is a learning curve to actually mastering StreetComplete or SCEE. I also wish I could create my own custom quests. I think I have several quest ideas that could make this experience more fun (Where can I submit new quest suggestions?)
But in the end, I reverted to my previous workflow centered around Sakumap. Instead of mapping everything live in the field, I collect rough notes during the trip, export them as GeoJSON afterward, and perform the actual OSM edits later using iD or JOSM. For now, this post-trip workflow is more reliable for me than the real-time StreetComplete or SCEE approach.
Sakumap itself is not without shortcomings. One major issue is directionality. Using it effectively requires doing non-trivial directional reasoning mentally before placing notes. This is because several reference frames are involved simultaneously. There is the direction my head is facing, the direction of the vehicle I am in, and the direction of the map itself. Sakumap uses a raster-based OpenStreetMap Carto basemap that is fixed to north-up and does not rotate.
As a result, situations become surprisingly complex. I might be facing east while the vehicle is moving west, yet the map always presents north at the top. When I see a mountain directly in front of me, it is not immediately obvious whether the corresponding note should be placed above, below, left, or right of the GPS marker on the screen.
In hindsight, bringing a physical compass would have helped significantly, especially for identifying hills and mountains in the field. Unfortunately, I did not have one, and my phone lacks the sensors required for a reliable compass app. That leaves less practical options, such as inferring direction from the sun’s position, or maybe learning to navigate by the stars. Alternatively, I simply need to become faster at doing these vector transformations mentally.
Finally, during the trip I noticed a discrepancy between a mass-imported dataset, my own field observations, and other documented local reports. I wrote a detailed account of this issue on the OSM Wiki. I have not performed any reversion yet, as I believe additional data is needed before making a confident correction.
I actually prepared two articles about this trip. The first is for OSM mappers, focusing on the technical aspects of field mapping (which you’ve just finished reading). The second is for a general audience. Here is the second part :
The west coast of Java was the first place my extended family stopped when they migrated from West Sumatra. Even today, many members of my family still live in Cilegon, Anyer, and the surrounding areas. Because of that, I have regularly mudik to Cilegon–Anyer over the years.
And from the beginning, the trip has almost always been by bus—Primajasa or Arimbi on the Bekasi–Merak route—followed by the Silver-colored “angkot” share taxi from Cilegon to Anyer.

On April 1, 2025, I did a Lebaran mudik to Anyer. Riding a motorcycle along the coastline, then climbing up into the Mancak hills, before descending again.
However, a few months ago, when I was about to return from Cilegon to Bekasi, I accidentally “discovered” Cilegon Station, which is located somewhat hidden away from the city’s main road.

Cilegon Station is somewhat hidden, located inside a narrow side street rather than directly along Jalan Raya Cilegon. The orange line indicates the railway track.
At that time, I was curious to try going home by train for the first time. It turned out that taking the train from there is not as straightforward as using the Commuter Line in Jakarta and its surroundings, where you simply tap in and go. First, you have to buy a ticket in advance, and it is probably better to do so well ahead of time. Second, the service frequency is much lower than the Commuter Line, so you really need to understand the timetable beforehand.
In the end, I went home by bus as usual.
A few days ago, I finally had the chance to properly plan the trip by train.
The journey would start from the westernmost terminus of the Commuter Line: Rangkasbitung Station. From Bekasi to Rangkas, I didn’t need to book a ticket in advance. I could simply tap in with my e-money card at Bekasi Station, take the Blue Line to Tanah Abang, get off, then continue on the Green Line to Rangkas. From Rangkas to Cilegon, however, I would need to take a local train. That part required buying a ticket ahead of time and checking the schedule.
So I downloaded the KAI Access app, registered an account, selected the “Local Train” menu, searched for Rangkasbitung–Cilegon, and entered the departure date. When should I go? Why not tomorrow? I searched.
No luck. Tickets for the next day were already sold out.
The entire plan had to be postponed to December 28, 2025. On that date, tickets were still available.
The next problem was choosing a departure time. Which one made the most sense? There was a train around half past seven in the morning, and another at ten. Leaving earlier would mean arriving earlier, but could I realistically reach Rangkas before half past seven? The earliest I could leave Bekasi was after dawn. If I departed after Subuh, would I arrive in Rangkas before 7:30 a.m.?
I ran a “simulation” in Google Maps. From Bekasi to Rangkas, using trains, with an arrival time before 7:30 a.m. When should I depart? Google Maps already had all the relevant data: Blue Line schedules, Green Line schedules, average travel time from Bekasi to Tanah Abang, and from Tanah Abang to Rangkas. By combining all of that, it could estimate the optimal departure time.
The result was unexpected. Google Maps suggested that I should start traveling on the night of December 27, 2025. Overnight at the station? No thanks.
So I abandoned the 7:30 a.m. option and bought a ticket for the 10 a.m. train instead. It was cheap, only IDR 3,000.
While I was at it, I also bought the return ticket. There were several options as well: around five in the afternoon, or half past seven in the evening. To give myself more flexibility, I chose the one at half past seven.
The outbound and return tickets were already purchased. Then I realized there was a small mistake.
Since my actual destination was Anyer, I shouldn’t have planned to get off at Cilegon Station. I should have chosen Krenceng Station instead, as it is closer to Anyer.

It’s more convenient to get off at Krenceng if you’re heading to Anyer.
Realizing this, I immediately rushed to open the KAI Access app. I looked for a “change destination station” feature, just in case it existed. It turned out there wasn’t one. Uh oh.
That left another alternative. What would happen if I simply decided to get off at Krenceng Station anyway? What if I held an e-ticket for Rangkasbitung–Cilegon, but got off at Krenceng instead of Cilegon? The biggest risk was obvious: I might not be able to tap out at Krenceng Station.
Hmm.
The risk felt too high. Better to forget the idea and just get off at Cilegon Station, following the proper rules.
One day before departure.
This would be my first time riding a local train. I didn’t actually know what the entry procedure at Rangkasbitung Station would be like. Because of that, that evening I did some “image training” by watching YouTube tutorial videos on how to take the Rangkas–Cilegon local train.
In the video, it was explained that there is a “special lane” for local train passengers, separate from the lane for Green Line passengers heading toward Jakarta. To enter this lane, passengers have to scan a barcode with a staff member. In the video, a staff member was shown using a handheld barcode scanner, similar to the ones commonly used in convenience stores, to scan the passenger’s phone screen. Hmm.
In my KAI Access app, there are actually two types of barcodes. First, there is the old-style barcode, rectangular in shape, the kind you usually see on product packaging. If the staff really use a convenience-store-style scanner, then this must be the barcode I need to show. But the app also displays a QR code, square in shape. This type of QR ticket is usually used at the automatic gates in Commuter Line stations around Greater Jakarta. Hmm.
Maybe the video is already outdated. Not up to date. Maybe the situation at Rangkasbitung Station now already uses automatic gates, instead of manual cashier-style barcode scanning. Hmm hmm.
We’ll see tomorrow.
Departure day arrived. After dawn, I hurried to Bekasi Timur Station. At 5:43 a.m., I was already inside a Blue Line train on the Cikarang–Angke route.
Hmm… Angke?
Would this train actually stop at Tanah Abang?
I looked closely at the network map mounted above the train doors.
The map was fairly confusing. The Blue Line splits into two branches at Jatinegara.

The direction wasn’t clear. There was no explanation of whether a Blue Line train from Cikarang bound for Angke would go via Pondok Jati or via Matraman. If it turned out to go via Pondok Jati, the train would terminate at Angke without passing through Tanah Abang. That would be a problem.
I quickly approached a uniformed train staff member who happened to be in the front car.
“Does this go through Tanah Abang, sir?”
“Yes.”
Phew. Relief.
At 5:44 a.m., we arrived at Kranji Station. My phone battery was at 93 percent. I needed to conserve it, because my digital ticket for Rangkas–Cilegon was stored on this phone. If the battery died before ten o’clock in Rangkas, that would be the end of it.
At 6:29 a.m., we arrived at Tanah Abang. The station renovation had been completed, so it was huge. I had to walk quite a distance to transfer from the Blue Line platform to the Green Line.
At 7:21 a.m., we arrived at Parung Panjang Station. I messaged my friend who lives nearby. “I don’t use Parung Panjang anymore. If you’re on a motorcycle, it’s closer to get off at Cicayur,” he replied. Oh.

Parung Panjang Station
At 7:42 a.m., we arrived at Tigaraksa Station.
At 8:08 a.m., we reached Rangkasbitung Station. I tapped out and was charged IDR 11,000. Ouch. That caught me a bit off guard. Apparently, tapping in at Bekasi Timur and tapping out at Rangkasbitung costs that much. I had assumed the fare was a flat three thousand rupiah no matter where you went. Thankfully, my balance was still sufficient.
Eight in the morning in Rangkas. The train to Cilegon wouldn’t arrive until ten. I spent a full two hours pacing around the station, which was still under renovation. The place already felt quite grand, nothing like the YouTube video I had watched the night before. It now has multiple levels and uses fully automatic gates everywhere. There were no longer any station staff manually scanning passengers’ tickets one by one with handheld barcode scanners.
As ten o’clock approached, the entrance gates for the local train were opened. As expected, they were automatic. I opened the QR code ticket on my phone and held the screen up to the front of the gate. Beep. Entry granted.
Inside the waiting area for the Rangkas–Merak local train, which is its official name even though I was getting off midway at Cilegon, there was a first-floor waiting space with long rows of seats. Passengers weren’t allowed to go downstairs yet, as the staircase was still blocked off. The process felt similar to when I took the Whoosh train from Halim to Bandung in the past.
Eventually, the barrier on the stairs was removed. Everyone rushed downstairs into the dedicated local-train platform. Down there, there were more rows of seats.
Not long after, the train from Merak arrived at Rangkas. Many passengers with suitcases got off, likely having just crossed the Sunda Strait, disembarked at Merak Port, and then continued toward Jakarta via Merak Station.
Only after all of them had exited were we allowed to board.
There were no assigned seats. You could sit wherever you wanted.
The seating layout was face to face, with some sections arranged two by two and others three by three. Passengers were effectively forced to sit close to several strangers. With good social skills, you might even make a new acquaintance in this setup.
I chose a corner seat by the window, partly for a better view and partly so I could charge my phone. There were power outlets in each seating area, but they were only accessible from the window-side seats. Once I settled in, I immediately plugged my phone in to charge.

The train departed right on time at 10:10 a.m.
During the journey from Rangkas to Cilegon, I opened an app I had built myself a few months earlier: Sakumaps.
While other map apps focus on displaying fairly random ‘points of interest’—which, in practice, often function as thinly veiled advertisements—Sakumaps, which simply shows the OSM Carto raster basemap, tries to present what I would call a ‘real map.’ It feels more like the paper maps we used in elementary and junior high school geography classes, or the maps found in the “National Atlas” that were commonly sold at school book fairs. In those older-style maps, the points of interest are genuinely points of interest: mountains, hills, rivers, lakes, reservoirs, rice fields, forests, village names, city names, museums, police stations, and so on. Compare that to a certain map app, where what stands out most is whoever pays the most for advertising.
Sakumaps can also record a journey. By tapping on a point, you can add a comment label. That comment, along with its coordinates and timestamp, is automatically stored in a database. Once I get home, the database can be exported as a GeoJSON file and used for whatever purpose I want. I usually use the app to note things I encounter along the way: rice fields, rivers, hills, mountains, specific plant species, communication towers, mosque locations, roadside eateries, or rare and unusual traffic signs. It’s mostly for fun, something to take home as a travel memento.
As it turns out, Sakumaps also works well as a conversation starter with strangers sitting next to me.
From the train window, the person beside me noticed a toll road running along the edge of rice fields. “Is that the Jakarta–Merak toll road?” she asked.
“Oh, no. That’s the Serang–Panimbang toll road,” I replied. “It’s still under construction, but it looks like the Serang–Rangkasbitung segment is already usable.”
“Where is Panimbang?” she asked.
“On the west coast of Java, right by the sea—just like Anyer, but a bit further south. From Anyer, if you follow the coastal road southward, you can reach Panimbang. Keep going south from there and you’ll end up in Ujung Kulon.”
“Oh.”
How did I know that the toll road visible from the train was Serang–Panimbang rather than Jakarta–Merak? Sakumaps, of course. The app reads the phone’s GPS movement, so I only had to pan the map to see which toll road was closest to our current location. The label appeared immediately: “Serang–Panimbang.”

Then the next topic of conversation suddenly appeared outside the window. Two large mountains were visible across the rice fields.
“Ah, those are Mount Karang and Mount Pulosari,” I said, sounding confident, armed only with the map in Sakumaps.

Mount Karang (right) and Mount Pulosari (left)
She eventually became curious about my activity of collecting coordinate points in Sakumaps, as well as the app I was using. I ended up telling her at length about why and how I had built the application a few months earlier. I also explained all the ins and outs of OpenStreetMap, without actually name-dropping the name ‘OpenStreetMap’.
Mostly, people around here don’t know about OpenStreetMap, even though, without realizing it, they use OpenStreetMap data in their everyday lives. So I simply mentioned Grab and Gojek, two of the most popular ride-hailing apps in this country, which also happen to be Gold Corporate Members of the OpenStreetMap Foundation (as of this writing). “Do you know Grab and Gojek, especially the maps inside the apps? That data comes from this kind of volunteer-based geospatial data collection, like what I’m doing right now as we speak.”
She looked very excited hearing my explanation, as if she had just solved a long-standing mystery in her life. It turned out that, long before this conversation, she had already been wondering how online maps are made. Before we ended our conversation, since we were getting off at different stations, she expressed her sincere gratitude for everything I had shared: a quick, informal introduction to OpenStreetMap and the open mapping movement. I was genuinely grateful to receive that kind of appreciation directly, as an OSM mapper, right there in front of me.
Around half past eleven in the morning, the train reached the Banten Lama area. It turned out that after Serang, the train does not continue straight west toward Cilegon. Instead, it first heads north to the Banten Lama area, then turns left toward Cilegon.
This area is rich with historical remains from the Banten Sultanate and Dutch-era fortifications. I had always assumed that the Banten Sultanate was located near the Sunda Strait, around Merak. It turns out that its capital was actually on the north coast of Java.
I felt a sudden urge to get off at Banten Lama (Karangantu) Station and do some impromptu historical sightseeing in the area. Maybe next time.

Mount Pinang (center) and possibly Mount Malang (right); photo taken around -6.0314767, 106.1102915.
At half past eleven, the train arrived at Cilegon Station.

It turned out there was no tap-out process. Passengers were simply allowed to exit through a dedicated exit gate. Hmm. In that case, maybe I could have quietly gotten off at Krenceng Station after all.
Before continuing the journey to Anyer, I stopped for lunch at a Padang restaurant located right next to Cilegon Station: RM Zahira Minang. Everything was IDR 12,000. I ordered grilled chicken with chicken gulai sauce, serondeng, boiled cassava leaves, and sweet iced tea.

After that, I performed the Zuhur prayer at the Grand Mosque of the Cilegon Islamic Center, located directly in front of Cilegon Station.
The interior layout of this grand mosque reminded me of Bandung Grand Mosque and Istiqlal Mosque, as the ablution area is also located within the main building.
Leaving the mosque at 12:23 p.m., I immediately took a silver-colored “angkot” share taxi on the Cilegon–Anyer route.

The Cilegon–Anyer road truly runs along the shoreline of the Sunda Strait. There are many warning signs marking it as a TSUNAMI-PRONE AREA. Reportedly, emergency warning sirens have even been installed at mosques in the area. If those sirens suddenly sound, residents are instructed to evacuate to higher ground, away from the coastline.
At 1:12 p.m., I arrived in Anyer. The fare was IDR 15,000.
At Asr time, I performed the prayer at At-Taubah Mosque in Anyer, a large mosque by the roadside and also right along the coast. In the past, my extended family lived around this area.
After the prayer, I went into a small alley beside At-Taubah Mosque. There are several “hidden gem” beaches here. I visited three places in one go: Pangandaran Beach, Paku Beach, and the Anyer Fisherman’s Harbor.
At Pangandaran Beach, the atmosphere was very crowded. Several residents’ houses are built close to the shoreline, and their yards were packed with visitors’ vehicles used as parking areas. I didn’t even get off the motorcycle. I just looked around, took a single photo, and moved on.

Pangandaran Beach
Next was Paku Beach, and this one easily scored a 98 out of 100 in my book.
It’s spacious and relatively quiet. There’s an open field, clusters of rocky outcrops, and plenty of people fishing, both with rods and with nets. Some visitors were picnicking on tarpaulin mats, children were playing in the waves, and others were flying kites. The wind along this stretch of coast is strong and constant, making it an ideal spot for kite flying. From the beach, you can see many large vessels offshore—barges, speedboats, cargo ships, ferries, and even the long queue of ships heading to Merak Port. Sumatra Island is clearly visible from here, as well as the headland near Mandalika Beach, Sangiang Island, and Merak Besar Island.
I spent much of the afternoon at Paku Beach.

An angler standing on the rocks.

A net fisherman standing directly facing the waves.

A line of ships heading in and out of Merak Port.

Mandalika Beach, as seen from Paku Beach.




For some reason, there is a football field located right along the shoreline.

In the foreground is Sangiang Island. Behind it, the landmass of Sumatra is faintly visible.
After taking many photos at Paku Beach, I continued on to the Anyer Fisherman’s Harbor.
Here there is a fish auction facility, a breakwater, and an area where fishing boats are parked. I also saw several people fishing with rods while standing on the concrete blocks of the breakwater.






