我有一个查询,使用Npgsql获取PostGIS数据。它的目的是获取一个点(x,y坐标),并找出该点是否存在任何几何形状。对于数据库中绝大部分的几何形状,查询都可以正常工作,但至少有一种几何形状会导致以下异常:
是否有任何方法可以修改我的代码或数据以防止发生这种情况?代码失败部分是读取reader的部分:
堆栈跟踪的顶部如下所示:ERROR: XX000: 应用了LWGEOMCOLLECTION类型的关联操作。这是不被支持的。
所有几何形状应该都是有效的,因为我会在任何无效的几何形状上调用[NpgsqlException (0x80004005): ERROR: XX000: 应用了LWGEOMCOLLECTION类型的关联操作。这是不被支持的。]
Npgsql.d__0.MoveNext() +3160
Npgsql.ForwardsOnlyDataReader.GetNextResponseObject(Boolean cleanup) +808 Npgsql.ForwardsOnlyDataReader.GetNextRow(Boolean clearPending) +308 Npgsql.ForwardsOnlyDataReader.Read() +47
ST_MakeValid
,而目前没有任何ST_IsValid
返回false的情况。该几何形状是通过调用ST_GeomFromKML
创建的,并且在地图上以栅格图层(通过GeoServer使用WMS)或矢量图层(使用ST_AsGeoJSON
)呈现,因此PostGIS数据似乎是正确的。是否有任何方法可以修改我的代码或数据以防止发生这种情况?代码失败部分是读取reader的部分:
command.CommandText = "SELECT area_code FROM area WHERE ST_INTERSECTS(ST_SetSRID(ST_Point(:x, :y), 4326), shape) AND area_type_code = :typecode";
command.CommandType = CommandType.Text;
var typeCodeParameter = new NpgsqlParameter
{
DbType = DbType.String,
ParameterName = "typecode",
Value = _typeCode
};
var xParameter = new NpgsqlParameter
{
DbType = DbType.Double,
ParameterName = "x",
Value = _x
};
var yParameter = new NpgsqlParameter
{
DbType = DbType.Double,
ParameterName = "y",
Value = _y
};
command.Parameters.Add(typeCodeParameter);
command.Parameters.Add(xParameter);
command.Parameters.Add(yParameter);
using (var reader = command.ExecuteReader())
{
if (reader.Read())
area = new AreaBasic
{
Code = (string)reader["area_code"]
};
}
编辑:更多信息。在pgAdmin III中使用硬编码值运行查询时,出现相同的错误,因此问题不是Npgsql特定的。