TypeORM中使用PostGIS空间函数查询道路所属行政区报错如何解决
问题解决方案
报错核心原因
所有报错的根源是:TypeORM直接将JavaScript的GeoJSON对象作为参数传入时,不会自动序列化为标准JSON字符串,PostGIS函数无法识别未序列化的JS对象类型,同时也存在参数类型不匹配、SRID不一致的问题。
各报错的具体原因
- 第一个混合SRID报错:传入的LineString未指定坐标参考系,默认SRID为0,和行政区面要素的SRID 4326不匹配
- 第二个ST_SetSRID不唯一报错:PostgreSQL无法识别传入的JS对象类型,无法匹配ST_SetSRID的重载函数
- 第三个GeoJSON解析报错:首先你只传入了coordinates数组而非完整GeoJSON对象,其次未序列化为字符串,PostgreSQL无法解析
正确实现代码
const municipalities = await getConnection() .getRepository(Municipality) .createQueryBuilder('municipality') .where('ST_Intersects(municipality.polygon, ST_GeomFromGeoJSON(:lineString, 4326))', { lineString: JSON.stringify(feature.geometry) }) .getMany()
代码说明
- 用
JSON.stringify()将GeoJSON格式的JS对象序列化为标准JSON字符串,满足ST_GeomFromGeoJSON的入参要求 ST_GeomFromGeoJSON的第二个参数直接指定SRID为4326,省去额外调用ST_SetSRID的步骤,同时保证和面要素的SRID一致- 空间查询条件
ST_Intersects的两个参数类型、SRID完全匹配,可正常执行
内容的提问来源于stack exchange,提问作者Stephen
相关产品推荐
相关产品推荐

