Ho una query che recupera i dati PostGIS utilizzando Npgsql. Il suo scopo è quello di prendere un punto (x, y coordinate) e capire quale (se c'è) la geometria è in quel punto. Per la stragrande maggioranza delle geometrie nel database query funziona bene, ma per almeno un'ottengo la seguente eccezione:NPGSQL: operazione correlata chiamata con un tipo LWGEOMCOLLECTION
ERROR: XX000: Relate Operation called with a LWGEOMCOLLECTION type. This is unsupported.
con la parte superiore dell'essere dello stack:
[NpgsqlException (0x80004005): ERROR: XX000: Relate Operation called with a LWGEOMCOLLECTION type. This is unsupported.]
Npgsql.d__0.MoveNext() +3160
Npgsql.ForwardsOnlyDataReader.GetNextResponseObject(Boolean cleanup) +808 Npgsql.ForwardsOnlyDataReader.GetNextRow(Boolean clearPending) +308 Npgsql.ForwardsOnlyDataReader.Read() +47
Tutte le geometrie dovrebbe essere valido come chiamo ST_MakeValid
su quelli che non lo sono e non ci sono attualmente nessuno dove ST_IsValid
restituisce false. La geometria è stata creata chiamando lo ST_GeomFromKML
ed è reso bene su una mappa come livello raster utilizzando WMS tramite GeoServer o come livello vettoriale utilizzando ST_AsGeoJSON
in modo che i dati PostGIS sembrino essere corretti.
Esiste un modo per modificare il mio codice oi miei dati per impedire che ciò accada? La parte del codice difetto è la parte in cui il lettore viene letto in:
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"]
};
}
EDIT: ulteriori informazioni. Lo stesso errore si verifica quando si esegue la query con valori hard coded in pgAdmin III, quindi il problema non è specifico per Npgsql.