Obraich a-mach no cuir ceist air an astar cearcallach mòr eadar puingean leud agus leud a’ cleachdadh foirmle Haversine (eisimpleirean PHP, JavaScript, Java, Python, MySQL, MSSQL)
A’ mhìos seo, tha mi air a bhith a’ dèanamh phrògraman ann am PHP agus MySQL airson GIS. Fhad 's a bha mi a' rannsachadh a' chuspair, bha duilgheadas agam a lorg àireamhachadh cruinn-eòlasach gus an astar eadar dà àite a lorg, agus mar sin bha mi airson an roinn an seo.
Is e an dòigh sìmplidh air astar eadar dà phuing obrachadh a-mach a bhith a ’cleachdadh foirmle Pythagorean gus hypotenuse triantan obrachadh a-mach (A² + B² = C²). Canar seo ris an Astar Euclidean.
Is e toiseach tòiseachaidh inntinneach a tha sin, ach chan eil e a’ buntainn ri cruinn-eòlas leis gu bheil an astar eadar loidhnichean domhan-leud is domhan-leud chan eil astaran co-ionann bho chèile. Mar a thig thu nas fhaisge air a’ chrios-meadhain, bidh loidhnichean domhan-leud a’ dol nas fhaide bho chèile. Ma chleachdas tu co-aontar triantanachaidh sìmplidh, faodaidh e astar a thomhas gu ceart ann an aon àite agus ceàrr anns an àite eile air sgàth lùbadh na Talmhainn.
Astar Cearcall Mòr
Canar an t-Astar Cearcall Mòr ris na slighean a shiubhail astaran fada timcheall na Talmhainn. Is e sin… tha an t-astar as giorra eadar dà phuing air cruinne eadar-dhealaichte bho na puingean air mapa rèidh. Cuir sin còmhla ris an fhìrinn nach eil loidhnichean domhan-leud is domhan-leud co-ionann… agus tha àireamhachadh duilich agad.
Seo mìneachadh bhidio air leth math air mar a tha Great Circles ag obair.
Foirmle Haversine
Tha an t-astar a’ cleachdadh curvature na Talmhainn air a ghabhail a-steach ann am foirmle Haversine, a bhios a’ cleachdadh trigonometry gus leigeil le curvature na Talmhainn. Nuair a lorgas tu an astar eadar 2 àite air an Talamh (mar a bhios an fheannag ag itealaich), is e arc a th’ ann an loidhne dhìreach.
Tha seo iomchaidh ann an itealan adhair - an do choimhead thu a-riamh air a’ mhapa de thursan-adhair agus an do mhothaich thu gu bheil bogha aca? Tha sin air sgàth gu bheil itealaich ann am bogha eadar dà phuing nas giorra na dìreach chun an àite.
PHP: Obraich a-mach astar eadar 2 phuing domhan-leud is domhan-leud
Seo am foirmle PHP airson obrachadh a-mach an astair eadar dà phuing (còmhla ri tionndadh Mile vs Kilometer) cruinn gu dà ionad deicheach.
function getDistanceBetweenPointsNew($latitude1, $longitude1, $latitude2, $longitude2, $unit = 'miles') {
$theta = $longitude1 - $longitude2;
$distance = (sin(deg2rad($latitude1)) * sin(deg2rad($latitude2))) + (cos(deg2rad($latitude1)) * cos(deg2rad($latitude2)) * cos(deg2rad($theta)));
$distance = acos($distance);
$distance = rad2deg($distance);
$distance = $distance * 60 * 1.1515;
switch($unit) {
case 'miles':
break;
case 'kilometers' :
$distance = $distance * 1.609344;
}
return (round($distance,2));
}
Is iad na caochladairean:
- $ leud 1 - caochladair airson domhan-leud a’ chiad àite agad.
- $ domhan-leud 1 - caochladair airson domhan-leud a’ chiad àite agad
- $ leud 2 - caochladair airson leud an dàrna àite agad.
- $ domhan-leud 2 - caochladair airson domhan-leud an dàrna àite agad.
- $aonad - an suidheachadh bunaiteach mìle. Faodar seo ùrachadh no a thoirt seachad mar cilemeatair.
Java: Obraich a-mach an astar eadar 2 phuing leudachaidh agus leud
public static double getDistanceBetweenPointsNew(double latitude1, double longitude1, double latitude2, double longitude2, String unit) {
double theta = longitude1 - longitude2;
double distance = 60 * 1.1515 * (180/Math.PI) * Math.acos(
Math.sin(latitude1 * (Math.PI/180)) * Math.sin(latitude2 * (Math.PI/180)) +
Math.cos(latitude1 * (Math.PI/180)) * Math.cos(latitude2 * (Math.PI/180)) * Math.cos(theta * (Math.PI/180))
);
if (unit.equals("miles")) {
return Math.round(distance, 2);
} else if (unit.equals("kilometers")) {
return Math.round(distance * 1.609344, 2);
} else {
return 0;
}
}
Is iad na caochladairean:
- domhanleithead 1 - caochladair airson domhan-leud a’ chiad àite agad.
- domhan-leud 1 - caochladair airson domhan-leud a’ chiad àite agad
- domhanleithead 2 - caochladair airson leud an dàrna àite agad.
- domhan-leud 2 - caochladair airson domhan-leud an dàrna àite agad.
- aonad - an suidheachadh bunaiteach mìle. Faodar seo ùrachadh no a thoirt seachad mar cilemeatair.
JavaScript: Obraich a-mach an astar eadar 2 phuing leudachaidh agus leud
function getDistanceBetweenPoints(latitude1, longitude1, latitude2, longitude2, unit = 'miles') {
let theta = longitude1 - longitude2;
let distance = 60 * 1.1515 * (180/Math.PI) * Math.acos(
Math.sin(latitude1 * (Math.PI/180)) * Math.sin(latitude2 * (Math.PI/180)) +
Math.cos(latitude1 * (Math.PI/180)) * Math.cos(latitude2 * (Math.PI/180)) * Math.cos(theta * (Math.PI/180))
);
if (unit == 'miles') {
return Math.round(distance, 2);
} else if (unit == 'kilometers') {
return Math.round(distance * 1.609344, 2);
}
}
Is iad na caochladairean:
- domhanleithead 1 - caochladair airson domhan-leud a’ chiad àite agad.
- domhan-leud 1 - caochladair airson domhan-leud a’ chiad àite agad
- domhanleithead 2 - caochladair airson leud an dàrna àite agad.
- domhan-leud 2 - caochladair airson domhan-leud an dàrna àite agad.
- aonad - an suidheachadh bunaiteach mìle. Faodar seo ùrachadh no a thoirt seachad mar cilemeatair.
Python: Obraich a-mach an astar eadar 2 phuing leudachaidh agus leud
Seo am foirmle Python airson obrachadh a-mach an astair eadar dà phuing (còmhla ri tionndadh Mile vs. Kilometer) cruinn gu dà ionad deicheach. Cliù dha mo mhac, Bill Karr, neach-saidheans dàta airson OSNAIDHEAN BHO IFRINN, airson a 'chòd.
from numpy import sin, cos, arccos, pi, round
def rad2deg(radians):
degrees = radians * 180 / pi
return degrees
def deg2rad(degrees):
radians = degrees * pi / 180
return radians
def getDistanceBetweenPointsNew(latitude1, longitude1, latitude2, longitude2, unit = 'miles'):
theta = longitude1 - longitude2
distance = 60 * 1.1515 * rad2deg(
arccos(
(sin(deg2rad(latitude1)) * sin(deg2rad(latitude2))) +
(cos(deg2rad(latitude1)) * cos(deg2rad(latitude2)) * cos(deg2rad(theta)))
)
)
if unit == 'miles':
return round(distance, 2)
if unit == 'kilometers':
return round(distance * 1.609344, 2)
Is iad na caochladairean:
- domhanleithead 1 - caochladair airson a’ chiad àite agad domhan-leud.
- domhan-leud 1 - caochladair airson a’ chiad àite agad domhan-leud
- domhanleithead 2 - caochladair airson an dàrna àite agad domhan-leud.
- domhan-leud 2 - caochladair airson an dàrna àite agad domhan-leud.
- aonad - an suidheachadh bunaiteach mìle. Faodar seo ùrachadh no a thoirt seachad mar cilemeatair.
MySQL: A’ faighinn a h-uile clàr air ais taobh a-staigh raon le bhith a’ tomhas astar nam mìltean a’ cleachdadh leud agus leud
Tha cleachdadh Seòrsan Dàta Spàsail ann am MySQL na dhòigh nas èifeachdaiche agus nas goireasaiche air obrachadh le dàta cruinn-eòlasach, a’ gabhail a-steach obrachadh a-mach astaran eadar puingean. Tha MySQL a’ toirt taic do sheòrsan dàta spàsail leithid POINT
, LINESTRING
, agus POLYGON
, còmhla ri gnìomhan spàsail mar ST_Distance
.
Nuair a chleachdas tu an ST_Distance
gnìomh ann am MySQL le dàta cruinn-eòlasach air a riochdachadh mar POINT
co-chomharran, bidh e a’ gabhail a-steach curvature uachdar na Talmhainn. Am modail spherical a chleachdar le ST_Distance
a’ cleachdadh foirmle Haversine. Tha an tuairmse seo freagarrach airson a’ mhòr-chuid de dh’ adhbharan practaigeach ach dh’ fhaodadh e beagan mearachd a thoirt a-steach airson astaran glè fhada.
Seo mar as urrainn dhut astaran eadar dà phuing obrachadh a-mach a’ cleachdadh Seòrsan Dàta Spàsail:
- Cruthaich Clàr le Seòrsa Dàta Spàsail: An toiseach, cruthaich clàr le a
POINT
colbh gus puingean cruinn-eòlais a stòradh. Mar eisimpleir:
CREATE TABLE locations (
id INT AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(255),
coordinates POINT
);
Cuir na puingean cruinn-eòlais agad a-steach don chlàr seo a’ cleachdadh an fhaidhle POINT
neach-togail:
INSERT INTO locations (name, coordinates)
VALUES
('Point A', POINT(40.7128, -74.0060)), -- New York City
('Point B', POINT(34.0522, -118.2437)); -- Los Angeles
- Obraich a-mach an astar a’ cleachdadh ST_Distance: Faodaidh tu an astar eadar dà phuing obrachadh a-mach a’ cleachdadh an
ST_Distance
gnìomh. Seo eisimpleir de cheist airson obrachadh a-mach an astar eadar dà phuing:
SELECT
id1,
id2,
(ST_Distance(coordinates1, coordinates2) / 1609.344) AS distance_in_miles
FROM (
SELECT
l1.id AS id1,
l2.id AS id2,
l1.coordinates AS coordinates1,
l2.coordinates AS coordinates2
FROM
locations l1,
locations l2
WHERE
l1.id = 1 AND l2.id = 2
) AS distances;
Replace 1
agus 2
le IDan an dà phuing a tha thu airson obrachadh a-mach an astar eadar.
- toradh: Tillidh a’ cheist an astar eadar an dà phuing ann am mìltean.
A’ cleachdadh seòrsaichean dàta spàsail agus an ST_Distance
tha gnìomh a’ toirt seachad dòigh nas èifeachdaiche agus nas ceart air obrachadh le dàta cruinn-eòlasach ann am MySQL. Bidh e cuideachd a’ sìmpleachadh àireamhachadh astaran eadar puingean, ga dhèanamh nas fhasa an dàta agad a riaghladh agus a cheasnachadh.
MySQL: A’ faighinn a h-uile clàr air ais taobh a-staigh raon le bhith a’ tomhas astair ann an cilemeatairean a’ cleachdadh leud agus leud
Gu bunaiteach ST_Distance
tillidh tu an astar ann am meatairean, agus mar sin cha leig thu leas ach a’ cheist ùrachadh airson cilemeatairean:
SELECT
id1,
id2,
(ST_Distance(coordinates1, coordinates2) / 1000) AS distance_in_kilometers
FROM (
SELECT
l1.id AS id1,
l2.id AS id2,
l1.coordinates AS coordinates1,
l2.coordinates AS coordinates2
FROM
locations l1,
locations l2
WHERE
l1.id = 1 AND l2.id = 2
) AS distances;
Astar cruinn-eòlasach Microsoft SQL Server: STDistance
Ma tha thu a’ cleachdadh Microsoft SQL Server, bidh iad a’ tabhann an gnìomh fhèin, STDastar airson obrachadh a-mach an astair eadar dà phuing a’ cleachdadh an seòrsa dàta Cruinn-eòlas.
DECLARE @g geography;
DECLARE @h geography;
SET @g = geography::STGeomFromText('LINESTRING(-122.360 47.656, -122.343 47.656)', 4326);
SET @h = geography::STGeomFromText('POINT(-122.34900 47.65100)', 4326);
SELECT @g.STDistance(@h);
Hat tip gu Manash Sahoo, stèidheadair agus àrd ailtire aig Ion Tri.