ST_DWithin dokumentation angiver, at den første funktionssignatur accepterer geografityper ikke geometrityper :
boolean ST_DWithin(geography gg1, geography gg2, double precision distance_meters, boolean use_spheroid);
da (placering,ST_SetSRID(ST_MakePoint(20, -30), 4326)) alle er geometrier, ville det give mening, at udførelsen af funktionen er rodet. Og jeg tror, at din anden funktion fungerede korrekt, fordi det, du udførte, var denne signatur :
boolean ST_DWithin(geometry g1, geometry g2, double precision distance_of_srid);
Og som du sagde, at skift af kolonnetyper til Geografi i stedet for Geometri ville løse problemet, da det ville give dig den korrekte udførelse af:
boolean ST_DWithin(geography gg1, geography gg2, double precision distance_meters);
boolean ST_DWithin(geography gg1, geography gg2, double precision distance_meters, boolean use_spheroid);
Håber dette hjælper lidt.
Rediger:
Fandt denne del i dokumentationen der angiver, at ved dataindtastning
dette kunne forklare, hvorfor Postgres accepterede din første påkaldelse af ST_DWithin(), da postgis tilsyneladende ville kaste den til geografi, og det forklarer også, hvorfor udførelsen tager længere tid og negligerer indekset, da hver casting ville resultere i et nyt objekt, der ikke er indekseret i din oprindelige kolonne.