Skip to content

Commit

Permalink
refactored quadtree code to support memcached strategy
Browse files Browse the repository at this point in the history
  • Loading branch information
trey0 committed Aug 10, 2012
1 parent 3a65cb5 commit ecf03fa
Show file tree
Hide file tree
Showing 6 changed files with 380 additions and 256 deletions.
8 changes: 3 additions & 5 deletions geocamTiePoint/admin.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,9 +6,7 @@

from django.contrib import admin

from geocamTiePoint.models import Overlay
from geocamTiePoint import models

class OverlayAdmin(admin.ModelAdmin):
pass

admin.site.register(Overlay, OverlayAdmin)
admin.site.register(models.Overlay)
admin.site.register(models.QuadTree)
70 changes: 31 additions & 39 deletions geocamTiePoint/models.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,28 +4,42 @@
# All Rights Reserved.
# __END_LICENSE__

import os
import shutil

from django.db import models
from geocamTiePoint import settings
from django.core.files.storage import FileSystemStorage
import os, shutil

from jsonfield import JSONField
from quadtree import makeQuadTree
from geocamUtil.models import UuidField

from geocamTiePoint import quadtree, settings

dataStorage = FileSystemStorage(location=settings.DATA_ROOT)

def getNewImageFileName(instance, filename):
return 'geocamTiePoint/overlay_images/'+filename


class QuadTree(models.Model):
overlay = models.ForeignKey('Overlay', null=True, db_index=True,
on_delete=models.SET_NULL # avoid circular FK constraints making deletes impossible
)
# transform is either an empty string (simple quadtree) or a JSON-formatted
# definition of the warping transform (warped quadtree)
transform = models.TextField(blank=True)


class Overlay(models.Model):
data = models.TextField()
image = models.ImageField(upload_to=getNewImageFileName,
storage=dataStorage)
imageType = models.CharField(max_length=50)
name = models.CharField(max_length=50)
key = models.AutoField(primary_key=True, unique=True)
unaligned_quadtree = models.ForeignKey(QuadTree, blank=True)
aligned_quadtree = models.ForeignKey(QuadTree, blank=True)
unalignedQuadtree = models.ForeignKey(QuadTree, null=True, blank=True,
related_name='unaligned_overlays')
alignedQuadtree = models.ForeignKey(QuadTree, null=True, blank=True,
related_name='aligned_overlays')

class Meta:
ordering = ['-key']
Expand All @@ -38,38 +52,16 @@ def __unicode__(self):

def delete(self, *args, **kwargs):
dataStorage.delete(self.image)
self.last_quadtree.delete()
super(self, Overlay).delete(*args, **kwargs)
# self.last_quadtree.delete() # FIX: delete quadtrees associated with overlay
super(Overlay, self).delete(*args, **kwargs)

def generateQuadTree(self):
self.unaligned_quadtree = QuadTree(overlay=self))
self.unaligned_quadtree.generate()

class QuadTree(models.Model):
overlay = models.ForeignKey(Overlay, null=True, on_delete=Models.SET_NULL) # avoid circular FK constraints making deletes impossible
tiles = JSONField(null=True) # notionally a long array of tile storage keys

def delete(self, *args, **kwargs):
self.deleteTiles()
self.deleteRegisteredTiles()
self.deleteArchive()
super(self, Quadtree).delete(*args, **kwargs)

def deleteTiles(self):
if dataStorage.exists('geocamTiePoint/tiles/'+str(self.pk)):
shutil.rmtree(dataStorage.path('geocamTiePoint/tiles/'+str(self.pk)))

def deleteRegisteredTiles(self):
if dataStorage.exists('geocamTiePoint/registeredTiles/'+str(self.pk)):
shutil.rmtree(dataStorage.path('geocamTiePoint/registeredTiles/'+str(self.pk)))

def deleteArchive(self):
if dataStorage.exists('geocamTiePoint/tileArchives/'+str(self.pk)):
os.remove(dataStorage.path('geocamTiePoint/tileArchives/'+str(self.pk)))

def generate(self):
image = PIL.Image( dataStorage.Open( self.overlay.image ) )
coords = ((0,0),(image.size[0],0),(0,image.size[1]),image.size)
basePath = 'quadtree/' + str(self.id)

tile_keys = makeQuadTree( image, coords, basePath, dataStorage)
qt = QuadTree(overlay=self)
qt.save()
self.unalignedQuadtree = qt
self.save()
if 1:
gen = quadtree.SimpleQuadTreeGenerator(self.image.path)
basePath = settings.DATA_ROOT + 'geocamTiePoint/tiles/%d' % qt.id
gen.writeQuadTree(basePath)
return qt
Loading

0 comments on commit ecf03fa

Please sign in to comment.