Avaleht
uus teema   vasta Tarkvara »  Programmeerimine »  Andke abi MySQL query ja matemaatikaga märgi kõik teemad loetuks
märgi mitteloetuks
vaata eelmist teemat :: vaata järgmist teemat
Hinnavaatlus :: Foorum :: Uudised :: Ärifoorumid :: HV F1 ennustusvõistlus :: Pangalink :: Telekavad :: HV toote otsing
autor
sõnum Saada viide sõbrale.  :: Teata moderaatorile teata moderaatorile
otsing:  
raitl
HV veteran


liitunud: 20.01.2002



Autoriseeritud ID-kaardiga

sõnum 18.05.2012 11:21:15 Andke abi MySQL query ja matemaatikaga vasta tsitaadiga

Ü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
vaata kasutaja infot saada privaatsõnum
kullar
HV kasutaja
kullar

liitunud: 26.11.2006



Autoriseeritud ID-kaardiga

sõnum 18.05.2012 11:41:27 vasta tsitaadiga

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
vaata kasutaja infot saada privaatsõnum
Ho Ho
HV Guru
Ho Ho

liitunud: 16.02.2002




sõnum 18.05.2012 11:46:09 vasta tsitaadiga

Kui vaja vähe asisemat jõudlust siis tasub GIS'i suunas vaadata:
http://forge.mysql.com/wiki/GIS_Functions
http://dev.mysql.com/doc/refman/5.0/en/spatial-extensions.html

_________________
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
vaata kasutaja infot saada privaatsõnum mine selle kasutaja kodulehele
raitl
HV veteran


liitunud: 20.01.2002



Autoriseeritud ID-kaardiga

sõnum 18.05.2012 11:47:44 vasta tsitaadiga

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
vaata kasutaja infot saada privaatsõnum
jnt
HV Guru
jnt

liitunud: 10.05.2005



Autoriseeritud ID-kaardiga

sõnum 18.05.2012 12:00:43 vasta tsitaadiga

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. icon_wink.gif
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
vaata kasutaja infot saada privaatsõnum
Fukiku
Kreisi kasutaja
Fukiku

liitunud: 06.11.2003




sõnum 18.05.2012 12:39:16 vasta tsitaadiga

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 Spoiler 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
vaata kasutaja infot saada privaatsõnum
mikk36
HV Guru
mikk36

liitunud: 21.02.2004



Online

sõnum 18.05.2012 12:48:10 vasta tsitaadiga

Great-circle distance | Wikipedia
Ei tasu ka antud artiklist ära unustada peatükki "Radius for spherical Earth".
Kommentaarid: 85 loe/lisa Kasutajad arvavad:  :: 0 :: 2 :: 78
tagasi üles
vaata kasutaja infot saada privaatsõnum
kullar
HV kasutaja
kullar

liitunud: 26.11.2006



Autoriseeritud ID-kaardiga

sõnum 18.05.2012 12:49:52 vasta tsitaadiga

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
vaata kasutaja infot saada privaatsõnum
raitl
HV veteran


liitunud: 20.01.2002



Autoriseeritud ID-kaardiga

sõnum 18.05.2012 12:54:16 vasta tsitaadiga

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 thumbs_up.gif
Kommentaarid: 166 loe/lisa Kasutajad arvavad:  :: 1 :: 0 :: 147
tagasi üles
vaata kasutaja infot saada privaatsõnum
Ho Ho
HV Guru
Ho Ho

liitunud: 16.02.2002




sõnum 18.05.2012 13:28:06 vasta tsitaadiga

mikk36 kirjutas:
Great-circle distance | Wikipedia
Ei tasu ka antud artiklist ära unustada peatükki "Radius for spherical Earth".
Maa ei ole kerakujuline icon_smile.gif

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
vaata kasutaja infot saada privaatsõnum mine selle kasutaja kodulehele
mikk36
HV Guru
mikk36

liitunud: 21.02.2004



Online

sõnum 18.05.2012 13:54:24 vasta tsitaadiga

Ho Ho, seal artiklis on ka vastavad viited abistamaks täpsemat arvutamist.
Kommentaarid: 85 loe/lisa Kasutajad arvavad:  :: 0 :: 2 :: 78
tagasi üles
vaata kasutaja infot saada privaatsõnum
jnt
HV Guru
jnt

liitunud: 10.05.2005



Autoriseeritud ID-kaardiga

sõnum 18.05.2012 14:08:32 vasta tsitaadiga

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 Spoiler Spoiler


Good point! On jah tegelikult ju nii. thumbs_up.gif

_________________
Progemisest: https://byteaether.github.io/
Seisab keldris vana 386-486-Pentium1? Räägime! Ehk saan vanakesele uue elu anda. icon_wink.gif
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
vaata kasutaja infot saada privaatsõnum
näita postitusi alates eelmisest:   
uus teema   vasta Tarkvara »  Programmeerimine »  Andke abi MySQL query ja matemaatikaga
[vaata eelmist teemat] [vaata järgmist teemat]
 lisa lemmikuks
näita foorumit:  
 ignoreeri teemat 
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.