edit interface first commit
|
@ -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
|
||||
|
|
|
@ -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
|
||||
})
|
||||
|
||||
|
|
|
@ -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)
|
||||
|
|
206
openmumbai/places/static/js/edit.js
Normal 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);
|
||||
|
||||
});
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
BIN
openmumbai/places/static/leaflet/images/draw-circle.png
Normal file
After Width: | Height: | Size: 1.1 KiB |
BIN
openmumbai/places/static/leaflet/images/draw-marker-icon.png
Normal file
After Width: | Height: | Size: 378 B |
BIN
openmumbai/places/static/leaflet/images/draw-polygon.png
Normal file
After Width: | Height: | Size: 318 B |
BIN
openmumbai/places/static/leaflet/images/draw-polyline.png
Normal file
After Width: | Height: | Size: 266 B |
BIN
openmumbai/places/static/leaflet/images/draw-rectangle.png
Normal file
After Width: | Height: | Size: 138 B |
BIN
openmumbai/places/static/leaflet/images/layers.png
Normal file
After Width: | Height: | Size: 3.9 KiB |
BIN
openmumbai/places/static/leaflet/images/marker-icon.png
Normal file
After Width: | Height: | Size: 2.5 KiB |
BIN
openmumbai/places/static/leaflet/images/marker-shadow.png
Normal file
After Width: | Height: | Size: 1.6 KiB |
BIN
openmumbai/places/static/leaflet/images/zoom-in.png
Normal file
After Width: | Height: | Size: 963 B |
BIN
openmumbai/places/static/leaflet/images/zoom-out.png
Normal file
After Width: | Height: | Size: 959 B |
7638
openmumbai/places/static/leaflet/leaflet-src.js
Normal file
379
openmumbai/places/static/leaflet/leaflet.css
Normal 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;
|
||||
}
|
122
openmumbai/places/static/leaflet/leaflet.draw.css
vendored
Normal 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; }
|
||||
}
|
1
openmumbai/places/static/leaflet/leaflet.draw.js
Normal file
44
openmumbai/places/static/leaflet/leaflet.ie.css
Normal 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;
|
||||
}
|
6
openmumbai/places/static/leaflet/leaflet.js
Normal 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)
|
||||
|
|
58
openmumbai/templates/edit.html
Normal 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>
|
|
@ -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)),
|
||||
)
|
||||
|
|