praegune kellaaeg 18.06.2025 01:15:47
|
Hinnavaatlus
:: Foorum
:: Uudised
:: Ärifoorumid
:: HV F1 ennustusvõistlus
:: Pangalink
:: Telekavad
:: HV toote otsing
|
|
autor |
|
raitl
HV veteran

liitunud: 20.01.2002
|
18.05.2012 11:21:15
Andke abi MySQL query ja matemaatikaga |
|
|
Üks veidi põhjalikum query on koos oma matemaatikaga mind nurka surunud. Ehk viitsib keegi aidata.
Ülesande püstitus:
Wordpressi postidel on lisatud custom post metana geo_latitude ja goe_longitude väljadesse koordinaadid. Nüüd on vaja otsida kõik postitused, mis jäävad etteantud koordinaatidest X raadiusesse.
Tabelid:
CREATE TABLE IF NOT EXISTS `wp_posts` (
`ID` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
`post_author` bigint(20) unsigned NOT NULL DEFAULT '0',
`post_date` datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
`post_date_gmt` datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
`post_content` longtext NOT NULL,
`post_title` text CHARACTER SET utf8 COLLATE utf8_estonian_ci,
`post_excerpt` text NOT NULL,
`post_status` varchar(20) NOT NULL DEFAULT 'publish',
`comment_status` varchar(20) NOT NULL DEFAULT 'open',
`ping_status` varchar(20) NOT NULL DEFAULT 'open',
`post_password` varchar(20) NOT NULL DEFAULT '',
`post_name` varchar(200) NOT NULL DEFAULT '',
`to_ping` text NOT NULL,
`pinged` text NOT NULL,
`post_modified` datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
`post_modified_gmt` datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
`post_content_filtered` text NOT NULL,
`post_parent` bigint(20) unsigned NOT NULL DEFAULT '0',
`guid` varchar(255) NOT NULL DEFAULT '',
`menu_order` int(11) NOT NULL DEFAULT '0',
`post_type` varchar(20) NOT NULL DEFAULT 'post',
`post_mime_type` varchar(100) NOT NULL DEFAULT '',
`comment_count` bigint(20) NOT NULL DEFAULT '0',
PRIMARY KEY (`ID`),
KEY `post_name` (`post_name`),
KEY `type_status_date` (`post_type`,`post_status`,`post_date`,`ID`),
KEY `post_parent` (`post_parent`),
KEY `post_author` (`post_author`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=7082 ;
--
-- Tabeli andmete salvestamine `wp_posts`
--
INSERT INTO `wp_posts` (`ID`, `post_author`, `post_date`, `post_date_gmt`, `post_content`, `post_title`, `post_excerpt`, `post_status`, `comment_status`, `ping_status`, `post_password`, `post_name`, `to_ping`, `pinged`, `post_modified`, `post_modified_gmt`, `post_content_filtered`, `post_parent`, `guid`, `menu_order`, `post_type`, `post_mime_type`, `comment_count`) VALUES
(7016, 1, '2012-05-17 12:12:48', '2012-05-17 10:12:48', '<ul><li><strong>Piirkond:</strong> Põlvamaa</li><li><strong>Ala nimetus:</strong> Räpina-Värska puhkeala</li><li><strong>Osaala:</strong> Räpina osaala</li><li><strong>Asukoht:</strong> Toolamaal, Räpina vallas, Põlvamaal. Regio atlas lk 85 G4, puhkeala kaardil objekt nr 9.</li><li><strong>Koordinaadid:</strong> Long-Lat WGS 84 x:27.373850 y:58.093581</li><li><strong>:</strong> L-EST 97 x:698897 y:6444161</li><li><strong>Parkimisvõimalused:</strong> Kaljupealse lõkkekoha juures ruumi 5-6 autole</li><li><strong>Varustus:</strong> Matkarada on tähistatud viitadega ja 12 huvipunkti kirjeldusega. Rada on metsandusliku sisuga, tutvustatakse erinevaid metsatöid. Rada on võimalik läbida jalgsi, rattaga ja talvel lumega ka suuskadega. </li><li><strong>Telkimisvõimalus:</strong> on</li><li><strong>Kattega lõkkekoht:</strong> on</li><li><strong>Marjad-seened:</strong> mustikad, pohlad, seened</li><li><strong>Talvine kasutus:</strong> Talvel kasutatav suusarajana.
</li></ul> [gallery link="file"] ', 'Võhandu matkarada (6,6 km)', '', 'publish', 'closed', 'open', '', 'vohandu-matkarada-66-km', '', '', '2012-05-17 12:12:48', '2012-05-17 10:12:48', '', 0, 'http://kalakoht.ee/poi/vohandu-matkarada-66-km/', 0, 'poi', '', 0); |
CREATE TABLE IF NOT EXISTS `wp_postmeta` (
`meta_id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
`post_id` bigint(20) unsigned NOT NULL DEFAULT '0',
`meta_key` varchar(255) DEFAULT NULL,
`meta_value` longtext,
PRIMARY KEY (`meta_id`),
KEY `post_id` (`post_id`),
KEY `meta_key` (`meta_key`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=29899 ;
--
-- Tabeli andmete salvestamine `wp_postmeta`
--
INSERT INTO `wp_postmeta` (`meta_id`, `post_id`, `meta_key`, `meta_value`) VALUES
(29647, 7016, 'geo_latitude', '58.0935822'),
(29648, 7016, 'geo_longitude', '27.3738499'); |
Ja selline oli minu query see hetk, kui juhe kapitaalselt kokku jooksis:
SELECT pmone.post_id, p.post_type, pmone.meta_value
AS geo_lat, pmtwo.meta_value
AS geo_long,(
SELECT (sqrt( sqrt((pmone.meta_value - pmsubone.meta_value) * 40076000) / 360) + sqrt((pmtwo.meta_value - pmsubtwo.meta_value) * 40076000 * cos((pmone.meta_value + pmsubone.meta_value)/2) / 360) )
FROM `wp_postmeta`
AS pmsubone
LEFT JOIN `wp_postmeta`
AS pmsubtwo
ON pmsubone.post_id = pmsubtwo.post_id
LEFT JOIN `wp_posts`
AS p
ON p.ID = pmsubone.post_id
WHERE pmsubone.meta_key = 'geo_latitude'
AND pmsubtwo.meta_key = 'geo_longitude'
AND p.post_type = 'water' LIMIT 1)
AS waters
FROM `wp_postmeta`
AS pmone
LEFT JOIN `wp_postmeta`
AS pmtwo
ON pmone.post_id = pmtwo.post_id
LEFT JOIN `wp_posts`
AS p
ON p.ID = pmone.post_id
WHERE pmone.meta_key = 'geo_latitude'
AND pmtwo.meta_key = 'geo_longitude'
AND p.post_type = 'poi' |
|
|
Kommentaarid: 166 loe/lisa |
Kasutajad arvavad: |
   |
:: |
1 :: |
0 :: |
147 |
|
tagasi üles |
|
 |
kullar
HV kasutaja

liitunud: 26.11.2006
|
18.05.2012 11:41:27
|
|
|
Kunagi tegin ühe projekti, kus oli vaja tööpakkumisi otsida raadiuse järgi(ehk kui kaugele jääb minust mingi tööpakkumine kaardil) päringus arvutasin kuidagi nii:
SELECT osa, et saada kätte kaugus
$_strSel = "(3959 * acos(
cos(
radians('{$_arrLatitudes['lat']}')
) *
cos(
radians(l.lat)
) *
cos(
radians(l.lng) - radians('{$_arrLatitudes['lng']}')
) +
sin(
radians('{$_arrLatitudes['lat']}')
) * sin(
radians(l.lat)
)
)
) AS distance";
ja mySQL WHERE oli selline:
HAVING distance <= $_intDistance";
_________________ Online Perekonna Eelarve, Keerukamad veebipõhised infosüsteemid jms |
|
Kommentaarid: 27 loe/lisa |
Kasutajad arvavad: |
   |
:: |
0 :: |
1 :: |
25 |
|
tagasi üles |
|
 |
Ho Ho
HV Guru

liitunud: 16.02.2002
|
|
Kommentaarid: 106 loe/lisa |
Kasutajad arvavad: |
   |
:: |
0 :: |
1 :: |
86 |
|
tagasi üles |
|
 |
raitl
HV veteran

liitunud: 20.01.2002
|
18.05.2012 11:47:44
|
|
|
Ho Ho, jõudlus pole antud hetkel oluline. Tegu on conversion scriptiga, ehk siis ainult üks kord vaja käima lasta ja andmed ära töödelda.
|
|
Kommentaarid: 166 loe/lisa |
Kasutajad arvavad: |
   |
:: |
1 :: |
0 :: |
147 |
|
tagasi üles |
|
 |
jnt
HV Guru

liitunud: 10.05.2005
|
18.05.2012 12:00:43
|
|
|
Konkreetselt igat sulgu läbi ei käinud, kuid kas pütaagoruse teoreem ei kõlba antud juhul? Absoluutväärtused kahe punkti x ja y kordinaatide vahest, need ruutu ja siis ruutjuur ja saad kauguse. Pikkus ja laius on ju tegelikult x ja y kordinaadid.
_________________ Progemisest: https://byteaether.github.io/
Seisab keldris vana 386-486-Pentium1? Räägime! Ehk saan vanakesele uue elu anda.
Vaata siia, äkki müün midagi põnevat -> https://www.osta.ee/index.php?fuseaction=listing.seller&q[seller]=jnt |
|
Kommentaarid: 110 loe/lisa |
Kasutajad arvavad: |
   |
:: |
2 :: |
0 :: |
102 |
|
tagasi üles |
|
 |
Fukiku
Kreisi kasutaja

liitunud: 06.11.2003
|
18.05.2012 12:39:16
|
|
|
jnt kirjutas: |
Konkreetselt igat sulgu läbi ei käinud, kuid kas pütaagoruse teoreem ei kõlba antud juhul? Absoluutväärtused kahe punkti x ja y kordinaatide vahest, need ruutu ja siis ruutjuur ja saad kauguse. Pikkus ja laius on ju tegelikult x ja y kordinaadid. |
Päris nii lihtne see pole. Oleneb soovitavast täpsusest. Katsetasin mingit netist kättesaadava kalkulaatoriga ja leidsin, et üks kraad koordinaatides ida-läänes suunas on Põhja-Eestis ~2,5km lühem kui Lõuna-Eestis. (Pildid spoileris)
Spoiler 
_________________ Foxic is just a simple fox
Enne kui sa küsid oma küsimuse - küsi seda vannipardilt! Rangelt soovitatav enne programmeerimise alafoorumisse uue teema tegemist. |
|
Kommentaarid: 2 loe/lisa |
Kasutajad arvavad: |
   |
:: |
0 :: |
0 :: |
2 |
|
tagasi üles |
|
 |
mikk36
HV Guru

liitunud: 21.02.2004

|
|
Kommentaarid: 85 loe/lisa |
Kasutajad arvavad: |
   |
:: |
0 :: |
2 :: |
78 |
|
tagasi üles |
|
 |
kullar
HV kasutaja

liitunud: 26.11.2006
|
18.05.2012 12:49:52
|
|
|
Täpsustan enda näidet:
SELECT id, ( 3959 * acos( cos( radians(37) ) * cos( radians( lat ) ) * cos( radians( lng ) - radians(-122) ) + sin( radians(37) ) * sin( radians( lat ) ) ) ) AS distance
FROM askohad HAVING distance < 25 ORDER BY distance LIMIT 0 , 20;
|
Selgituseks:
37 ja -122 on sinu asukoht ja lat,lng on andmebaasis olevad väljad.
3959 = miilid
6371 = km[/code]
_________________ Online Perekonna Eelarve, Keerukamad veebipõhised infosüsteemid jms |
|
Kommentaarid: 27 loe/lisa |
Kasutajad arvavad: |
   |
:: |
0 :: |
1 :: |
25 |
|
tagasi üles |
|
 |
raitl
HV veteran

liitunud: 20.01.2002
|
18.05.2012 12:54:16
|
|
|
Lahendus käes. Komistasin sellise dokumendi otsa: http://www.scribd.com/doc/2569355/Geo-Distance-Search-with-MySQL
Tulemuseks selline query:
SELECT p.ID, p.post_title, (( ACOS( SIN( ".$latitude." * PI() / 180 )
* SIN( `latitude`.`meta_value` * PI() / 180 )
+ COS( ".$latitude." * PI() / 180 )
* COS( `latitude`.`meta_value` * PI() / 180 )
* COS(( ".$longitude." - `longitude`.`meta_value` ) * PI() / 180 )) * 180 / PI() ) * 60 * 1.1515 ) AS distance
FROM wp_posts p
LEFT JOIN wp_postmeta latitude ON latitude.post_id = p.ID AND latitude.meta_key = 'geo_latitude'
LEFT JOIN wp_postmeta longitude ON longitude.post_id = p.ID AND longitude.meta_key = 'geo_longitude' HAVING distance < 10 |
Ja toimib. tänud kaasamõtlejatele
|
|
Kommentaarid: 166 loe/lisa |
Kasutajad arvavad: |
   |
:: |
1 :: |
0 :: |
147 |
|
tagasi üles |
|
 |
Ho Ho
HV Guru

liitunud: 16.02.2002
|
18.05.2012 13:28:06
|
|
|
Maa ei ole kerakujuline
Vahepeal sonari softi kirjutades tuli sellega arvestada kuna muidu läksid koordinaadid kiiresti metsa poole.
_________________ Teach a man to reason and he'll think for a lifetime
Common sense - so rare that it's a damn superpower
Vaadates paljude inimeste sõnavõtte siin ja mujal jääb üle ainult klassikuid tsiteerida - "I weep for humanity" |
|
Kommentaarid: 106 loe/lisa |
Kasutajad arvavad: |
   |
:: |
0 :: |
1 :: |
86 |
|
tagasi üles |
|
 |
mikk36
HV Guru

liitunud: 21.02.2004

|
18.05.2012 13:54:24
|
|
|
Ho Ho, seal artiklis on ka vastavad viited abistamaks täpsemat arvutamist.
|
|
Kommentaarid: 85 loe/lisa |
Kasutajad arvavad: |
   |
:: |
0 :: |
2 :: |
78 |
|
tagasi üles |
|
 |
jnt
HV Guru

liitunud: 10.05.2005
|
18.05.2012 14:08:32
|
|
|
Fukiku kirjutas: |
jnt kirjutas: |
Konkreetselt igat sulgu läbi ei käinud, kuid kas pütaagoruse teoreem ei kõlba antud juhul? Absoluutväärtused kahe punkti x ja y kordinaatide vahest, need ruutu ja siis ruutjuur ja saad kauguse. Pikkus ja laius on ju tegelikult x ja y kordinaadid. |
Päris nii lihtne see pole. Oleneb soovitavast täpsusest. Katsetasin mingit netist kättesaadava kalkulaatoriga ja leidsin, et üks kraad koordinaatides ida-läänes suunas on Põhja-Eestis ~2,5km lühem kui Lõuna-Eestis. (Pildid spoileris)
Spoiler 
|
Good point! On jah tegelikult ju nii.
_________________ Progemisest: https://byteaether.github.io/
Seisab keldris vana 386-486-Pentium1? Räägime! Ehk saan vanakesele uue elu anda.
Vaata siia, äkki müün midagi põnevat -> https://www.osta.ee/index.php?fuseaction=listing.seller&q[seller]=jnt |
|
Kommentaarid: 110 loe/lisa |
Kasutajad arvavad: |
   |
:: |
2 :: |
0 :: |
102 |
|
tagasi üles |
|
 |
|
lisa lemmikuks |
|
|
sa ei või postitada uusi teemasid siia foorumisse sa ei või vastata selle foorumi teemadele sa ei või muuta oma postitusi selles foorumis sa ei või kustutada oma postitusi selles foorumis sa ei või vastata küsitlustele selles foorumis sa ei saa lisada manuseid selles foorumis sa võid manuseid alla laadida selles foorumis
|
|
Hinnavaatlus ei vastuta foorumis tehtud postituste eest.
|