The branch, master has been updated via 79b5bd602e50cc5eff4c32c85df673f7eac94862 (commit) via d501fc1fe6f1f449ddadb13dacf505a841e7ec85 (commit) via 0387ea0b40ad47dea5fad3c2b432452b31605dd1 (commit) via 46722b80359c81626bdbc429329b1bc710db3530 (commit) via 5e11e88a147e16c96c33547e199dca31d1a20c77 (commit) via 5744b9622d0bc76250e20127fd4a0329919f4af9 (commit) via 7d7dd02e8cd2048f3e11585da86892bf7c4a6dea (commit) via 16a039392b4a8ea028b38f969ef7e4e586532b94 (commit) via 9ed1cd7c3ef2eb5cb9b3511aec280f89937b3cd0 (commit) via d6bf1cd451be99703fe428fb90747ef71b625a3e (commit) via cb176b2648f0d787d115290212ab829372414a16 (commit) via 005a4ce61b0f5818f8bcba83f8eda7a3192301f3 (commit) via bedd7087f369567288ccdbb0898ed4dec90666e3 (commit) via cb0eca28e4014555c219b290e47a282474281e94 (commit) via 414ac18e624fafb84cd82f89eb8ae628f6e93957 (commit) via 333dc9ccec0e6f16ea7dbf65acdd9549311d169b (commit) via f60672d0d3f8864a67ca92c7f5044b74073fe430 (commit) via 760d895036176c2d2ca60d63150ce9b5a44379cd (commit) via 68d617ad17d60851d69c50d58d728702f8cd6cff (commit) via 591be45324f3e67c281c2e36d8624daf741bca0e (commit) via 881d2f29b7d3021be171964fa735ac634921c400 (commit) via 81667ad578c52a47071394bb4baba5e51be7ac0d (commit) via 7f94f8ea738d727389f63bd99d33b4e6f4130220 (commit) via ca0bf0be2763b2659fb44391f329a8cb80256b3e (commit) via b67c913fadc71fec51d139d96cf5afe98656db1f (commit) via 84f2882bbf19dd8f1eec3b81a29a3eecb63b2af2 (commit) via fa3e058e251d72a758629248a7ced02b89b3d62a (commit) via 0e8492769354e5b5e2187d4fcda73f174c8f0417 (commit) via 9c316b7b1158b9207c8a87d04ddbedebac1a42dc (commit) via acb6656961eb5191e7e3f8cd3ea09638f5d5f3ec (commit) via a1f2d5311ad9c47092e4b95f28125bc2a7bfdaa3 (commit) via 2f6a53f50d979aca1c06891e8774e5952d4e0d80 (commit) via 2b749e30c562c76441589e7123b8dbb4e520f47a (commit) via 218a2b561c7b242e4a10c11b7da7dbac4bcdadfe (commit) via 1a16ba7caecf157d7ac976acdd8df16bff698c10 (commit) via 2923f1cdb58d07ddc99146e85e0d91d8f98a45eb (commit) via 981cfeac2ede69205da710ac38714938bcb85239 (commit) via e2d535cc56d05d9ff0ffa9716f6580ef1a4fadf3 (commit) via 3da9f02130a4f7fa951f72d0667a4e543f76b683 (commit) via 175a6e094801ff0a4097eaeeeda665ab8f35e212 (commit) via 7fe1ce201fc793c09b5833a4933c0b0bf81348a0 (commit) via ba99e8fe12e3a13c839f9bb488ad1ade636bed4e (commit) via dc823602428de00f987425ccdbbb903044572551 (commit) via 3611d48325f6e2990a5d29060503237f83d52257 (commit) via 36c55adb9ebc4b341bc52e3ad839b9909365fa78 (commit) via 304a5d666b1f52695851df6a9d2ead74e3f8f9c1 (commit) via fe10dec01f77a40afab3a0c97d03ee9d458d7501 (commit) via f00b473c17bce475816f0be84b48f572f404fbb5 (commit) via e62c03f7a5b153ec7524157a7ec8878f46ce0162 (commit) via 7a955d4c66a0690d66f312aca1460d6f7d3da9b0 (commit) via d3bd2d5d91c25c77a192041216898d17059df401 (commit) via 3efcd0e24bd9a096611ae94d2c35bc2b5f48455a (commit) via ed5c01dc440f28486a3f6db546d5faf7d7e41165 (commit) via 5ccc1dec16ec46422544c984f4b884ae25fef066 (commit) via 516557716a37836df650387bfbc0034031476c24 (commit) via 0a80147c4623dff9420cda8ef7e26a0f279566c4 (commit) via 6ae969a5ee3d2e30ccf3d95aefa7f641a3ccd2db (commit) via 6c6e43b78a43e323de38331e6f0e7668851e59fe (commit) via c53750eac09bbff5388613d97297b1cdece2e99f (commit) via db1f83b55b151c100a3aa9a81f7856432f730386 (commit) via c73380be3509626fbdb7b5027b7d80abb16f2588 (commit) via c3189393448f80543ecdb6c94c8c533f204cb0ad (commit) via e456f221494e1ccf76d5b8f73ca5e6896feec113 (commit) via 47a8dcfc8885a0086fc8c8b9b5a49e783d81180a (commit) via aed7270cb99b80ccc7abe970a566e6241ccec159 (commit) via 01976f1663f7d36d18f65574276f7250b506ef94 (commit) via 003496969e3a5ab8a04e939c945f42c90dfe7f49 (commit) via b48a250ca8ceb4ab07caa502f05772b9d02acb25 (commit) via ec7feea9b04d173f2468d7fa3294be23b1965427 (commit) via 11ca5daa412c0338d63020f94f74530e95463ce9 (commit) via 1f2ba4e9cc51c2bf2b1c1b96f78f29143e033e36 (commit) via 47fdfad3361fc5840776060c2326505de1512ee3 (commit) via 6f35aaa8e46e1bc50b4b5e38d4b9c4810c5c71ce (commit) via 47762d7b14815296256dea277647f152c1c5c2fc (commit) via 015ad8968008284f565ecd1274f37ddcd89ca06e (commit) via 4d7b7d9a88012563463df82b904a6859400de7d9 (commit) via 0e4435266b588de8788b01bb92bf8261c3762ab5 (commit) via 2a402a3103c5a12e6c9d2fd2515d7695da2942ff (commit) via 5a6379f93e97a4535a3a78b56ddc6a5cbe3901e8 (commit) via 96785858bc79297b34b06722fc833bb033aa10c4 (commit) via d85c777c78a854d56d39cb6420624e22eedc6586 (commit) via 1b9ddd2efa71971ef1b78356cc878af437cdf5dd (commit) via ba93a625b9de49fc10c1d65a880768258497459c (commit) via 7af88c04c75641fc3aba7e26935c0ef8f9e2dcbe (commit) via ed23518a44fdd62c5394c785e515d65f7c4910eb (commit) via ffb970f169f6e9642fd9fe924cca88f8c14695d2 (commit) via 83d8d3a8ed3043f52b1f1ef42af33fccfead1e87 (commit) via b2d703dbea2077c9ff48686ee230d7a7ff224318 (commit) via 166b571964d6c3513359512b8eef83584f2f9ddf (commit) via 56090dd46f34e485199541d1262dc70c85001ede (commit) via f5bd53fae03e41c2b26f3769ce891270d00d39e9 (commit) via c18ef53b57ba72a6b35e479b3510d855cc636aa7 (commit) via bb987837ebf198e60503231bbf7cc9a50eea3337 (commit) via 6e7c3adbc15eb1f4b822a083b954cbc39a02bc13 (commit) via 0c9301f7dbc88ee49021f708d9004e0b57975fd8 (commit) via fd0cb076c0c415c321edf8e811c9691d6f2ca06f (commit) via 4ee9d4834639659f73635825f367c842fcd0e090 (commit) via c97bb579250bdafa23e60386facf3f12034d287b (commit) via b1634f80fd598d67130b7fccd29f7bc8dbc726b4 (commit) via ac4f0a10b0593b20cb49116df0170912ab292e69 (commit) via 66f73b4114bf8e60496fe052ec86b33c65c3137e (commit) via e0e0dea09b25da67f60d787b0c2312dbbc5a7660 (commit) via 1d9ef026089b7b52061f4558ddaaed10d500df60 (commit) via a1e6b187c60999d1934ed5f7428c95f0a5d3820d (commit) via f76785603f311153f7217ec45575c98440b07381 (commit) via 2bf70868bbd9c69036470b4a9cbfe2fe29e1a8fc (commit) via 242534a78ad3d26334cd97dcf8346c7cd327179b (commit) via be8ce3d5b61a069ab2dc4caf2206db1af67cd15c (commit) via e7135574bd2acefa90c7b2e654d2344d3027e479 (commit) via b9e5125870e8d6575f679d59d46e1fddec2f9e0c (commit) via c821997a5a69e8f37ce8b802211774b33a479103 (commit) via 3ca86a3929e201898e692ab3608d0dcf1a8a4bf2 (commit) via 4e8cc7dc97871ba757517d0791488d57abee71a1 (commit) via 6f3cf75e317dda6dc4a41a5b0c1227962edd30e0 (commit) via 2795a9061ca0a2c4f344303b686c64dbbc7032cd (commit) via c81db372d79bf96acc8a4a2cdb2fe7f0430b57e4 (commit) via faced3027aa337a629f69a3e6b67410ad9f07df3 (commit) via a58bb10e1839d0740cb634112f36462d52d4ac6f (commit) via 28519cf25befaba56aa677d38af2847c2a7febcb (commit) via 6f4db19f53370d1e220ba396408dc6e03e0061d9 (commit) via c6a8098239bac87d105525173e14cf1d1cbc0afa (commit) via 5a1018fc43c63c12c8ba8787e83ce4d48f91ff6e (commit) via 4d111205b1dfb1ef220b052f8ba96b8b1c47af0d (commit) via 93ab68dd131616369dccd0a6a62ff5f1a1a710d2 (commit) via cfeb031d1f8d7c31cb3fdf6b376ba7b7ea757a59 (commit) via ae88c2e758de107313e8a8cfaa192c42984a9fb8 (commit) via c4faafdc792abb3b2bef62b70ab7f32fd85aa143 (commit) via 1bc0473fe2b2c5fe24ccb2a1541b70e584009265 (commit) via b8ddd56d78598c497e4b4b0b1ffa27ed0550ebc8 (commit) via 67ef96d1f6d6bbf6b7d906a02c4c79898a11ee66 (commit) via 52501828f77f16baac93b16f706c6262ed55a926 (commit) via ff3efd4b7d3ac7b00117d7ef78f239972e3f9d50 (commit) via 5ac3f567c454764152631c26a9dafec7bf7eef0a (commit) via da6fe46a4d34c650e3d7f0b70d04ea22730f8e19 (commit) via d257d46dee97fb57173642fafe26a9f8b7f5b10c (commit) via 63900d009441d8e81714ea56337d5b736806fca1 (commit) from c04a557c02c590eb141661780f731540d46ba74c (commit)
- Log ----------------------------------------------------------------- commit 79b5bd602e50cc5eff4c32c85df673f7eac94862 Author: Madhura Jayaratne madhura.cj@gmail.com Date: Wed Aug 17 19:14:43 2011 +0530
Changelog entries for GIS features
commit d501fc1fe6f1f449ddadb13dacf505a841e7ec85 Merge: c04a557 0387ea0 Author: Madhura Jayaratne madhura.cj@gmail.com Date: Wed Aug 17 18:02:25 2011 +0530
Merge branch 'OpenGIS'
commit 0387ea0b40ad47dea5fad3c2b432452b31605dd1 Merge: 46722b8 aca93f4 Author: Madhura Jayaratne madhura.cj@gmail.com Date: Wed Aug 17 16:48:50 2011 +0530
Merge branch 'master' of git://phpmyadmin.git.sourceforge.net/gitroot/phpmyadmin/phpmyadmin into OpenGIS
commit 46722b80359c81626bdbc429329b1bc710db3530 Merge: 5e11e88 576e76d Author: Madhura Jayaratne madhura.cj@gmail.com Date: Wed Aug 17 16:43:18 2011 +0530
Merge branch 'master' into OpenGIS
commit 5e11e88a147e16c96c33547e199dca31d1a20c77 Author: Madhura Jayaratne madhura.cj@gmail.com Date: Sat Aug 13 17:31:38 2011 +0530
Mention the use of TempDir for ESRI Shapefile imports
commit 5744b9622d0bc76250e20127fd4a0329919f4af9 Author: Madhura Jayaratne madhura.cj@gmail.com Date: Sat Aug 13 17:24:39 2011 +0530
Documentation about importing ESRI Shapefiles
commit 7d7dd02e8cd2048f3e11585da86892bf7c4a6dea Merge: 16a0393 9147f30 Author: Madhura Jayaratne madhura.cj@gmail.com Date: Sat Aug 13 14:12:46 2011 +0530
Merge branch 'master' into OpenGIS
Conflicts: tbl_select.php
commit 16a039392b4a8ea028b38f969ef7e4e586532b94 Author: Madhura Jayaratne madhura.cj@gmail.com Date: Sat Aug 13 10:11:08 2011 +0530
Remove tab characters
commit 9ed1cd7c3ef2eb5cb9b3511aec280f89937b3cd0 Author: Madhura Jayaratne madhura.cj@gmail.com Date: Sat Aug 13 10:10:32 2011 +0530
Use abstract test class to avoid code duplications in tests
commit d6bf1cd451be99703fe428fb90747ef71b625a3e Author: Madhura Jayaratne madhura.cj@gmail.com Date: Sat Aug 13 10:02:39 2011 +0530
Adhere to coding style
commit cb176b2648f0d787d115290212ab829372414a16 Author: Madhura Jayaratne madhura.cj@gmail.com Date: Sat Aug 13 00:17:36 2011 +0530
Unit tests for PMA_GIS_Factory class
commit 005a4ce61b0f5818f8bcba83f8eda7a3192301f3 Author: Madhura Jayaratne madhura.cj@gmail.com Date: Fri Aug 12 15:09:03 2011 +0530
Unit test for PMA_GIS_modifyQuery
commit bedd7087f369567288ccdbb0898ed4dec90666e3 Author: Madhura Jayaratne madhura.cj@gmail.com Date: Fri Aug 12 14:03:40 2011 +0530
Wrap long lines
commit cb0eca28e4014555c219b290e47a282474281e94 Author: Madhura Jayaratne madhura.cj@gmail.com Date: Fri Aug 12 13:50:28 2011 +0530
Rename functions to match PEAR coding style
commit 414ac18e624fafb84cd82f89eb8ae628f6e93957 Author: Madhura Jayaratne madhura.cj@gmail.com Date: Fri Aug 12 13:32:43 2011 +0530
Remove redundant parameter
commit 333dc9ccec0e6f16ea7dbf65acdd9549311d169b Author: Madhura Jayaratne madhura.cj@gmail.com Date: Fri Aug 12 11:59:22 2011 +0530
Unit tests for PMA_GIS_Multipolygon class
commit f60672d0d3f8864a67ca92c7f5044b74073fe430 Author: Madhura Jayaratne madhura.cj@gmail.com Date: Fri Aug 12 11:22:57 2011 +0530
More tests for PMA_GIS_Polygon class
commit 760d895036176c2d2ca60d63150ce9b5a44379cd Author: Madhura Jayaratne madhura.cj@gmail.com Date: Fri Aug 12 08:30:14 2011 +0530
Unit tests for PMA_GIS_Polygon class
commit 68d617ad17d60851d69c50d58d728702f8cd6cff Author: Madhura Jayaratne madhura.cj@gmail.com Date: Fri Aug 12 07:03:24 2011 +0530
Unit tests for PMA_GIS_Multilinestring class
commit 591be45324f3e67c281c2e36d8624daf741bca0e Author: Madhura Jayaratne madhura.cj@gmail.com Date: Thu Aug 11 22:40:55 2011 +0530
Unit tests for PMA_GIS_Linestring class
commit 881d2f29b7d3021be171964fa735ac634921c400 Author: Madhura Jayaratne madhura.cj@gmail.com Date: Thu Aug 11 22:01:24 2011 +0530
Tests for PMA_GIS_Multipoint class
commit 81667ad578c52a47071394bb4baba5e51be7ac0d Author: Madhura Jayaratne madhura.cj@gmail.com Date: Thu Aug 11 21:45:24 2011 +0530
Unit tests for PMA_GIS_Point class
commit 7f94f8ea738d727389f63bd99d33b4e6f4130220 Author: Madhura Jayaratne madhura.cj@gmail.com Date: Thu Aug 11 21:21:19 2011 +0530
Wrap long lines
commit ca0bf0be2763b2659fb44391f329a8cb80256b3e Author: Madhura Jayaratne madhura.cj@gmail.com Date: Thu Aug 11 21:20:24 2011 +0530
Fix coding style
commit b67c913fadc71fec51d139d96cf5afe98656db1f Author: Madhura Jayaratne madhura.cj@gmail.com Date: Wed Aug 10 00:23:43 2011 +0530
Avoid undefined variable notice.
commit 84f2882bbf19dd8f1eec3b81a29a3eecb63b2af2 Author: Madhura Jayaratne madhura.cj@gmail.com Date: Wed Aug 10 00:09:42 2011 +0530
Added missing question mark in the URL
commit fa3e058e251d72a758629248a7ced02b89b3d62a Merge: 0e84927 630cdd9 Author: Madhura Jayaratne madhura.cj@gmail.com Date: Tue Aug 9 06:16:12 2011 +0530
Merge branch 'master' of git://phpmyadmin.git.sourceforge.net/gitroot/phpmyadmin/phpmyadmin into OpenGIS
commit 0e8492769354e5b5e2187d4fcda73f174c8f0417 Merge: 9c316b7 c00b1e5 Author: Madhura Jayaratne madhura.cj@gmail.com Date: Mon Aug 8 07:45:53 2011 +0530
Merge branch 'master' of git://phpmyadmin.git.sourceforge.net/gitroot/phpmyadmin/phpmyadmin into OpenGIS
Conflicts: libraries/common.lib.php
commit 9c316b7b1158b9207c8a87d04ddbedebac1a42dc Author: Madhura Jayaratne madhura.cj@gmail.com Date: Sun Aug 7 07:11:38 2011 +0530
Reduce font size. Remove black from the color list
commit acb6656961eb5191e7e3f8cd3ea09638f5d5f3ec Author: Madhura Jayaratne madhura.cj@gmail.com Date: Sat Aug 6 10:59:06 2011 +0530
Labels for each part in the geometry is not a good idea
commit a1f2d5311ad9c47092e4b95f28125bc2a7bfdaa3 Author: Madhura Jayaratne madhura.cj@gmail.com Date: Sat Aug 6 10:35:15 2011 +0530
Abstract function definition to the PMA_GIS_Geometry class
commit 2f6a53f50d979aca1c06891e8774e5952d4e0d80 Author: Madhura Jayaratne madhura.cj@gmail.com Date: Sat Aug 6 10:18:21 2011 +0530
Labels for polygons and multipolygons
commit 2b749e30c562c76441589e7123b8dbb4e520f47a Author: Madhura Jayaratne madhura.cj@gmail.com Date: Sat Aug 6 10:03:23 2011 +0530
Should verify that the point is not empty first
commit 218a2b561c7b242e4a10c11b7da7dbac4bcdadfe Author: Madhura Jayaratne madhura.cj@gmail.com Date: Fri Aug 5 05:55:51 2011 +0530
Labels for linestrings and multilinestring exported to PNG and PDF
commit 1a16ba7caecf157d7ac976acdd8df16bff698c10 Author: Madhura Jayaratne madhura.cj@gmail.com Date: Fri Aug 5 05:29:29 2011 +0530
Labels for points and multipoint exported to PDF
commit 2923f1cdb58d07ddc99146e85e0d91d8f98a45eb Author: Madhura Jayaratne madhura.cj@gmail.com Date: Fri Aug 5 05:05:22 2011 +0530
Labels for multipoints exported to PNG
commit 981cfeac2ede69205da710ac38714938bcb85239 Author: Madhura Jayaratne madhura.cj@gmail.com Date: Fri Aug 5 05:01:08 2011 +0530
Labels for exporting points as PNG
commit e2d535cc56d05d9ff0ffa9716f6580ef1a4fadf3 Author: Madhura Jayaratne madhura.cj@gmail.com Date: Thu Aug 4 09:39:58 2011 +0530
Use $cfg['PDFDefaultPageSize'] when exporting to PDF
commit 3da9f02130a4f7fa951f72d0667a4e543f76b683 Merge: 175a6e0 54fbcaa Author: Madhura Jayaratne madhura.cj@gmail.com Date: Wed Aug 3 18:17:57 2011 +0530
Merge branch 'master' into OpenGIS
commit 175a6e094801ff0a4097eaeeeda665ab8f35e212 Author: Madhura Jayaratne madhura.cj@gmail.com Date: Wed Aug 3 18:11:32 2011 +0530
Use hexadecimal form to create a unique condition for geometry fields
commit 7fe1ce201fc793c09b5833a4933c0b0bf81348a0 Merge: ba99e8f 663d073 Author: Madhura Jayaratne madhura.cj@gmail.com Date: Wed Aug 3 00:53:53 2011 +0530
Merge branch 'master' of git://phpmyadmin.git.sourceforge.net/gitroot/phpmyadmin/phpmyadmin into OpenGIS
commit ba99e8fe12e3a13c839f9bb488ad1ade636bed4e Merge: dc82360 19172fb Author: Madhura Jayaratne madhura.cj@gmail.com Date: Tue Aug 2 00:34:27 2011 +0530
Merge branch 'master' of git://phpmyadmin.git.sourceforge.net/gitroot/phpmyadmin/phpmyadmin into OpenGIS
commit dc823602428de00f987425ccdbbb903044572551 Author: Madhura Jayaratne madhura.cj@gmail.com Date: Tue Aug 2 00:32:32 2011 +0530
Prepares and insert GIS data to the input field on pressing 'enter'
commit 3611d48325f6e2990a5d29060503237f83d52257 Merge: 36c55ad 15a384a Author: Madhura Jayaratne madhura.cj@gmail.com Date: Mon Aug 1 09:40:36 2011 +0530
Merge branch 'master' of git://phpmyadmin.git.sourceforge.net/gitroot/phpmyadmin/phpmyadmin into OpenGIS
commit 36c55adb9ebc4b341bc52e3ad839b9909365fa78 Author: Madhura Jayaratne madhura.cj@gmail.com Date: Mon Aug 1 09:36:29 2011 +0530
Disabling causes problems as value is not passed. Use readonly.
commit 304a5d666b1f52695851df6a9d2ead74e3f8f9c1 Author: Madhura Jayaratne madhura.cj@gmail.com Date: Mon Aug 1 00:25:02 2011 +0530
Avoid undefined variables
commit fe10dec01f77a40afab3a0c97d03ee9d458d7501 Merge: f00b473 1917807 Author: Madhura Jayaratne madhura.cj@gmail.com Date: Sun Jul 31 23:25:33 2011 +0530
Merge branch 'master' of git://phpmyadmin.git.sourceforge.net/gitroot/phpmyadmin/phpmyadmin into OpenGIS
commit f00b473c17bce475816f0be84b48f572f404fbb5 Author: Madhura Jayaratne madhura.cj@gmail.com Date: Sun Jul 31 23:14:43 2011 +0530
Accept WKTs without SRID
commit e62c03f7a5b153ec7524157a7ec8878f46ce0162 Author: Madhura Jayaratne madhura.cj@gmail.com Date: Sun Jul 31 22:28:02 2011 +0530
Avoid undefined index
commit 7a955d4c66a0690d66f312aca1460d6f7d3da9b0 Author: Madhura Jayaratne madhura.cj@gmail.com Date: Sun Jul 31 21:55:21 2011 +0530
GIS data editor to insert geometry type parameters
commit d3bd2d5d91c25c77a192041216898d17059df401 Author: Madhura Jayaratne madhura.cj@gmail.com Date: Sun Jul 31 18:33:02 2011 +0530
Refractor common code to gis_data_editor.js. Remove hidden input to track null checkbox.
commit 3efcd0e24bd9a096611ae94d2c35bc2b5f48455a Merge: 6c6e43b ed5c01d Author: Madhura Jayaratne madhura.cj@gmail.com Date: Sun Jul 31 16:24:20 2011 +0530
Merge branch 'master' of ssh://repo.or.cz/srv/git/phpmyadmin/madhuracj into OpenGIS
commit ed5c01dc440f28486a3f6db546d5faf7d7e41165 Merge: 5ccc1de e3b91b7 Author: Madhura Jayaratne madhura.cj@gmail.com Date: Sun Jul 31 16:13:26 2011 +0530
Merge branch 'master' of git://phpmyadmin.git.sourceforge.net/gitroot/phpmyadmin/phpmyadmin into OpenGIS
commit 5ccc1dec16ec46422544c984f4b884ae25fef066 Author: Madhura Jayaratne madhura.cj@gmail.com Date: Sun Jul 31 15:53:35 2011 +0530
Styles adjusted to suit the AJAX dialog
commit 516557716a37836df650387bfbc0034031476c24 Author: Madhura Jayaratne madhura.cj@gmail.com Date: Sun Jul 31 15:32:59 2011 +0530
Remove the content when AJAX dialog closes
commit 0a80147c4623dff9420cda8ef7e26a0f279566c4 Author: Madhura Jayaratne madhura.cj@gmail.com Date: Sun Jul 31 14:34:29 2011 +0530
In multi editing this used to cause duplicate IDs for elements
commit 6ae969a5ee3d2e30ccf3d95aefa7f641a3ccd2db Author: Madhura Jayaratne madhura.cj@gmail.com Date: Sun Jul 31 14:04:12 2011 +0530
Serve OpenStreetMap.js locally
commit 6c6e43b78a43e323de38331e6f0e7668851e59fe Author: Madhura Jayaratne madhura.cj@gmail.com Date: Sun Jul 31 10:15:10 2011 +0530
Control selection based on the selected function.
commit c53750eac09bbff5388613d97297b1cdece2e99f Author: Madhura Jayaratne madhura.cj@gmail.com Date: Sun Jul 31 09:07:58 2011 +0530
'Function based search' for functions that tests spatial relations between geometric objects
commit db1f83b55b151c100a3aa9a81f7856432f730386 Author: Madhura Jayaratne madhura.cj@gmail.com Date: Sun Jul 31 01:40:55 2011 +0530
Make it possible to compare with WKB
commit c73380be3509626fbdb7b5027b7d80abb16f2588 Author: Madhura Jayaratne madhura.cj@gmail.com Date: Sun Jul 31 01:26:31 2011 +0530
Make it more readable
commit c3189393448f80543ecdb6c94c8c533f204cb0ad Author: Madhura Jayaratne madhura.cj@gmail.com Date: Sun Jul 31 01:14:42 2011 +0530
Use curly brackets for if/else and foreach blocks
commit e456f221494e1ccf76d5b8f73ca5e6896feec113 Author: Madhura Jayaratne madhura.cj@gmail.com Date: Sun Jul 31 01:11:11 2011 +0530
Detect the output type of the functions being applied
commit 47a8dcfc8885a0086fc8c8b9b5a49e783d81180a Author: Madhura Jayaratne madhura.cj@gmail.com Date: Thu Jul 28 12:06:15 2011 +0530
Function based search - for unary functions
commit aed7270cb99b80ccc7abe970a566e6241ccec159 Merge: 01976f1 66c0be9 Author: Madhura Jayaratne madhura.cj@gmail.com Date: Sat Jul 30 22:53:07 2011 +0530
Merge branch 'master' of git://phpmyadmin.git.sourceforge.net/gitroot/phpmyadmin/phpmyadmin into OpenGIS
commit 01976f1663f7d36d18f65574276f7250b506ef94 Author: Madhura Jayaratne madhura.cj@gmail.com Date: Thu Jul 28 11:44:18 2011 +0530
Handle the cases where URL is too long
commit 003496969e3a5ab8a04e939c945f42c90dfe7f49 Merge: b48a250 e58eea5 Author: Madhura Jayaratne madhura.cj@gmail.com Date: Thu Jul 28 06:01:39 2011 +0530
Merge branch 'master' of git://phpmyadmin.git.sourceforge.net/gitroot/phpmyadmin/phpmyadmin into OpenGIS
commit b48a250ca8ceb4ab07caa502f05772b9d02acb25 Merge: ec7feea ad4975b Author: Madhura Jayaratne madhura.cj@gmail.com Date: Tue Jul 26 21:45:43 2011 +0530
Merge branch 'master' of git://phpmyadmin.git.sourceforge.net/gitroot/phpmyadmin/phpmyadmin into OpenGIS
commit ec7feea9b04d173f2468d7fa3294be23b1965427 Merge: 11ca5da c3863f0 Author: Madhura Jayaratne madhura.cj@gmail.com Date: Sun Jul 24 23:05:35 2011 +0530
Merge branch 'master' of git://phpmyadmin.git.sourceforge.net/gitroot/phpmyadmin/phpmyadmin into OpenGIS
Conflicts: libraries/import.lib.php libraries/zip_extension.lib.php
commit 11ca5daa412c0338d63020f94f74530e95463ce9 Author: Madhura Jayaratne madhura.cj@gmail.com Date: Sun Jul 24 22:30:52 2011 +0530
Change of color
commit 1f2ba4e9cc51c2bf2b1c1b96f78f29143e033e36 Author: Madhura Jayaratne madhura.cj@gmail.com Date: Sun Jul 24 22:17:03 2011 +0530
Resolves problems with point and multipoint visualizations due to the assumption of empty values as zeros
commit 47fdfad3361fc5840776060c2326505de1512ee3 Merge: 6f35aaa 4925260 Author: Madhura Jayaratne madhura.cj@gmail.com Date: Fri Jul 22 04:07:09 2011 +0530
Merge branch 'master' of git://phpmyadmin.git.sourceforge.net/gitroot/phpmyadmin/phpmyadmin into OpenGIS
Conflicts: libraries/gis/pma_gis_geometrycollection.php
commit 6f35aaa8e46e1bc50b4b5e38d4b9c4810c5c71ce Merge: 47762d7 75bb94f Author: Madhura Jayaratne madhura.cj@gmail.com Date: Wed Jul 20 23:15:01 2011 +0530
Merge branch 'master' of git://phpmyadmin.git.sourceforge.net/gitroot/phpmyadmin/phpmyadmin into OpenGIS
Conflicts: libraries/import.lib.php
commit 47762d7b14815296256dea277647f152c1c5c2fc Author: Madhura Jayaratne madhura.cj@gmail.com Date: Wed Jul 20 23:07:53 2011 +0530
Better organized JS code
commit 015ad8968008284f565ecd1274f37ddcd89ca06e Author: Madhura Jayaratne madhura.cj@gmail.com Date: Wed Jul 20 15:41:35 2011 +0530
Size of GIS visualization auto adjusted to fit the available space
commit 4d7b7d9a88012563463df82b904a6859400de7d9 Merge: 0e44352 1b56916 Author: Madhura Jayaratne madhura.cj@gmail.com Date: Mon Jul 18 14:08:37 2011 +0530
Merge branch 'master' of git://phpmyadmin.git.sourceforge.net/gitroot/phpmyadmin/phpmyadmin into OpenGIS
commit 0e4435266b588de8788b01bb92bf8261c3762ab5 Author: Madhura Jayaratne madhura.cj@gmail.com Date: Mon Jul 18 14:03:21 2011 +0530
Change of classes to avoid conflicts with classes used in tbl_gis_visualization.js
commit 2a402a3103c5a12e6c9d2fd2515d7695da2942ff Author: Madhura Jayaratne madhura.cj@gmail.com Date: Mon Jul 18 13:43:46 2011 +0530
OpenStreetMaps based data visualization for GIS data editor
commit 5a6379f93e97a4535a3a78b56ddc6a5cbe3901e8 Author: Madhura Jayaratne madhura.cj@gmail.com Date: Sun Jul 17 16:59:25 2011 +0530
SVG based data visualization for GIS data editor
commit 96785858bc79297b34b06722fc833bb033aa10c4 Merge: d85c777 10fa6c5 Author: Madhura Jayaratne madhura.cj@gmail.com Date: Sat Jul 16 14:19:27 2011 +0530
Merge branch 'master' of git://phpmyadmin.git.sourceforge.net/gitroot/phpmyadmin/phpmyadmin into OpenGIS
commit d85c777c78a854d56d39cb6420624e22eedc6586 Author: Madhura Jayaratne madhura.cj@gmail.com Date: Sat Jul 16 14:17:17 2011 +0530
Chose the correct GIS type
commit 1b9ddd2efa71971ef1b78356cc878af437cdf5dd Author: Madhura Jayaratne madhura.cj@gmail.com Date: Sat Jul 16 13:23:11 2011 +0530
These should be PMA_messages[]
commit ba93a625b9de49fc10c1d65a880768258497459c Author: Madhura Jayaratne madhura.cj@gmail.com Date: Sat Jul 16 13:14:29 2011 +0530
Make JS messages translatable.
commit 7af88c04c75641fc3aba7e26935c0ef8f9e2dcbe Author: Madhura Jayaratne madhura.cj@gmail.com Date: Sat Jul 16 11:05:53 2011 +0530
Cleanup spaces
commit ed23518a44fdd62c5394c785e515d65f7c4910eb Author: Madhura Jayaratne madhura.cj@gmail.com Date: Sat Jul 16 10:50:22 2011 +0530
Handle adding polygons and geometry objects
commit ffb970f169f6e9642fd9fe924cca88f8c14695d2 Merge: 83d8d3a 10cbf3b Author: Madhura Jayaratne madhura.cj@gmail.com Date: Sat Jul 16 02:18:41 2011 +0530
Merge branch 'master' of git://phpmyadmin.git.sourceforge.net/gitroot/phpmyadmin/phpmyadmin into OpenGIS
commit 83d8d3a8ed3043f52b1f1ef42af33fccfead1e87 Author: Madhura Jayaratne madhura.cj@gmail.com Date: Sat Jul 16 02:11:18 2011 +0530
Handle adding linestrings and inner rings. Better comments
commit b2d703dbea2077c9ff48686ee230d7a7ff224318 Author: Madhura Jayaratne madhura.cj@gmail.com Date: Sat Jul 16 00:29:00 2011 +0530
Add points with JavaScript
commit 166b571964d6c3513359512b8eef83584f2f9ddf Author: Madhura Jayaratne madhura.cj@gmail.com Date: Fri Jul 15 23:13:00 2011 +0530
Non JS version does not need this parameters.
commit 56090dd46f34e485199541d1262dc70c85001ede Merge: f5bd53f 108f738 Author: Madhura Jayaratne madhura.cj@gmail.com Date: Fri Jul 15 18:35:32 2011 +0530
Merge branch 'master' of git://phpmyadmin.git.sourceforge.net/gitroot/phpmyadmin/phpmyadmin into OpenGIS
commit f5bd53fae03e41c2b26f3769ce891270d00d39e9 Author: Madhura Jayaratne madhura.cj@gmail.com Date: Fri Jul 15 18:31:15 2011 +0530
Remove hidden fields not used.
commit c18ef53b57ba72a6b35e479b3510d855cc636aa7 Author: Madhura Jayaratne madhura.cj@gmail.com Date: Fri Jul 15 18:30:28 2011 +0530
Do not use PMA_mysqlDie() to handle these errors.
commit bb987837ebf198e60503231bbf7cc9a50eea3337 Merge: 6e7c3ad 117dd68 Author: Madhura Jayaratne madhura.cj@gmail.com Date: Fri Jul 15 00:34:28 2011 +0530
Merge branch 'master' of git://phpmyadmin.git.sourceforge.net/gitroot/phpmyadmin/phpmyadmin into OpenGIS
commit 6e7c3adbc15eb1f4b822a083b954cbc39a02bc13 Author: Madhura Jayaratne madhura.cj@gmail.com Date: Fri Jul 15 00:27:31 2011 +0530
Trigger AJAX calls on data change and update the output
commit 0c9301f7dbc88ee49021f708d9004e0b57975fd8 Author: Madhura Jayaratne madhura.cj@gmail.com Date: Fri Jul 15 00:04:32 2011 +0530
Corrected order of includes.
commit fd0cb076c0c415c321edf8e811c9691d6f2ca06f Author: Madhura Jayaratne madhura.cj@gmail.com Date: Fri Jul 15 00:03:48 2011 +0530
Better styling for GIS data editor.
commit 4ee9d4834639659f73635825f367c842fcd0e090 Merge: c97bb57 7f5cbe9 Author: Madhura Jayaratne madhura.cj@gmail.com Date: Thu Jul 14 19:49:59 2011 +0530
Merge branch 'master' of git://phpmyadmin.git.sourceforge.net/gitroot/phpmyadmin/phpmyadmin into OpenGIS
commit c97bb579250bdafa23e60386facf3f12034d287b Merge: b1634f8 ac4f0a1 Author: Madhura Jayaratne madhura.cj@gmail.com Date: Thu Jul 14 19:45:16 2011 +0530
Merge branch 'master' of ssh://repo.or.cz/srv/git/phpmyadmin/madhuracj into OpenGIS
commit b1634f80fd598d67130b7fccd29f7bc8dbc726b4 Author: Madhura Jayaratne madhura.cj@gmail.com Date: Thu Jul 14 19:39:39 2011 +0530
GIS data editor extended for JS enabled browsers
commit ac4f0a10b0593b20cb49116df0170912ab292e69 Merge: 66f73b4 ad87dcf Author: Madhura Jayaratne madhura.cj@gmail.com Date: Thu Jul 14 10:01:41 2011 +0530
Merge branch 'master' of git://phpmyadmin.git.sourceforge.net/gitroot/phpmyadmin/phpmyadmin into OpenGIS
commit 66f73b4114bf8e60496fe052ec86b33c65c3137e Author: Madhura Jayaratne madhura.cj@gmail.com Date: Thu Jul 14 09:59:35 2011 +0530
Better error handling.
commit e0e0dea09b25da67f60d787b0c2312dbbc5a7660 Author: Madhura Jayaratne madhura.cj@gmail.com Date: Thu Jul 14 00:09:25 2011 +0530
1) Better error handling. 2)Typo
commit 1d9ef026089b7b52061f4558ddaaed10d500df60 Merge: a1e6b18 f57faf6 Author: Madhura Jayaratne madhura.cj@gmail.com Date: Wed Jul 13 23:55:14 2011 +0530
Merge branch 'master' of git://phpmyadmin.git.sourceforge.net/gitroot/phpmyadmin/phpmyadmin into OpenGIS
commit a1e6b187c60999d1934ed5f7428c95f0a5d3820d Author: Madhura Jayaratne madhura.cj@gmail.com Date: Wed Jul 13 23:51:25 2011 +0530
Correctly display error message for zero data.
commit f76785603f311153f7217ec45575c98440b07381 Merge: 2bf7086 2c0d2ac Author: Madhura Jayaratne madhura.cj@gmail.com Date: Wed Jul 13 00:20:41 2011 +0530
Merge branch 'master' of git://phpmyadmin.git.sourceforge.net/gitroot/phpmyadmin/phpmyadmin into OpenGIS
commit 2bf70868bbd9c69036470b4a9cbfe2fe29e1a8fc Author: Madhura Jayaratne madhura.cj@gmail.com Date: Wed Jul 13 00:19:11 2011 +0530
Avoid undefined variables
commit 242534a78ad3d26334cd97dcf8346c7cd327179b Author: Madhura Jayaratne madhura.cj@gmail.com Date: Wed Jul 13 00:17:09 2011 +0530
Avoid divide by zero error
commit be8ce3d5b61a069ab2dc4caf2206db1af67cd15c Merge: e713557 7802be3 Author: Madhura Jayaratne madhura.cj@gmail.com Date: Tue Jul 12 19:04:47 2011 +0530
Merge branch 'master' of git://phpmyadmin.git.sourceforge.net/gitroot/phpmyadmin/phpmyadmin into OpenGIS
commit e7135574bd2acefa90c7b2e654d2344d3027e479 Author: Madhura Jayaratne madhura.cj@gmail.com Date: Tue Jul 12 14:21:48 2011 +0530
Trim the name before being displayed as the tooltip.
commit b9e5125870e8d6575f679d59d46e1fddec2f9e0c Author: Madhura Jayaratne madhura.cj@gmail.com Date: Mon Jul 11 22:25:45 2011 +0530
Correctly display null and empty values in geometry columns
commit c821997a5a69e8f37ce8b802211774b33a479103 Merge: 3ca86a3 4bb11fd Author: Madhura Jayaratne madhura.cj@gmail.com Date: Mon Jul 11 21:36:38 2011 +0530
Merge branch 'master' of git://phpmyadmin.git.sourceforge.net/gitroot/phpmyadmin/phpmyadmin into OpenGIS
commit 3ca86a3929e201898e692ab3608d0dcf1a8a4bf2 Author: Madhura Jayaratne madhura.cj@gmail.com Date: Mon Jul 11 21:29:48 2011 +0530
Protection against malformed WKT and null
commit 4e8cc7dc97871ba757517d0791488d57abee71a1 Author: Madhura Jayaratne madhura.cj@gmail.com Date: Sun Jul 10 23:29:05 2011 +0530
Avoid accessing undefined variables
commit 6f3cf75e317dda6dc4a41a5b0c1227962edd30e0 Merge: 2795a90 4ae5cb0 Author: Madhura Jayaratne madhura.cj@gmail.com Date: Sun Jul 10 22:26:15 2011 +0530
Merge branch 'master' of git://phpmyadmin.git.sourceforge.net/gitroot/phpmyadmin/phpmyadmin into OpenGIS
commit 2795a9061ca0a2c4f344303b686c64dbbc7032cd Author: Madhura Jayaratne madhura.cj@gmail.com Date: Sun Jul 10 22:13:50 2011 +0530
Resolve problems due to merge commit
commit c81db372d79bf96acc8a4a2cdb2fe7f0430b57e4 Author: Madhura Jayaratne madhura.cj@gmail.com Date: Sat Jul 9 19:18:03 2011 +0530
Manually implemented PointOnSurface() function as it is not yet implemented in MySQL
commit faced3027aa337a629f69a3e6b67410ad9f07df3 Merge: a58bb10 429328b Author: Madhura Jayaratne madhura.cj@gmail.com Date: Sat Jul 9 15:41:56 2011 +0530
Merge remote branch 'origin/master' into OpenGIS
commit a58bb10e1839d0740cb634112f36462d52d4ac6f Author: Madhura Jayaratne madhura.cj@gmail.com Date: Fri Jul 8 18:32:35 2011 +0530
Correctly import multipolygons from ESRI shape files
commit 28519cf25befaba56aa677d38af2847c2a7febcb Author: Madhura Jayaratne madhura.cj@gmail.com Date: Fri Jul 8 18:31:19 2011 +0530
ESRI shape files imported from a zip archive
commit 6f4db19f53370d1e220ba396408dc6e03e0061d9 Merge: c6a8098 b856161 Author: Madhura madhura.cj@gmail.com Date: Fri Jul 8 18:05:52 2011 +0530
Merge remote branch 'origin/master' into OpenGIS
commit c6a8098239bac87d105525173e14cf1d1cbc0afa Author: Madhura Jayaratne madhura.cj@gmail.com Date: Mon Jul 4 00:31:24 2011 +0530
Typo
commit 5a1018fc43c63c12c8ba8787e83ce4d48f91ff6e Author: Madhura Jayaratne madhura.cj@gmail.com Date: Sun Jul 3 23:56:47 2011 +0530
Increase memory limit and time limit
commit 4d111205b1dfb1ef220b052f8ba96b8b1c47af0d Author: Madhura Jayaratne madhura.cj@gmail.com Date: Sun Jul 3 22:46:48 2011 +0530
A polygon needs to have atleast 4 points - more instances
commit 93ab68dd131616369dccd0a6a62ff5f1a1a710d2 Author: Madhura Jayaratne madhura.cj@gmail.com Date: Sun Jul 3 22:41:52 2011 +0530
A polygon needs to have atleast 4 points - more instances
commit cfeb031d1f8d7c31cb3fdf6b376ba7b7ea757a59 Author: Madhura Jayaratne madhura.cj@gmail.com Date: Sun Jul 3 22:36:34 2011 +0530
A polygon needs to have atleast 4 points.
commit ae88c2e758de107313e8a8cfaa192c42984a9fb8 Author: Madhura Jayaratne madhura.cj@gmail.com Date: Sun Jul 3 22:14:14 2011 +0530
Tabs replaced with spaces
commit c4faafdc792abb3b2bef62b70ab7f32fd85aa143 Author: Madhura Jayaratne madhura.cj@gmail.com Date: Sun Jul 3 22:12:02 2011 +0530
Import GIS data from ESRI shape files
commit 1bc0473fe2b2c5fe24ccb2a1541b70e584009265 Merge: b8ddd56 64e4f9f Author: Madhura Jayaratne madhura.cj@gmail.com Date: Sun Jul 3 21:42:04 2011 +0530
Merge branch 'master' of git://phpmyadmin.git.sourceforge.net/gitroot/phpmyadmin/phpmyadmin into OpenGIS
Conflicts: tbl_replace.php
commit b8ddd56d78598c497e4b4b0b1ffa27ed0550ebc8 Merge: 67ef96d cbf00bc Author: Madhura Jayaratne madhura.cj@gmail.com Date: Thu Jun 30 10:01:33 2011 +0530
Merge branch 'master' of git://phpmyadmin.git.sourceforge.net/gitroot/phpmyadmin/phpmyadmin into OpenGIS
commit 67ef96d1f6d6bbf6b7d906a02c4c79898a11ee66 Author: Madhura Jayaratne madhura.cj@gmail.com Date: Thu Jun 30 09:58:09 2011 +0530
Check whether the variable is set before accessing it.
commit 52501828f77f16baac93b16f706c6262ed55a926 Merge: ff3efd4 02b1b32 Author: Madhura Jayaratne madhura.cj@gmail.com Date: Sun Jun 26 18:01:41 2011 +0530
Merge branch 'master' of git://phpmyadmin.git.sourceforge.net/gitroot/phpmyadmin/phpmyadmin into OpenGIS
commit ff3efd4b7d3ac7b00117d7ef78f239972e3f9d50 Author: Madhura Jayaratne madhura.cj@gmail.com Date: Sun Jun 26 17:57:12 2011 +0530
Editing geometry data using GIS data editor.
commit 5ac3f567c454764152631c26a9dafec7bf7eef0a Author: Madhura Jayaratne madhura.cj@gmail.com Date: Sat Jun 25 23:01:48 2011 +0530
GIS data editing for POINT
commit da6fe46a4d34c650e3d7f0b70d04ea22730f8e19 Author: Madhura Jayaratne madhura.cj@gmail.com Date: Sat Jun 25 21:24:07 2011 +0530
GISFromWKB functions in data insert/edit window fixed.
commit d257d46dee97fb57173642fafe26a9f8b7f5b10c Merge: 63900d0 5403fc1 Author: Madhura Jayaratne madhura.cj@gmail.com Date: Sat Jun 25 19:48:40 2011 +0530
Merge branch 'master' of git://phpmyadmin.git.sourceforge.net/gitroot/phpmyadmin/phpmyadmin into OpenGIS
commit 63900d009441d8e81714ea56337d5b736806fca1 Author: Madhura Jayaratne madhura.cj@gmail.com Date: Sat Jun 25 19:39:31 2011 +0530
GIS data editor for environments without JavaScript support. GIS data preserved while editing.
-----------------------------------------------------------------------
Summary of changes: ChangeLog | 3 + Documentation.html | 42 ++- gis_data_editor.php | 335 +++++++++++ js/OpenStreetMap.js | 125 ++++ js/gis_data_editor.js | 309 ++++++++++ js/messages.php | 12 + js/sql.js | 10 +- js/tbl_change.js | 29 +- js/tbl_gis_visualization.js | 146 ++++-- js/tbl_select.js | 89 +++- libraries/bfShapeFiles/ShapeFile.lib.php | 649 +++++++++++++++++++++ libraries/common.lib.php | 193 ++++++- libraries/config.default.php | 1 + libraries/display_tbl.lib.php | 96 ++-- libraries/gis/pma_gis_factory.php | 7 +- libraries/gis/pma_gis_geometry.php | 53 ++- libraries/gis/pma_gis_geometrycollection.php | 81 +++ libraries/gis/pma_gis_linestring.php | 76 +++ libraries/gis/pma_gis_multilinestring.php | 119 ++++ libraries/gis/pma_gis_multipoint.php | 130 ++++- libraries/gis/pma_gis_multipolygon.php | 209 +++++++ libraries/gis/pma_gis_point.php | 104 +++- libraries/gis/pma_gis_polygon.php | 254 ++++++++ libraries/gis/pma_gis_visualization.php | 62 ++- libraries/gis_visualization.lib.php | 19 +- libraries/import.lib.php | 43 +- libraries/import/shp.php | 399 +++++++++++++ libraries/tbl_select.lib.php | 134 ++++- libraries/zip_extension.lib.php | 79 +++- sql.php | 9 + tbl_change.php | 35 +- tbl_gis_visualization.php | 39 +-- tbl_replace.php | 35 +- tbl_select.php | 60 ++- test/classes/gis/PMA_GIS_Factory_test.php | 80 +++ test/classes/gis/PMA_GIS_Geometry_test.php | 60 ++ test/classes/gis/PMA_GIS_Linestring_test.php | 142 +++++ test/classes/gis/PMA_GIS_Multilinestring_test.php | 182 ++++++ test/classes/gis/PMA_GIS_Multipoint_test.php | 146 +++++ test/classes/gis/PMA_GIS_Multipolygon_test.php | 139 +++++ test/classes/gis/PMA_GIS_Point_test.php | 148 +++++ test/classes/gis/PMA_GIS_Polygon_test.php | 299 ++++++++++ test/libraries/PMA_GIS_modifyQuery_test.php | 94 +++ themes/original/css/theme_right.css.php | 38 ++ themes/pmahomme/css/theme_right.css.php | 38 ++ 45 files changed, 5090 insertions(+), 262 deletions(-) create mode 100644 gis_data_editor.php create mode 100644 js/OpenStreetMap.js create mode 100644 js/gis_data_editor.js create mode 100644 libraries/bfShapeFiles/ShapeFile.lib.php create mode 100644 libraries/import/shp.php create mode 100644 test/classes/gis/PMA_GIS_Factory_test.php create mode 100644 test/classes/gis/PMA_GIS_Geometry_test.php create mode 100644 test/classes/gis/PMA_GIS_Linestring_test.php create mode 100644 test/classes/gis/PMA_GIS_Multilinestring_test.php create mode 100644 test/classes/gis/PMA_GIS_Multipoint_test.php create mode 100644 test/classes/gis/PMA_GIS_Multipolygon_test.php create mode 100644 test/classes/gis/PMA_GIS_Point_test.php create mode 100644 test/classes/gis/PMA_GIS_Polygon_test.php create mode 100644 test/libraries/PMA_GIS_modifyQuery_test.php
diff --git a/ChangeLog b/ChangeLog index e6c1bc4..f70eae5 100644 --- a/ChangeLog +++ b/ChangeLog @@ -44,6 +44,9 @@ phpMyAdmin - ChangeLog - bug #3380946 [export] no uid Query result export (Suhosin limit) + Grid editing in browse mode (replaces row inline edit) + Zoom-search in table Search ++ [interface] Editor for GIS data ++ [import] Import GIS data from ESRI Shapefiles ++ [interface] 'Function based search' for GIS data
3.4.5.0 (not yet released) - bug #3375325 [interface] Page list in navigation frame looks odd diff --git a/Documentation.html b/Documentation.html index 8f7e66f..758a2bc 100644 --- a/Documentation.html +++ b/Documentation.html @@ -2088,9 +2088,10 @@ $cfg['TrustedProxies'] = The name of the directory where temporary files can be stored. <br /><br />
- This is needed to work around limitations of <tt>open_basedir</tt> - for uploaded files, see - <a href="#faq1_11"><abbr title="Frequently Asked Questions">FAQ</abbr> + This is needed for importing ESRI Shapefiles, see + <a href="#faq6_30"><abbr title="Frequently Asked Questions">FAQ</abbr> + 6.30</a> and to work around limitations of <tt>open_basedir</tt> for uploaded + files, see <a href="#faq1_11"><abbr title="Frequently Asked Questions">FAQ</abbr> 1.11</a>. <br /><br />
@@ -4373,6 +4374,41 @@ INSERT INTO REL_towns VALUES ('M', 'Montréal');
<p> Not every table can be put to the chart. Only tables with one, two or three columns can be visualised as a chart. Moreover the table must be in a special format for chart script to understand it. Currently supported formats can be found in the <a href="http://wiki.phpmyadmin.net/pma/Charts#Data_formats_for_query_results_chart">wiki</a>.</p>
+<h4 id="faq6_30"> + <a href="#faq6_30">6.30 Import: How can I import ESRI Shapefiles</a></h4> + + <p> + An ESRI Shapefile is actually a set of several files, where .shp file contains + geometry data and .dbf file contains data related to those geometry data. + To read data from .dbf file you need to have PHP compiled with the dBase extension + (--enable-dbase). Otherwise only geometry data will be imported. + </p> + + <p>To upload these set of files you can use either of the following methods:</p> + <ul> + <li> + <p> + Configure upload directory with + <a href="#cfg_UploadDir" class="configrule">$cfg['UploadDir']</a>, upload both + .shp and .dbf files with the same filename and chose the .shp file from the import page. + </p> + </li> + <li> + <p> + Create a Zip archive with .shp and .dbf files and import it. For this to work, + you need to set <a href="#cfg_TempDir" class="configrule">$cfg['TempDir']</a> to a + place where the web server user can write (for example <tt>'./tmp'</tt>). + </p> + + <p> To create the temporary directory on a UNIX-based system, you can do:</p> +<pre> +cd phpMyAdmin +mkdir tmp +chmod o+rwx tmp +</pre> + </li> + </ul> + <h3 id="faqproject">phpMyAdmin project</h3>
<h4 id="faq7_1"> diff --git a/gis_data_editor.php b/gis_data_editor.php new file mode 100644 index 0000000..7614aba --- /dev/null +++ b/gis_data_editor.php @@ -0,0 +1,335 @@ +<?php +require_once './libraries/common.inc.php'; +if (! isset($_REQUEST['get_gis_editor']) && ! isset($_REQUEST['generate'])) { + require_once './libraries/header_http.inc.php'; + require_once './libraries/header_meta_style.inc.php'; +} +require_once './libraries/gis/pma_gis_factory.php'; +require_once './libraries/gis_visualization.lib.php'; + +// Get data if any posted +$gis_data = array(); +if (PMA_isValid($_REQUEST['gis_data'], 'array')) { + $gis_data = $_REQUEST['gis_data']; +} + +$gis_types = array( + 'POINT', + 'MULTIPOINT', + 'LINESTRING', + 'MULTILINESTRING', + 'POLYGON', + 'MULTIPOLYGON', + 'GEOMETRYCOLLECTION' +); + +// Extract type from the initial call and make sure that it's a valid one. +// Extract from field's values if availbale, if not use the column type passed. +if (! isset($gis_data['gis_type'])) { + if (isset($_REQUEST['type']) && $_REQUEST['type'] != '') { + $gis_data['gis_type'] = strtoupper($_REQUEST['type']); + } + if (isset($_REQUEST['value']) && trim($_REQUEST['value']) != '') { + $start = (substr($_REQUEST['value'], 0, 1) == "'") ? 1 : 0; + $gis_data['gis_type'] = substr($_REQUEST['value'], $start, strpos($_REQUEST['value'], "(") - $start); + } + if((! isset($gis_data['gis_type'])) || (! in_array($gis_data['gis_type'], $gis_types))) { + $gis_data['gis_type'] = $gis_types[0]; + } +} +$geom_type = $gis_data['gis_type']; + +// Generate parameters from value passed. +$gis_obj = PMA_GIS_Factory::factory($geom_type); +if (isset($_REQUEST['value'])) { + $gis_data = array_merge($gis_data, $gis_obj->generateParams($_REQUEST['value'])); +} + +// Generate Well Known Text +$srid = (isset($gis_data['srid']) && $gis_data['srid'] != '') ? htmlspecialchars($gis_data['srid']) : 0; +$wkt = $gis_obj->generateWkt($gis_data, 0); +$wkt_with_zero = $gis_obj->generateWkt($gis_data, 0, '0'); +$result = "'" . $wkt . "'," . $srid; + +// Gererate PNG or SVG based visualization +$format = (PMA_USR_BROWSER_AGENT == 'IE' && PMA_USR_BROWSER_VER <= 8) ? 'png' : 'svg'; +$visualizationSettings = array('width' => 450, 'height' => 300, 'spatialColumn' => 'wkt'); +$data = array(array('wkt' => $wkt_with_zero, 'srid' => $srid)); +$visualization = PMA_GIS_visualizationResults($data, $visualizationSettings, $format); +$open_layers = PMA_GIS_visualizationResults($data, $visualizationSettings, 'ol'); + +// If the call is to update the WKT and visualization make an AJAX response +if(isset($_REQUEST['generate']) && $_REQUEST['generate'] == true) { + $extra_data = array( + 'result' => $result, + 'visualization' => $visualization, + 'openLayers' => $open_layers, + ); + PMA_ajaxResponse(null, true, $extra_data); +} + +// If the call is to get the whole content, start buffering, skipping </head> and <body> tags +if(isset($_REQUEST['get_gis_editor']) && $_REQUEST['get_gis_editor'] == true) { + ob_start(); +} else { +?> +</head> +<body> +<?php +} +?> + <form id="gis_data_editor_form" action="gis_data_editor.php" method="post"> + <input type="hidden" id="pmaThemeImage" value="<?php echo($GLOBALS['pmaThemeImage']); ?>" /> + <div id="gis_data_editor"> + <h3><?php printf(__('Value for the column "%s"'), htmlspecialchars($_REQUEST['field'])); ?></h3> + +<?php echo('<input type="hidden" name="field" value="' . htmlspecialchars($_REQUEST['field']) . '" />'); + // The input field to which the final result should be added and corresponding null checkbox + if (isset($_REQUEST['input_name'])) { + echo('<input type="hidden" name="input_name" value="' . htmlspecialchars($_REQUEST['input_name']) . '" />'); + } + echo PMA_generate_common_hidden_inputs(); +?> + <!-- Visualization section --> + <div id="placeholder" style="width:450px;height:300px; +<?php if ($srid != 0) { + echo('display:none;'); + } +?> "> +<?php echo ($visualization); +?> </div> + <div id="openlayersmap" style="width:450px;height:300px; +<?php if ($srid == 0) { + echo('display:none;'); + } +?> "> + </div> + <div class="choice" style="float:right;clear:right;"> + <input type="checkbox" id="choice" value="useBaseLayer" +<?php if ($srid != 0) { + echo(' checked="checked"'); + } +?> /> + <label for="choice"><?php echo __("Use OpenStreetMaps as Base Layer"); ?></label> + </div> + <script language="javascript" type="text/javascript"> + <?php echo($open_layers); ?> + </script> + <!-- End of visualization section --> + + <!-- Header section - Inclueds GIS type selector and input field for SRID --> + <div id="gis_data_header"> + <select name="gis_data[gis_type]" class="gis_type"> +<?php + foreach ($gis_types as $gis_type) { + echo('<option value="' . $gis_type . '"'); + if ($geom_type == $gis_type) { + echo(' selected="selected"'); + } + echo('>' . $gis_type . '</option>'); + } +?> + </select> + <input type="submit" name="gis_data[go]" class="go" value="<?php echo __("Go")?>" /> + <label for="srid"><?php echo __("SRID"); ?>: </label> + <input name="gis_data[srid]" type="text" value="<?php echo($srid); ?>" /> + </div> + <!-- End of header section --> + + <!-- Data section --> + <div id="gis_data"> +<?php $geom_count = 1; + if ($geom_type == 'GEOMETRYCOLLECTION') { + $geom_count = (isset($gis_data[$geom_type]['geom_count'])) ? $gis_data[$geom_type]['geom_count'] : 1; + if (isset($gis_data[$geom_type]['add_geom'])) { + $geom_count++; + } + echo('<input type="hidden" name="gis_data[GEOMETRYCOLLECTION][geom_count]" value="' . $geom_count . '">'); + } + for ($a = 0; $a < $geom_count; $a++) { + if ($geom_type == 'GEOMETRYCOLLECTION') { + echo('<br/><br/>'); echo __("Geometry"); echo($a + 1 . ':<br/>'); + if (isset($gis_data[$a]['gis_type'])) { + $type = $gis_data[$a]['gis_type']; + } else { + $type = $gis_types[0]; + } + echo('<select name="gis_data[' . $a . '][gis_type]" class="gis_type">'); + foreach (array_slice($gis_types, 0, 6) as $gis_type) { + echo('<option value="' . $gis_type . '"'); + if ($type == $gis_type) { + echo(' selected="selected"'); + } + echo('>' . $gis_type . '</option>'); + } + echo('</select>'); + echo('<input type="submit" name="gis_data[' . $a . '][go]" class="go" value="'); echo __("Go"); echo('">'); + } else { + $type = $geom_type; + } + + if ($type == 'POINT') { + echo('<br/>'); echo __("Point"); echo(' :'); +?> <label for="x"><?php echo __("X"); ?></label> + <input name="gis_data[<?php echo($a); ?>][POINT][x]" type="text" value="<?php echo(isset($gis_data[$a]['POINT']['x']) ? htmlspecialchars($gis_data[$a]['POINT']['x']) : ''); ?>" /> + <label for="y"><?php echo __("Y"); ?></label> + <input name="gis_data[<?php echo($a); ?>][POINT][y]" type="text" value="<?php echo(isset($gis_data[$a]['POINT']['y']) ? htmlspecialchars($gis_data[$a]['POINT']['y']) : ''); ?>" /> +<?php + } elseif ($type == 'MULTIPOINT' || $type == 'LINESTRING') { + + $no_of_points = isset($gis_data[$a][$type]['no_of_points']) ? $gis_data[$a][$type]['no_of_points'] : 1; + if ($type == 'LINESTRING' && $no_of_points < 2) { + $no_of_points = 2; + } + if ($type == 'MULTIPOINT' && $no_of_points < 1) { + $no_of_points = 1; + } + + if (isset($gis_data[$a][$type]['add_point'])) { + $no_of_points++; + } + echo('<input type="hidden" name="gis_data[' . $a . '][' . $type . '][no_of_points]" value="' . $no_of_points . '">'); + + for ($i = 0; $i < $no_of_points; $i++) { + echo('<br/>'); echo __("Point"); echo($i + 1 . ':'); +?> <label for="x"><?php echo __("X"); ?></label> + <input type="text" name="gis_data[<?php echo($a); ?>][<?php echo($type); ?>][<?php echo($i); ?>][x]" value="<?php echo(isset($gis_data[$a][$type][$i]['x']) ? htmlspecialchars($gis_data[$a][$type][$i]['x']) : ''); ?>" /> + <label for="y"><?php echo __("Y"); ?></label> + <input type="text" name="gis_data[<?php echo($a); ?>][<?php echo($type); ?>][<?php echo($i); ?>][y]" value="<?php echo(isset($gis_data[$a][$type][$i]['y']) ? htmlspecialchars($gis_data[$a][$type][$i]['y']) : ''); ?>" /> +<?php + } +?> + <input type="submit" name="gis_data[<?php echo($a); ?>][<?php echo($type); ?>][add_point]" class="add addPoint" value="<?php echo __("Add a point"); ?>"> +<?php + } elseif ($type == 'MULTILINESTRING' || $type == 'POLYGON') { + + $no_of_lines = isset($gis_data[$a][$type]['no_of_lines']) ? $gis_data[$a][$type]['no_of_lines'] : 1; + if ($no_of_lines < 1) { + $no_of_lines = 1; + } + if (isset($gis_data[$a][$type]['add_line'])) { + $no_of_lines++; + } + echo('<input type="hidden" name="gis_data[' . $a . '][' . $type . '][no_of_lines]" value="' . $no_of_lines . '">'); + + for ($i = 0; $i < $no_of_lines; $i++) { + echo('<br/>'); + if ($type == 'MULTILINESTRING') { + echo __("Linestring"); echo($i + 1 . ':'); + } else { + if ($i == 0) { + echo __("Outer Ring:"); + } else { + echo __("Inner Ring"); echo($i . ':'); + } + } + + $no_of_points = isset($gis_data[$a][$type][$i]['no_of_points']) ? $gis_data[$a][$type][$i]['no_of_points'] : 2; + if ($type == 'MULTILINESTRING' && $no_of_points < 2) { + $no_of_points = 2; + } + if ($type == 'POLYGON' && $no_of_points < 4) { + $no_of_points = 4; + } + if (isset($gis_data[$a][$type][$i]['add_point'])) { + $no_of_points++; + } + echo('<input type="hidden" name="gis_data[' . $a . '][' . $type . '][' . $i . '][no_of_points]" value="' . $no_of_points . '">'); + + for ($j = 0; $j < $no_of_points; $j++) { + echo('<br/>'); echo __("Point"); echo($j + 1 . ':'); +?> <label for="x"><?php echo __("X"); ?></label> + <input type="text" name="gis_data[<?php echo($a); ?>][<?php echo($type); ?>][<?php echo($i); ?>][<?php echo($j); ?>][x]" value="<?php echo(isset($gis_data[$a][$type][$i][$j]['x']) ? htmlspecialchars($gis_data[$a][$type][$i][$j]['x']) : ''); ?>" /> + <label for="y"><?php echo __("Y"); ?></label> + <input type="text" name="gis_data[<?php echo($a); ?>][<?php echo($type); ?>][<?php echo($i); ?>][<?php echo($j); ?>][y]" value="<?php echo(isset($gis_data[$a][$type][$i][$j]['x']) ? htmlspecialchars($gis_data[$a][$type][$i][$j]['y']) : ''); ?>" /> +<?php } +?> <input type="submit" name="gis_data[<?php echo($a); ?>][<?php echo($type); ?>][<?php echo($i); ?>][add_point]" class="add addPoint" value="<?php echo __("Add a point"); ?>"> +<?php } + $caption = ($type == 'MULTILINESTRING') ? __('Add a linestring') : __('Add an inner ring'); +?> <br/><input type="submit" name="gis_data[<?php echo($a); ?>][<?php echo($type); ?>][add_line]" class="add addLine" value="<?php echo($caption); ?>"> +<?php + } elseif ($type == 'MULTIPOLYGON') { + $no_of_polygons = isset($gis_data[$a][$type]['no_of_polygons']) ? $gis_data[$a][$type]['no_of_polygons'] : 1; + if ($no_of_polygons < 1) { + $no_of_polygons = 1; + } + if (isset($gis_data[$a][$type]['add_polygon'])) { + $no_of_polygons++; + } + echo('<input type="hidden" name="gis_data[' . $a . '][' . $type . '][no_of_polygons]" value="' . $no_of_polygons . '">'); + + for ($k = 0; $k < $no_of_polygons; $k++) { + echo('<br/>'); echo __("Polygon"); echo($k + 1 . ':'); + $no_of_lines = isset($gis_data[$a][$type][$k]['no_of_lines']) ? $gis_data[$a][$type][$k]['no_of_lines'] : 1; + if ($no_of_lines < 1) { + $no_of_lines = 1; + } + if (isset($gis_data[$a][$type][$k]['add_line'])) { + $no_of_lines++; + } + echo('<input type="hidden" name="gis_data[' . $a . '][' . $type . '][' . $k . '][no_of_lines]" value="' . $no_of_lines . '">'); + + for ($i = 0; $i < $no_of_lines; $i++) { + echo('<br/><br/>'); + if ($i == 0) { + echo __("Outer Ring:"); + } else { + echo __("Inner Ring"); echo($i . ':'); + } + + $no_of_points = isset($gis_data[$a][$type][$k][$i]['no_of_points']) ? $gis_data[$a][$type][$k][$i]['no_of_points'] : 4; + if ($no_of_points < 4) { + $no_of_points = 4; + } + if (isset($gis_data[$a][$type][$k][$i]['add_point'])) { + $no_of_points++; + } + echo('<input type="hidden" name="gis_data[' . $a . '][' . $type . '][' . $k . '][' . $i . '][no_of_points]" value="' . $no_of_points . '">'); + + for ($j = 0; $j < $no_of_points; $j++) { + echo('<br/>'); echo __("Point"); echo($j + 1 . ':'); +?> <label for="x"><?php echo __("X"); ?></label> + <input type="text" name="<?php echo("gis_data[" . $a . "][" . $type . "][" . $k . "][" . $i . "][" . $j . "][x]"); ?>" value="<?php echo(isset($gis_data[$a][$type][$k][$i][$j]['x']) ? htmlspecialchars($gis_data[$a][$type][$k][$i][$j]['x']) : ''); ?>" /> + <label for="y"><?php echo __("Y"); ?></label> + <input type="text" name="<?php echo("gis_data[" . $a . "][" . $type . "][" . $k . "][" . $i . "][" . $j . "][y]"); ?>" value="<?php echo(isset($gis_data[$a][$type][$k][$i][$j]['y']) ? htmlspecialchars($gis_data[$a][$type][$k][$i][$j]['y']) : ''); ?>" /> +<?php } +?> <input type="submit" name="<?php echo("gis_data[" . $a . "][" . $type . "][" . $k . "][" . $i . "][add_point]"); ?>" class="add addPoint" value="<?php echo __("Add a point"); ?>"> +<?php } +?> <br/><input type="submit" name="<?php echo("gis_data[" . $a . "][" . $type . "][" . $k . "][add_line]"); ?>" class="add addLine" value="<?php echo __('Add an inner ring') ?>"><br/> +<?php } +?> <br/><input type="submit" name="<?php echo("gis_data[" . $a . "][" . $type . "][add_polygon]"); ?>" class="add addPolygon" value="<?php echo __('Add a polygon') ?>"> +<?php } + } + if ($geom_type == 'GEOMETRYCOLLECTION') { +?> <br/><br/><input type="submit" name="gis_data[GEOMETRYCOLLECTION][add_geom]" class="add addGeom" value="<?php echo __("Add geometry"); ?>" /> +<?php } +?> </div> + <!-- End of data section --> + + <br/><input type="submit" name="gis_data[save]" value="<?php echo __('Go') ?>"> + <div id="gis_data_output"> + <h3><?php echo __('Output'); ?></h3> + <p><?php echo __('Chose "GeomFromText" from the "Function" column and paste the below string into the "Value" field'); ?></p> + <textarea id="gis_data_textarea" cols="95" rows="5"> +<?php echo($result); +?> </textarea> + </div> + </div> + </form> +<?php + +// If the call is to get the whole content, get the content in the buffer and make and AJAX response. +if(isset($_REQUEST['get_gis_editor']) && $_REQUEST['get_gis_editor'] == true) { + $extra_data['gis_editor'] = ob_get_contents(); + PMA_ajaxResponse(NULL, ob_end_clean(), $extra_data); +} +?> +</body> + +<?php +/** + * Displays the footer + */ +require './libraries/footer.inc.php'; + +?> \ No newline at end of file diff --git a/js/OpenStreetMap.js b/js/OpenStreetMap.js new file mode 100644 index 0000000..aebfa65 --- /dev/null +++ b/js/OpenStreetMap.js @@ -0,0 +1,125 @@ +/** + * Namespace: Util.OSM + */ +OpenLayers.Util.OSM = {}; + +/** + * Constant: MISSING_TILE_URL + * {String} URL of image to display for missing tiles + */ +OpenLayers.Util.OSM.MISSING_TILE_URL = "http://www.openstreetmap.org/openlayers/img/404.png"; + +/** + * Property: originalOnImageLoadError + * {Function} Original onImageLoadError function. + */ +OpenLayers.Util.OSM.originalOnImageLoadError = OpenLayers.Util.onImageLoadError; + +/** + * Function: onImageLoadError + */ +OpenLayers.Util.onImageLoadError = function() { + if (this.src.match(/^http://[abc].[a-z]+.openstreetmap.org//)) { + this.src = OpenLayers.Util.OSM.MISSING_TILE_URL; + } else if (this.src.match(/^http://[def].tah.openstreetmap.org//)) { + // do nothing - this layer is transparent + } else { + OpenLayers.Util.OSM.originalOnImageLoadError; + } +}; + +/** + * Class: OpenLayers.Layer.OSM.Mapnik + * + * Inherits from: + * - <OpenLayers.Layer.OSM> + */ +OpenLayers.Layer.OSM.Mapnik = OpenLayers.Class(OpenLayers.Layer.OSM, { + /** + * Constructor: OpenLayers.Layer.OSM.Mapnik + * + * Parameters: + * name - {String} + * options - {Object} Hashtable of extra options to tag onto the layer + */ + initialize: function(name, options) { + var url = [ + "http://a.tile.openstreetmap.org/$%7Bz%7D/$%7Bx%7D/$%7By%7D.png", + "http://b.tile.openstreetmap.org/$%7Bz%7D/$%7Bx%7D/$%7By%7D.png", + "http://c.tile.openstreetmap.org/$%7Bz%7D/$%7Bx%7D/$%7By%7D.png" + ]; + options = OpenLayers.Util.extend({ + numZoomLevels: 19, + buffer: 0, + transitionEffect: "resize" + }, options); + var newArguments = [name, url, options]; + OpenLayers.Layer.OSM.prototype.initialize.apply(this, newArguments); + }, + + CLASS_NAME: "OpenLayers.Layer.OSM.Mapnik" +}); + +/** + * Class: OpenLayers.Layer.OSM.Osmarender + * + * Inherits from: + * - <OpenLayers.Layer.OSM> + */ +OpenLayers.Layer.OSM.Osmarender = OpenLayers.Class(OpenLayers.Layer.OSM, { + /** + * Constructor: OpenLayers.Layer.OSM.Osmarender + * + * Parameters: + * name - {String} + * options - {Object} Hashtable of extra options to tag onto the layer + */ + initialize: function(name, options) { + var url = [ + "http://a.tah.openstreetmap.org/Tiles/tile/$%7Bz%7D/$%7Bx%7D/$%7By%7D.png", + "http://b.tah.openstreetmap.org/Tiles/tile/$%7Bz%7D/$%7Bx%7D/$%7By%7D.png", + "http://c.tah.openstreetmap.org/Tiles/tile/$%7Bz%7D/$%7Bx%7D/$%7By%7D.png" + ]; + options = OpenLayers.Util.extend({ + numZoomLevels: 18, + buffer: 0, + transitionEffect: "resize" + }, options); + var newArguments = [name, url, options]; + OpenLayers.Layer.OSM.prototype.initialize.apply(this, newArguments); + }, + + CLASS_NAME: "OpenLayers.Layer.OSM.Osmarender" +}); + +/** + * Class: OpenLayers.Layer.OSM.CycleMap + * + * Inherits from: + * - <OpenLayers.Layer.OSM> + */ +OpenLayers.Layer.OSM.CycleMap = OpenLayers.Class(OpenLayers.Layer.OSM, { + /** + * Constructor: OpenLayers.Layer.OSM.CycleMap + * + * Parameters: + * name - {String} + * options - {Object} Hashtable of extra options to tag onto the layer + */ + initialize: function(name, options) { + var url = [ + "http://a.tile.opencyclemap.org/cycle/$%7Bz%7D/$%7Bx%7D/$%7By%7D.png", + "http://b.tile.opencyclemap.org/cycle/$%7Bz%7D/$%7Bx%7D/$%7By%7D.png", + "http://c.tile.opencyclemap.org/cycle/$%7Bz%7D/$%7Bx%7D/$%7By%7D.png" + ]; + options = OpenLayers.Util.extend({ + numZoomLevels: 19, + buffer: 0, + transitionEffect: "resize" + }, options); + var newArguments = [name, url, options]; + OpenLayers.Layer.OSM.prototype.initialize.apply(this, newArguments); + }, + + CLASS_NAME: "OpenLayers.Layer.OSM.CycleMap" +}); diff --git a/js/gis_data_editor.js b/js/gis_data_editor.js new file mode 100644 index 0000000..b2bab89 --- /dev/null +++ b/js/gis_data_editor.js @@ -0,0 +1,309 @@ +/** + * @fileoverview functions used in GIS data editor + * + * @requires jQuery + * + */ + +/** + * Closes the GIS data editor and perform necessary clean up work. + */ +function closeGISEditor(){ + $("#popup_background").fadeOut("fast"); + $("#gis_editor").fadeOut("fast"); + $("#gis_editor").html(''); +} + +/** + * Prepares the HTML recieved via AJAX. + */ +function prepareJSVersion() { + // Hide 'Go' buttons associated with the dropdowns + $('.go').hide(); + + // Change the text on the submit button + $("input[name='gis_data[save]']") + .attr('value', PMA_messages['strCopy']) + .insertAfter($('#gis_data_textarea')) + .before('<br><br>'); + + // Add close and cancel links + $('#gis_data_editor').prepend('<a class="close_gis_editor">' + PMA_messages['strClose'] + '</a>'); + $('<a class="cancel_gis_editor"> ' + PMA_messages['strCancel'] + '</a>') + .insertAfter($("input[name='gis_data[save]']")); + + // Remove the unnecessary text + $('div#gis_data_output p').remove(); + + // Remove 'add' buttons and add links + $('.add').each(function(e) { + var $button = $(this); + $button.addClass('addJs').removeClass('add'); + var classes = $button.attr('class'); + $button + .after('<a class="' + classes + '" name="' + $button.attr('name') + + '">+ ' + $button.attr('value') + '</a>') + .remove(); + }); +} + +/** + * Returns the HTML for a data point. + * + * @param pointNumber point number + * @param prefix prefix of the name + * @returns the HTML for a data point + */ +function addDataPoint(pointNumber, prefix) { + return '<br>' + PMA_messages['strPoint'] + (pointNumber + 1) + ':' + + '<label for="x"> ' + PMA_messages['strX'] + ' </label>' + + '<input type="text" name="' + prefix + '[' + pointNumber + '][x]" value="">' + + '<label for="y"> ' + PMA_messages['strY'] + ' </label>' + + '<input type="text" name="' + prefix + '[' + pointNumber + '][y]" value="">'; +} + +/** + * Initialize the visualization in the GIS data editor. + */ +function initGISEditorVisualization() { + // Loads either SVG or OSM visualization based on the choice + selectVisualization(); + // Adds necessary styles to the div that coontains the openStreetMap + styleOSM(); + // Loads the SVG element and make a reference to it + loadSVG(); + // Adds controllers for zooming and panning + addZoomPanControllers(); + zoomAndPan(); +} + +/** + * Opens up the GIS data editor. + * + * @param value current value of the geometry field + * @param field field name + * @param type geometry type + * @param input_name name of the input field + * @param token token + */ +function openGISEditor(value, field, type, input_name, token) { + // Center the popup + var windowWidth = document.documentElement.clientWidth; + var windowHeight = document.documentElement.clientHeight; + var popupWidth = windowWidth * 0.9; + var popupHeight = windowHeight * 0.9; + var popupOffsetTop = windowHeight / 2 - popupHeight / 2; + var popupOffsetLeft = windowWidth / 2 - popupWidth / 2; + var $gis_editor = $("#gis_editor"); + $gis_editor.css({"top": popupOffsetTop, "left": popupOffsetLeft, "width": popupWidth, "height": popupHeight}); + + $.post('gis_data_editor.php', { + 'field' : field, + 'value' : value, + 'type' : type, + 'input_name' : input_name, + 'get_gis_editor' : true, + 'token' : token + }, function(data) { + if(data.success == true) { + $gis_editor.html(data.gis_editor); + initGISEditorVisualization(); + prepareJSVersion(); + } else { + PMA_ajaxShowMessage(data.error); + } + }, 'json'); + + // Make it appear + $("#popup_background").css({"opacity":"0.7"}); + $("#popup_background").fadeIn("fast"); + $gis_editor.fadeIn("fast"); +} + +/** + * Prepare and insert the GIS data in Well Known Text format + * to the input field. + */ +function insertDataAndClose() { + var $form = $('form#gis_data_editor_form'); + var input_name = $form.find("input[name='input_name']").val(); + + $.post('gis_data_editor.php', $form.serialize() + "&generate=true", function(data) { + if(data.success == true) { + $("input[name='" + input_name + "']").val(data.result); + } else { + PMA_ajaxShowMessage(data.error); + } + }, 'json'); + closeGISEditor(); +} + +$(document).ready(function() { + + // Remove the class that is added due to the URL being too long. + $('.open_gis_editor a').removeClass('formLinkSubmit'); + + /** + * Prepares and insert the GIS data to the input field on clicking 'copy'. + */ + $("input[name='gis_data[save]']").live('click', function(event) { + event.preventDefault(); + insertDataAndClose(); + }); + + /** + * Prepares and insert the GIS data to the input field on pressing 'enter'. + */ + $('#gis_editor').live('submit', function(event) { + event.preventDefault(); + insertDataAndClose(); + }); + + /** + * Trigger asynchronous calls on data change and update the output. + */ + $('#gis_editor').find("input[type='text']").live('change', function() { + var $form = $('form#gis_data_editor_form'); + $.post('gis_data_editor.php', $form.serialize() + "&generate=true", function(data) { + if(data.success == true) { + $('#gis_data_textarea').val(data.result); + $('#placeholder').empty().removeClass('hasSVG').html(data.visualization); + $('#openlayersmap').empty(); + eval(data.openLayers); + initGISEditorVisualization(); + } else { + PMA_ajaxShowMessage(data.error); + } + }, 'json'); + }); + + /** + * Update the form on change of the GIS type. + */ + $(".gis_type").live('change', function(event) { + var $gis_editor = $("#gis_editor"); + var $form = $('form#gis_data_editor_form'); + + $.post('gis_data_editor.php', $form.serialize() + "&get_gis_editor=true", function(data) { + if(data.success == true) { + $gis_editor.html(data.gis_editor); + initGISEditorVisualization(); + prepareJSVersion(); + } else { + PMA_ajaxShowMessage(data.error); + } + }, 'json'); + }); + + /** + * Handles closing of the GIS data editor. + */ + $('.close_gis_editor, .cancel_gis_editor').live('click', function() { + closeGISEditor(); + }); + + /** + * Handles adding data points + */ + $('.addJs.addPoint').live('click', function() { + var $a = $(this); + var name = $a.attr('name'); + // Eg. name = gis_data[0][MULTIPOINT][add_point] => prefix = gis_data[0][MULTIPOINT] + var prefix = name.substr(0, name.length - 11); + // Find the number of points + var $noOfPointsInput = $("input[name='" + prefix + "[no_of_points]" + "']"); + var noOfPoints = parseInt($noOfPointsInput.attr('value')); + // Add the new data point + var html = addDataPoint(noOfPoints, prefix); + $a.before(html); + $noOfPointsInput.attr('value', noOfPoints + 1); + }); + + /** + * Handles adding linestrings and inner rings + */ + $('.addLine.addJs').live('click', function() { + var $a = $(this); + var name = $a.attr('name'); + + // Eg. name = gis_data[0][MULTILINESTRING][add_line] => prefix = gis_data[0][MULTILINESTRING] + var prefix = name.substr(0, name.length - 10); + var type = prefix.slice(prefix.lastIndexOf('[') + 1, prefix.lastIndexOf(']')); + + // Find the number of lines + var $noOfLinesInput = $("input[name='" + prefix + "[no_of_lines]" + "']"); + var noOfLines = parseInt($noOfLinesInput.attr('value')); + + // Add the new linesting of inner ring based on the type + var html = '<br>'; + if (type == 'MULTILINESTRING') { + html += PMA_messages['strLineString'] + (noOfLines + 1) + ':'; + var noOfPoints = 2; + } else { + html += PMA_messages['strInnerRing'] + noOfLines + ':'; + var noOfPoints = 4; + } + html += '<input type="hidden" name="' + prefix + '[' + noOfLines + '][no_of_points]" value="' + noOfPoints + '">'; + for (i = 0; i < noOfPoints; i++) { + html += addDataPoint(i, (prefix + '[' + noOfLines + ']')); + } + html += '<a class="addPoint addJs" name="' + prefix + '[' + noOfLines + '][add_point]">+ ' + + PMA_messages['strAddPoint'] + '</a><br>'; + + $a.before(html); + $noOfLinesInput.attr('value', noOfLines + 1); + }); + + /** + * Handles adding polygons + */ + $('.addJs.addPolygon').live('click', function() { + var $a = $(this); + var name = $a.attr('name'); + // Eg. name = gis_data[0][MULTIPOLYGON][add_polygon] => prefix = gis_data[0][MULTIPOLYGON] + var prefix = name.substr(0, name.length - 13); + // Find the number of polygons + var $noOfPolygonsInput = $("input[name='" + prefix + "[no_of_polygons]" + "']"); + var noOfPolygons = parseInt($noOfPolygonsInput.attr('value')); + + // Add the new polygon + var html = PMA_messages['strPolygon'] + (noOfPolygons + 1) + ':<br>'; + html += '<input type="hidden" name="' + prefix + '[' + noOfPolygons + '][no_of_lines]" value="1">'; + + '<br>' + PMA_messages['strOuterRing'] + ':'; + + '<input type="hidden" name="' + prefix + '[' + noOfPolygons + '][0][no_of_points]" value="4">'; + for (i = 0; i < 4; i++) { + html += addDataPoint(i, (prefix + '[' + noOfPolygons + '][0]')); + } + html += '<a class="addPoint addJs" name="' + prefix + '[' + noOfPolygons + '][0][add_point]">+ ' + + PMA_messages['strAddPoint'] + '</a><br>' + + '<a class="addLine addJs" name="' + prefix + '[' + noOfPolygons + '][add_line]">+ ' + + PMA_messages['strAddInnerRing'] + '</a><br><br>'; + + $a.before(html); + $noOfPolygonsInput.attr('value', noOfPolygons + 1); + }); + + /** + * Handles adding geoms + */ + $('.addJs.addGeom').live('click', function() { + var $a = $(this); + var prefix = 'gis_data[GEOMETRYCOLLECTION]'; + // Find the number of geoms + var $noOfGeomsInput = $("input[name='" + prefix + "[geom_count]" + "']"); + var noOfGeoms = parseInt($noOfGeomsInput.attr('value')); + + var html1 = PMA_messages['strGeometry'] + (noOfGeoms + 1) + ':<br>'; + var $geomType = $("select[name='gis_data[" + (noOfGeoms - 1) + "][gis_type]']").clone(); + $geomType.attr('name', 'gis_data[' + noOfGeoms + '][gis_type]').val('POINT'); + var html2 = '<br>' + PMA_messages['strPoint'] + ' :' + + '<label for="x"> ' + PMA_messages['strX'] + ' </label>' + + '<input type="text" name="gis_data[' + noOfGeoms + '][POINT][x]" value="">' + + '<label for="y"> ' + PMA_messages['strY'] + ' </label>' + + '<input type="text" name="gis_data[' + noOfGeoms + '][POINT][y]" value="">' + + '<br><br>'; + + $a.before(html1); $geomType.insertBefore($a); $a.before(html2); + $noOfGeomsInput.attr('value', noOfGeoms + 1); + }); +}); diff --git a/js/messages.php b/js/messages.php index a8c7d10..10beb0a 100644 --- a/js/messages.php +++ b/js/messages.php @@ -280,6 +280,18 @@ $js_messages['strSameInputs'] = '<strong>' . __('Select two different columns')
/* For tbl_change.js */ $js_messages['strIgnore'] = __('Ignore'); +$js_messages['strCopy'] = __('Copy'); +$js_messages['strX'] = __('X'); +$js_messages['strY'] = __('Y'); +$js_messages['strPoint'] = __('Point'); +$js_messages['strLineString'] = __('Linestring'); +$js_messages['strPolygon'] = __('Polygon'); +$js_messages['strGeometry'] = __('Geometry'); +$js_messages['strInnerRing'] = __('Inner Ring'); +$js_messages['strOuterRing'] = __('Outer Ring'); +$js_messages['strAddPoint'] = __('Add a point'); +$js_messages['strAddInnerRing'] = __('Add an inner ring'); +$js_messages['strAddPolygon'] = __('Add a polygon');
/* For tbl_structure.js */ $js_messages['strAddColumns'] = __('Add columns'); diff --git a/js/sql.js b/js/sql.js index f4a7475..99fd93c 100644 --- a/js/sql.js +++ b/js/sql.js @@ -334,10 +334,10 @@ $(document).ready(function() { */ var button_options = {}; // in the following function we need to use $(this) - button_options[PMA_messages['strCancel']] = function() {$(this).parent().dialog('close').remove();} + button_options[PMA_messages['strCancel']] = function() {$(this).dialog('close').remove();}
var button_options_error = {}; - button_options_error[PMA_messages['strOK']] = function() {$(this).parent().dialog('close').remove();} + button_options_error[PMA_messages['strOK']] = function() {$(this).dialog('close').remove();} var $form = $("#resultsForm"); var $msgbox = PMA_ajaxShowMessage();
@@ -351,6 +351,9 @@ $(document).ready(function() { height: 230, width: 900, open: PMA_verifyTypeOfAllColumns, + close: function(event, ui) { + $('#change_row_dialog').remove(); + }, buttons : button_options_error })// end dialog options } else { @@ -361,6 +364,9 @@ $(document).ready(function() { height: 600, width: 900, open: PMA_verifyTypeOfAllColumns, + close: function(event, ui) { + $('#change_row_dialog').remove(); + }, buttons : button_options }) //Remove the top menu container from the dialog diff --git a/js/tbl_change.js b/js/tbl_change.js index 17677b9..25bc120 100644 --- a/js/tbl_change.js +++ b/js/tbl_change.js @@ -218,11 +218,38 @@ function verificationsAfterFieldChange(urlField, multi_edit, theType) * Ajax handlers for Change Table page * * Actions Ajaxified here: - * Submit Data to be inserted into the table + * Submit Data to be inserted into the table. * Restart insertion with 'N' rows. */ $(document).ready(function() {
+ $('.open_gis_editor').live('click', function(event) { + event.preventDefault(); + + var $span = $(this); + // Current value + var value = $span.parent('td').children("input[type='text']").val(); + // Field name + var field = $span.parents('tr').children('td:first').find("input[type='hidden']").val(); + // Column type + var type = $span.parents('tr').find('span.column_type').text(); + // Names of input field and null checkbox + var input_name = $span.parent('td').children("input[type='text']").attr('name'); + //Token + var token = $("input[name='token']").val(); + + openGISEditor(value, field, type, input_name, token); + }); + + /** + * Uncheck the null checkbox as geometry data is placed on the input field + */ + $("input[name='gis_data[save]']").live('click', function(event) { + var input_name = $('form#gis_data_editor_form').find("input[name='input_name']").val(); + var $null_checkbox = $("input[name='" + input_name + "']").parents('tr').find('.checkbox_null'); + $null_checkbox.attr('checked', false); + }); + // these were hidden via the "hide" class $('.foreign_values_anchor').show();
diff --git a/js/tbl_gis_visualization.js b/js/tbl_gis_visualization.js index 978cd69..0a84189 100644 --- a/js/tbl_gis_visualization.js +++ b/js/tbl_gis_visualization.js @@ -8,7 +8,9 @@ */
var x = 0; +var default_x = 0; var y = 0; +var default_y = 0; var scale = 1; var svg;
@@ -51,56 +53,52 @@ function zoomAndPan() }
/** - * Ajax handlers for GIS visualization page - * - * Actions Ajaxified here: - * - * Zooming in and zooming out on mousewheel movement. - * Panning the visualization on dragging. - * Zooming in on double clicking. - * Zooming out on clicking the zoom out button. - * Panning on clicking the arrow buttons. - * Displaying tooltips for GIS objects. + * Initially loads either SVG or OSM visualization based on the choice. */ -$(document).ready(function() { - var $placeholder = $('#placeholder'); - var $openlayersmap = $('#openlayersmap'); - - if ($('#choice').prop('checked') != true) { - $openlayersmap.hide(); +function selectVisualization() { + if ($('#choice').prop('checked') != true) { + $('#openlayersmap').hide(); } else { - $placeholder.hide(); + $('#placeholder').hide(); } + $('.choice').show(); +}
+/** + * Adds necessary styles to the div that coontains the openStreetMap. + */ +function styleOSM() { + var $placeholder = $('#placeholder'); var cssObj = { 'border' : '1px solid #aaa', 'width' : $placeholder.width(), 'height' : $placeholder.height(), 'float' : 'right' }; - $openlayersmap.css(cssObj); - drawOpenLayers(); + $('#openlayersmap').css(cssObj); +}
- $('.choice').show(); - $('#choice').bind('click', function() { - if ($(this).prop('checked') == false) { - $placeholder.show(); - $openlayersmap.hide(); - } else { - $placeholder.hide(); - $openlayersmap.show(); - } - }); +/** + * Loads the SVG element and make a reference to it. + */ +function loadSVG() { + var $placeholder = $('#placeholder');
- $('#placeholder').svg({ + $placeholder.svg({ onLoad: function(svg_ref) { svg = svg_ref; } });
- // Removes the second SVG element unnecessarily added due to the above command. - $('#placeholder').find('svg:nth-child(2)').remove(); + // Removes the second SVG element unnecessarily added due to the above command + $placeholder.find('svg:nth-child(2)').remove(); +}
+/** + * Adds controllers for zooming and panning. + */ +function addZoomPanControllers() { + var $placeholder = $('#placeholder'); if ($("#placeholder svg").length > 0) { var pmaThemeImage = $('#pmaThemeImage').attr('value'); // add panning arrows @@ -113,7 +111,81 @@ $(document).ready(function() { $('<img class="button" id="zoom_world" src="' + pmaThemeImage + 'zoom-world-mini.png">').appendTo($placeholder); $('<img class="button" id="zoom_out" src="' + pmaThemeImage + 'zoom-minus-mini.png">').appendTo($placeholder); } +}
+/** + * Resizes the GIS visualization to fit into the space available. + */ +function resizeGISVisualization() { + var $placeholder = $('#placeholder'); + + // Hide inputs for width and height + $("input[name='visualizationSettings[width]']").parents('tr').remove(); + $("input[name='visualizationSettings[height]']").parents('tr').remove(); + + var old_width = $placeholder.width(); + var extraPadding = 100; + var leftWidth = $('.gis_table').width(); + var windowWidth = document.documentElement.clientWidth; + var visWidth = windowWidth - extraPadding - leftWidth; + + // Assign new value for width + $placeholder.width(visWidth); + $('svg').attr('width', visWidth); + + // Assign the offset created due to resizing to default_x and center the svg. + default_x = (visWidth - old_width) / 2; + x = default_x; +} + +/** + * Initialize the GIS visualization. + */ +function initGISVisualization() { + // Loads either SVG or OSM visualization based on the choice + selectVisualization(); + // Resizes the GIS visualization to fit into the space available + resizeGISVisualization(); + // Adds necessary styles to the div that coontains the openStreetMap + styleOSM(); + // Draws openStreetMap with openLayers + drawOpenLayers(); + // Loads the SVG element and make a reference to it + loadSVG(); + // Adds controllers for zooming and panning + addZoomPanControllers(); + zoomAndPan(); +} + +/** + * Ajax handlers for GIS visualization page + * + * Actions Ajaxified here: + * + * Zooming in and zooming out on mousewheel movement. + * Panning the visualization on dragging. + * Zooming in on double clicking. + * Zooming out on clicking the zoom out button. + * Panning on clicking the arrow buttons. + * Displaying tooltips for GIS objects. + */ +$(document).ready(function() { + + // If we are in GIS visualization, initialize it + if ($('.gis_table').length > 0) { + initGISVisualization(); + } + + $('#choice').live('click', function() { + if ($(this).prop('checked') == false) { + $('#placeholder').show(); + $('#openlayersmap').hide(); + } else { + $('#placeholder').hide(); + $('#openlayersmap').show(); + } + }); + $('#placeholder').live('mousewheel', function(event, delta) { if (delta > 0) { //zoom in @@ -135,13 +207,13 @@ $(document).ready(function() {
var dragX = 0; var dragY = 0; $('svg').live('dragstart', function(event, dd) { - $placeholder.addClass('placeholderDrag'); + $('#placeholder').addClass('placeholderDrag'); dragX = Math.round(dd.offsetX); dragY = Math.round(dd.offsetY); });
$('svg').live('mouseup', function(event) { - $placeholder.removeClass('placeholderDrag'); + $('#placeholder').removeClass('placeholderDrag'); });
$('svg').live('drag', function(event, dd) { @@ -178,8 +250,8 @@ $(document).ready(function() { $('#zoom_world').live('click', function(e) { e.preventDefault(); scale = 1; - x = 0; - y = 0; + x = default_x; + y = default_y; zoomAndPan(); });
@@ -225,7 +297,7 @@ $(document).ready(function() { */ $('.polygon, .multipolygon, .point, .multipoint, .linestring, .multilinestring, ' + '.geometrycollection').live('mousemove', function(event) { - contents = $(this).attr('name'); + contents = $.trim($(this).attr('name')); $("#tooltip").remove(); if (contents != '') { $('<div id="tooltip">' + contents + '</div>').css({ diff --git a/js/tbl_select.js b/js/tbl_select.js index af2242a..4f6ddf0 100644 --- a/js/tbl_select.js +++ b/js/tbl_select.js @@ -68,7 +68,7 @@ $(document).ready(function() { $("#sqlqueryresults").html(response); $("#sqlqueryresults").trigger('appendAnchor'); $('#tbl_search_form') - // work around for bug #3168569 - Issue on toggling the "Hide search criteria" in chrome. + // workaround for bug #3168569 - Issue on toggling the "Hide search criteria" in chrome. .slideToggle() .hide(); $('#togglesearchformlink') @@ -87,4 +87,91 @@ $(document).ready(function() { }); }) // end $.post() }) + + // Following section is related to the 'function based search' for geometry data types. + // Initialy hide all the open_gis_editor spans + $('.open_search_gis_editor').hide(); + + $('.geom_func').bind('change', function() { + var $geomFuncSelector = $(this); + + var binaryFunctions = [ + 'Contains', + 'Crosses', + 'Disjoint', + 'Equals', + 'Intersects', + 'Overlaps', + 'Touches', + 'Within', + 'MBRContains', + 'MBRDisjoint', + 'MBREquals', + 'MBRIntersects', + 'MBROverlaps', + 'MBRTouches', + 'MBRWithin', + 'ST_Contains', + 'ST_Crosses', + 'ST_Disjoint', + 'ST_Equals', + 'ST_Intersects', + 'ST_Overlaps', + 'ST_Touches', + 'ST_Within', + ]; + + var tempArray = [ + 'Envelope', + 'EndPoint', + 'StartPoint', + 'ExteriorRing', + 'Centroid', + 'PointOnSurface' + ]; + var outputGeomFunctions = binaryFunctions.concat(tempArray); + + // If the chosen function takes two geomerty objects as parameters + var $operator = $geomFuncSelector.parents('tr').find('td:nth-child(5)').find('select'); + if ($.inArray($geomFuncSelector.val(), binaryFunctions) >= 0){ + $operator.attr('readonly', true); + } else { + $operator.attr('readonly', false); + } + + // if the chosen function's output is a geometry, enable GIS editor + var $editorSpan = $geomFuncSelector.parents('tr').find('.open_search_gis_editor'); + if ($.inArray($geomFuncSelector.val(), outputGeomFunctions) >= 0){ + $editorSpan.show(); + } else { + $editorSpan.hide(); + } + + }); + + $('.open_search_gis_editor').live('click', function(event) { + event.preventDefault(); + + var $span = $(this); + // Current value + var value = $span.parent('td').children("input[type='text']").val(); + // Field name + var field = 'Parameter'; + // Column type + var geom_func = $span.parents('tr').find('.geom_func').val(); + if (geom_func == 'Envelope') { + var type = 'polygon'; + } else if (geom_func == 'ExteriorRing') { + var type = 'linestring'; + } else { + var type = 'point'; + } + // Names of input field and null checkbox + var input_name = $span.parent('td').children("input[type='text']").attr('name'); + //Token + var token = $("input[name='token']").val(); + + openGISEditor(value, field, type, input_name, token); + }); + }, 'top.frame_content'); // end $(document).ready() diff --git a/libraries/bfShapeFiles/ShapeFile.lib.php b/libraries/bfShapeFiles/ShapeFile.lib.php new file mode 100644 index 0000000..0680708 --- /dev/null +++ b/libraries/bfShapeFiles/ShapeFile.lib.php @@ -0,0 +1,649 @@ +<?php + function loadData($type, $data) { + if (!$data) return $data; + $tmp = unpack($type, $data); + return current($tmp); + } + + function swap($binValue) { + $result = $binValue{strlen($binValue) - 1}; + for($i = strlen($binValue) - 2; $i >= 0 ; $i--) { + $result .= $binValue{$i}; + } + + return $result; + } + + function packDouble($value, $mode = 'LE') { + $value = (double)$value; + $bin = pack("d", $value); + + //We test if the conversion of an integer (1) is done as LE or BE by default + switch (pack ('L', 1)) { + case pack ('V', 1): //Little Endian + $result = ($mode == 'LE') ? $bin : swap($bin); + break; + case pack ('N', 1): //Big Endian + $result = ($mode == 'BE') ? $bin : swap($bin); + break; + default: //Some other thing, we just return false + $result = FALSE; + } + + return $result; + } + + class ShapeFile { + var $FileName; + + var $SHPFile; + var $SHXFile; + var $DBFFile; + + var $DBFHeader; + + var $lastError = ""; + + var $boundingBox = array("xmin" => 0.0, "ymin" => 0.0, "xmax" => 0.0, "ymax" => 0.0); + var $fileLength = 0; + var $shapeType = 0; + + var $records; + + function ShapeFile($shapeType, $boundingBox = array("xmin" => 0.0, "ymin" => 0.0, "xmax" => 0.0, "ymax" => 0.0), $FileName = NULL) { + $this->shapeType = $shapeType; + $this->boundingBox = $boundingBox; + $this->FileName = $FileName; + $this->fileLength = 50; + } + + function loadFromFile($FileName) { + $this->FileName = $FileName; + + if (($this->_openSHPFile()) && ($this->_openDBFFile())) { + $this->_loadHeaders(); + $this->_loadRecords(); + $this->_closeSHPFile(); + $this->_closeDBFFile(); + } else { + return false; + } + } + + function saveToFile($FileName = NULL) { + if ($FileName != NULL) $this->FileName = $FileName; + + if (($this->_openSHPFile(TRUE)) && ($this->_openSHXFile(TRUE)) && ($this->_openDBFFile(TRUE))) { + $this->_saveHeaders(); + $this->_saveRecords(); + $this->_closeSHPFile(); + $this->_closeSHXFile(); + $this->_closeDBFFile(); + } else { + return false; + } + } + + function addRecord($record) { + if ((isset($this->DBFHeader)) && (is_array($this->DBFHeader))) { + $record->updateDBFInfo($this->DBFHeader); + } + + $this->fileLength += ($record->getContentLength() + 4); + $this->records[] = $record; + $this->records[count($this->records) - 1]->recordNumber = count($this->records); + + return (count($this->records) - 1); + } + + function deleteRecord($index) { + if (isset($this->records[$index])) { + $this->fileLength -= ($this->records[$index]->getContentLength() + 4); + for ($i = $index; $i < (count($this->records) - 1); $i++) { + $this->records[$i] = $this->records[$i + 1]; + } + unset($this->records[count($this->records) - 1]); + $this->_deleteRecordFromDBF($index); + } + } + + function getDBFHeader() { + return $this->DBFHeader; + } + + function setDBFHeader($header) { + $this->DBFHeader = $header; + + for ($i = 0; $i < count($this->records); $i++) { + $this->records[$i]->updateDBFInfo($header); + } + } + + function getIndexFromDBFData($field, $value) { + $result = -1; + for ($i = 0; $i < (count($this->records) - 1); $i++) { + if (isset($this->records[$i]->DBFData[$field]) && (strtoupper($this->records[$i]->DBFData[$field]) == strtoupper($value))) { + $result = $i; + } + } + + return $result; + } + + function _loadDBFHeader() { + $DBFFile = fopen(str_replace('.*', '.dbf', $this->FileName), 'r'); + + $result = array(); + $buff32 = array(); + $i = 1; + $inHeader = true; + + while ($inHeader) { + if (!feof($DBFFile)) { + $buff32 = fread($DBFFile, 32); + if ($i > 1) { + if (substr($buff32, 0, 1) == chr(13)) { + $inHeader = false; + } else { + $pos = strpos(substr($buff32, 0, 10), chr(0)); + $pos = ($pos == 0 ? 10 : $pos); + + $fieldName = substr($buff32, 0, $pos); + $fieldType = substr($buff32, 11, 1); + $fieldLen = ord(substr($buff32, 16, 1)); + $fieldDec = ord(substr($buff32, 17, 1)); + + array_push($result, array($fieldName, $fieldType, $fieldLen, $fieldDec)); + } + } + $i++; + } else { + $inHeader = false; + } + } + + fclose($DBFFile); + return($result); + } + + function _deleteRecordFromDBF($index) { + if (@dbase_delete_record($this->DBFFile, $index)) { + @dbase_pack($this->DBFFile); + } + } + + function _loadHeaders() { + fseek($this->SHPFile, 24, SEEK_SET); + $this->fileLength = loadData("N", fread($this->SHPFile, 4)); + + fseek($this->SHPFile, 32, SEEK_SET); + $this->shapeType = loadData("V", fread($this->SHPFile, 4)); + + $this->boundingBox = array(); + $this->boundingBox["xmin"] = loadData("d", fread($this->SHPFile, 8)); + $this->boundingBox["ymin"] = loadData("d", fread($this->SHPFile, 8)); + $this->boundingBox["xmax"] = loadData("d", fread($this->SHPFile, 8)); + $this->boundingBox["ymax"] = loadData("d", fread($this->SHPFile, 8)); + + $this->DBFHeader = $this->_loadDBFHeader(); + } + + function _saveHeaders() { + fwrite($this->SHPFile, pack("NNNNNN", 9994, 0, 0, 0, 0, 0)); + fwrite($this->SHPFile, pack("N", $this->fileLength)); + fwrite($this->SHPFile, pack("V", 1000)); + fwrite($this->SHPFile, pack("V", $this->shapeType)); + fwrite($this->SHPFile, packDouble($this->boundingBox['xmin'])); + fwrite($this->SHPFile, packDouble($this->boundingBox['ymin'])); + fwrite($this->SHPFile, packDouble($this->boundingBox['xmax'])); + fwrite($this->SHPFile, packDouble($this->boundingBox['ymax'])); + fwrite($this->SHPFile, pack("dddd", 0, 0, 0, 0)); + + fwrite($this->SHXFile, pack("NNNNNN", 9994, 0, 0, 0, 0, 0)); + fwrite($this->SHXFile, pack("N", 50 + 4*count($this->records))); + fwrite($this->SHXFile, pack("V", 1000)); + fwrite($this->SHXFile, pack("V", $this->shapeType)); + fwrite($this->SHXFile, packDouble($this->boundingBox['xmin'])); + fwrite($this->SHXFile, packDouble($this->boundingBox['ymin'])); + fwrite($this->SHXFile, packDouble($this->boundingBox['xmax'])); + fwrite($this->SHXFile, packDouble($this->boundingBox['ymax'])); + fwrite($this->SHXFile, pack("dddd", 0, 0, 0, 0)); + } + + function _loadRecords() { + fseek($this->SHPFile, 100); + while (!feof($this->SHPFile)) { + $bByte = ftell($this->SHPFile); + $record = new ShapeRecord(-1); + $record->loadFromFile($this->SHPFile, $this->DBFFile); + $eByte = ftell($this->SHPFile); + if (($eByte <= $bByte) || ($record->lastError != "")) { + return false; + } + + $this->records[] = $record; + } + } + + function _saveRecords() { + if (file_exists(str_replace('.*', '.dbf', $this->FileName))) { + @unlink(str_replace('.*', '.dbf', $this->FileName)); + } + if (!($this->DBFFile = @dbase_create(str_replace('.*', '.dbf', $this->FileName), $this->DBFHeader))) { + return $this->setError(sprintf("It wasn't possible to create the DBase file '%s'", str_replace('.*', '.dbf', $this->FileName))); + } + + $offset = 50; + if (is_array($this->records) && (count($this->records) > 0)) { + reset($this->records); + while (list($index, $record) = each($this->records)) { + //Save the record to the .shp file + $record->saveToFile($this->SHPFile, $this->DBFFile, $index + 1); + + //Save the record to the .shx file + fwrite($this->SHXFile, pack("N", $offset)); + fwrite($this->SHXFile, pack("N", $record->getContentLength())); + $offset += (4 + $record->getContentLength()); + } + } + @dbase_pack($this->DBFFile); + } + + function _openSHPFile($toWrite = false) { + $this->SHPFile = @fopen(str_replace('.*', '.shp', $this->FileName), ($toWrite ? "wb+" : "rb")); + if (!$this->SHPFile) { + return $this->setError(sprintf("It wasn't possible to open the Shape file '%s'", str_replace('.*', '.shp', $this->FileName))); + } + + return TRUE; + } + + function _closeSHPFile() { + if ($this->SHPFile) { + fclose($this->SHPFile); + $this->SHPFile = NULL; + } + } + + function _openSHXFile($toWrite = false) { + $this->SHXFile = @fopen(str_replace('.*', '.shx', $this->FileName), ($toWrite ? "wb+" : "rb")); + if (!$this->SHXFile) { + return $this->setError(sprintf("It wasn't possible to open the Index file '%s'", str_replace('.*', '.shx', $this->FileName))); + } + + return TRUE; + } + + function _closeSHXFile() { + if ($this->SHXFile) { + fclose($this->SHXFile); + $this->SHXFile = NULL; + } + } + + function _openDBFFile($toWrite = false) { + $checkFunction = $toWrite ? "is_writable" : "is_readable"; + if (($toWrite) && (!file_exists(str_replace('.*', '.dbf', $this->FileName)))) { + if (!@dbase_create(str_replace('.*', '.dbf', $this->FileName), $this->DBFHeader)) { + return $this->setError(sprintf("It wasn't possible to create the DBase file '%s'", str_replace('.*', '.dbf', $this->FileName))); + } + } + if ($checkFunction(str_replace('.*', '.dbf', $this->FileName))) { + $this->DBFFile = dbase_open(str_replace('.*', '.dbf', $this->FileName), ($toWrite ? 2 : 0)); + if (!$this->DBFFile) { + return $this->setError(sprintf("It wasn't possible to open the DBase file '%s'", str_replace('.*', '.dbf', $this->FileName))); + } + } else { + return $this->setError(sprintf("It wasn't possible to find the DBase file '%s'", str_replace('.*', '.dbf', $this->FileName))); + } + return TRUE; + } + + function _closeDBFFile() { + if ($this->DBFFile) { + dbase_close($this->DBFFile); + $this->DBFFile = NULL; + } + } + + function setError($error) { + $this->lastError = $error; + return false; + } + } + + class ShapeRecord { + var $SHPFile = NULL; + var $DBFFile = NULL; + + var $recordNumber = NULL; + var $shapeType = NULL; + + var $lastError = ""; + + var $SHPData = array(); + var $DBFData = array(); + + function ShapeRecord($shapeType) { + $this->shapeType = $shapeType; + } + + function loadFromFile(&$SHPFile, &$DBFFile) { + $this->SHPFile = $SHPFile; + $this->DBFFile = $DBFFile; + $this->_loadHeaders(); + + switch ($this->shapeType) { + case 0: + $this->_loadNullRecord(); + break; + case 1: + $this->_loadPointRecord(); + break; + case 3: + $this->_loadPolyLineRecord(); + break; + case 5: + $this->_loadPolygonRecord(); + break; + case 8: + $this->_loadMultiPointRecord(); + break; + default: + $this->setError(sprintf("The Shape Type '%s' is not supported.", $this->shapeType)); + break; + } + $this->_loadDBFData(); + } + + function saveToFile(&$SHPFile, &$DBFFile, $recordNumber) { + $this->SHPFile = $SHPFile; + $this->DBFFile = $DBFFile; + $this->recordNumber = $recordNumber; + $this->_saveHeaders(); + + switch ($this->shapeType) { + case 0: + $this->_saveNullRecord(); + break; + case 1: + $this->_savePointRecord(); + break; + case 3: + $this->_savePolyLineRecord(); + break; + case 5: + $this->_savePolygonRecord(); + break; + case 8: + $this->_saveMultiPointRecord(); + break; + default: + $this->setError(sprintf("The Shape Type '%s' is not supported.", $this->shapeType)); + break; + } + $this->_saveDBFData(); + } + + function updateDBFInfo($header) { + $tmp = $this->DBFData; + unset($this->DBFData); + $this->DBFData = array(); + reset($header); + while (list($key, $value) = each($header)) { + $this->DBFData[$value[0]] = (isset($tmp[$value[0]])) ? $tmp[$value[0]] : ""; + } + } + + function _loadHeaders() { + $this->recordNumber = loadData("N", fread($this->SHPFile, 4)); + $tmp = loadData("N", fread($this->SHPFile, 4)); //We read the length of the record + $this->shapeType = loadData("V", fread($this->SHPFile, 4)); + } + + function _saveHeaders() { + fwrite($this->SHPFile, pack("N", $this->recordNumber)); + fwrite($this->SHPFile, pack("N", $this->getContentLength())); + fwrite($this->SHPFile, pack("V", $this->shapeType)); + } + + function _loadPoint() { + $data = array(); + + $data["x"] = loadData("d", fread($this->SHPFile, 8)); + $data["y"] = loadData("d", fread($this->SHPFile, 8)); + + return $data; + } + + function _savePoint($data) { + fwrite($this->SHPFile, packDouble($data["x"])); + fwrite($this->SHPFile, packDouble($data["y"])); + } + + function _loadNullRecord() { + $this->SHPData = array(); + } + + function _saveNullRecord() { + //Don't save anything + } + + function _loadPointRecord() { + $this->SHPData = $this->_loadPoint(); + } + + function _savePointRecord() { + $this->_savePoint($this->SHPData); + } + + function _loadMultiPointRecord() { + $this->SHPData = array(); + $this->SHPData["xmin"] = loadData("d", fread($this->SHPFile, 8)); + $this->SHPData["ymin"] = loadData("d", fread($this->SHPFile, 8)); + $this->SHPData["xmax"] = loadData("d", fread($this->SHPFile, 8)); + $this->SHPData["ymax"] = loadData("d", fread($this->SHPFile, 8)); + + $this->SHPData["numpoints"] = loadData("V", fread($this->SHPFile, 4)); + + for ($i = 0; $i <= $this->SHPData["numpoints"]; $i++) { + $this->SHPData["points"][] = $this->_loadPoint(); + } + } + + function _saveMultiPointRecord() { + fwrite($this->SHPFile, pack("dddd", $this->SHPData["xmin"], $this->SHPData["ymin"], $this->SHPData["xmax"], $this->SHPData["ymax"])); + + fwrite($this->SHPFile, pack("V", $this->SHPData["numpoints"])); + + for ($i = 0; $i <= $this->SHPData["numpoints"]; $i++) { + $this->_savePoint($this->SHPData["points"][$i]); + } + } + + function _loadPolyLineRecord() { + $this->SHPData = array(); + $this->SHPData["xmin"] = loadData("d", fread($this->SHPFile, 8)); + $this->SHPData["ymin"] = loadData("d", fread($this->SHPFile, 8)); + $this->SHPData["xmax"] = loadData("d", fread($this->SHPFile, 8)); + $this->SHPData["ymax"] = loadData("d", fread($this->SHPFile, 8)); + + $this->SHPData["numparts"] = loadData("V", fread($this->SHPFile, 4)); + $this->SHPData["numpoints"] = loadData("V", fread($this->SHPFile, 4)); + + for ($i = 0; $i < $this->SHPData["numparts"]; $i++) { + $this->SHPData["parts"][$i] = loadData("V", fread($this->SHPFile, 4)); + } + + $firstIndex = ftell($this->SHPFile); + $readPoints = 0; + reset($this->SHPData["parts"]); + while (list($partIndex, $partData) = each($this->SHPData["parts"])) { + if (!isset($this->SHPData["parts"][$partIndex]["points"]) || !is_array($this->SHPData["parts"][$partIndex]["points"])) { + $this->SHPData["parts"][$partIndex] = array(); + $this->SHPData["parts"][$partIndex]["points"] = array(); + } + while (!in_array($readPoints, $this->SHPData["parts"]) && ($readPoints < ($this->SHPData["numpoints"])) && !feof($this->SHPFile)) { + $this->SHPData["parts"][$partIndex]["points"][] = $this->_loadPoint(); + $readPoints++; + } + } + + fseek($this->SHPFile, $firstIndex + ($readPoints*16)); + } + + function _savePolyLineRecord() { + fwrite($this->SHPFile, pack("dddd", $this->SHPData["xmin"], $this->SHPData["ymin"], $this->SHPData["xmax"], $this->SHPData["ymax"])); + + fwrite($this->SHPFile, pack("VV", $this->SHPData["numparts"], $this->SHPData["numpoints"])); + + for ($i = 0; $i < $this->SHPData["numparts"]; $i++) { + fwrite($this->SHPFile, pack("V", count($this->SHPData["parts"][$i]))); + } + + reset($this->SHPData["parts"]); + foreach ($this->SHPData["parts"] as $partData){ + reset($partData["points"]); + while (list($pointIndex, $pointData) = each($partData["points"])) { + $this->_savePoint($pointData); + } + } + } + + function _loadPolygonRecord() { + $this->_loadPolyLineRecord(); + } + + function _savePolygonRecord() { + $this->_savePolyLineRecord(); + } + + function addPoint($point, $partIndex = 0) { + switch ($this->shapeType) { + case 0: + //Don't add anything + break; + case 1: + //Substitutes the value of the current point + $this->SHPData = $point; + break; + case 3: + case 5: + //Adds a new point to the selected part + if (!isset($this->SHPData["xmin"]) || ($this->SHPData["xmin"] > $point["x"])) $this->SHPData["xmin"] = $point["x"]; + if (!isset($this->SHPData["ymin"]) || ($this->SHPData["ymin"] > $point["y"])) $this->SHPData["ymin"] = $point["y"]; + if (!isset($this->SHPData["xmax"]) || ($this->SHPData["xmax"] < $point["x"])) $this->SHPData["xmax"] = $point["x"]; + if (!isset($this->SHPData["ymax"]) || ($this->SHPData["ymax"] < $point["y"])) $this->SHPData["ymax"] = $point["y"]; + + $this->SHPData["parts"][$partIndex]["points"][] = $point; + + $this->SHPData["numparts"] = count($this->SHPData["parts"]); + $this->SHPData["numpoints"]++; + break; + case 8: + //Adds a new point + if (!isset($this->SHPData["xmin"]) || ($thi PData["parts"]); < $point["y"])) $this->SHPData["ymax"] = $point["y"]; a["ymax"])); try"); ?>" />