Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#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 :

  1. Choisir une distance

  2. Calculer l'équation d'une droite parallèle au segment initial, et située à la distance choisie

  3. Calculer les intersections de cette droite avec tous les segments initiaux

  4. Déterminer les deux points à retenir (pas évident lorsque la parcelle n'est pas convexe)

  5. Refaire un fichier de coordonnées avec ces deux points et une partie des points initiaux

  6. Refaire le calcul des surfaces à partir de ce fichier réduit, comme tu l'as fait pour la totalité

  7. 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 ! wink


"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.

meh7-vflGevej7.png
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