def clean(self, *args, **kwargs): cleaned_data = super(Form_insert_home_administration, self).clean(*args, **kwargs) form = super(Form_insert_home_administration, self) if form.is_valid(): # api yandex key api_key = settings.YANDEX_MAPS_API_KEY splited_home = self.cleaned_data["home_numbers"].split(',') coordinates, homes = [], [] for home in splited_home: if home != "": try: check_adress = ConectionInputHomeAdmin.objects.get(street__street__icontains=self.cleaned_data["street1"].encode("utf-8"), house__house=home) except: homes.append(home) if homes == []: raise forms.ValidationError("ВСЕ введённые дома уже есть в базе ") else: self.homes = homes for home in homes: address = str(self.cleaned_data["city"]) + " " + str(self.cleaned_data["street_types"].encode('utf-8')) + " " + str(self.cleaned_data["street1"].encode('utf-8')) + " " + str(home.encode('utf-8')) # geocoding yandex pos = api.geocode(api_key, address) if pos[0] == None and pos[1] == None: raise forms.ValidationError("Неудаётся получить координаты-нет ответа от YANDEX") if (str(self.cleaned_data["city"]) != 'Москва') and (str(self.cleaned_data["city"]) != 'Санкт-Петербург'): self.coordinates = [None, None] elif not (((37.17 < float(pos[0]) < 37.86) and (55.54 < float(pos[1]) < 55.93) and (str(self.cleaned_data["city"]) == 'Москва')) or ((29.75 < float(pos[0]) < 30.55) and (59.78 < float(pos[1]) < 60.11) and (str(self.cleaned_data["city"]) == 'Санкт-Петербург'))): raise forms.ValidationError("Проверьте название улицы и номер дома") coordinates.append([pos[0], pos[1]]) self.coordinates = coordinates return cleaned_data
def clean(self, *args, **kwargs): cleaned_data = super(PrefectursAdminForm, self).clean(*args, **kwargs) form = super(PrefectursAdminForm, self) if form.is_valid(): print "valid" adress1 = self.cleaned_data["adress1"] # api yandex key api_key = settings.YANDEX_MAPS_API_KEY # geocoding yandex pos = api.geocode(api_key, adress1.encode('utf-8')) print "x %s" % pos[0] print "y %s" % pos[1] if pos: self.coordinates = [pos[0], pos[1]] prefectures_coordinates = Prefecturs.objects.filter(x=pos[1], y=pos[0]) # if prefectures_coordinates: # raise forms.ValidationError("Проверьте адрес, такие геокоординаты уже есть") if not ((37.17 < float(pos[0]) < 37.86) and (55.54 < float(pos[1]) < 55.93) or ((29.75 < float(pos[0]) < 30.55) and (59.78 < float(pos[1]) < 60.11))): raise forms.ValidationError("Проверьте адрес") else: raise forms.ValidationError("не удалось получить геопараметры") return cleaned_data
def clean(self, *args, **kwargs): cleaned_data = super(Connection_address_Admin_Form, self).clean(*args, **kwargs) street1 = self.cleaned_data["street1"] street_type1 = self.cleaned_data["street_types"] city = self.cleaned_data["city"] # check for existing address separator = street1.rfind(" ") # street strstreet = street1[:separator] # house strhouse = street1[separator + 1:] idexist = self.instance.id addressexist = Connection_address.objects.filter(city__city=city, street__street=strstreet, street__street_type=street_type1, house__house=strhouse) if (addressexist and not(idexist)): raise forms.ValidationError("Такой адрес уже есть") # end of checking existing address # api yandex key api_key = settings.YANDEX_MAPS_API_KEY st = street1.encode('utf-8') st1 = street_type1.encode('utf-8') address = str(city) + " " + str(st1) + " " + str(st) # geocoding yandex pos = api.geocode(api_key, address) if ((pos[0] != None) and (pos[1] != None)): # если геокодирование вернуло результаты self.coordinates = [pos[0], pos[1]] if (str(city) != 'Москва') and (str(city) != 'Санкт-Петербург'): self.coordinates = [None, None] elif not (((37.17 < float(pos[0]) < 37.86) and (55.54 < float(pos[1]) < 55.93) and (str(city) == 'Москва')) or ((29.75 < float(pos[0]) < 30.55) and (59.78 < float(pos[1]) < 60.11) and (str(city) == 'Санкт-Петербург'))): raise forms.ValidationError("Проверьте название улицы и номер дома") return cleaned_data
def Parser_maps(file_spisok): k = open(spisok, 'r') r = open(result, 'w') for line in k: allmas = line.split('"') homes = allmas[5].split(',') for i in homes: city = allmas[1] street = allmas[3] pos = api.geocode(api_key, city + ',' + street + i) try: res = city + ' ' + street + ' ' + i + ' ' + pos[0].encode('UTF-8') + ' ' + pos[1].encode('UTF-8') + '\n' r.write(res) print city, street, i, pos, len(homes) except AttributeError: res = city + ' ' + street + ' ' + i + ' ' + 'No results!' + ' ' + 'No results!' + '\n' r.close() k.close()
def fill_geocode_data(self): if YANDEX_KEY is not None: longtitude, latitude = api.geocode(settings.YANDEX_MAPS_API_KEY, self.address) if self.pk and longtitude and latitude or not self.pk: self.longtitude, self.latitude = longtitude, latitude
def test_geocode(self): pos = geocode("Москва") self.assertEqual(pos[0][:5], COORDS[0][:5]) self.assertEqual(pos[1][:5], COORDS[1][:5])
def fill_geocode_data(self): if YANDEX_KEY is not None: self.longitude, self.latitude = api.geocode(settings.YANDEX_MAPS_API_KEY, self.address)
def apply_changes(request): if not request.POST.has_key('zayavka_id'): raise Http404 zayavka_id = request.POST.get('zayavka_id') # находим заявку в базе zayavka_obj = MobiOrganizationsUserChanges.objects.get(id=zayavka_id) # находим организацию для изменения org_obj = MobiOrganizationsUnique.objects.get(id=zayavka_obj.org_id.id) # отменить или принять заявку action = request.POST.get('action') if action == 'ok': # если применить зафвку u_org_name = request.POST.get('u_org_name') u_org_address = request.POST.get('u_org_address') u_org_phone = request.POST.get('u_org_phone') u_org_url = request.POST.get('u_org_url') u_org_hours = request.POST.get('u_org_hours') to_del = request.POST.get('to_del') if to_del == 'on': # сохраняем измениния для заявки zayavka_obj.u_org_name = u_org_name zayavka_obj.u_address = u_org_address zayavka_obj.u_phone = u_org_phone zayavka_obj.u_url = u_org_url zayavka_obj.u_hours = u_org_hours zayavka_obj.applied = True zayavka_obj.save() # удаляем организацию org_obj.deleted = True org_obj.save() str = 'ok' else: # если организация не помечена к удалению if u_org_name != '': org_obj.org_name = u_org_name # геокодировать новый адрес if u_org_address != '': org_obj.address = u_org_address api_key = settings.YANDEX_MAPS_API_KEY # geocoding yandex pos = api.geocode(api_key, u_org_address) org_obj.x = pos[0] org_obj.y = pos[1] if u_org_phone != '': org_obj.phone = u_org_phone if u_org_url != '': org_obj.url = u_org_url if u_org_hours != '': org_obj.hours = u_org_hours # сохраняем измениния для заявки zayavka_obj.u_org_name = u_org_name zayavka_obj.u_address = u_org_address zayavka_obj.u_phone = u_org_phone zayavka_obj.u_url = u_org_url zayavka_obj.u_hours = u_org_hours zayavka_obj.applied = True zayavka_obj.save() # сохраняем изменения для организации org_obj.save() str = 'ok' else: # если отклонить заявку zayavka_obj.applied = True zayavka_obj.save() str = 'cancel' return HttpResponse(str)
def fill_geocode_data(self): self.longitude, self.latitude = api.geocode(self.address)
def get_point(self, address): api_key = 'AL58ZlIBAAAA7Xs2NwIANDolptueIwOHHYvb76TmuGgXIu4AAAAAAAAAAAAuO3HCoZ2VUAPtAsm6-MOrhoGN-w==' pos = api.geocode(api_key, u'Москва ' + address) if pos[0] is None: return None return {'x': float(pos[0]), 'y': float(pos[1])}
def fill_geocode_data(self): if YANDEX_KEY is not None: self.longitude, self.latitude = api.geocode( settings.YANDEX_MAPS_API_KEY, self.address)
def handle(self, *args, **options): city_levels = [1, 2, 3, 4, 5, 6] street_levels = [7, 90, 91] region_cities = [u'Москва', u'Санкт-Петербург'] address_examples = [ u'129515, Москва, ул. Академика Королева, д. 4, корп. 4', u'625016, Тюмень, улица Логунова, 6, 72', u'117036, Москва, пр. Черемушкинский, д. 5', u'614077, Пермский, Пермь, б-р Гагарина, д. 60 Б', u'236029, Калининград, ул. Беломорская, 23, кв. 2', u'117119, Москва, переулок Лефортовский, 12/50, 1', u'353411, Краснодарский край, Анапский район, с. Супсех, ул. Мира, д. 7', u'603022, г Нижний Новгород, ул Малая Ямская, д 78, А', u'362007, г Владикавказ, ул Кутузова, д 8', u'450106, Уфа, ул. Степана Кувыкина, 25/1', u'194100, Санкт-Петербург, ул. Кантемировская, 12, лит. А, пом. 41-Н', u'115093, Москва, переулок Партийный, 1, корп. 57, стр. 3', u'630028, Новосибирская обл., Новосибирск, Нижегородская ул., 280', u'636210, Томская область, Бакчарский район, п Плотниково, ул Трактовая, д 18', u'429282, Чувашская Республика, Янтиковский р-н, с. Яншихово-Норваши, ул. Ленина, 4', u'123100, Москва, Шмитовский проезд, 13/6, 1', u'680006, Г ХАБАРОВСК, УЛ ЦЕНТРАЛЬНАЯ, Д 10, ОФ 63', ] for address_string in address_examples: print u'\n\n %s' % address_string address_vals = address_string.split(',') index = address_vals[0].strip() address_iter_vals = address_vals[1:] housenum = [] region_name = u'' city_name = u'' street_name = u'' kladr_code = u'' city_code = u'' street_code = u'' street_aoguid = u'' city_flag = False street_flag = False for address_iter_val in address_iter_vals: print u'iter val ', address_iter_val item_addr_objs = [] #replacing all socr names address_iter_val = address_iter_val.strip().lower() address_iter_val = address_iter_val.replace(u'.', u'') for replace_item in ADDRESS_SOCRNAMES + ADDRESS_SCNAMES: replace_item_start_low = u'%s ' % replace_item.lower() replace_item_start = u'%s ' % replace_item replace_item_end_low = u' %s' % replace_item.lower() replace_item_end = u' %s' % replace_item if address_iter_val.startswith(replace_item_start): address_iter_val = address_iter_val.replace(replace_item_start, u'') elif address_iter_val.startswith(replace_item_start_low): address_iter_val = address_iter_val.replace(replace_item_start_low, u'') if address_iter_val.endswith(replace_item_end): address_iter_val = address_iter_val.replace(replace_item_end, u'') elif address_iter_val.endswith(replace_item_end_low): address_iter_val = address_iter_val.replace(replace_item_end_low, u'') address_item = address_iter_val.strip() #finding city_name if not city_name: adr_objs = AddressObj.objects.filter(FORMALNAME=address_item, AOLEVEL__in=city_levels, ACTSTATUS=1) if not adr_objs and address_item not in region_cities: adr_objs = AddressObj.objects.filter(FORMALNAME__contains=address_item, AOLEVEL__in=city_levels, ACTSTATUS=1) if kladr_code: adr_objs = adr_objs.filter(CODE__startswith=kladr_code).order_by('AOLEVEL') else: adr_objs = adr_objs.order_by('AOLEVEL') if adr_objs: adr_obj = adr_objs[0] print address_item, adr_obj.AOLEVEL, adr_obj.FORMALNAME, adr_obj.CITYCODE, adr_obj.PLACECODE if adr_obj.CITYCODE != u'000' or adr_obj.PLACECODE != u'000' or adr_obj.FORMALNAME in region_cities: city_name = u'%s %s' % (adr_obj.FORMALNAME, adr_obj.SHORTNAME) city_code = adr_obj.CODE region_name = adr_obj.parse_fias()['region'] kladr_full_code = adr_obj.CODE kladr_list1 = list(kladr_full_code) kladr_list2 = [] kladr_list1.reverse() kladr_flag = False for item in kladr_list1: if item != u'0': kladr_flag = True if kladr_flag: kladr_list2.append(item) kladr_list2.reverse() kladr_code = ''.join(kladr_list2) #if we get city_name immediatly start next iteration continue #finding street name if not street_name and city_name: adr_objs = AddressObj.objects.filter(FORMALNAME=address_item, AOLEVEL__in=street_levels, ACTSTATUS=1, CODE__startswith=kladr_code).order_by('AOLEVEL') if not adr_objs: adr_objs = AddressObj.objects.filter(FORMALNAME__contains=address_item, AOLEVEL__in=street_levels, ACTSTATUS=1, CODE__startswith=kladr_code).order_by('AOLEVEL') if adr_objs: adr_obj = adr_objs[0] #print adr_obj.AOLEVEL, adr_obj.FORMALNAME, adr_obj.STREETCODE street_name = u'%s %s' % (adr_obj.FORMALNAME, adr_obj.SHORTNAME) street_code = adr_obj.CODE street_aoguid = adr_obj.AOGUID continue #append everything after street_name to housenum if street_name: housenum.append(address_item) # empty city for Москва Санкт-Петербург if city_name in region_cities: city_name = u'' city_code = u'' # arrange house number and office number office_shorts = [u'кв', u'квартира', u'оф', u'офис'] if housenum: if len(housenum) == 1: house_number = u'%s~~' % housenum[0] office_number = u'' elif len(housenum) == 2: house_number = u'%s~%s~' % (housenum[0], housenum[1]) office_number = u'' for office_short in office_shorts: if office_short in housenum[1]: house_number = u'%s~~' % housenum[0] office_number = housenum[1].replace(office_short, u'') break else: house_number = u'%s~%s~' % (housenum[0], housenum[1]) office_number = '~'.join(housenum[2:]) else: house_number = u'' office_number = u'' # testing xml template xml_template = u''' <Region>%s</Region> <PostCode>%s</PostCode> <City Code="%s">%s</City> <Street Code="%s">%s</Street> <Building>%s</Building> <Office>%s</Office> ''' print xml_template % (region_name, index, city_code, city_name, street_code, street_name, house_number, office_number) # saving to Address() with plain string and coords address_string = u'%s, %s, %s' % (region_name, city_name, street_name) address_to_save = Address() address_to_save.address_type = 1 address_to_save.aoguid = street_aoguid address_to_save.code = street_code address_to_save.postal_code = index address_to_save.housenum = house_number address_to_save.officenum = office_number address_to_save.address = address_string address_to_save.save() geo = yandex_api.geocode(settings.YANDEX_MAPS_API_KEY, address_to_save.__unicode__()) address_to_save.latitude = geo[1] address_to_save.longitude = geo[0] address_to_save.save() return address_to_save
def test_geocode(self): pos = geocode("Москва") self.assertEqual(pos, (COORDS[0], COORDS[1]))