Pages : 1
#1 Le 26/11/2014, à 11:24
- titi89
geometrie et imagemagick
bonjour,
j'aurai besoin d'aide pour un script qui dépasse mes compétences
voilà j'ai acheté des données cadastrales que je visualise avec qgis
je récupère les coordonnées de toutes les bornes d'une parcelle en les prenant dans l'ordre et je les enregistre dans un fichier
d'après ce fichier je veux créer une image png de la parcelle et calculer la distance entre chaque borne , le périmètre et la surface de la parcelle
ça c'est bon
c'est là que j'arrive pas
je voudrais maintenant choisir 2 points qui se suivent dans les coordonnées soit une droite qui servira de départ
dessiner une autre droite qui part du bord de mon image à l'autre bord et paralléle à la première droite
trouver les coordonnées des points d'intersection avec le polygone de telle sorte que par exemple la surface du polygone découpé soit ègal
à 5000 m2
je sais pas si je me fais bien comprendre
je veux couper un polygone en prenant un côté en référence pour obtenir une surface donnée
et en sortir une image png du style de la première donc un nouveau fichier de coord du polygone découpé pour pouvoir calculer les distances
exemple de fichier coord de départ:
parcelle1.txt
710049.596025,6761074.00762
710054.577955,6761105.32261
710064.541813,6761112.43965
710083.046122,6761114.57476
710113.649402,6761123.11521
710139.982457,6761135.92589
710183.396413,6761160.12383
710290.863746,6761036.2873
710293.710563,6761024.18833
710292.998859,6761017.07129
710344.953264,6760958.71154
710386.943812,6760987.89142
710413.988571,6760999.27868
710452.420597,6760899.6401
710393.349149,6760871.88363
710347.088377,6760834.87501
710304.386126,6760787.90254
710297.980788,6760780.7855
mes scripts :
polygone.sh
#!/bin/bash
#export DISPLAY=:0
rm $HOME/MesTravaux/shp/x.txt
rm $HOME/MesTravaux/shp/y.txt
rm $HOME/MesTravaux/shp/trix.txt
rm $HOME/MesTravaux/shp/triy.txt
rm $HOME/MesTravaux/shp/nouvcoord.txt
rm $HOME/MesTravaux/shp/textcoord.txt
rm $HOME/MesTravaux/shp/surfcoord.txt
mescoord=""
t="0"
fic=$(yad --title "choisissez un fichier de coordonnées" --width=600 --height=400 --file-selection)
parcelle=$(yad --title "Entrez le nom de la parcelle" --width=300 --entry)
echo "$parcelle" > $HOME/MesTravaux/shp/text.txt
echo "" >> $HOME/MesTravaux/shp/text.txt
while read line
do
nbre=$(cut -d "," -f1 <<< $line)
nbre2=$(cut -d "," -f2 <<< $line)
echo $nbre >> $HOME/MesTravaux/shp/x.txt
echo $nbre2 >> $HOME/MesTravaux/shp/y.txt
done < $fic
nbligne=$(echo $(sed -n '$=' $fic))
sort -n $HOME/MesTravaux/shp/x.txt > $HOME/MesTravaux/shp/trix.txt
sort -n $HOME/MesTravaux/shp/y.txt > $HOME/MesTravaux/shp/triy.txt
nb1=$(echo $(sed -n "1 p" $HOME/MesTravaux/shp/trix.txt))
nb2=$(echo $(sed -n "$nbligne p" $HOME/MesTravaux/shp/triy.txt))
nb3=$(echo $(sed -n "$nbligne p" $HOME/MesTravaux/shp/trix.txt))
nb4=$(echo $(sed -n "1 p" $HOME/MesTravaux/shp/triy.txt))
canv1=$(echo "scale=0; $nb3-$nb1+20" /1 | bc)
canv2=$(echo "scale=0; $nb2-$nb4+20" /1 | bc)
convert -size 200x"$canv2" xc:none \
$HOME/MesTravaux/shp/text.png
#echo $nbligne
#echo $nb1
#echo $nb2
while read line
do
n=$(cut -d "," -f1 <<< $line)
n2=$(cut -d "," -f2 <<< $line)
x2=$(echo "scale=0; ($n-$nb1)/(1/1)+13" / 1 | bc)
y2=$(echo "scale=0; ($nb2-$n2)/(1/1)+13" / 1 | bc)
x3=$(echo "scale=2; ($n-$nb1)/(1/1)+13" / 1 | bc)
y3=$(echo "scale=2; ($nb2-$n2)/(1/1)+13" / 1 | bc)
x=$(echo "scale=6; $n-$nb1+10" / 1 | bc)
y=$(echo "scale=6; $nb2-$n2+10" / 1 | bc)
echo "$x,$y" >> $HOME/MesTravaux/shp/nouvcoord.txt
echo "$x2,$y2" >> $HOME/MesTravaux/shp/textcoord.txt
echo "$x3,$y3" >> $HOME/MesTravaux/shp/surfcoord.txt
mescoord=$(echo "$mescoord $x,$y")
done < $fic
n3=$(echo $(sed -n "1 p" $HOME/MesTravaux/shp/nouvcoord.txt))
mescoord=$(echo "$mescoord $n3")
#echo $mescoord
nl=$(echo $(sed -n "1 p" $HOME/MesTravaux/shp/surfcoord.txt))
echo "$nl" >> $HOME/MesTravaux/shp/surfcoord.txt
# Define a string of X and Y coordinates
# comma between values, space between coordinates.
#points="10,271 77,233 138,245 228,39 195,12 137,10 10,271"
points="$mescoord"
# circle radius (or symbol size) to draw around each point.
radius=3.5
# convert each point into a draw command for a cross
# In this case, points are space separated by the shell
circles=$(for point in $points; do
x=$(echo "$point" | cut -d, -f1)
y=$(echo "$point" | cut -d, -f2)
# use IM to do some floating point math, EG: y2=$y+$radius
y2=$(convert xc: -format '%[fx:'"$y"'+'"$radius"']' info:)
echo "circle $x,$y $x,$y2"
done)
# Draw a red line between the points, and blue circles on the points.
convert -size "$canv1"x"$canv2" xc:none \
-draw "fill none stroke red polyline $points " \
-draw "fill none stroke blue $circles " \
$HOME/MesTravaux/shp/points_circle.png
echo "#!/bin/bash" > $HOME/MesTravaux/shp/txt2png.sh
echo "convert $HOME/MesTravaux/shp/points_circle.png \\" >> $HOME/MesTravaux/shp/txt2png.sh
while read line
do
ct=$line
t=$(echo "scale=0; $t+1" / 1 | bc)
echo "-draw \"text $line '"$t"' \" \\" >> $HOME/MesTravaux/shp/txt2png.sh
done < $HOME/MesTravaux/shp/textcoord.txt
echo "circle.png" >> $HOME/MesTravaux/shp/txt2png.sh
echo "exit 0" >> $HOME/MesTravaux/shp/txt2png.sh
chmod +x $HOME/MesTravaux/shp/txt2png.sh
bash $HOME/MesTravaux/shp/txt2png.sh &&
bash $HOME/MesTravaux/shp/distance.sh &&
bash $HOME/MesTravaux/shp/imageviewer.sh &&
exit 0
distance.sh
#!/bin/bash
#rm $HOME/MesTravaux/shp/text.txt
nbligne=$(echo $(sed -n '$=' $HOME/MesTravaux/shp/textcoord.txt))
LIMITE="$nbligne"
c=$(echo "scale=0; $nbligne+1" / 1 | bc)
for ((a=1; a <= LIMITE ; a++))
do
b=$(echo "scale=0; $a+1" / 1 | bc)
if [ "$b" = "$c" ]; then
b=1
fi
coord1=$(echo $(sed -n "$a p" $HOME/MesTravaux/shp/textcoord.txt))
coord2=$(echo $(sed -n "$b p" $HOME/MesTravaux/shp/textcoord.txt))
x1=$(echo "$coord1" | cut -d, -f1)
y1=$(echo "$coord1" | cut -d, -f2)
x2=$(echo "$coord2" | cut -d, -f1)
y2=$(echo "$coord2" | cut -d, -f2)
dist=$(echo "scale=2; sqrt(($x1-$x2)^2+($y1-$y2)^2)" / 1 | bc)
echo "distance point $a point $b : $dist m"
echo "point $a point $b : $dist m" >> $HOME/MesTravaux/shp/text.txt
[ -z "$total" ] && total=0
total=$(echo "scale=2; $total+$dist" /1 | bc)
done
echo "" >> $HOME/MesTravaux/shp/text.txt
echo "Périmètre de la parcelle : $total m"
echo "Périmètre : $total m" >> $HOME/MesTravaux/shp/text.txt
I=$(echo $(sed -n '$=' $HOME/MesTravaux/shp/surfcoord.txt))
J=$(echo "scale=0; $i-1" / 1 | bc)
for ((c=1; c < I ; c++))
do
d=$(echo "scale=0; $c+1" / 1 | bc)
co1=$(echo $(sed -n "$c p" $HOME/MesTravaux/shp/surfcoord.txt))
co2=$(echo $(sed -n "$d p" $HOME/MesTravaux/shp/surfcoord.txt))
x3=$(echo "$co1" | cut -d, -f1)
y3=$(echo "$co2" | cut -d, -f2)
prod1=$(echo "scale=2; $x3*$y3" / 1 | bc)
[ -z "$total1" ] && total1=0
total1=$(echo "scale=2; $total1+$prod1" /1 | bc)
done
for ((c=1; c < I ; c++))
do
d=$(echo "scale=0; $c+1" / 1 | bc)
co1=$(echo $(sed -n "$c p" $HOME/MesTravaux/shp/surfcoord.txt))
co2=$(echo $(sed -n "$d p" $HOME/MesTravaux/shp/surfcoord.txt))
x3=$(echo "$co1" | cut -d, -f2)
y3=$(echo "$co2" | cut -d, -f1)
prod2=$(echo "scale=2; $x3*$y3" / 1 | bc)
[ -z "$total2" ] && total2=0
total2=$(echo "scale=2; $total2+$prod2" /1 | bc)
done
total3=$(echo "scale=2; ($total1-$total2)/2" /1 | bc)
echo ""
echo "surface de la parcelle:$total3 m2"
echo "" >> $HOME/MesTravaux/shp/text.txt
echo "surface : $total3 m2" >> $HOME/MesTravaux/shp/text.txt
convert -pointsize 12 $HOME/MesTravaux/shp/text.png \
-draw "text 10,15 '$(cat text.txt)'" \
t.png
convert circle.png t.png +append output.png
exit 0
imageviewer.sh
#!/bin/bash
img=$HOME/MesTravaux/shp/output.png
export MAIN_DIALOG="<window title=\"Informations complémentaires sur les parcelles\" window_position=\"1\">
<vbox>
<hbox>
<pixmap auto-refresh=\"true\" file-monitor=\"true\">
<variable>IMG</variable>
<input file>$img</input>
</pixmap>
</hbox>
<hbox>
<button>
<input file stock=\"gtk-close\"></input>
<label>Fermer la fenêtre</label>
<action type=\"exit\">MAIN_DIALOG</action>
</button>
</hbox>
</vbox>
</window>"
gtkdialog --program MAIN_DIALOG
exit 0
pour essayer
créer un dossier "MesTravaux/shp" dans votre home
coller les fichiers polygone.sh distance.sh et imageviewer.sh les rendre executable et le fichier de coord dedans et lancer polygone .sh
il faut imagemagick yad et gtkdialog si pas de gtkdialog visionner l'image avec visualiseur ordinaire
merci d'avance pour toute aide
Hors ligne
#2 Le 26/11/2014, à 15:52
- pingouinux
Re : geometrie et imagemagick
Bonjour,
Tu veux couper la parcelle en deux avec une droite parallèle à un segment défini par deux points consécutifs, de façon qu'une des petites parcelles ait une surface déterminée. Est-ce bien ça ? Tiens-tu à le faire en bash ? Python me paraîtrait bien adapté.
J'ai regardé tes scripts, qui me paraissent un peu compliqués. Pourquoi ne travailles-tu pas sur les coordonnées d'origine ?
Voici par exemple le script distances_perimetre_surface.sh qui calcule les longueurs des segments, le périmètre et la surface directement sur parcelle1.txt :
#!/bin/bash
calcul() {
S=$(bc <<<"$S+.5*($4+$2)*($3-$1)")
lon=$(bc <<<"sqrt(($3-$1)^2+($4-$2)^2)")
perim=$(bc <<<"$perim+$lon")
}
S=0;n=0;perim=0
while IFS="," read x2 y2
do
((n++==0)) && { x0=$x2; y0=$y2; x1=$x2; y1=$y2; continue; }
calcul $x1 $y1 $x2 $y2
printf "point %2d point %2d : %7.2f m\n" $((n-1)) $n $lon
x1=$x2; y1=$y2
done <"$1"
calcul $x1 $y1 $x0 $y0
printf "point %2d point %2d : %7.2f m\n\n" $n 1 $lon
printf "Périmètre : %7.2f m\n\nSurface : %8.2f m2\n\n" $perim $S
à appeler ainsi
./distances_perimetre_surface.sh parcelle1.txt
Ajouté : Unités pour la surface
Dernière modification par pingouinux (Le 26/11/2014, à 16:44)
Hors ligne
#3 Le 26/11/2014, à 18:32
- titi89
Re : geometrie et imagemagick
@Pingouinux
Bonjour et merci
oui t'as tout compris ce que je veux
je transforme les coordonnées c'est pour les utiliser pour la construction de l'image .png l'image a juste les dimensions de la parcelle plus 20
oui je veux en bash car je connais que cela (un peu) et je l'intègrerais dans un autre script.
merci pour ton script cela parait bien plus simple.
comme je fonctionne qu'avec des exemples cela va m'aider à simplifier.
encore merci
Hors ligne
#4 Le 26/11/2014, à 22:13
- pingouinux
Re : geometrie et imagemagick
Ce n'est pas du tout évident. Voici comment je verrais les choses :
Choisir une distance
Calculer l'équation d'une droite parallèle au segment initial, et située à la distance choisie
Calculer les intersections de cette droite avec tous les segments initiaux
Déterminer les deux points à retenir (pas évident lorsque la parcelle n'est pas convexe)
Refaire un fichier de coordonnées avec ces deux points et une partie des points initiaux
Refaire le calcul des surfaces à partir de ce fichier réduit, comme tu l'as fait pour la totalité
Recommencer avec une autre distance
Un problème simplifié serait plus accessible : découper la parcelle avec une droite passant par deux des points initiaux, pour qu'une sous-parcelle ait la surface la plus proche possible de la valeur donnée.
Hors ligne
#5 Le 27/11/2014, à 19:28
- titi89
Re : geometrie et imagemagick
merci
oui je vais me remettre dessus d'ici 2-3 jours j'ai pas trop le temps en ce moment
désolé de n'avoir répondu plus tôt
@+
Hors ligne
#6 Le 30/11/2014, à 10:15
- Ferod
Re : geometrie et imagemagick
Bonjour
Je ne connais pas grand chose en script bash mais j'ai réussis à le faire avec un tableur :
http://www.partage-facile.com/YS0WAFFA4 … k.ods.html
J'ai suivi les étapes de pingouinux sauf que j'ai fait les calculs dans un repère particulier. Je tourne la parcelle pour que les deux points choisis soient sur une droite horizontale. Comme ça on sait très facilement si il y a intersection ou pas.
J'ai mis quelques commentaires. Si c'est pas clair tu peux toujours me demander. Le choix de la droite de coupure se fait dans la cellule C36 (tu choisis un point entre le premier et l'avant dernier). L'offset de la droite se fait dans la cellule C40.
Il resterais une chose à faire : faire la boucle pour obtenir une surface voulue.
Bon courage pour traduire tout ça en bash !
"When I was in the military, they gave me a medal for killing
two men, and a descharge for loving one !" Leonard Matlovich
Hors ligne
#7 Le 01/12/2014, à 08:23
- titi89
Re : geometrie et imagemagick
bonjour,
@Ferod
je te remerci d'avoir passé du temps pour moi et je vais regarder cela de plus près dès que j'ai un peu plus de temps
de mon côté j'ai avancé aussi j'y suis arrivé pour l'instant dans un cas: un déplacement du repère de gauche à droite
je rebosse dessus le week-end prochain.
l
@+
Hors ligne
#8 Le 03/12/2014, à 16:36
- titi89
Re : geometrie et imagemagick
bonjour,
j'ai pas mal avancé
une petite demo
voir une petite video
encore du travail mais cela avance
merci à vous
@+
Dernière modification par titi89 (Le 04/12/2014, à 10:42)
Hors ligne
#9 Le 03/12/2014, à 22:06
- Ferod
Re : geometrie et imagemagick
Cette vidéo n'est pas disponible dans votre pays.
Google je te hais !
"When I was in the military, they gave me a medal for killing
two men, and a descharge for loving one !" Leonard Matlovich
Hors ligne
#10 Le 04/12/2014, à 10:48
- titi89
Re : geometrie et imagemagick
@Ferod
désolé
j'avais jamais posté de videos et comme j'écoutais de la musique en même temps
c'est du aux droits d'auteur
j'ai supprimé le son
cela devrait marcher maintenant
dis le moi
@+
Hors ligne
#11 Le 05/12/2014, à 18:41
- Ferod
Re : geometrie et imagemagick
oui effectivement j'ai pu voir la vidéo !
C'est jolie tout ça !
"When I was in the military, they gave me a medal for killing
two men, and a descharge for loving one !" Leonard Matlovich
Hors ligne
#12 Le 18/12/2014, à 19:20
- joko
Re : geometrie et imagemagick
bonjour, titi89 j'ai vu ta vidéo (de très bonne qualité avec mpsyt -mps-youtube-), je suis vraiment bluffé notamment sur l'aspect "imageviewer",
étant un âne en bash, puis-je me permettre de demander d'expliquer -en très gros- le fonctionnement de imageviewer surtout les balises, c'est la première fois que je vois cette façon de faire en bash...
merci encore
Je suis un homme, quoi de plus naturel en somme ?
linux on the rocks
Hors ligne
#13 Le 19/12/2014, à 09:22
- titi89
Re : geometrie et imagemagick
bonjour,
@joko
en fait les balises c'est pour gtkdialog qui permet de faire des interfaces graphique pour les scripts un peu comme du html je crois pas vraiement de rapport avec le bash le principe une balise d'ouverture: <window> et la fin une de fermeture </window> gtkdialog n'est pas dans les dépots officiels
mais tu le trouveras dans le dépot de multisystems de Frafa et il est utilisé sur puppy et maintenu.
pour moi qui n'est pas très doué c'est assez simple d'utilisation et il y a plein d'exemples sur le web
je referai un petite vidéo pour te montrer que l'on peut déjà faire des trucs sympa
@+
Hors ligne
#14 Le 19/12/2014, à 12:20
- joko
Re : geometrie et imagemagick
ok, bien reçu et bien compris, hâte de voir tes vidéos :-)
merci de l'info
Je suis un homme, quoi de plus naturel en somme ?
linux on the rocks
Hors ligne
#15 Le 19/12/2014, à 14:32
- titi89
Re : geometrie et imagemagick
voilà un petit exemple pour mes scripts
video
bash et gtkdialog
@+
Hors ligne
#16 Le 19/12/2014, à 18:00
- joko
Re : geometrie et imagemagick
hello, ai vu la video (toujours en hq via mpsyt),
que dire ? sinon que c'est vraiment bien, des trucs en gtk et bash pourraient utilement agrémenter (et faciliter) la vie de beaucoup.
merci pour cet aperçu...
Je suis un homme, quoi de plus naturel en somme ?
linux on the rocks
Hors ligne
#17 Le 05/04/2015, à 11:02
- titi89
Re : geometrie et imagemagick
bonjour,
cela avance doucement
nouvelle video
video
@+
Dernière modification par titi89 (Le 05/04/2015, à 18:00)
Hors ligne