ArcGIS 10: créer une couche linéaire d'événements à partir d'une couche ponctuelle en fonction de la directionnalité

8

J'ai une couche de points qui reflète les limites de vitesse et une couche de lignes des routes. L'emplacement du panneau de vitesse indique dans quelle direction la limite de vitesse s'applique.

Comment puis-je créer un tableau d'événements linéaire au-dessus de la couche routière qui reflète les vitesses? Donc, pour chaque segment, renvoyez deux attributs de vitesse, un pour chaque direction.

Couche vitesse / route

dassouki
la source
Pouvez-vous préciser "L'emplacement du panneau de vitesse indique dans quelle direction la limite de vitesse s'applique"? Cela signifie-t-il que si le point se trouve sur le côté droit de la route (en fonction de la directionnalité de la route), la vitesse s'applique à la voie de droite? À quelle distance de la route se trouve le point?
Stephen Lead
@StephenLead Oui, le point de signalisation est situé à 1 à 5 m de la couche de ligne pour indiquer dans quelle direction la vitesse s'applique
dassouki
Y a-t-il d'autres attributs stockés avec les panneaux de signalisation? Il semble que vous devrez d'abord les accrocher aux routes, puis transférer en quelque sorte la directionnalité de la route aux panneaux de signalisation, puis couper les lignes par les sommets et transférer les valeurs d'attribut des panneaux à chaque segment. Juste une idée. Pourrait aider si vous avez publié les données.
Jakub Sisak GeoGraphics
@Jakub le seul attribut que je veux du panneau de signalisation est "posted_speed". La couche de signe n'a pas d'informations sur la directionnalité
dassouki
Les soupirs ont-ils d'autres attributs que la vitesse? Je demande parce qu'il pourrait y avoir quelque chose qui pourrait relier les panneaux aux routes. Sinon, ce que vous voulez faire n'est pas possible sans accrocher manuellement les panneaux sur les segments de route, transférer des attributs et diviser les segments de route. (vous pouvez le faire par programme mais les distances sont variables, donc une automatisation complète peut ne pas être possible) Le résultat ne sera pas une table autonome mais plutôt une table attributaire vers laquelle toutes ces informations seront transférées.
Jakub Sisak GeoGraphics

Réponses:

3

Pour les couches d'événements de route linéaire, vous devez créer une table contenant l'ID de la route et les valeurs m de début et de fin.

Si vos routes n'ont pas de valeurs m, vous pouvez créer des itinéraires à l'aide de l' outil de création d'itinéraires .

La deuxième étape consiste à extraire les valeurs m de vos routes pour chaque point, ce qui peut être fait avec la fonction de localisation le long de la route . Si je vois bien sur votre figure, les points sont situés du même côté de la route s'ils sont dans le même sens. C'est très bien car vous avez alors une distance positive ou négative qui vous indique de quel côté vous êtes.

La façon la plus simple de passer à la dernière étape est dans Microsoft Excel:

  • Trier vos points par roadIDet par signe de la distance à l'itinéraire
  • Ajoutez une nouvelle colonne avec le m-valuepoint suivant (ou le point précédent, selon la direction).
  • Il y aura une valeur manquante à la fin qui doit être remplie avec 0 ou le maximum m-valuedu segment.

EDIT: après le tri, votre table ressemblera à ceci

 pointID RoadID mvalue dist speed
 15      2      25     1    80
 25      2      30     1    50
 87      2      45     12   70
 etc

Vous voyez que les points sont triés par m-valeurs. La troisième colonne dans mon cas serait le début de l'événement. la nouvelle couche d'événements doit avoir fromun tochamp et un champ. Donc, dans mon exemple, cela ressemblerait à:

pointID RoadID from to speed
15      2      25   30   80    
25      2      30   45   50    
87      2      45   max  70

dans l'autre sens, il serait

pointID RoadID from to speed    
15      2      0    25   80    
25      2      25   30   50    
87      2      30   45   70

Vous pouvez ensuite créer votre couche d'événements en utilisant le signe comme champ de décalage pour localiser la limitation de vitesse du bon côté des itinéraires.

radouxju
la source
Jusqu'à présent, cela fonctionne mieux que l'autre solution. Pouvez-vous expliquer la partie excelle sur l'ajout de points précédents et suivants, s'il vous plaît?
dassouki
3

Je n'ai pas assez de représentants pour commenter, mais ma question est de savoir si les routes sont déjà dans des segments qui correspondent aux zones de vitesse, c'est-à-dire que chaque segment aurait généralement une vitesse associée à chaque côté, ou plus d'une.

Quoi qu'il en soit, voici ma suggestion, bien qu'elle dépende du fait que vous ayez un niveau de licence qui permettrait un tampon unilatéral (avancé / ArcInfo, je crois). Un principe similaire pourrait être appliqué avec des outils de base, mais serait plus complexe. De plus, je m'attends à ce que cela prenne un certain temps à fonctionner ...

import arcpy
def TakeOutTrash(dataset):
    if arcpy.Exists(dataset):
        arcpy.management.Delete(dataset)
roads = "path/to/roads" #make sure it's in a projected crs with meter units
buff_right = "path/to/new/buffer/feature/class1" #new gdb feature class
buff_left = "path/to/new/buffer/feature/class2" #new gdb feature class
arcpy.analysis.Buffer(roads,buff_right,6,"RIGHT","FLAT")
arcpy.analysis.Buffer(roads,buff_left,6,"LEFT","FLAT")

Vous disposez maintenant de tampons de chaque côté de chaque route, à 6 mètres de la ligne médiane, qui devraient couvrir tous les panneaux. Vous pouvez faire une sélection facile par emplacement pour vous assurer que c'est le cas, et sinon, réexécuter les opérations de tampon avec 1 ou 2 mètres supplémentaires.

Prochain:

final_dict = {}
buffers = [buff_right, buff_left]
for i, buffer in enumerate(buffers):
    rows1 = arcpy.SearchCursor(buffer)
    for row1 in rows1:
        final_dict[seg] = [[],[]]
        seg = str(row1.getValue("seg_num"))
        TakeOutTrash("fl")
        fl = arcpy.management.MakeFeatureLayer(buffer,"fl",'"seg_num" = ' + seg)
        arpcpy.management.SelectLayerByLocation(signs,"INTERSECT",fl)
        rows2 = arcpy.SearchCursor(signs)
        for row2 in rows2:
            final_dict[seg][i].append(row2.getValue("posted_speed"))

Alors maintenant, vous avez un dictionnaire dans ce format:

"seg_num":[[list of speeds on the right],[list of speeds on the left]]

à partir de laquelle vous pouvez faire ce que vous voulez, par exemple:

for k,v in final_dict.iteritems():
    print "road segment {0}:".format(str(k))
    print "   speeds on right: {0}".format(", ".join(v[0]))
    print "   speeds on left: {0}".format(", ".join(v[1]))

Ou testez simplement le nombre de vitesses de chaque côté du segment, ou écrivez-le dans les champs de la classe d'entités routes d'origine, etc. Encore une fois, vous ne savez pas si cela pourrait être une solution finale avec les données dont vous disposez, mais cela pourrait certainement travailler dans le cadre de celui-ci. Je pouvais voir qu'il était utilisé en conjonction avec le processus de capture / division décrit ci-dessus.

Pour écrire dans la couche routes, vous pouvez créer deux nouveaux champs, SPD_RIGHT et SPD_LEFT, et pour l'instant (sauf si vous savez avec certitude qu'il n'y a qu'une seule vitesse par segment), faites-en des champs de texte. Alors:

urows = arcpy.UpdateCursor(roads)
for row in urows:
    seg = row.getValue("seg_num")
    right_speeds = ", ".join(final_dict[seg][0])
    left_speeds = ", ".join(final_dict[seg][1])
    row.setValue("SPD_RIGHT",right_speeds)
    row.setValue("SPD_LEFT",left_speeds)
    urows.updateRows(row)

Bien sûr, il est idéal de n'avoir qu'une seule vitesse par segment, mais cela revient à la question initiale de savoir comment les segments sont actuellement divisés.

mr.adam
la source
Maintenant que vous avez des points à commenter; où la couche de vitesse se met-elle en place? Ai-je mal compris votre commande de tampon?
dassouki
ok j'ai ajouté un peu plus à la réponse. J'espère que je comprends ce que vous cherchez.
mr.adam
les segments et les vitesses peuvent ne pas être divisés de la même manière que les données sont collectées par deux entités différentes; en outre, un segment peut avoir des vitesses différentes dans les deux sens.
dassouki
Ok, je pense maintenant que la meilleure façon de procéder est de faire d'abord un tampon du côté droit, 6m ou quelque chose, puis de sélectionner les signes qui en font partie et de les extraire dans une nouvelle classe d'entités ponctuelles. De cette façon, vous pourriez avoir une classe d'entités pour les panneaux du côté droit et une pour les panneaux du côté gauche.
mr.adam
La réponse de Jakub dans les commentaires est un bon point de départ pour définir de bons segments et pourrait être complétée par la mienne afin de relier les vitesses à la direction de la route.
mr.adam