干了十五年地理信息这行,见过太多小白被各种软件整懵圈。今天不整那些虚头巴脑的理论,直接聊点干货。很多人问,csv怎么转geo文件?其实吧,这事儿真没想象中那么玄乎,但坑是真不少。
先说个真事儿。上周有个哥们找我,说他在网上下了个工具,转出来的图全是乱的,坐标全飘到太平洋去了。我一看,好家伙,经纬度搞反了,而且没指定投影坐标系。这种低级错误,新手最容易犯。所以,第一步,别急着点转换,先检查数据。
你的csv里,必须有经度(Longitude)和纬度(Latitude)这两列。注意,是WGS84坐标系下的经纬度。如果你的数据是GCJ02(也就是俗称的火星坐标),直接转会偏好几公里。这点必须得提醒,很多国产地图数据都是加密过的,直接转GeoJSON或者Shapefile,位置绝对不对。
那具体怎么操作呢?我有两个路子,一个适合懒人,一个适合懂点技术的。
先说懒人版。用QGIS。这软件免费开源,比ArcGIS轻量多了。打开QGIS,点击图层,添加图层,选择添加 delimited text layer。然后找到你的csv文件。这时候关键来了,在Geometry definition那里,选Point coordinates。X字段选经度,Y字段选纬度。坐标系选EPSG:4326 - WGS 84。点添加,如果地图上点出来了,那就对了。然后右键图层,导出为,保存要素为。格式选GeoJSON或者ESRI Shapefile。搞定。
但这只是第一步。很多人转完发现,属性表里的数据乱码。特别是中文,gbk和utf-8搞混,转出来全是问号。这时候你得在QGIS里先把csv的编码改成utf-8,或者在导入时指定编码。这个细节,90%的人都会忽略。
再说技术版。用Python。如果你会点代码,这方法更灵活。用pandas读csv,用geopandas转geo。代码也就几行。
import pandas as pd
import geopandas as gpd
from shapely.geometry import Point
df = pd.read_csv('data.csv')
geometry = [Point(xy) for xy in zip(df['lon'], df['lat'])]
gdf = gpd.GeoDataFrame(df, geometry=geometry, crs="EPSG:4326")
gdf.to_file('output.geojson', driver='GeoJSON')
这方法快,但要注意,如果你的csv里有空值,Point()会报错。所以得先清洗数据,把空值删掉或者填充。这也是个坑。
再聊聊价格。网上有些收费软件,转个文件收几十块,真心没必要。QGIS和Python都是免费的。除非你公司有特殊需求,比如批量处理百万级数据,那可能需要用ArcGIS Pro或者写更复杂的脚本。但一般个人用,免费的足够。
避坑指南:
1. 别信什么“一键转换神器”,很多带毒或者广告多。
2. 转完一定要在GIS软件里打开看看,别光看文件生成没。
3. 如果数据量大,csv转geo可能会卡死。建议分批处理。
4. 坐标系一定要对,不然转出来也是废数据。
最后说句心里话,做这行久了,发现很多人不是不会操作,而是不敢试。其实csv怎么转geo文件,核心就是两点:坐标对不对,格式对不对。只要这两点搞定了,剩下的就是点点鼠标的事儿。
别总想着走捷径,有些弯路,踩了才能长记性。我当年也是被坑过几次,才总结出这些经验。希望这些能帮到你,少走点弯路。要是还有问题,评论区见,别私信,私信回得慢。
记住,数据无小事,坐标差一点,结果谬千里。仔细点,总没错。