Sélection des contours dont les hauteurs sont des entiers?

18

J'ai une classe Contours Featureclass, avec un intervalle de 0,2 mètre. Je souhaite sélectionner uniquement les contours qui sont à 1 m d'intervalle?

J'ai essayé d'utiliser la syntaxe suivante dans la boîte de dialogue "Sélectionner par attribut" (dans ArcMap), mais elle sélectionne tous les contours:

Mod("ELEVATION", 1)=0

Quelle requête dois-je exécuter?

Devdatta Tengshe
la source
Gain de temps pour moi, vraiment merci! Jamais vu ces codes de requête comme "Flor", "Elevation" et "Mod".

Réponses:

22

L'astuce simple pour sélectionner uniquement des valeurs entières est d'utiliser la syntaxe suivante:

Mod(Round("ELEVATION", 0)*10, 10)=0

Cette multiplication par 10, rend toutes les valeurs entières, puis nous sélectionnons uniquement celles qui sont des multiples de 10.

Si vous souhaitez sélectionner des multiples d'un autre nombre, multipliez simplement 10 par l'intervalle.

  • Pour obtenir des contours à des intervalles de 5 m, utilisez:

    Mod(Round("ELEVATION",0) * 10, 50)=0

  • Pour obtenir des contours à 100 m d'intervalle, utilisez:

    Mod(Round("ELEVATION", 0) * 10, 1000)=0

Mise à jour
Selon les conseils de Whuber donnés dans le commentaire ci-dessous, j'ai ajouté la fonction d'arrondi dans l'expression de requête.

Devdatta Tengshe
la source
6
Je ne pense pas que je ferais confiance à ces solutions. Le problème est qu'avec des intervalles non intégraux de 0,2, la base de données les stocke probablement sous forme de flottants. Par conséquent, MODsera soumis à une erreur d'arrondi à virgule flottante - et c'est essentiel ici: si vous êtes faible, même par le chiffre le moins significatif, MODpeut retourner la mauvaise valeur (selon la façon dont il est implémenté). Je voudrais suggérer d' arrondir les valeurs avant d'appliquer MODcomme moyen de prévenir ces erreurs subtiles (et insidieuses).
whuber
Vous devez arrondir après avoir multiplié par 10, mais avant de trouver le mod.
smithkm
1
Si je souhaite sélectionner des contours à des intervalles de 5 m, la formule implémentée telle qu'écrite ci-dessus sélectionne des nombres non entiers arrondis à un nombre divisible par 5. Par exemple , 14,5 m et 19,5 m ont été sélectionnés, mais cela n'est pas souhaité. Ceux-ci n'étaient pas sélectionnés si je supprimais la partie "Round" de la fonction.
delongtime
1
@delongtime Si vous avez des contours censés avoir des niveaux non intégraux, modifiez simplement le deuxième argument de ROUNDpour obtenir plus de précision dans l'arrondi.
whuber
9

Voici une autre option de requête. Il fait en grande partie la même chose que les réponses énumérées ci-dessus mais est (à mon avis) un peu plus facile à personnaliser pour différents scénarios.

Pour afficher tout contour divisible par 10

Floor(Elevation/10)=Elevation/10

Pour afficher tout contour divisible par 50

Floor(Elevation/50)=Elevation/50

Pour afficher les contours d'un demi-mètre

Floor(Elevation/0.5)=Elevation/0.5

Pour afficher les contours de 10 mètres avec un décalage arbitraire (par exemple 10.2, 20.2, 30.2)

Floor((Elevation-0.2)/10)=(Elevation-0.2)/10

À la fin de la journée, ce n'est qu'une autre option à considérer.

TGS71
la source
2

C'était censé être un commentaire sur la réponse ci-dessus - désolé .

La syntaxe varie en fonction du type de base de données dans lequel vos contours sont stockés, mais la solution donnée semble choisir les contours après avoir arrondi leurs valeurs. Ainsi, par exemple, dans mon test, cela a permis d'obtenir un ensemble sélectionné qui comprenait 0,3 m ainsi que 0,4 m. En fait, il n'a exclu aucune des valeurs.

Cette équation

Mod(Round("ELEVATION" * 10, 0), 2)=0

M'a donné des résultats qui semblaient correspondre à ce que le questionneur demandait.

user23715
la source
1

Pour obtenir les contours d'index, j'utilise ceci sur la calculatrice de champ:

Dans ARCMAP

dim dIndexInterval
dim dCont
dim i
dim j
dim k
dim c

dIndexInterval = 200 ' set to interval of index contours
dCont = [level] ' Set to contour height field

i = ROUND(dCont, 0) * 10
j = dIndexInterval * 10
k = i MOD j

if k = 0 then
 c = 1 ' is an index contour
else
 c = 0 ' is not an index contour
end if

'Tapez "c" (sans guillemets) dans le champ de saisie de texte en bas de la boîte de dialogue et cliquez sur OK.

Dans QGIS

if(((round("level", 0) * 10) % (200 * 10)) = 0, 1, 0)

"" niveau "" Régler sur le champ de hauteur de contour "200" Régler sur l'intervalle des contours d'index

Ensuite: "1" est un contour d'index et "0" n'est pas un contour d'index

carfog81
la source
0

Multipliez le contour par 10 puis le module par 10 pour déterminer s'il y a un reste. S'il n'y a pas de reste que c'est un entier, sinon c'est float.

def contour_class(contour):
    if ((contour * 10) % 10) == 0:
        return "Integer"
    else:
        return "Float"

__esri_field_calculator_splitter__
contour_class(!Contour!)
Sam
la source