{"id":13365,"date":"2026-11-05T00:53:06","date_gmt":"2026-11-05T00:53:06","guid":{"rendered":"https:\/\/aiper.com\/blogs\/?page_id=13365"},"modified":"2026-11-12T04:41:58","modified_gmt":"2026-11-12T04:41:58","slug":"calculateur-surface-pelouse","status":"publish","type":"page","link":"https:\/\/aiper.com\/blogs\/fr\/calculateur-surface-pelouse\/","title":{"rendered":"Calculateur de surface de pelouse"},"content":{"rendered":"\n<style>#lawn-tool{max-width:960px;margin:24px auto;color:#243746}#lawn-tool *{box-sizing:border-box}#lawn-tool .fields{display:grid;grid-template-columns:repeat(auto-fit,minmax(min(100%,240px),1fr));gap:18px}#lawn-tool label{display:block;font-weight:600}#lawn-tool input,#lawn-tool textarea{display:block;width:100%;padding:12px;border:1px solid #9aacb5;border-radius:8px;margin-top:6px;font:inherit}#lawn-tool button{padding:12px 20px;margin:18px 10px 10px 0;border:2px solid #1ecad3;border-radius:8px;background:#1ecad3;color:#1a202c;cursor:pointer;font:inherit}#lawn-tool button[type=reset],#lawn-tool #copy-area{background:white}#lawn-tool button:focus-visible,#lawn-tool input:focus-visible,#lawn-tool textarea:focus-visible{outline:3px solid #9486f7;outline-offset:3px;color:#1a202c}#lawn-tool button:active{color:#1a202c}#lawn-tool .result{background:#edf7f8;border-left:4px solid #1ecad3;padding:18px;margin:16px 0;overflow-wrap:anywhere}#lawn-tool svg{width:100%;height:300px;border:1px solid #b8cbd2}#lawn-tool a{color:#08778b}<\/style><div id=\"lawn-tool\" lang=\"fr\"><p>Mesurez des contours irr\u00e9guliers \u00e0 partir de coordonn\u00e9es relev\u00e9es et soustrayez les exclusions.<\/p><p>Placez les sommets mesur\u00e9s sur la grille de 20 \u00d7 20 m\u00e8tres. Ajoutez chaque contour, puis calculez. Effacez d\u2019abord les exemples avec le bouton pr\u00e9vu.<\/p><svg id=\"draw-grid\" viewBox=\"0 0 20 20\" role=\"img\" aria-label=\"Grille mesur\u00e9e : 20 \u00d7 20 m\u00e8tres\"><defs><pattern id=\"metre-grid\" width=\"1\" height=\"1\" patternUnits=\"userSpaceOnUse\"><path d=\"M 1 0 L 0 0 0 1\" fill=\"none\" stroke=\"#c5ddd9\" stroke-width=\".03\"\/><\/pattern><\/defs><rect width=\"20\" height=\"20\" fill=\"url(#metre-grid)\"\/><\/svg><button type=\"button\" id=\"add-lawn\">Ajouter un contour de pelouse<\/button><button type=\"button\" id=\"add-hole\">Ajouter une exclusion<\/button><button type=\"button\" id=\"undo-point\">Annuler le sommet<\/button><button type=\"button\" id=\"clear-boundaries\">Effacer tous les contours<\/button><form data-mode=\"area\"><div class=\"fields\"><label>Coordonn\u00e9es mesur\u00e9es du contour (m\u00e8tres)<textarea name=\"coordinates\" rows=\"12\" required>0,0\n10,0\n10,10\n0,10\n\n&#8211;\n1,1\n3,1\n3,3\n1,3<\/textarea><small>Utilisez un point d\u00e9cimal et s\u00e9parez x et y par une virgule (exemple : 1.5,2.5).<\/small><\/label><\/div><button type=\"submit\">Calculer<\/button><button type=\"reset\">R\u00e9initialiser<\/button><\/form><div class=\"result\" role=\"status\" aria-live=\"polite\">Saisissez vos mesures et lancez le calcul.<\/div><svg id=\"area-diagram\" role=\"img\" aria-label=\"Sch\u00e9ma des contours mesur\u00e9s\"><\/svg><button id=\"copy-area\" type=\"button\" disabled>Copier la surface en m\u00b2<\/button><h2>M\u00e9thode de calcul<\/h2><p>Saisissez les coordonn\u00e9es du contour en m\u00e8tres, dans l\u2019un des deux sens de rotation. Chaque ligne contient x,y ; une ligne vide s\u00e9pare les polygones. Commencez une exclusion par une ligne contenant uniquement un signe moins. Utilisez le m\u00eame rep\u00e8re pour toutes les mesures. La surface est calcul\u00e9e avec la formule du lacet. Les zones incluses ne doivent pas se chevaucher ; les exclusions doivent rester \u00e0 l\u2019int\u00e9rieur de la pelouse et \u00eatre d\u00e9duites une seule fois. Les contours qui se croisent sont refus\u00e9s, mais le chevauchement et l\u2019inclusion entre polygones ne sont pas v\u00e9rifi\u00e9s automatiquement. Le sch\u00e9ma repr\u00e9sente vos mesures, sans carte satellite. Copiez la surface nette en m\u00b2 pour les autres calculateurs.<\/p><h2>Unit\u00e9s et donn\u00e9es<\/h2><p>Remplacez les exemples par vos mesures. 1 pied = 0,3048 m ; 1 pied carr\u00e9 = 0,09290304 m\u00b2 ; 1 pouce = 25,4 mm ; 1 gallon am\u00e9ricain = 3,785411784 litres. Utilisez la m\u00eame devise pour tous les prix. Un prix nul masque le budget facultatif.<\/p><h2>Guides pour la pelouse<\/h2><ul><li><a href=\"https:\/\/aiper.com\/blogs\/fr\/comment-realiser-le-terreautage-d-une-pelouse\/\">Comment r\u00e9aliser le terreautage d\u2019une pelouse\u00a0: la technique pro pour une terre en pleine sant\u00e9<\/a><\/li><li><a href=\"https:\/\/aiper.com\/blogs\/fr\/sursemer-pelouse-guide\/\">Comment sursemer une pelouse correctement : guide \u00e9tape par \u00e9tape<\/a><\/li><\/ul><h2>Autres outils pour la pelouse<\/h2><p><a href=\"https:\/\/aiper.com\/blogs\/fr\/calculateur-gazon-en-rouleaux\/\">calculateur de gazon en rouleaux<\/a> \u00b7 <a href=\"https:\/\/aiper.com\/blogs\/fr\/calculateur-arrosage-pelouse-duree\/\">calculateur d\u2019arrosage et de dur\u00e9e des arroseurs<\/a> \u00b7 <a href=\"https:\/\/aiper.com\/blogs\/fr\/calculateur-zones-arrosage\/\">calculateur de zones d\u2019arrosage<\/a> \u00b7 <a href=\"https:\/\/aiper.com\/blogs\/fr\/calculateur-cout-tonte-pelouse\/\">calculateur de co\u00fbt de tonte<\/a> \u00b7 <a href=\"https:\/\/aiper.com\/blogs\/fr\/calculateur-temps-tonte\/\">calculateur de temps de tonte<\/a> \u00b7 <a href=\"https:\/\/aiper.com\/blogs\/fr\/calculateur-chaux-pelouse\/\">calculateur de chaux pour pelouse<\/a> \u00b7 <a href=\"https:\/\/aiper.com\/blogs\/fr\/calculateur-irrigation-goutte-a-goutte\/\">calculateur d\u2019irrigation goutte \u00e0 goutte<\/a> \u00b7 <a href=\"https:\/\/aiper.com\/blogs\/fr\/calculateur-semences-gazon\/\">calculateur de semences de gazon<\/a> \u00b7 <a href=\"https:\/\/aiper.com\/blogs\/fr\/calculateur-engrais-pelouse\/\">calculateur d\u2019engrais pour pelouse<\/a> \u00b7 <a href=\"https:\/\/aiper.com\/blogs\/fr\/outils\/\">Outils<\/a><\/p><\/div><script>\/* SI units internally; no external services or weather assumptions. *\/\nfunction calculateLawn(mode,v){\n const n=k=>{if(v[k]===undefined||String(v[k]).trim()==='')throw Error(\"Saisissez toutes les mesures requises.\");let x=Number(v[k]);if(!Number.isFinite(x)||x<0)throw Error(\"Utilisez des valeurs finies et positives ou nulles.\");return x;};\n const p=k=>{let x=n(k);if(x<=0)throw Error(\"Cette mesure doit \u00eatre sup\u00e9rieure \u00e0 z\u00e9ro.\");return x;};\n const percent=k=>{let x=n(k);if(x>=100)throw Error(\"Le pourcentage doit \u00eatre inf\u00e9rieur \u00e0 100.\");return x\/100;};\n let o;\n if(mode==='sod'){\n  let a=p('area'),w=n('waste');if(w>100)throw Error(\"Les pertes doivent \u00eatre comprises entre 0 et 100 %.\");\n  let q=a*(1+w\/100);o={required:q,pieces:Math.ceil(q\/p('piece')-1e-10),pallets:Math.ceil(q\/p('pallet')-1e-10)};\n  if(n('price')>0)o.budget=q*n('price');\n }else if(mode==='watering'){\n  let depth=Math.max(0,n('target')-n('rain')),minutes=depth\/p('rate')*60,water=p('area')*depth;\n  o={depth,minutes,litres:water};if(n('price')>0)o.budget=water\/1000*n('price');\n }else if(mode==='zone'){\n  let heads=p('heads');if(!Number.isInteger(heads))throw Error(\"Le nombre d\u2019arroseurs doit \u00eatre entier.\");\n  let capacity=Math.floor(p('flow')*(1-percent('reserve'))\/p('nozzle'));\n  if(p('pressure')<p('required'))throw Error(\"La pression de service est inf\u00e9rieure au minimum requis.\");\n  if(capacity<1)throw Error(\"Le d\u00e9bit ne suffit pas pour une buse avec cette r\u00e9serve.\");\n  o={capacity,zones:Math.ceil(heads\/capacity)};\n }else if(mode==='area'){\n  let polygons=JSON.parse(v.polygons);if(!Array.isArray(polygons)||!polygons.length)throw Error(\"Saisissez les polygones mesur\u00e9s.\");\n  let total=0;\n  for(let poly of polygons){\n   let pts=poly.points;if(!Array.isArray(pts)||pts.length<3)throw Error(\"Chaque polygone exige au moins trois sommets.\");\n   for(let pt of pts)if(!Array.isArray(pt)||pt.length!==2||!pt.every(x=>typeof x==='number'&&Number.isFinite(x)))throw Error(\"Chaque sommet exige deux coordonn\u00e9es finies.\");\n   \/\/ Reject crossings, touching edges, repeated vertices and degenerate edges.\n   let cross=(a,b,c)=>(b[0]-a[0])*(c[1]-a[1])-(b[1]-a[1])*(c[0]-a[0]);\n   let on=(a,b,c)=>Math.abs(cross(a,b,c))<1e-9&&c[0]>=Math.min(a[0],b[0])-1e-9&&c[0]<=Math.max(a[0],b[0])+1e-9&&c[1]>=Math.min(a[1],b[1])-1e-9&&c[1]<=Math.max(a[1],b[1])+1e-9;\n   for(let i=0;i<pts.length;i++)for(let j=i+1;j<pts.length;j++){\n    if(pts[i][0]===pts[j][0]&&pts[i][1]===pts[j][1])throw Error(\"Ne r\u00e9p\u00e9tez pas les sommets.\");\n    if(j===i+1||i===0&&j===pts.length-1)continue;\n    let a=pts[i],b=pts[(i+1)%pts.length],c=pts[j],d=pts[(j+1)%pts.length];\n    if(cross(a,b,c)*cross(a,b,d)<0&&cross(c,d,a)*cross(c,d,b)<0||on(a,b,c)||on(a,b,d)||on(c,d,a)||on(c,d,b))throw Error(\"Les c\u00f4t\u00e9s ne doivent ni se croiser ni se toucher.\");\n   }\n   let a=Math.abs(pts.reduce((s,p,i)=>s+p[0]*pts[(i+1)%pts.length][1]-pts[(i+1)%pts.length][0]*p[1],0))\/2;\n   if(a<=0)throw Error(\"La surface du polygone doit \u00eatre positive.\");\n   if(poly.exclude!==undefined&&typeof poly.exclude!=='boolean')throw Error(\"L\u2019exclusion doit \u00eatre vraie ou fausse.\");\n   total+=poly.exclude?-a:a;\n  }\n  if(total<=0)throw Error(\"La surface nette doit \u00eatre positive.\");o={area:total,sqft:total\/0.09290304};\n }else if(mode==='mowing-cost'){\n  let area=p('area'),frequency=p('frequency'),weeks=p('weeks');\n  if(frequency>7||weeks>52.1775)throw Error(\"Utilisez au maximum 7 passages par semaine et 52,1775 semaines par an.\");\n  let obstacle=n('obstacle');if(obstacle>100)throw Error(\"La majoration doit \u00eatre comprise entre 0 et 100 %.\");\n  let visit=Math.max(n('minimum'),n('base')+area\/100*n('rate')+n('edging'))*(1+obstacle\/100),visits=Math.ceil(frequency*weeks-1e-10);\n  o={visits};if(visit>0)Object.assign(o,{visit,month:visit*frequency*52.1775\/12,season:visit*visits});\n }else if(mode==='mowing-time'){\n  let area=p('area'),width=p('width')\/100,speed=p('speed')*1000,overlap=percent('overlap'),eff=p('efficiency')\/100;\n  if(eff>1)throw Error(\"L\u2019efficacit\u00e9 ne doit pas d\u00e9passer 100 %.\");\n  let productivity=width*(1-overlap)*speed*eff,minutes=area\/productivity*60;\n  o={effective:width*(1-overlap)*100,productivity,minutes,total:minutes+n('extra')};\n }else if(mode==='lime'){\n  let area=p('area'),rate=n('lab'),reference=p('reference'),product=p('product');\n  if(reference>200||product>200)throw Error(\"Les valeurs neutralisantes doivent \u00eatre des pourcentages au plus \u00e9gaux \u00e0 200.\");\n  let adjusted=rate*reference\/product,total=area\/100*adjusted;\n  o={adjusted,total,bags:Math.ceil(total\/p('bag')-1e-10)};\n  let cap=n('cap');if(cap>0){let passes=Math.max(1,Math.ceil(adjusted\/cap-1e-10));o.passes=total>0?passes:0;o.perpass=total>0?total\/passes:0;}\n }else if(mode==='drip'){\n  let length=p('length'),spacing=p('spacing'),lines=p('lines');\n  if(!Number.isInteger(lines))throw Error(\"Le nombre de lignes doit \u00eatre entier.\");\n  \/\/ Assumes the first emitter is one spacing from the inlet, not at x=0.\n  let emitters=Math.floor(length\/spacing+1e-10);if(emitters<1)throw Error(\"Chaque ligne doit comporter au moins un goutteur.\");\n  let flow=emitters*p('emitter'),capacity=p('supply')*60*(1-percent('reserve')),linesPerZone=Math.floor(capacity\/flow);\n  if(linesPerZone<1)throw Error(\"Le d\u00e9bit ne suffit pas pour une ligne compl\u00e8te.\");\n  let minutes=n('litres')\/p('emitter')*60,zones=Math.ceil(lines\/linesPerZone);\n  o={emitters,totalemitters:emitters*lines,flow:flow*lines\/60,linesperzone:linesPerZone,zones,minutes,totalminutes:minutes*zones,water:emitters*lines*n('litres')};\n }else throw Error(\"Calculateur inconnu.\");\n if(Object.values(o).some(x=>!Number.isFinite(x)))throw Error(\"Les mesures d\u00e9passent la plage prise en charge.\");\n return o;\n}\nif(typeof module!=='undefined')module.exports=calculateLawn;\n\n(()=>{const root=document.getElementById('lawn-tool'),form=root.querySelector('form'),result=root.querySelector('.result'),labels={\"area\": \"Surface nette mesur\u00e9e (m\u00b2)\", \"sqft\": \"Surface nette mesur\u00e9e (pieds carr\u00e9s)\"};let last=null;\nfunction polygons(text){return text.trim().split(\/\\n\\s*\\n\/).map(block=>{let rows=block.trim().split(\/\\n\/),exclude=\/^[-\u2013\u2014]$\/.test(rows[0].trim());if(exclude)rows.shift();return {exclude,points:rows.map(row=>{let parts=row.trim().split(\/\\s*,\\s*\/);if(parts.length!==2||parts.some(p=>!p.trim()))throw Error(\"Saisissez une coordonn\u00e9e x,y par ligne.\");return parts.map(Number);})};});}\nform.addEventListener('submit',e=>{e.preventDefault();last=null;try{let v=Object.fromEntries(new FormData(form));let polys;if(form.dataset.mode==='area'){polys=polygons(v.coordinates);v.polygons=JSON.stringify(polys);}let out=calculateLawn(form.dataset.mode,v);result.replaceChildren();for(let [key,value]of Object.entries(out)){let p=document.createElement('p');p.textContent=labels[key]+': '+value.toLocaleString(\"fr\",{maximumFractionDigits:3});result.append(p);}if(polys){let svg=root.querySelector('#area-diagram'),all=polys.flatMap(p=>p.points),xs=all.map(p=>p[0]),ys=all.map(p=>p[1]),minx=Math.min(...xs),miny=Math.min(...ys),w=Math.max(...xs)-minx,h=Math.max(...ys)-miny;svg.replaceChildren();svg.setAttribute('viewBox',[minx-1,miny-1,w+2,h+2].join(' '));for(let poly of polys){let shape=document.createElementNS('http:\/\/www.w3.org\/2000\/svg','polygon');shape.setAttribute('points',poly.points.map(p=>p.join(',')).join(' '));shape.setAttribute('fill',poly.exclude?'#fff':'#b4e8c1');shape.setAttribute('stroke','#147e91');shape.setAttribute('stroke-width',Math.max(w,h)\/200);svg.append(shape);}last=out.area;root.querySelector('#copy-area').disabled=false;}}\ncatch(err){result.textContent=err.message;if(root.querySelector('#copy-area'))root.querySelector('#copy-area').disabled=true;}});\nform.addEventListener('reset',()=>{last=null;result.textContent=\"Saisissez vos mesures et lancez le calcul.\";let svg=root.querySelector('#area-diagram');if(svg)svg.replaceChildren();let b=root.querySelector('#copy-area');if(b)b.disabled=true;});\nlet copy=root.querySelector('#copy-area');if(copy)copy.addEventListener('click',async()=>{if(last===null)return;try{await navigator.clipboard.writeText(String(last));result.append(document.createTextNode(\" Surface copi\u00e9e en m\u00b2.\"));}catch(e){result.append(document.createTextNode(\" Copier la surface manuellement : \"+last+' m\u00b2.'));}});\n})();\n(()=>{let r=document.getElementById('lawn-tool');r.querySelector('form').addEventListener('input',()=>{r.querySelector('.result').textContent=\"Saisissez vos mesures et lancez le calcul.\";let b=r.querySelector('#copy-area');if(b)b.disabled=true;let s=r.querySelector('#area-diagram');if(s)s.replaceChildren();});})();(()=>{let root=document.getElementById('lawn-tool'),svg=root.querySelector('#draw-grid');if(!svg)return;let pts=[],text=root.querySelector('[name=coordinates]'),out=root.querySelector('.result');function draw(){svg.querySelectorAll('.vertex,.edge').forEach(x=>x.remove());let line=document.createElementNS(svg.namespaceURI,'polyline');line.setAttribute('class','edge');line.setAttribute('points',pts.map(p=>p.join(',')).join(' '));line.setAttribute('stroke','#176d78');line.setAttribute('stroke-width','.12');line.setAttribute('fill','none');svg.append(line);for(let p of pts){let x=document.createElementNS(svg.namespaceURI,'circle');x.setAttribute('class','vertex');x.setAttribute('cx',p[0]);x.setAttribute('cy',p[1]);x.setAttribute('r','.2');x.setAttribute('fill','#176d78');svg.append(x);}}\nsvg.addEventListener('click',e=>{let p=svg.createSVGPoint();p.x=e.clientX;p.y=e.clientY;p=p.matrixTransform(svg.getScreenCTM().inverse());if(p.x<0||p.x>20||p.y<0||p.y>20)return;pts.push([Math.round(p.x*100)\/100,Math.round(p.y*100)\/100]);draw();});\nfunction append(exclude){if(pts.length<3){out.textContent=[\"Placez les sommets mesur\u00e9s sur la grille de 20 \u00d7 20 m\u00e8tres. Ajoutez chaque contour, puis calculez. Effacez d\u2019abord les exemples avec le bouton pr\u00e9vu.\", \"Ajouter un contour de pelouse\", \"Ajouter une exclusion\", \"Annuler le sommet\", \"Effacer tous les contours\", \"Trois sommets au minimum sont requis.\", \"Grille mesur\u00e9e : 20 \u00d7 20 m\u00e8tres\"][5];return;}let block=(exclude?'-\\n':'')+pts.map(p=>p.join(',')).join('\\n');text.value=(text.value.trim()?text.value.trim()+'\\n\\n':'')+block;pts=[];draw();root.querySelector('form').requestSubmit();}\nroot.querySelector('#add-lawn').onclick=()=>append(false);root.querySelector('#add-hole').onclick=()=>append(true);root.querySelector('#undo-point').onclick=()=>{pts.pop();draw();};root.querySelector('#clear-boundaries').onclick=()=>{pts=[];text.value='';draw();root.querySelector('#area-diagram').replaceChildren();root.querySelector('#copy-area').disabled=true;out.textContent=\"Saisissez vos mesures et lancez le calcul.\";};root.querySelector('form').addEventListener('reset',()=>{pts=[];draw();});})();<\/script>\n","protected":false},"excerpt":{"rendered":"<p>Mesurez des contours irr\u00e9guliers \u00e0 partir de coordonn\u00e9es relev\u00e9es et soustrayez les exclusions. Placez les sommets mesur\u00e9s sur la grille de 20 \u00d7 20 m\u00e8tres. Ajoutez chaque contour, puis calculez. Effacez d\u2019abord les exemples avec le bouton pr\u00e9vu. Ajouter un contour de pelouseAjouter une exclusionAnnuler le sommetEffacer tous les contours Coordonn\u00e9es mesur\u00e9es du contour (m\u00e8tres)0,0 [&hellip;]<\/p>\n","protected":false},"author":3,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"aiper_reading_time":2,"aiper_last_reviewed":"","aiper_reviewer":0,"aiper_related_ids":[],"aiper_layout":"","footnotes":""},"class_list":["post-13365","page","type-page","status-publish","hentry"],"lang":"fr","translations":{"fr":13365,"es":13366,"de":13364,"en":13363},"_links":{"self":[{"href":"https:\/\/aiper.com\/blogs\/wp-json\/wp\/v2\/pages\/13365","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/aiper.com\/blogs\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/aiper.com\/blogs\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/aiper.com\/blogs\/wp-json\/wp\/v2\/users\/3"}],"replies":[{"embeddable":true,"href":"https:\/\/aiper.com\/blogs\/wp-json\/wp\/v2\/comments?post=13365"}],"version-history":[{"count":3,"href":"https:\/\/aiper.com\/blogs\/wp-json\/wp\/v2\/pages\/13365\/revisions"}],"predecessor-version":[{"id":13485,"href":"https:\/\/aiper.com\/blogs\/wp-json\/wp\/v2\/pages\/13365\/revisions\/13485"}],"wp:attachment":[{"href":"https:\/\/aiper.com\/blogs\/wp-json\/wp\/v2\/media?parent=13365"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}