惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

Exploit-DB.com RSS Feed
Exploit-DB.com RSS Feed
Engineering at Meta
Engineering at Meta
博客园 - 三生石上(FineUI控件)
The GitHub Blog
The GitHub Blog
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
S
Schneier on Security
Vercel News
Vercel News
A
Arctic Wolf
G
Google Developers Blog
H
Hackread – Cybersecurity News, Data Breaches, AI and More
雷峰网
雷峰网
AWS News Blog
AWS News Blog
V
Visual Studio Blog
Cyberwarzone
Cyberwarzone
爱范儿
爱范儿
博客园 - 司徒正美
NISL@THU
NISL@THU
N
News | PayPal Newsroom
N
News and Events Feed by Topic
Scott Helme
Scott Helme
I
InfoQ
Project Zero
Project Zero
CTFtime.org: upcoming CTF events
CTFtime.org: upcoming CTF events
T
Tenable Blog
Help Net Security
Help Net Security
D
Docker
IT之家
IT之家
人人都是产品经理
人人都是产品经理
C
Cisco Blogs
Cisco Talos Blog
Cisco Talos Blog
PCI Perspectives
PCI Perspectives
aimingoo的专栏
aimingoo的专栏
博客园 - Franky
G
GRAHAM CLULEY
阮一峰的网络日志
阮一峰的网络日志
T
The Exploit Database - CXSecurity.com
Recent Announcements
Recent Announcements
博客园 - 【当耐特】
L
LINUX DO - 热门话题
J
Java Code Geeks
C
Cyber Attacks, Cyber Crime and Cyber Security
GbyAI
GbyAI
Google DeepMind News
Google DeepMind News
The Hacker News
The Hacker News
H
Hacker News: Front Page
K
KPMG report finds enterprise disconnect between AI and its ROI | CIO
SecWiki News
SecWiki News
T
Tailwind CSS Blog
www.infosecurity-magazine.com
www.infosecurity-magazine.com
罗磊的独立博客

DEV Community

Authentication Security Deep Dive: From Brute Force to Salted Hashing (With Java Examples) Why AI Systems Don’t Fail — They Drift Spilling beans for how i learn for exam😁"Reinforcement Learning Cheat Sheet" I Replaced Chrome with Safari for AI Browser Automation. Here's What Broke (and What Finally Worked) How Python Borrows Other People's Work The $40 Architecture: Processing 1 Billion API Requests with 99.99% Uptime Vibe Coding: A Workflow Guide (From Zero to SaaS) Most webhook security guides protect the wrong side. The scary part is delivery. Headless CMS for TanStack Start: Build a Blog with Cosmic EU Age Verification App "Hacked in 2 Minutes" — What Actually Happened Comfy Cloud’s delete function does not actually remove files Running AI Models on GPU Cloud Servers: A Beginner Guide Event-driven media intelligence with AWS Step Functions and Bedrock I scored 500 AI prompts across 8 quality dimensions — here's what broke How to Call Google Gemini API from Next.js (Free Tier, No Backend Needed) The Portal Protocol: Reclaiming Human Connection in the Age of AI How to Fix Your Team's Scattered Knowledge Problem With a Self-Hosted Forum Intro to tc Cloud Functors: A Graph-First Mental Model for the Modern Cloud Designing Multi-Tenant Backends With Both Ownership and Team Access I Built a Neumorphic CSS Library with 77+ Components — Here's What I Learned PostgreSQL Performance Optimization: Why Connection Pooling Is Critical at Scale Cómo construí un SaaS multi-rubro para gestionar expensas en Argentina con FastAPI + Vue 3 🚀 I Built an Ethical Hacking Scanner Tool – Open Source Project I Replaced /usage and /context in Claude Code With a Single Statusline A Pythonic Way to Handle Emails (IMAP/SMTP) with Auto-Discovery and AI-Ready Design I Collected 8.9 Million Polymarket Price Points — Here's What I Found About How Markets Really Move EcoTrack AI — Carbon Footprint Tracker & Dashboard Everyone's Using AI. No One Agrees How. 5 self-hosted ebook managers worth trying in 2026 Building Your First AI Agent with LangChain: From Chatbot to Autonomous Assistant Common SOC 2 Failures (Real World) Stop Vibe-Checking Your AI App: A Practical Guide to Evals How to Use SonarQube and SonarScanner Locally to Level Up Your Code Quality Your Next To-Do App Is Dead — I Replaced Mine with an OpenClaw AI Sign a Nostr event in 60 lines of Python using coincurve — no nostr-sdk, no nbxplorer, no rust toolchain ITGC Audit Explained Like You’re in Big 4 Patch Tuesday abril 2026: Microsoft parcha 163 vulnerabilidades y un zero-day en SharePoint Stop scraping everything: a better way to track competitor price changes Listing on MCPize + the Official MCP Registry while routing payments OUTSIDE the marketplace — how I kept 100% of my x402 revenue Building an AI-Powered Risk Intelligence System Using Serverless Architecture Why We Ripped Function Overloading Out of Our AI Toolchain Testing AI-Generated Code: How to Actually Know If It Works SaaS Churn Is Killing Your Business. Here Is What to Do About It (Without a Support Team) The Speed of AI Is No Longer Linear - And Self-Improving Models Are Why How to Implement RBAC for MCP Tools: A Practical Guide for Engineering Teams From Standard Quote to Persuasive Proposal: AI Automation for Arborists I built a CLI that scaffolds complete multi-tenant SaaS apps Axios CVE-2025–62718: The Silent SSRF Bug That Could Be Hiding in Your Node.js App Right Now The dashboard that ended our friendship Data Pipelines Explained Simply (and How to Build Them with Python) The Hidden Cost of AI Systems Nobody Talks About. undefined vs undeclared, and how typeof behaves Switching from file-based jobs to NATS/Kafka in Rust without changing code io_uring Adventures: Rust Servers That Love Syscalls Why Agentic AI is Killing the Traditional Database The POUR principles of web accessibility for developers and designers Quantum Neural Network 3D — A Deep Dive into Interactive WebGL Visualization How To Install Caveman In Codex On macOS And Windows Automation Pipeline Reliability: Why Your Workflow Breaks When Nobody Is Watching I Built an 'Open World' AI Coding Agent — It Works From ANY Folder From Freelancing to Product: A Tech Service Company's SaaS Transformation China's AI Giants: Adding Tencent Hunyuan & ByteDance Doubao to AI University (74 Providers) On the Vibe Coders and Their Lies clerk: Auto-Summarize Your Claude Code Sessions AI Weekly — 2026/04/10–04/17 | The Model Lockdown Is Here, but the Toolchain Is the Real Battleground AI 週報 — 2026/04/10–2026/04/17 模型封鎖潮來了,但工具鏈才是真戰場 Maybe this is how Open-Source apps are born... 🚀 Fine-Tune LLMs with LoRA and QLoRA: 2026 Guide tRPC v11 + Next.js App Router: End-to-End Type Safety Without the Boilerplate ShadCN UI in 2026: Why I Stopped Installing Component Libraries and Started Owning My Components SaaS Billing in React Server Components: Stripe + Supabase Without a Single `useEffect` Join our DEV Weekend Challenge — $1,000 in Prizes Across TEN winners! Submissions Due April 20 at 6:59 AM UTC. Implementing FSRS Spaced Repetition in Flutter + Supabase — Adding Memory Science to an AI Learning App "I Texted My Localhost From the Train — Claude Code Fixed the Bug Before I Got Home" I Built a Sales Prep AI and It Went Deeper Than Expected Design to Code #2: One JSON, Eleven Outputs Solving the 100M-Row Problem: A Summary Table Pattern for High-Volume Push Notification Logs Flutter Web With Wasm: What Actually Changes For Developers I Built 50 Royalty-Free Soundtracks for My Side Project in a Weekend Using AI Music Generation The Vibe Coding Security Checklist: 7 Things to Check Before You Ship Stop Letting Googlebot Guess Fix Your React App's SEO Right Desconstruindo o Streaming do LinkedIn: Como Criar um Engine de Extração de Vídeo de Alta Performance com HLS e FFmpeg (EDA Part-1) EDA (Exploratory Data Analysis) Explained With Real Life — Why Looking at Your Data Is the Most Important Step in Machine Learning Brand Relationship Management at Scale: Our 4-Touch Outreach System for 200+ Brands Why String.fromEnvironment() Might Return an Empty String in Dart JGuardrails 1.0.0 — Hardening Java LLM Apps Against Jailbreaks, Toxicity, and Prompt Injection Plan and Schedule a Full Week of Threads Content From One Claude Conversation Coding Cat Oran Ep3, Five Tables Changed Everything Updated: BFF Pattern I'm done watching freelancers get buried by 200 proposals. So I'm building the alternative. This is my first post BFS Algorithm in Java Step by Step Tutorial with Examples Tracking LLM Pricing Monthly: An Open Dataset for 22 AI Models How We Measure Content ROI on a Comparison Site: Revenue Attribution Without Perfect Data Introducing Nova AI Ops: The AI-Native Operating System for SRE Teams I built a free desktop video downloader for Windows — Grabbit How Talkie OCR Helps Vision-Impaired & Dyslexic Users Read the World Around Them VRCFaceTracking安装和iPhone面捕配置教程,有bug Even CrowdStrike Can't See Your Agents The Automation Gold Rush: What n8n Workflows and Claude Are Opening Up for Developers Right Now
Distancia en una Esfera
Denelesan · 2026-05-06 · via DEV Community

De aquí hasta China

Medir distancias es una tarea sencilla cuando se trata de objetos pequeños y cotidianos; como una mesa, una pared, la altura de mi hija a lo largo de los años, o la distancia que me dalta para ganar en un torneo de rayuela. Todo esto se puede resolver con un flexómetro. Sin embargo, la situación se complica al medir distancias más grandes, como un terreno de 2 hectáreas, donde el flexómetro ya no es útil y los ángulos comienzan a cobrar importancia. Es en este punto donde se necesitan técnicas de medición más eficientes.

La topografía es la ciencia que se encarga de representar planimétrica y altimétricamente un terreno y sus elementos, utilizando diversas técnicas de medición que se clasifican principalmente según la forma en que obtienen sus mediciones: directas o indirectas. Gracias a los diversos instrumentos y técnicas disponibles, la topografía nos permite realizar mediciones en grandes áreas de territorio, logrando, en situaciones ideales, obtener distancias kilométricas a partir de una observación.

La representación de la topografía, sus distancias y sus ángulos, se lleva a cabo sobre un plano cartesiano (x e y, abscisas y ordenadas, norte y este, manzana y pera). Lo importante es que se representan con base en un mismo origen (0,0). A partir de este origen, podemos representar cualquier elemento desde sus distancias relativas y ángulos (método de radiación).

Geometría plana de la ESO con GeoGebra:  Movimientos en el plano

Sin embargo, este sistema supone un problema para distancias muchos más grandes, en donde comienza a afectar la famosa curvatura de la tierra, ya que dada la necesidad histórica de la representación sobre planos (en papel o digital) se asumen distancias “falsas”, la cuales, en algunas situaciones y contextos, pueden conllevar a errores.

A continuación, a modo de ejemplo práctico, en geogebra se puede ver representada la curvatura de la tierra, la línea de visión de un observador, y un elemento de 1.8 m de altura, el cual, desde el punto de vista del observador, aproximadamente a los 4820 m, ya comienza a desaparecer desde su vista del horizonte, o como se creyó en algún tiempo, que los barcos caían en una especie de barranco cósmico ya que la tierra era plana y en este punto se encontraba el borde de la misma.

En topografía se realizan correcciones por curvatura y refracción atmosférica asociadas a este fenómeno.

geogebra-caida-plano-tangencial

Podemos calcular esta caída del plano tangencial, utilizando una aproximación trigonométrica sobre un círculo, la cual se utiliza para ángulos pequeños*:

hd2/2Rh≈ d^2/2R

h = Caída respecto a la tangente del observador

d = Distancia desde el observador

R = Radio medio de la tierra (6.378.000 m)

💡 Se habla de ángulos pequeños ya que en este caso se relacionan kilómetros (distancia desde el observador) con miles de kilómetros (radio medio de la tierra).

Si fijamos h= 1.8 m, entonces:

d=263780001.8 d = \sqrt{263780001.8}

d=4792m d = 4792 m

Por lo tanto, a una distancia de 4792 m del observador, se genera una caída de 1.8 m desde su plano tangencial a causa de la curvatura de la tierra.

Podemos ver el ejemplo práctico en el siguiente link:


Sistemas de Proyección

Tal como vimos en los ejemplos anteriores, la curvatura de la tierra existe y afecta considerablemente mientras más extensas sean las distancias a medir. Esto impacta principalmente a las distancias, dado que cuando medimos distancias extensas sobre la superficie de la tierra, se introducen deformaciones intrínsecas al llevarlos a un plano horizontal, es decir, lo que medimos en terreno es distinto a lo que llevamos al papel, esto dado que no es posible achatar una esfera sin distorcionarla de alguna manera.

Esta convención de procesos para llevar las mediciones realizadas sobre esferas/elipsoides a un plano horizontal se llaman Sistemas de Proyección, cuyo sistema más conocido y utilizado es la Proyección de Mercator, proyección cartográfica creada en 1569 por Gerardus Mercator, con el fin de elaborar mapas para usos naúticos. Es una proyección , la cual resulta de proyectar la superficie terrestre sobre una superficie cilíndrica, el cual es tangente al globo.

La proyección de Mercator es una proyección conforme (mantiene ángulos) pero no es equivalente (distorsiona áreas y distancias).

Si bien la proyección de mercator genera una distorción de las distancias al llevarlas a un plano horizontal, para ciertos usos (principalmente naúticos y cartográficos) y escalas (1:2000 y más pequeñas) es una manera bastante práctica y cómoda de representar una gran extensión de superficie, además de que nos permite manipular distancias métricas, lo cual facilita el cálculo en diversos casos prácticos.

Sistema de Coordenadas Geográficas: UTM

¿Y qué sucede con las latitudes y longitudes?

Bueno, las latitudes y longitudes son medidas angulares que nos permiten ubicar prácticamente cualquier punto sobre la superficie del planeta. La latitud nos posiciona en dirección norte-sur, mientras que la longitud lo hace en dirección este-oeste; la intersección de ambas nos entrega una ubicación.

La latitud se define mediante líneas imaginarias llamadas paralelos, las cuales rodean la Tierra de forma horizontal. El paralelo de mayor extensión es el ecuador (0°), y a partir de este se miden los ángulos hacia el norte y hacia el sur, alcanzando +90° en el Polo Norte y -90° en el Polo Sur. Por ello, las latitudes negativas corresponden al hemisferio sur.

La longitud también se define mediante líneas imaginarias, llamadas meridianos, que conectan el Polo Norte con el Polo Sur. Su origen convencional es el meridiano de Greenwich (0°), y desde allí los valores se extienden hacia el este y oeste hasta ±180°, dependiendo de la convención utilizada.

Latitudes-longitudes

Para ser específicos, muchas veces cuando hablamos de latitud y longitud de forma general, solemos imaginar un modelo esférico simplificado de la Tierra, lo cual resulta útil para entender el concepto base. En ese caso, las posiciones pueden interpretarse desde una geometría centrada en el planeta.

centro de la tierra

Sin embargo, nuestro planeta no es una esfera perfecta, sino que se aproxima mejor a un elipsoide achatado en los polos. Esto complica el cálculo de posiciones, ya que la definición estricta de latitud geodésica no se basa simplemente en una línea hacia el centro de la Tierra, sino en la dirección perpendicular (normal) al elipsoide tangente al punto de interés. Esa normal intersecta el plano ecuatorial, y desde allí se define el ángulo de latitud geodésica. Estas coordenadas corresponden a las llamadas coordenadas geográficas o geodésicas.

normal-coordenadas-geodesicas

Distancia Haversine

La Distancia Haversine (o Fórmula de Haversine) permite calcular la distancia más corta entre dos puntos definidos por latitud y longitud, asumiendo una Tierra esférica. En otras palabras, calcula la distancia sobre el arco del círculo máximo entre ambos puntos:

esfera-haversine

Imagen de la Ley de Haversines, por Steven G. Johnson , publicada bajo la Licencia de Documentación Libre de GNU.

Esta fórmula es especialmente útil cuando queremos calcular rápidamente distancias aproximadas entre dos puntos en metros, kilómetros o millas, utilizando únicamente sus coordenadas geográficas.

a = sin²(φB — φA/2) + cos φA * cos φB * sin²(λB — λA/2)
c = 2 * atan2( √a, √(1−a) )
d = R ⋅ c

Enter fullscreen mode Exit fullscreen mode

Donde:

φA = Latitud punto A
φB = Latitud punto B
λA = Longitud punto A
λB = Longitud punto B
R = Radio curvatura de la tierra

Todos los ángulos deben ser convertidos a radianes antes de aplicar la fórmula.
La unidad de medida del resultado (d) vendra dada por la unidad de medida de la variable R.

El uso de la fórmula Haversine en Python

En primer lugar, llamaremos a la libreria math e importaremos lo siguiente:

from math import radians, sin, cos, sqrt, atan2

Enter fullscreen mode Exit fullscreen mode

Para luego definir una función simple, cuidando de aplicar las conversiones a radianes correspondientes, además de dar la opción al usuario de modificar el argumento de radius en caso de utilizar otro valor o en otra unidad de medida:

def haversine_formula(lat1, lng1, lat2, lng2, radius=6378):
  dlat = radians(lat2 - lat1)
  dlon = radians(lon2 - lon1)
  a = (sin(dlat / 2) ** 2 + cos(radians(lat1)) * cos(radians(lat2)) * sin(dlon / 2) ** 2)
  c = 2 * atan2(sqrt(a), sqrt(1 - a))
  distance = radius * c

  return distance

Enter fullscreen mode Exit fullscreen mode

Con esto podemos calcular la distancia aproximada entre prácticamente cualquier par de puntos del planeta, por ejemplo, entre Santiago de Chile y Pekín (al norte de China):

dist_stgo_pkn = haversine_formula(-33.43778, -70.65028, 39.91, 116.40)
print(f"Distancia entre Santiago de Chile y Pekín: {dist_stgo_pkn:.2f} km")

# Distancia entre Santiago de Chile y Pekín: 19081.05 km

Enter fullscreen mode Exit fullscreen mode

También podemos recurrir a una librería en python llamada haversine para realizar los cálculos de una manera mucho más directa:

#pip install haversine
from haversine import haversine, Unit

stgo = (-33.43778, -70.65028) # (lat, lon)
pekin = (39.91, 116.40) # (lat, lon)

haversine(stgo, pekin)

# 19060.13 <<en kilómetros

Enter fullscreen mode Exit fullscreen mode

La diferencia en el resultado se debe principalmente a que la librería haversine utiliza 6371.0088 km como radio promedio de la tierra.

Limitantes

Tal como comentamos antes, la Tierra no es una esfera perfecta, por lo que el cálculo de distancias no puede resumirse únicamente a un radio estándar si buscamos alta precisión.

La fórmula de Haversine suele ser suficientemente buena para muchos usos generales, con errores que normalmente pueden rondar hasta cerca del 0,5% dependiendo de la distancia y ubicación. Para aplicaciones cotidianas o análisis generales suele ser más que suficiente, pero en trabajos de alta precisión —como geodesia, topografía o navegación— esta simplificación puede generar diferencias relevantes, especialmente en distancias muy largas o cercanas a los polos.

Para un cálculo mucho más exacto, existe la opción de calcular la línea geodésica entre 2 puntos, con los mismos datos de entrada utilizando métodos iterativo complejos tales como la fórmula de Vincenty, el método de Bessel o utilizando librerías como GeographicLib (basado en Karney), que resuelven el problema inverso geodésico: obtener la distancia más corta y el azimut entre dos puntos sobre un elipsoide.

En nuestra área, esto se conoce como:

  • Problema inverso: conocidos dos puntos, calcular distancia y dirección (azimut).
  • Problema directo: conocido un punto, una distancia y un azimut, calcular la posición del segundo punto.

Estos problemas ya utilizan como parámetros de entrada los elispoides correspondientes según las necesidades del cálculo.

A continuación, un ejemplo utilizando la librería Geographiclib, revisando la distancia entre Santiago y Pekín:

#pip install geographiclib
from geographiclib.geodesic import Geodesic
import math
wgs84 = Geodesic.WGS84  # Definimos el elipsoide WGS84

dist_stgo_pkn_geod = wgs84.Inverse(-33.43778, -70.65028, 39.91, 116.40)
print("Distancia entre Santiago de Chile y Pekín es {:.3f} km.".format(dist_stgo_pkn_geod['s12']/1000))

# Distancia entre Santiago de Chile y Pekín es 19058.202 km.

Enter fullscreen mode Exit fullscreen mode

En este ejemplo, podemos identificar una diferencia entre 2 km y 23 km dependiendo del radio de la tierra utilizado.

En Conclusión

El cálculo de distancias puede parecer algo simple, pero dependiendo de su finalidad, puede pasar rápidamente a niveles de complejidad bastante mayores.

Lo importante no siempre es utilizar el método más complejo, sino entender qué nivel de precisión necesitamos y cuáles son las limitantes del modelo que estamos utilizando. Muchas veces una aproximación esférica será suficiente; otras veces, será indispensable trabajar bajo modelos geodésicos más rigurosos.

Al final, más que memorizar fórmulas, lo realmente importante es aprender a identificar el marco de cálculo correcto según el problema que queremos resolver. Ahí está, probablemente, la diferencia entre simplemente calcular... y realmente entender lo que estamos calculando.

¡Llévalo a la práctica!

Revisa como se comportan las distancias utilizando las distintas fórmulas y librerias en localidades más cercanas a los polos, por ejemplo:

#Polo Norte
#Longyearbyen, Svalbard: 78.2232, 15.6267
#Station Nord, Groenlandia: 81.7166, -17.8333

#Polo Sur
#Base Amundsen-Scott: -90.0000, 0.0000
#Base McMurdo: -77.8419, 166.6863

Enter fullscreen mode Exit fullscreen mode

( )