# 导入必要的库 import os import geopandas as gpd from pathlib import Path def convert_geojson_to_shp(): # 获取当前脚本所在的目录 current_dir = os.path.dirname(os.path.abspath(__file__)) # 创建输出目录(如果不存在) output_dir = os.path.join(current_dir, "shapefile_output") os.makedirs(output_dir, exist_ok=True) # 计数器统计转换文件数量 converted_count = 0 try: print("开始扫描目录中的GeoJSON文件...") # 遍历当前目录下所有文件 for filename in os.listdir(current_dir): # 检查文件扩展名是否为geojson或json if filename.lower().endswith(('.geojson', '.json')): file_path = os.path.join(current_dir, filename) print(f"正在处理文件: {filename}") # 读取GeoJSON文件 try: gdf = gpd.read_file(file_path) except Exception as e: print(f"读取文件 {filename} 失败,错误信息:{str(e)}") continue # 创建输出文件名(保留原始文件名) base_name = Path(filename).stem # 获取不带扩展名的文件名 output_filename = f"{base_name}.shp" output_path = os.path.join(output_dir, output_filename) # 写入Shapefile try: # 确保使用相同的坐标系 gdf.to_file(output_path, driver='ESRI Shapefile', encoding='utf-8') converted_count += 1 print(f"成功转换:{filename} -> {output_filename}") except Exception as e: print(f"写入Shapefile失败,错误信息:{str(e)}") print("\n转换完成!") print(current_dir) print(f"共转换了 {converted_count} 个文件") print(f"输出目录:{output_dir}") except KeyboardInterrupt: print("\n用户中断操作") if __name__ == "__main__": convert_geojson_to_shp() # 防止Windows系统下窗口立即关闭 input("按回车键退出...")这段代码改成打包成exe后实现unity调用,输入文件路径后在同路径文件夹下生成shapefile的功能
时间: 2025-06-27 08:01:02 浏览: 7
<think>嗯,用户的问题是关于如何将Python脚本打包成可执行文件(EXE),然后通过Unity调用这个EXE来实现GeoJSON到Shapefile的转换。他们还想知道如何修改现有的Python脚本,使其能够接受输入文件路径,并在同一目录下生成Shapefile。同时,用户提到了使用PyInstaller或其他类似工具进行打包,以及与Unity交互的方法。我需要一步步理清楚解决方案。
首先,我需要确认用户的需求。他们想将Python代码转换为EXE,这样Unity可以调用这个EXE来处理文件转换。GeoJSON转Shapefile通常需要用到地理处理库,比如GDAL的ogr2ogr,或者Fiona和Shapely库。用户可能需要安装这些依赖库。
接下来,修改Python脚本以接受命令行参数。用户需要能够指定输入文件的路径,可能还需要其他参数,比如输出目录。在Python中,可以通过sys.argv来获取命令行参数。例如,脚本可以接收一个输入路径参数,然后处理该文件,并将结果输出到同一目录下。
然后,使用PyInstaller将Python脚本打包成EXE。需要确保PyInstaller正确安装,并且在打包时包含所有依赖项。特别是地理处理库可能会有一些动态链接库需要包含进去,可能需要指定隐藏导入或者添加数据文件。用户需要注意,如果使用conda环境,可能会有路径问题,推荐使用虚拟环境。
打包完成后,Unity需要调用这个EXE。在Unity中,可以使用System.Diagnostics.Process来启动外部进程,并传递参数。例如,在C#脚本中,设置ProcessStartInfo的文件名(EXE路径)和参数(输入文件路径),然后启动进程并等待完成。同时,需要处理可能出现的错误,比如文件不存在或者转换失败。
用户可能还需要在Unity中指定输入文件路径,这可以通过Unity的编辑器界面,比如公开一个字符串变量,让用户拖拽文件或者输入路径。然后,将这个路径作为参数传递给EXE。
另外,需要考虑路径问题。在Unity中,相对路径可能基于项目目录,而EXE的位置可能需要放在Assets或StreamingAssets文件夹中,以便正确访问。或者,用户可能需要将EXE放在特定的目录下,并在代码中指定绝对路径。
还有错误处理的问题。Python脚本应该返回适当的退出码,Unity端需要检查进程的退出码,以确定转换是否成功。如果出现错误,Unity需要能够捕获并显示给用户。
最后,测试整个流程是否顺畅。从Unity调用EXE,传递参数,处理文件,生成输出,并确保没有遗漏的依赖项或路径错误。
可能遇到的问题包括:PyInstaller打包时遗漏了某些库,导致EXE运行时出错;路径问题导致找不到输入文件或输出目录权限不足;Unity调用EXE时的平台兼容性问题(比如Windows和Mac的区别);以及处理大型文件时的性能问题。
总结步骤:修改Python脚本以接受命令行参数并处理文件转换→使用PyInstaller打包为EXE→在Unity中编写C#脚本调用EXE并传递参数→处理路径和错误→测试整个流程。</think>### 分步解决方案:将Python脚本打包为EXE并通过Unity调用实现GeoJSON转Shapefile
#### 一、修改Python脚本以支持命令行参数
1. **添加参数解析**:使用`sys.argv`接收输入文件路径参数,并指定输出目录
```python
import sys
import os
from osgeo import ogr # 需安装GDAL库
def convert_geojson_to_shapefile(input_path):
output_dir = os.path.dirname(input_path)
base_name = os.path.splitext(os.path.basename(input_path))[0]
output_path = os.path.join(output_dir, f"{base_name}.shp")
# 执行转换(示例使用OGR)
driver = ogr.GetDriverByName("GeoJSON")
data_source = driver.Open(input_path)
layer = data_source.GetLayer()
shape_driver = ogr.GetDriverByName("ESRI Shapefile")
shape_ds = shape_driver.CreateDataSource(output_path)
shape_ds.CopyLayer(layer, "output")
shape_ds = None
print(f"转换完成:{output_path}")
if __name__ == "__main__":
if len(sys.argv) != 2:
print("错误:需要输入文件路径参数")
sys.exit(1)
input_file = sys.argv[1]
convert_geojson_to_shapefile(input_file)
```
#### 二、使用PyInstaller打包为EXE
1. **安装依赖**:
```bash
pip install pyinstaller gdal
```
2. **创建打包命令**:
```bash
pyinstaller --onefile --hidden-import=osgeo --add-data="C:/path/to/gdal/data;./gdal/data" your_script.py
```
> 说明:`--hidden-import`确保包含GDAL依赖,`--add-data`添加GDAL数据文件(路径需根据实际安装位置调整)[^2]
3. **验证EXE**:
```bash
dist/your_script.exe input.geojson
```
#### 三、Unity端调用配置
1. **放置EXE文件**:
- 将生成的EXE文件放入Unity项目的`Assets/StreamingAssets`文件夹
- 确保EXE与GDAL依赖文件(如`gdal-data`目录)在同一位置
2. **编写C#调用脚本**:
```csharp
using UnityEngine;
using System.Diagnostics;
using System.IO;
public class GeoJSONConverter : MonoBehaviour
{
public string inputGeoJSONPath; // 在Inspector面板指定输入文件
void Start()
{
string exePath = Path.Combine(Application.streamingAssetsPath, "your_script.exe");
string arguments = $"\"{inputGeoJSONPath}\"";
ProcessStartInfo startInfo = new ProcessStartInfo()
{
FileName = exePath,
Arguments = arguments,
UseShellExecute = false,
CreateNoWindow = true,
RedirectStandardError = true
};
using (Process process = Process.Start(startInfo))
{
process.WaitForExit();
if (process.ExitCode != 0)
{
string error = process.StandardError.ReadToEnd();
UnityEngine.Debug.LogError($"转换失败:{error}");
}
else
{
UnityEngine.Debug.Log("文件转换成功");
}
}
}
}
```
#### 四、关键问题处理
1. **路径兼容性**:
- Unity中使用`Application.streamingAssetsPath`获取绝对路径
- 处理空格路径时使用`\"\"`包裹参数
2. **依赖文件部署**:
- 将GDAL的`gdal-data`目录复制到EXE同级目录
- 在Python脚本中添加环境变量设置:
```python
import os
os.environ['GDAL_DATA'] = os.path.join(os.path.dirname(__file__), 'gdal-data')
```
3. **跨平台注意事项**:
- Windows需使用`your_script.exe`,Linux/macOS需打包为二进制文件
- Unity需根据平台选择不同的EXE调用方式
#### 五、验证流程
1. 在Unity编辑器中将GeoJSON文件拖入Inspector面板的`inputGeoJSONPath`字段
2. 运行场景,观察Console输出是否显示转换成功
3. 检查输入文件所在目录是否生成对应的`.shp`文件
阅读全文
相关推荐











