{"id":13366,"date":"2026-11-05T00:53:12","date_gmt":"2026-11-05T00:53:12","guid":{"rendered":"https:\/\/aiper.com\/blogs\/?page_id=13366"},"modified":"2026-11-12T04:41:58","modified_gmt":"2026-11-12T04:41:58","slug":"calculadora-superficie-cesped","status":"publish","type":"page","link":"https:\/\/aiper.com\/blogs\/es\/calculadora-superficie-cesped\/","title":{"rendered":"Calculadora de superficie de c\u00e9sped"},"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=\"es\"><p>Calcula per\u00edmetros irregulares a partir de coordenadas medidas, suma zonas y resta exclusiones.<\/p><p>Dibuja v\u00e9rtices medidos en la cuadr\u00edcula de 20 \u00d7 20 metros. A\u00f1ade cada per\u00edmetro y calcula. Borra primero el ejemplo con el bot\u00f3n correspondiente.<\/p><svg id=\"draw-grid\" viewBox=\"0 0 20 20\" role=\"img\" aria-label=\"Cuadr\u00edcula medida: 20 \u00d7 20 metros\"><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\">A\u00f1adir per\u00edmetro de c\u00e9sped<\/button><button type=\"button\" id=\"add-hole\">A\u00f1adir exclusi\u00f3n<\/button><button type=\"button\" id=\"undo-point\">Deshacer v\u00e9rtice<\/button><button type=\"button\" id=\"clear-boundaries\">Borrar todos los per\u00edmetros<\/button><form data-mode=\"area\"><div class=\"fields\"><label>Coordenadas medidas del per\u00edmetro (metros)<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>Usa un punto decimal y separa x e y con una coma (ejemplo: 1.5,2.5).<\/small><\/label><\/div><button type=\"submit\">Calcular<\/button><button type=\"reset\">Restablecer<\/button><\/form><div class=\"result\" role=\"status\" aria-live=\"polite\">Introduce tus medidas y calcula.<\/div><svg id=\"area-diagram\" role=\"img\" aria-label=\"Diagrama de los l\u00edmites medidos\"><\/svg><button id=\"copy-area\" type=\"button\" disabled>Copiar superficie en m\u00b2<\/button><h2>C\u00f3mo funciona el c\u00e1lculo<\/h2><p>Introduce las coordenadas del per\u00edmetro en metros, en sentido horario o antihorario. Cada l\u00ednea contiene x,y; las l\u00edneas vac\u00edas separan pol\u00edgonos. Inicia cada exclusi\u00f3n con una l\u00ednea que contenga solo un signo menos. Usa el mismo sistema de referencia para todas las medidas. Se aplica la f\u00f3rmula del cord\u00f3n. Las zonas incluidas no deben solaparse; las exclusiones deben estar dentro del c\u00e9sped y restarse una sola vez. Se rechazan contornos individuales que se cruzan, pero no se comprueban autom\u00e1ticamente el solapamiento ni la contenci\u00f3n entre pol\u00edgonos. El diagrama representa tus medidas, sin mapa satelital. Copia la superficie neta en m\u00b2 para otras calculadoras.<\/p><h2>Unidades y datos<\/h2><p>Sustituye los ejemplos por tus medidas. 1 pie = 0,3048 m; 1 pie cuadrado = 0,09290304 m\u00b2; 1 pulgada = 25,4 mm; 1 gal\u00f3n estadounidense = 3,785411784 litros. Usa la misma moneda en todos los precios. Un precio cero omite el presupuesto opcional.<\/p><h2>Gu\u00edas para el c\u00e9sped<\/h2><ul><li><a href=\"https:\/\/aiper.com\/blogs\/es\/como-aplicar-cobertura-superior-al-cesped\/\">C\u00f3mo aplicar cobertura superior al c\u00e9sped: la t\u00e9cnica profesional para mejorar la salud del suelo<\/a><\/li><li><a href=\"https:\/\/aiper.com\/blogs\/es\/resembrar-cesped-guia\/\">C\u00f3mo resembrar el c\u00e9sped correctamente: gu\u00eda paso a paso<\/a><\/li><\/ul><h2>M\u00e1s herramientas para el c\u00e9sped<\/h2><p><a href=\"https:\/\/aiper.com\/blogs\/es\/calculadora-tepes\/\">calculadora de tepes<\/a> \u00b7 <a href=\"https:\/\/aiper.com\/blogs\/es\/calculadora-riego-cesped-duracion\/\">calculadora de riego y duraci\u00f3n de aspersores<\/a> \u00b7 <a href=\"https:\/\/aiper.com\/blogs\/es\/calculadora-zonas-aspersores\/\">calculadora de zonas de aspersores<\/a> \u00b7 <a href=\"https:\/\/aiper.com\/blogs\/es\/calculadora-coste-corte-cesped\/\">calculadora de coste de corte de c\u00e9sped<\/a> \u00b7 <a href=\"https:\/\/aiper.com\/blogs\/es\/calculadora-tiempo-corte-cesped\/\">calculadora de tiempo de corte de c\u00e9sped<\/a> \u00b7 <a href=\"https:\/\/aiper.com\/blogs\/es\/calculadora-cal-cesped\/\">calculadora de cal para c\u00e9sped<\/a> \u00b7 <a href=\"https:\/\/aiper.com\/blogs\/es\/calculadora-riego-goteo\/\">calculadora de riego por goteo<\/a> \u00b7 <a href=\"https:\/\/aiper.com\/blogs\/es\/calculadora-semillas-cesped\/\">calculadora de semillas de c\u00e9sped<\/a> \u00b7 <a href=\"https:\/\/aiper.com\/blogs\/es\/calculadora-fertilizante-cesped\/\">calculadora de fertilizante para c\u00e9sped<\/a> \u00b7 <a href=\"https:\/\/aiper.com\/blogs\/es\/herramientas\/\">Herramientas<\/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(\"Introduce todas las medidas necesarias.\");let x=Number(v[k]);if(!Number.isFinite(x)||x<0)throw Error(\"Usa valores finitos y no negativos.\");return x;};\n const p=k=>{let x=n(k);if(x<=0)throw Error(\"Esta medida debe ser mayor que cero.\");return x;};\n const percent=k=>{let x=n(k);if(x>=100)throw Error(\"El porcentaje debe ser inferior a 100.\");return x\/100;};\n let o;\n if(mode==='sod'){\n  let a=p('area'),w=n('waste');if(w>100)throw Error(\"El desperdicio debe estar entre 0 y 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(\"El n\u00famero de aspersores debe ser entero.\");\n  let capacity=Math.floor(p('flow')*(1-percent('reserve'))\/p('nozzle'));\n  if(p('pressure')<p('required'))throw Error(\"La presi\u00f3n de trabajo es inferior a la requerida.\");\n  if(capacity<1)throw Error(\"El caudal no basta para una boquilla con esta reserva.\");\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(\"Introduce los pol\u00edgonos medidos.\");\n  let total=0;\n  for(let poly of polygons){\n   let pts=poly.points;if(!Array.isArray(pts)||pts.length<3)throw Error(\"Cada pol\u00edgono necesita al menos tres v\u00e9rtices.\");\n   for(let pt of pts)if(!Array.isArray(pt)||pt.length!==2||!pt.every(x=>typeof x==='number'&&Number.isFinite(x)))throw Error(\"Cada v\u00e9rtice necesita dos coordenadas finitas.\");\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(\"No repitas v\u00e9rtices.\");\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(\"Los lados no deben cruzarse ni tocarse.\");\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 superficie del pol\u00edgono debe ser positiva.\");\n   if(poly.exclude!==undefined&&typeof poly.exclude!=='boolean')throw Error(\"La exclusi\u00f3n debe ser verdadera o falsa.\");\n   total+=poly.exclude?-a:a;\n  }\n  if(total<=0)throw Error(\"La superficie neta debe ser positiva.\");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(\"Usa como m\u00e1ximo 7 visitas por semana y 52,1775 semanas por a\u00f1o.\");\n  let obstacle=n('obstacle');if(obstacle>100)throw Error(\"El recargo debe estar entre 0 y 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(\"La eficiencia no debe superar el 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(\"Los valores neutralizantes deben ser porcentajes no superiores a 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(\"El n\u00famero de l\u00edneas debe ser entero.\");\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(\"Cada l\u00ednea debe contener al menos un gotero.\");\n  let flow=emitters*p('emitter'),capacity=p('supply')*60*(1-percent('reserve')),linesPerZone=Math.floor(capacity\/flow);\n  if(linesPerZone<1)throw Error(\"El caudal no basta para una l\u00ednea completa de goteo.\");\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(\"Calculadora desconocida.\");\n if(Object.values(o).some(x=>!Number.isFinite(x)))throw Error(\"Las medidas superan el intervalo admitido.\");\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\": \"Superficie neta medida (m\u00b2)\", \"sqft\": \"Superficie neta medida (pies cuadrados)\"};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(\"Usa una coordenada x,y por l\u00ednea.\");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(\"es\",{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=\"Introduce tus medidas y calcula.\";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(\" Superficie copiada en m\u00b2.\"));}catch(e){result.append(document.createTextNode(\" Copia la superficie manualmente: \"+last+' m\u00b2.'));}});\n})();\n(()=>{let r=document.getElementById('lawn-tool');r.querySelector('form').addEventListener('input',()=>{r.querySelector('.result').textContent=\"Introduce tus medidas y calcula.\";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=[\"Dibuja v\u00e9rtices medidos en la cuadr\u00edcula de 20 \u00d7 20 metros. A\u00f1ade cada per\u00edmetro y calcula. Borra primero el ejemplo con el bot\u00f3n correspondiente.\", \"A\u00f1adir per\u00edmetro de c\u00e9sped\", \"A\u00f1adir exclusi\u00f3n\", \"Deshacer v\u00e9rtice\", \"Borrar todos los per\u00edmetros\", \"Se necesitan al menos tres v\u00e9rtices.\", \"Cuadr\u00edcula medida: 20 \u00d7 20 metros\"][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=\"Introduce tus medidas y calcula.\";};root.querySelector('form').addEventListener('reset',()=>{pts=[];draw();});})();<\/script>\n","protected":false},"excerpt":{"rendered":"<p>Calcula per\u00edmetros irregulares a partir de coordenadas medidas, suma zonas y resta exclusiones. Dibuja v\u00e9rtices medidos en la cuadr\u00edcula de 20 \u00d7 20 metros. A\u00f1ade cada per\u00edmetro y calcula. Borra primero el ejemplo con el bot\u00f3n correspondiente. A\u00f1adir per\u00edmetro de c\u00e9spedA\u00f1adir exclusi\u00f3nDeshacer v\u00e9rticeBorrar todos los per\u00edmetros Coordenadas medidas del per\u00edmetro (metros)0,0 10,0 10,10 0,10 &#8211; [&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-13366","page","type-page","status-publish","hentry"],"lang":"es","translations":{"es":13366,"fr":13365,"de":13364,"en":13363},"_links":{"self":[{"href":"https:\/\/aiper.com\/blogs\/wp-json\/wp\/v2\/pages\/13366","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=13366"}],"version-history":[{"count":3,"href":"https:\/\/aiper.com\/blogs\/wp-json\/wp\/v2\/pages\/13366\/revisions"}],"predecessor-version":[{"id":13486,"href":"https:\/\/aiper.com\/blogs\/wp-json\/wp\/v2\/pages\/13366\/revisions\/13486"}],"wp:attachment":[{"href":"https:\/\/aiper.com\/blogs\/wp-json\/wp\/v2\/media?parent=13366"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}