simplemaplab

CSV to Map

Paste, upload, or drag-drop a spreadsheet of lat/lng data and get an interactive map in seconds. Auto-detects columns, supports up to 5,000 rows, colors points by any category column with a legend, shows every CSV field in a click-popup, and exports clean GeoJSON or KML. Free, no sign-up.

Paste CSV, drag a file, or upload
Up to 5,000 rows. Comma, semicolon, or tab delimited.
Loading map…
Map result
Paste a CSV or try the sample to start.

Why this exists — better than free competitors, no account like paid ones

Most free CSV-to-map tools online either gate behind a Google account (Google My Maps), cap at 250 rows on the free tier (BatchGeo, Maptive), or are too basic to be useful (mapcustomizer drops pins but cannot color-categorize and cannot export GeoJSON). Paid tools start at $25/month for individual use.

We built this for the everyday case: you have a spreadsheet with lat/lng, you want to see it on a map, and you want to share or export the result. 5,000 rows is a lot— sufficient for most customer lists, store locators, listing inventories, and field-data visualizations. Color by column is the headline differentiator vs free competitors. Every CSV field appears on click, not just the first three. And it is genuinely free — no watermark, no rate limit, no sign-up.

How to convert a CSV to a map

Five steps. The defaults handle the most common case (lat/lng/name/category) automatically.

  1. Paste, upload, or drag-drop your CSV. Paste the CSV text directly into the textarea, click "Upload .csv" to pick a local file, or drag a .csv / .tsv / .txt file onto the textarea area. Up to 5,000 rows. Comma, semicolon, or tab delimiters are auto-detected. The first row should be your header.
  2. Confirm the column mapping. The tool auto-detects which columns hold latitude and longitude — first by header name (lat, latitude, lng, lon, longitude…) and then by scanning numeric ranges. If the auto-detection is wrong, override via the dropdowns. The preview table below highlights your picks (green = lat/lng, yellow = label, purple = color).
  3. Pick a label column (optional). Choose any column to act as the marker title — the bold heading shown when you click a marker. Common picks: name, title, address, place, city. If you skip this, the popup falls back to the row number.
  4. Color by category (optional). Pick a "Color by column" — every unique value in that column gets a distinct color from a 12-color palette, with a legend below the map. Use it for categorical data: country, region, type, status, segment. For a single uniform color, leave it blank and pick from the swatches.
  5. Click any point — see all CSV columns. Markers are interactive. Click any one and a popup opens with every column from your CSV (up to 12 fields shown). Pan and zoom; the map auto-frames to fit all your points on first render. Export to GeoJSON or KML when you’re ready.

What people use this tool for

Seven recurring patterns we see in the analytics.

Customer / store locator visualizations

Sales teams export a list of customers from a CRM, drop the CSV here, and see every customer on a map within seconds. Color by sales region or account tier. Click any pin to see contact details, last order date, lifetime value — every CSV column appears in the popup. Works for hundreds or thousands of accounts.

Real estate listing maps

Drop a CSV of listings (lat, lng, price, beds, baths, address) and get an interactive map. Color by price tier or status (active / pending / sold). Buyers and agents click any pin to see all listing fields. Export to GeoJSON for embedding in a real estate website.

Field research and sample-site visualization

Researchers collecting GPS-stamped observations (water quality, wildlife sightings, archaeology finds, soil samples) drop their data here for instant visualization. Color by sample type or measured value tier. Each click reveals the full record with date, observer, and notes.

Event venue and tour-stop maps

Touring artists, conference organizers, and event planners drop a CSV of venues and see every stop on a map. Color by date range or venue type. Share the map by exporting to KML and embedding in Google My Maps, or use the GeoJSON export with a custom map on your website.

School, hospital, and government facility locators

Government open-data portals publish CSV lists of facilities (schools, hospitals, fire stations, polling places). Drop the CSV here for a quick interactive view. Color by type or district. Share the URL or export the GeoJSON to embed in a public-facing dashboard.

Employee / remote-team distribution maps

HR exports a CSV of employee home cities (lat, lng from a geocoding step) and sees the global team distribution. Color by department or office. Useful for planning meetups, time-zone allocation, and benefits geography. The full employee record appears on click — keep PII export discipline in mind.

Shipment, delivery, and logistics tracking

Logistics teams export a CSV of in-transit shipments (lat, lng of last GPS ping, status, cargo) and see the network at a glance. Color by status (delivered / in-transit / delayed). The export to GeoJSON drops directly into routing software for optimization.

CSV format — which columns the tool looks for

The tool auto-detects column roles by header name (case-insensitive). If your headers do not match these names, override the mapping via the dropdowns. The first row of your CSV should be the header. Quoted fields with embedded commas / newlines / escaped quotes are parsed correctly.

Column roleHeaders we look forNotes
Latitudelat, latitude, y, lat_dd, lat_dec, latitudDecimal degrees -90 to 90. Required.
Longitudelng, lon, long, longitude, x, lng_dd, lon_dec, longitudDecimal degrees -180 to 180. Required.
Labelname, label, title, place, location, description, place_name, cityOptional. Shown as the popup heading.
ColorAny column you pick (manual selection)Optional. Each unique value gets a distinct palette color.
Other columnsAny header — kept as-isAll other columns are preserved and shown in the popup.

Sample CSV format

name,lat,lng,category,population
Tokyo,35.6762,139.6503,Asia,37400000
New York,40.7128,-74.006,North America,8336000
London,51.5074,-0.1278,Europe,9540000

Two export formats — and which to use

Both exports preserve every column from your original CSV.

FormatSizeOpens inBest for
GeoJSON~150 bytes per row + all CSV fields as propertiesQGIS, Mapbox, Leaflet, ArcGIS, geojson.io, our other toolsWeb mapping, GIS workflows, custom map embeds.
KML~200 bytes per row + all CSV fields in descriptionGoogle Earth, Google My Maps, Gaia GPS, AllTrails, CalTopoDesktop / mobile mapping apps that natively read KML.

How the tool actually works

1. CSV parsing

We use a hand-rolled streaming parser that handles quoted fields with embedded commas, embedded newlines, escaped double-quotes (""), and the UTF-8 Byte Order Mark (BOM) that Excel sometimes prepends. Delimiter is auto-detected by counting ,, ;, and tab characters in the first 4KB of input.

2. Column auto-detection

Two passes. First pass: match header names against a list of common synonyms (lat, latitude, y, lat_dd / lng, lon, longitude, x, lng_dd / etc.). Second pass: for un-detected columns, scan the first 100 rows of each numeric column. Columns whose 85%+ values fall in [-90, 90] are lat candidates; in [-180, 180] are lng candidates. The winner is picked with preference for the column with the more constrained range.

3. Map rendering — WebGL circles

Points render as a MapLibre GL JS circle layer on a GeoJSON source. WebGL renders thousands of circles per frame at 60 FPS — the bottleneck is parsing, not drawing. Circle radius scales with zoom (smaller at world view, larger when zoomed in) so nearby points stay readable at any scale.

4. Click-to-popup

A click handler on the circle layer reads the clicked feature’s properties (which include every original CSV column) and builds a popup with a two-column key/value table. Up to 12 fields are shown; the rest are summarized at the bottom. The popup auto-positions with offset above the clicked point.

5. Color assignment

For categorical color: the tool finds every unique value in your chosen column, assigns each value a color from a 12-color palette in insertion order, and renders each point in its category color via a feature property (__color) read by the circle layer’s paint expression. The legend below the map enumerates the assignment.

6. Exports

GeoJSON wraps the points in a FeatureCollection, with every original CSV column preserved as a feature property. KML wraps each point in a Placemark with the label as name and the full column dump in description. All exports run client-side as Blob downloads — no upload, no server.

SimpleMapLab vs other CSV-to-map tools

Honest comparison. Each tool wins different scenarios — this is a feature checklist, not a value judgement.

FeatureSimpleMapLabGoogle My MapsBatchGeomapcustomizerMapping APIs
Free, no sign-up✗ (Google account)Free tier 250 rows
Up to 5,000 rows free✓ (2,000)250 free, more $$LimitedAPI only
Drag-and-drop uploadLimited
Smart column auto-detectLimited
Color-by-column (categorical)LimitedLimited
Auto legend
Click marker → all CSV columns in popupLimited
Export GeoJSONLimitedLimitedAPI only
Export KMLAPI only
WebGL rendering for 5,000 pointsLimited✓ (paid)
Mobile-first interfacePartialPartialPartial
No watermark, no rate limitFree tier limitedSome adsAPI key required

Tips for clean CSV-to-map results

Related tools and resources

For converting addresses to lat/lng before mapping (so this tool can plot them): Address to Coordinates. For mapping a list of US ZIP codes specifically: Map with ZIP Codes. For a county-level choropleth from a CSV of FIPS codes + values: Map with Counties. For dropping individual pins by hand (no CSV needed): Pin Drop Map. For converting between coordinate formats: GPS Coordinate Converter. For drawing on top of a map: Map Drawer.

Frequently asked questions

Paste your CSV (with lat and lng columns) into the textarea above, or upload / drag-drop a .csv file. The tool auto-detects the lat and lng columns, parses the rows, and renders every point on the interactive map. Click any point to see all CSV fields in a popup.
At minimum, two columns: latitude and longitude (decimal degrees). The tool recognises common header names (lat, latitude, y, lat_dd; lng, lon, longitude, x, lng_dd) and can also fall back to scanning numeric ranges when headers are non-standard. Optional columns: a label / name column for the popup heading, and any column you want to color-categorize by.
Currently this tool plots from lat/lng only. To convert addresses to coordinates first, use our Address to Coordinates tool — it geocodes a list of addresses to lat/lng and exports a CSV ready for this tool. We may add direct address-mode support here in a future version.
Up to 5,000 per session. The map uses WebGL circle rendering, which scales smoothly to thousands of points. For larger datasets you would want a dedicated GIS tool like QGIS or a paid service. The 5,000 cap is set to keep page memory and parse time reasonable.
Comma, semicolon, and tab. The tool detects the delimiter automatically by counting occurrences in the first 4KB of text. Quoted fields (with embedded commas, line breaks, or escaped double-quotes) are parsed correctly per RFC 4180.
Yes. The CSV parser supports double-quoted fields, embedded commas, embedded newlines (multi-line cells), escaped double-quotes (""), and the BOM (Byte Order Mark) that Excel sometimes prepends. Excel exports work as-is.
Pick any column from the "Color by column" dropdown. The tool finds every unique value in that column, assigns each value a distinct color from a 12-color palette (cycling if more than 12), and renders each point in its category color. A legend appears below the map. Useful for visualizing region, type, status, segment, or any categorical attribute.
Rows where lat or lng is non-numeric or out of range (-90 to 90, -180 to 180) are skipped. The "skipped rows" count is shown below the map, and (if there are 25 or fewer) the specific row numbers and reasons are listed. Empty rows are silently ignored.
When you click a marker, the popup shows the label (or "Row N") as the heading, then a two-column key/value table with every other CSV column. Up to 12 fields are displayed; if your CSV has more, a "…N more fields" note appears. All rows of your original CSV are preserved in the GeoJSON / KML exports.
No. CSV parsing, marker rendering, and exports all run client-side in your browser. The only network calls are to load the map basemap (OpenFreeMap tiles). Your CSV never leaves your device. Exports are generated as in-browser Blob downloads.
It happens when both lat and lng could match multiple columns by name, or when the header names are non-standard. Override via the dropdowns above the preview table — the map will re-render immediately. The preview table highlights your picks.
Not in this tool. Browsers cannot reliably render millions of points without dedicated GPU pipelines. For datasets at that scale, use QGIS, Mapbox Studio, or a server-side rendering pipeline. We cap this tool at 5,000 rows to keep performance smooth and the browser responsive.
After you confirm the lat/lng columns and the points are plotted, the map calls fitBounds to frame all visible points with comfortable padding (smaller padding on mobile so points are not squeezed into a sliver). The maxZoom cap is 9 — for tightly clustered points, the map will not zoom in beyond city-level so you can still see the cluster context.
GeoJSON and KML exports preserve every column from your original CSV as feature properties / placemark description. The exports also include the geometry (Point at lat/lng) which the original CSV did not have as a structured object. CSV-to-CSV round-trip is not provided directly, but you can read GeoJSON properties to reconstruct the original columns.
Yes. All math runs client-side. The OpenFreeMap basemap is free with no API key. No watermark, no rate limit, no sign-up. Exported files are yours to use however you like — analytics, presentations, embeds, internal dashboards, paying clients.
Data sources & methodology

CSV parsing: hand-rolled RFC 4180–compliant streaming parser (handles quoted fields, embedded newlines, escaped quotes, BOM). Delimiter detection: count of , / ; / tab in first 4KB. Column auto-detection: header-name match against a synonym list, then numeric-range scan (85% threshold) for un-matched columns. Map basemap: OpenFreeMap Liberty vector tiles. Marker rendering: MapLibre GL JS circle layer (WebGL) on a GeoJSON source, with zoom-interpolated radius and per-feature color. Color palette: 12-color categorical, cycled for groups beyond 12 unique values. Exports: GeoJSON RFC 7946 with original CSV fields as feature properties; KML 2.2 with label as name and field dump as description. All processing runs client-side; your data never leaves your device.

More SimpleMapLab tools

Pin Drop Map

Drop pins by hand with notes, colors, and shareable URLs.

Map with ZIP Codes

Plot a list of US ZIP codes on a map. Heat / dot / territory modes.

Map with Counties

Choropleth across 3,132 US counties from CSV of FIPS or names + values.

Address to Coordinates

Convert any address (or batch CSV) to lat/lng before mapping.