edit interface first commit

This commit is contained in:
Sanj 2012-08-12 19:37:57 +05:30
parent f47f8617d9
commit f79b8067c2
23 changed files with 8498 additions and 0 deletions

View File

@ -5,6 +5,7 @@ from os.path import join
class BaseModel(models.Model):
changed = models.DateTimeField(null=True, editable=False)
created = models.DateTimeField(null=True, editable=False)
is_openmumbai_model = True
def save(self, *args, **kwargs):
if not self.id:
@ -14,6 +15,28 @@ class BaseModel(models.Model):
self.created = self.changed
super(BaseModel, self).save(*args, **kwargs)
def get_dict(self, *args, **kwargs):
return {
'id': self.id,
'name': self.name
}
def get_geojson(self, srid=4326):
# print srid
if self.geometry is not None:
geom = json.loads(self.geometry.transform(srid, True).geojson)
else:
geom = {}
properties = self.get_dict()
return {
'type': 'Feature',
'properties': properties,
'geometry': geom
}
@classmethod
def import_from_csv(kls):
import csv

View File

@ -1 +1,15 @@
# Create your views here.
from django.contrib.contenttypes.models import ContentType
from django.shortcuts import get_object_or_404
from ox.django.shortcuts import render_to_json_response
def geojson(request, ctype_id):
ctype = get_object_or_404(ContentType, pk=ctype_id)
model_class = ctype.model_class()
features = [obj.get_geojson() for obj in model_class.objects.all()]
return render_to_json_response({
'type': 'FeatureCollection',
'features': features
})

View File

@ -18,6 +18,7 @@ class OpenSpace(BaseModel):
def __unicode__(self):
return "%s %s %s" % (self.ward, self.reservation, self.address,)
class AreaModel(BaseModel):
pk_serial = models.IntegerField(null=True, blank=True)
name = models.CharField(max_length=1024, blank=True)

View File

@ -0,0 +1,206 @@
var creds = {
'cloudmade': '534d7b971d044dcaafa6678414f26924'
}
var cloudmadeUrl = 'http://{s}.tile.cloudmade.com/' + creds.cloudmade + '/997/256/{z}/{x}/{y}.png',
cloudmade = new L.TileLayer(cloudmadeUrl, {maxZoom: 18}),
map = new L.Map('map', {layers: [cloudmade], center: new L.LatLng(-37.7772, 175.2756), zoom: 15 });
var drawControl = new L.Control.Draw({
// position: 'topright',
polygon: {
allowIntersection: false,
drawError: {
color: '#b00b00',
timeout: 1000
},
shapeOptions: {
color: '#bada55'
}
},
circle: {
shapeOptions: {
color: '#662d91'
}
}
});
map.addControl(drawControl);
map.on('draw:poly-created', function (e) {
console.log("drawn poly", e.poly);
initNewFeature(e.poly)
//drawnItems.addLayer(poly);
});
map.on('draw:rectangle-created', function (e) {
console.log("drawn rect", e.rect);
initNewFeature(e.rect);
// drawnItems.addLayer(rect);
});
map.on('draw:circle-created', function (e) {
console.log("drawn circle", e.circ);
initNewFeature(e.circ);
// drawnItems.addLayer(circ);
});
map.on('draw:marker-created', function (e) {
console.log("drawn marker", e.marker);
initNewFeature(e.marker);
// drawnItems.addLayer(marker);
});
var featureBeingEdited = false;
function initNewFeature(feat, type) {
// GLOBFEAT = feat;
if ($('.selectedItem').length == 0) {
alert("please select an item from the list first");
}
var $selectedItem = $('.selectedItem');
$selectedItem.data("layer", feat);
feat.addEventListener("click", function(e) {
map.fire("clear-current-edit");
e.target.editing.enable();
featureBeingEdited = e.target;
$selectedItem.addClass("selectedItem");
});
drawnItems.addLayer(feat);
/*
feat.addEventListener("click", function(e) {
selectFeatureOnMap(e.target);
});
*/
return feat;
}
function selectFeatureOnMap(feature) {
console.log("selected feature", feature);
}
var drawnItems = new L.LayerGroup();
map.on("clear-current-edit", function(e) {
console.log("clear-current-edit");
if (featureBeingEdited) {
featureBeingEdited.editing.disable();
featureBeingEdited = false;
}
$('.selectedItem').removeClass("selectedItem");
});
//map.on("select-item", function(e) {
// var id = e.itemId;
// $('#item' + id).addClass("selectedItem");
//
//});
//map.on("click", function(e) {
// console.log("clicked");
// map.fire("clear-current-edit", e);
///*
// featureBeingEdited.editing.disable();
// featureBeingEdited = false;
//*/
//});
/*
drawnItems.addEventListener("click", function(e) {
console.log(e);
});
*/
map.addLayer(drawnItems);
//geoJsonLayer = L
// .geoJson(null, {
// 'onEachFeature': function(feat, layer) {
// console.log(feat);
// GLOB = feat;
// if (feat.hasOwnProperty("addEventListener")) {
// feat.addEventListener("click", function(e) {
// console.log("clicked json feature", e);
// });
// }
// //initNewFeature(feat);
// }})
// .addEventListener("click", function(e) {
// console.log("clicked json layer", e);
// })
// .addEventListener("featureparse", function(f) {
// alert("features parsed");
// })
// .addTo(map);
loadGeoJsonFeatures("/geojson/10/");
function loadGeoJsonFeatures(url, params) {
//alert("hi");
if (!params) {
var params = {};
}
var $xhr = $.getJSON(url, params, function(data) {
console.log(data);
features = data.features;
var $itemsList = $('#itemsList');
features.forEach(function(f, i) {
var $item = $('<li />')
.attr("id", "item" + f.properties.id)
.text(f.properties.name)
//.data("feature", f)
.click(function(e) {
map.fire("clear-current-edit");
if ($item.data("layer")) {
var layer = $item.data("layer");
layer.editing.enable();
featureBeingEdited = layer;
//layer.fire("click");
}
$(this).addClass("selectedItem");
//$('.selectedItem').removeClass("selectedItem");
//$(this).addClass("selectedItem");
})
.appendTo($itemsList);
if (!$.isEmptyObject(f.geometry)) {
geom = L.geoJSON.geometryToLayer(f.geometry);
$item.data("layer", geom);
geom.on("click", function(e) {
map.fire("clear-current-edit");
e.target.editing.enable();
$item.addClass("selectedItem");
featureBeingEdited = e.target;
});
//initNewFeature(geom);
drawnItems.addLayer(geom);
// thisLayer = L.geoJson(f).on("click", function(e) {
// console.log("clicked json layer", e);
// map.fire("clear-current-edit");
// e.target.eachLayer(function(feature) {
// feature.editing.enable();
// featureBeingEdited = feature;
// });
// });
// drawnItems.addLayer(thisLayer);
// $item.data("layer", thisLayer);
}
});
// geoJsonLayer.addData(data);
});
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 378 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 318 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 266 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 138 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 963 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 959 B

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,379 @@
/* required styles */
.leaflet-map-pane,
.leaflet-tile,
.leaflet-marker-icon,
.leaflet-marker-shadow,
.leaflet-tile-pane,
.leaflet-overlay-pane,
.leaflet-shadow-pane,
.leaflet-marker-pane,
.leaflet-popup-pane,
.leaflet-overlay-pane svg,
.leaflet-zoom-box,
.leaflet-image-layer,
.leaflet-layer { /* TODO optimize classes */
position: absolute;
}
.leaflet-container {
overflow: hidden;
outline: 0;
}
.leaflet-tile,
.leaflet-marker-icon,
.leaflet-marker-shadow {
-moz-user-select: none;
-webkit-user-select: none;
user-select: none;
}
.leaflet-marker-icon,
.leaflet-marker-shadow {
display: block;
}
.leaflet-clickable {
cursor: pointer;
}
.leaflet-dragging, .leaflet-dragging .leaflet-clickable {
cursor: move;
}
.leaflet-container img {
/* map is broken in FF if you have max-width: 100% on tiles */
max-width: none !important;
}
.leaflet-container img.leaflet-image-layer {
/* stupid Android 2 doesn't understand "max-width: none" properly */
max-width: 15000px !important;
}
.leaflet-tile-pane { z-index: 2; }
.leaflet-objects-pane { z-index: 3; }
.leaflet-overlay-pane { z-index: 4; }
.leaflet-shadow-pane { z-index: 5; }
.leaflet-marker-pane { z-index: 6; }
.leaflet-popup-pane { z-index: 7; }
.leaflet-tile {
filter: inherit;
visibility: hidden;
}
.leaflet-tile-loaded {
visibility: inherit;
}
.leaflet-zoom-box {
width: 0;
height: 0;
}
/* Leaflet controls */
.leaflet-control {
position: relative;
z-index: 7;
pointer-events: auto;
}
.leaflet-top,
.leaflet-bottom {
position: absolute;
z-index: 1000;
pointer-events: none;
}
.leaflet-top {
top: 0;
}
.leaflet-right {
right: 0;
}
.leaflet-bottom {
bottom: 0;
}
.leaflet-left {
left: 0;
}
.leaflet-control {
float: left;
clear: both;
}
.leaflet-right .leaflet-control {
float: right;
}
.leaflet-top .leaflet-control {
margin-top: 10px;
}
.leaflet-bottom .leaflet-control {
margin-bottom: 10px;
}
.leaflet-left .leaflet-control {
margin-left: 10px;
}
.leaflet-right .leaflet-control {
margin-right: 10px;
}
.leaflet-control-zoom {
-moz-border-radius: 7px;
-webkit-border-radius: 7px;
border-radius: 7px;
}
.leaflet-control-zoom {
padding: 5px;
background: rgba(0, 0, 0, 0.25);
}
.leaflet-control-zoom a {
background-color: rgba(255, 255, 255, 0.75);
}
.leaflet-control-zoom a, .leaflet-control-layers a {
background-position: 50% 50%;
background-repeat: no-repeat;
display: block;
}
.leaflet-control-zoom a {
-moz-border-radius: 4px;
-webkit-border-radius: 4px;
border-radius: 4px;
width: 19px;
height: 19px;
}
.leaflet-control-zoom a:hover {
background-color: #fff;
}
.leaflet-touch .leaflet-control-zoom a {
width: 27px;
height: 27px;
}
.leaflet-control-zoom-in {
background-image: url(images/zoom-in.png);
margin-bottom: 5px;
}
.leaflet-control-zoom-out {
background-image: url(images/zoom-out.png);
}
.leaflet-control-layers {
box-shadow: 0 1px 7px #999;
background: #f8f8f9;
-moz-border-radius: 8px;
-webkit-border-radius: 8px;
border-radius: 8px;
}
.leaflet-control-layers a {
background-image: url(images/layers.png);
width: 36px;
height: 36px;
}
.leaflet-touch .leaflet-control-layers a {
width: 44px;
height: 44px;
}
.leaflet-control-layers .leaflet-control-layers-list,
.leaflet-control-layers-expanded .leaflet-control-layers-toggle {
display: none;
}
.leaflet-control-layers-expanded .leaflet-control-layers-list {
display: block;
position: relative;
}
.leaflet-control-layers-expanded {
padding: 6px 10px 6px 6px;
font: 12px/1.5 "Helvetica Neue", Arial, Helvetica, sans-serif;
color: #333;
background: #fff;
}
.leaflet-control-layers input {
margin-top: 2px;
position: relative;
top: 1px;
}
.leaflet-control-layers label {
display: block;
}
.leaflet-control-layers-separator {
height: 0;
border-top: 1px solid #ddd;
margin: 5px -10px 5px -6px;
}
.leaflet-container .leaflet-control-attribution {
background-color: rgba(255, 255, 255, 0.7);
box-shadow: 0 0 5px #bbb;
margin: 0;
}
.leaflet-control-attribution,
.leaflet-control-scale-line {
padding: 0 5px;
color: #333;
}
.leaflet-container .leaflet-control-attribution,
.leaflet-container .leaflet-control-scale {
font: 11px/1.5 "Helvetica Neue", Arial, Helvetica, sans-serif;
}
.leaflet-left .leaflet-control-scale {
margin-left: 5px;
}
.leaflet-bottom .leaflet-control-scale {
margin-bottom: 5px;
}
.leaflet-control-scale-line {
border: 2px solid #777;
border-top: none;
color: black;
line-height: 1;
font-size: 10px;
padding-bottom: 2px;
text-shadow: 1px 1px 1px #fff;
background-color: rgba(255, 255, 255, 0.5);
}
.leaflet-control-scale-line:not(:first-child) {
border-top: 2px solid #777;
padding-top: 1px;
border-bottom: none;
margin-top: -2px;
}
.leaflet-control-scale-line:not(:first-child):not(:last-child) {
border-bottom: 2px solid #777;
}
.leaflet-touch .leaflet-control-attribution, .leaflet-touch .leaflet-control-layers {
box-shadow: none;
}
.leaflet-touch .leaflet-control-layers {
border: 5px solid #bbb;
}
/* Zoom and fade animations */
.leaflet-fade-anim .leaflet-tile, .leaflet-fade-anim .leaflet-popup {
opacity: 0;
-webkit-transition: opacity 0.2s linear;
-moz-transition: opacity 0.2s linear;
-o-transition: opacity 0.2s linear;
transition: opacity 0.2s linear;
}
.leaflet-fade-anim .leaflet-tile-loaded, .leaflet-fade-anim .leaflet-map-pane .leaflet-popup {
opacity: 1;
}
.leaflet-zoom-anim .leaflet-zoom-animated {
-webkit-transition: -webkit-transform 0.25s cubic-bezier(0.25,0.1,0.25,0.75);
-moz-transition: -moz-transform 0.25s cubic-bezier(0.25,0.1,0.25,0.75);
-o-transition: -o-transform 0.25s cubic-bezier(0.25,0.1,0.25,0.75);
transition: transform 0.25s cubic-bezier(0.25,0.1,0.25,0.75);
}
.leaflet-zoom-anim .leaflet-tile,
.leaflet-pan-anim .leaflet-tile,
.leaflet-touching .leaflet-zoom-animated {
-webkit-transition: none;
-moz-transition: none;
-o-transition: none;
transition: none;
}
.leaflet-zoom-anim .leaflet-zoom-hide {
visibility: hidden;
}
/* Popup layout */
.leaflet-popup {
position: absolute;
text-align: center;
}
.leaflet-popup-content-wrapper {
padding: 1px;
text-align: left;
}
.leaflet-popup-content {
margin: 14px 20px;
}
.leaflet-popup-tip-container {
margin: 0 auto;
width: 40px;
height: 20px;
position: relative;
overflow: hidden;
}
.leaflet-popup-tip {
width: 15px;
height: 15px;
padding: 1px;
margin: -8px auto 0;
-moz-transform: rotate(45deg);
-webkit-transform: rotate(45deg);
-ms-transform: rotate(45deg);
-o-transform: rotate(45deg);
transform: rotate(45deg);
}
.leaflet-container a.leaflet-popup-close-button {
position: absolute;
top: 0;
right: 0;
padding: 4px 5px 0 0;
text-align: center;
width: 18px;
height: 14px;
font: 16px/14px Tahoma, Verdana, sans-serif;
color: #c3c3c3;
text-decoration: none;
font-weight: bold;
}
.leaflet-container a.leaflet-popup-close-button:hover {
color: #999;
}
.leaflet-popup-content p {
margin: 18px 0;
}
.leaflet-popup-scrolled {
overflow: auto;
border-bottom: 1px solid #ddd;
border-top: 1px solid #ddd;
}
/* Visual appearance */
.leaflet-container {
background: #ddd;
}
.leaflet-container a {
color: #0078A8;
}
.leaflet-container a.leaflet-active {
outline: 2px solid orange;
}
.leaflet-zoom-box {
border: 2px dotted #05f;
background: white;
opacity: 0.5;
}
.leaflet-div-icon {
background: #fff;
border: 1px solid #666;
}
.leaflet-editing-icon {
border-radius: 2px;
}
.leaflet-popup-content-wrapper, .leaflet-popup-tip {
background: white;
box-shadow: 0 3px 10px #888;
-moz-box-shadow: 0 3px 10px #888;
-webkit-box-shadow: 0 3px 14px #999;
}
.leaflet-popup-content-wrapper {
-moz-border-radius: 20px;
-webkit-border-radius: 20px;
border-radius: 20px;
}
.leaflet-popup-content {
font: 12px/1.4 "Helvetica Neue", Arial, Helvetica, sans-serif;
}

View File

@ -0,0 +1,122 @@
/* Leaflet controls */
.leaflet-control-draw {
-moz-border-radius: 7px;
-webkit-border-radius: 7px;
border-radius: 7px;
}
.leaflet-control-draw {
padding: 5px;
background: rgba(0, 0, 0, 0.25);
}
.leaflet-control-draw a {
background-color: rgba(255, 255, 255, 0.75);
}
.leaflet-control-draw a {
background-position: 50% 50%;
background-repeat: no-repeat;
display: block;
}
.leaflet-control-draw a {
-moz-border-radius: 4px;
-webkit-border-radius: 4px;
border-radius: 4px;
width: 19px;
height: 19px;
margin-top: 5px;
}
.leaflet-control-draw a:first-child{
margin-top: 0;
}
.leaflet-control-draw a:hover {
background-color: #fff;
}
.leaflet-touch .leaflet-control-draw a {
width: 27px;
height: 27px;
}
.leaflet-control-draw-polyline {
background-image: url(images/draw-polyline.png);
}
.leaflet-control-draw-polygon {
background-image: url(images/draw-polygon.png);
}
.leaflet-control-draw-rectangle {
background-image: url(images/draw-rectangle.png);
}
.leaflet-control-draw-circle {
background-image: url(images/draw-circle.png);
}
.leaflet-control-draw-marker {
background-image: url(images/draw-marker-icon.png);
}
.leaflet-draw-label {
background-color: #fff;
border: 1px solid #ccc;
color: #222;
font: 12px/18px "Helvetica Neue", Arial, Helvetica, sans-serif;
margin-left: 20px;
margin-top: -21px;
padding: 2px 4px;
position: absolute;
white-space: nowrap;
z-index: 6;
}
.leaflet-error-draw-label {
background-color: #F2DEDE;
border-color: #E6B6BD;
color: #B94A48;
}
.leaflet-draw-label-single {
margin-top: -12px
}
.leaflet-draw-label-subtext {
color: #999;
}
.leaflet-draw-guide-dash {
font-size: 1%;
opacity: 0.6;
position: absolute;
width: 5px;
height: 5px;
}
.leaflet-flash-anim {
-webkit-animation-duration: 0.66s;
-moz-animation-duration: 0.66s;
-o-animation-duration: 0.66s;
animation-duration: 0.66s;
-webkit-animation-fill-mode: both;
-moz-animation-fill-mode: both;
-o-animation-fill-mode: both;
animation-fill-mode: both;
-webkit-animation-name: leaflet-flash;
-moz-animation-name: leaflet-flash;
-o-animation-name: leaflet-flash;
animation-name: leaflet-flash;
}
@-webkit-keyframes leaflet-flash {
0%, 50%, 100% { opacity: 1; }
25%, 75% { opacity: 0.3; }
}
@-moz-keyframes leaflet-flash {
0%, 50%, 100% { opacity: 1; }
25%, 75% { opacity: 0.3; }
}
@-o-keyframes leaflet-flash {
0%, 50%, 100% { opacity: 1; }
25%, 75% { opacity: 0.3; }
}
@keyframes leaflet-flash {
0%, 50%, 100% { opacity: 1; }
25%, 75% { opacity: 0; }
}

File diff suppressed because one or more lines are too long

View File

@ -0,0 +1,44 @@
.leaflet-vml-shape {
width: 1px;
height: 1px;
}
.lvml {
behavior: url(#default#VML);
display: inline-block;
position: absolute;
}
.leaflet-control {
display: inline;
}
.leaflet-popup-tip {
width: 21px;
_width: 27px;
margin: 0 auto;
_margin-top: -3px;
filter: progid:DXImageTransform.Microsoft.Matrix(M11=0.70710678, M12=0.70710678, M21=-0.70710678, M22=0.70710678);
-ms-filter: "progid:DXImageTransform.Microsoft.Matrix(M11=0.70710678, M12=0.70710678, M21=-0.70710678, M22=0.70710678)";
}
.leaflet-popup-tip-container {
margin-top: -1px;
}
.leaflet-popup-content-wrapper, .leaflet-popup-tip {
border: 1px solid #bbb;
}
.leaflet-control-zoom {
filter: progid:DXImageTransform.Microsoft.gradient(startColorStr='#3F000000',EndColorStr='#3F000000');
}
.leaflet-control-zoom a {
background-color: #eee;
}
.leaflet-control-zoom a:hover {
background-color: #fff;
}
.leaflet-control-layers-toggle {
}
.leaflet-control-attribution, .leaflet-control-layers {
background: white;
}

File diff suppressed because one or more lines are too long

View File

@ -5,3 +5,7 @@ from django.shortcuts import render_to_response
def index(request):
context = RequestContext(request, {})
return render_to_response("index.html", context)
def edit(request):
context = RequestContext(request, {})
return render_to_response("edit.html", context)

View File

@ -0,0 +1,58 @@
<!doctype html>
<html>
<head>
<link rel="stylesheet" href="/static/leaflet/leaflet.css" />
<link rel="stylesheet" href="/static/leaflet/leaflet.draw.css" />
<!--[if lte IE 8]>
<link rel="stylesheet" href="http://cdn.leafletjs.com/leaflet-0.4.4/leaflet.ie.css" />
<![endif]-->
<style type="text/css">
html, body {
width: 100%;
height: 100%;
margin: 0;
padding: 0;
}
#map {
width: 100%;
height: 100%;
}
#overlayWrapper {
position: absolute;
top: 10px;
right: 10px;
height: 80%;
overflow: auto;
background: #fff;
}
.selectedItem {
background-color: green;
}
</style>
<script src="/static/leaflet/leaflet.js"></script>
<script src="/static/leaflet/leaflet.draw.js"></script>
<script src="http://code.jquery.com/jquery.js"></script>
</head>
<body>
<div id="map"></div>
<div id="overlayWrapper">
<ul id="itemsList">
</ul>
<div id="itemInfo">
</div>
</div>
<script src="/static/js/edit.js"></script>
</body>
</html>

View File

@ -14,6 +14,8 @@ urlpatterns = patterns('',
# Uncomment the admin/doc line below to enable admin documentation:
# url(r'^admin/doc/', include('django.contrib.admindocs.urls')),
url(r'^$', 'places.views.index', name='index'),
url(r'^geojson/(?P<ctype_id>[0-9]+)/$', 'base.views.geojson', name='geojson'),
url(r'^edit/$', 'places.views.edit', name='edit'),
# Uncomment the next line to enable the admin:
url(r'^admin/', include(admin.site.urls)),
)