2016-10-20 6 views
0

Ich habe einen Filter, den ich nicht beim Start der Anwendung verwenden möchte, nur auf eine bestimmte Aktion. Ich weiß, dass es bereits eine question darüber gibt, aber es hilft mir nicht, ich verstehe eigentlich nicht beide Antworten.Wie man MapServer anweist, einen Filter zu ignorieren?

Ich war in einer Logik von "meine Spalte = Wert oder 1 = 1", um alle meine Datensätze statt nur den Filter zu erhalten, wenn es nicht aufgerufen wird.

Hier ist, was ich schrieb:

FILTER (([ct]='%ct%') or '%ct%' = '%ct%') 
VALIDATION 
    'ct' '^[a-zA-Z\-]+$' 
END 

ich mit einem param meine Schicht rufen auf Openlayers 3 mit

url: 'http://localhost:5000/cgi-bin/mapserv.exe?map=/ms4w/apps/tutorial/htdocs/essai.map&SERVICE=WMS&VERSION=1.1.1%20&REQUEST=GetCapabilities', serverType: 'mapserver', params: {'LAYERS': 'aisdata', 'ct':'myvalue', 'TILED': true} });

Aber alle meine Daten-Set zurückgegeben wird. (Wenn ich '%ct%' = '%ct%' in meiner Mapfile entferne, wird der Filter gut angewendet)

Kann mir jemand helfen, meinen Zustand zu ignorieren?

+0

Ich verstehe dich nicht Frage. Der Ausdruck "meine Spalte = Wert oder 1 = 1" ist immer wahr und ist derselbe wie kein Filter. Was meinst du mit "bekomme alle meine Datensätze anstatt nur den Filter, wenn es nicht aufgerufen wird." –

+0

@TommasoDiBucchianico Sagen wir, ich habe eine Schicht mit einer Tiersäule (Huhn, Hund, Katze). Ich möchte, dass sie alle auf meiner Karte angezeigt werden. Aber ich habe einen Filter für meine Mapfile vordefiniert, um später nur einen Tiertyp auswählen zu können. Wegen meines FILTERS ([Tiere] =% Tiere%) zeigt meine Karte nichts an, wenn ich keine Parameter zur Verfügung stelle. Ich weiß nicht, wie ich in meinem FILTER sagen soll, dass ich zuerst alle meine Tiere haben möchte (d. H. 1 = 1), wenn keine Parameter angegeben sind. Und wenn ein Parameter zur Verfügung gestellt wird, möchte ich nicht 1 = 1 – So4ne

+0

@TommasoDiBucchianico Ich weiß, es ist immer wahr und ich muss es immer wahr sein. Für (([ct] = '% ct%') oder '% ct%' = '% ct%') möchte ich, dass Mapfile (oder Postgis?) Prüft, ob [ct] = '% ct%' zuerst TRUE zurückgibt. In meinem Fall scheint es immer "% ct%" = "% ct%" zu geben, was wahr ist. Oder was ich brauche, ist "Wenn ich keine Parameter eingestellt habe, dann zeige alles, trotz meines Filters" – So4ne

Antwort

1

einen Standardwert im VALIDATION Block hinzufügen, so dass Ihr Wert wird standardmäßig auf eine leere Zeichenfolge, und als eine OR-Bedingung in dem FILER Block hinzufügen, die überprüfen, ob der Wert eine leere Zeichenfolge ist:

VALIDATION 
    'ct' '^[a-zA-Z\-]+$' 
    'default_ct' '' # <-- ct will be a empty string if not provided via URL 
END 
FILTER (([ct]='%ct%') or ('%ct%' = '')) 

Wenn die Datenbankspalte ct einen numerischen Typ aufweist, führt der vorherige Filter zu einem internen Serverfehler, da Sie eine leere Zeichenfolge nicht mit einer Zahl vergleichen können. In diesem Fall verwenden Sie einen numerischen Wert als Standard, etwa 0 oder -1.

+0

Nun, das gibt mir tatsächlich einen 500 Internal Server Error haha ​​Ich werde überprüfen, ob ich ein '' = konfigurieren muss '' auf Apache oder so ähnlich – So4ne

+0

OK Ich behielt Ihre Idee, indem Sie einen Standardwert, anstatt '' Ich setze 'default_ct' '1' und FILTER (([ct] = '% ct%') oder ('% ct% '=' 1 ')). Vielen Dank ! – So4ne

+0

Wahrscheinlich war das Problem mit einer leeren Zeichenkette, dass Ihre Spalte 'ct' einen numerischen Typ hat, so dass die Bedingung '% ct%' = ''' eine Postgres-Ausnahme auslöst, weil eine Bedingung NUMERIC = TEXT –

Verwandte Themen