Ρίξε μία ματιά στα spatial extensions της My SQL και ιδιαίτερα στο παράδειγμα χρήσης spatial indexes. Η MySQL υποστηρίζει τις κλάσεις του OpenGIS, δηλαδή Point, Curve, Polygon κλπ καθώς και functions όπως η MBRContains, MBRIntersects κλπ. Επιπλέον, αν χρησιμοποιείς MyISAM μπορείς να δημιουργήσεις spatial indexes βασισμένα σε R-Trees για να επιταχύνεις τις αναζητήσεις. Έτσι μπορείς να εκτελέσεις εντολές όπως η παρακάτω για να πάρεις όλα τα σχήματα που περιέχονται σε ένα πολύγωνο:
mysql> SET @poly =
-> 'Polygon((30000 15000,31000 15000,31000 16000,30000 16000,30000 15000))';
mysql> SELECT fid,AsText(g) FROM geom WHERE
-> MBRContains(GeomFromText(@poly),g);
Στην δική σου περίπτωση θα έπρεπε να χρησιμοποιήσεις μάλλον την MBRIntersects για να φορτώσεις τα αντικείμενα που τέμνονται από το παράθυρο της εφαρμογής σου και όχι μόνο όσα περιέχονται πλήρως. Με τον τρόπο αυτό θα φορτώσεις μόνο τα σχήματα που χρειάζεσαι. Αν χρειαστεί να κάνεις zoom in δεν θα χρειαστεί να ξαναφορτώσεις τα αντικείμενα. Αν κάνεις zoom out υποθέτω ότι θα μπορούσες να χρησιμοποιήσεις ένα συνδυασμό Contains στο νέο παράθυρο και Not Contains στο παλιό για να φορτώσεις πάλι μόνο τα επιπλέον αντικείμενα. Δεν είμαι σίγουρος όμως αν αυτό όντως γίνεται ή αν θα ήταν γρηγορότερο από το να φορτώσεις απλά όλα τα αντικείμενα ξανά.
Ίσως μάλιστα ο ποιό γρήγορος τρόπος να είναι να φορτώσεις τα πάντα στη μνήμη και μετά να κάνεις queries κάθε φορά που γίνεται zoom ή click για να βρεις τα ID και μόνο των σχημάτων που σε ενδιαφέρουν! Αν για παράδειγμα έχεις λίγα πολύγωνα με πολλά σημεία, είναι πολύ πιο γρήγορο να διαβάσεις τα λίγα ID από τη βάση παρά τα πολλά σημεία ένα-ένα
Από εκεί και πέρα, αφού επιλέξεις τα σχήματα που χρειάζεσαι ο γρηγορότερος τρόπος είναι να χρησιμοποιήσεις ένα DataReader για να τα φορτώσεις γραμμή-γραμμή χωρίς περαιτέρω επεξεργασία. Δεν είμαι σίγουρος πως θα φέρει τα σχήματα ο .NET adapter που χρησιμοποιείς, αλλά σίγουρα μπορείς να τα επιστρέψεις ως string μέσω της AsText και μετά να τα κάνεις parse. Ή, αν θες να ελευθερώσεις τη σύνδεση με τη βάση όσο γίνεται γρηγορότερα, να τα αποθηκεύσεις προσωρινά σε ένα string array και μετά να κάνεις το parsing.
Παναγιώτης Καναβός, Freelancer
Twitter: http://www.twitter.com/pkanavos