Example #1
0
    def sync(self):
        LIMIT = 0  # 每一種同步動作的次數限制,除錯用

        # 注意!! 實驗階段指向測試伺服器
        #host = 'api06.dev.openstreetmap.org'
        host = 'api.openstreetmap.org'
        user = '******'
        pwf = '%s/.osmpass' % os.environ['HOME']

        # 注意!! 有中文的地方需要使用 unicode 字串型態
        chset = {
            u'comment': u'自動同步 (%s)' % self.source_name,
            u'created_by': u'小璋流同步機器人 (osmapi/0.6.0)',
            u'bot': u'yes'
        }

        api = OsmApi(api=host, username=user, passwordfile=pwf)
        api.ChangesetCreate(chset)

        # 新增/修改/刪除
        actions = ['create', 'update', 'delete']
        points_map = {
            'create': self.points_new,
            'update': self.points_changed,
            'delete': self.points_disappeared
        }
        for act in actions:
            points = points_map[act]
            count = 0
            failed = 0
            total = len(points)
            for p in points:
                node = self.toNode(p, api)
                if node is not None:
                    try:
                        if act == 'create': api.NodeCreate(node)
                        if act == 'update': api.NodeUpdate(node)
                        if act == 'delete': api.NodeDelete(node)
                    except:
                        # TODO: 加入 logger 機制
                        failed = failed + 1
                else:
                    # TODO: 加入 logger 機制
                    failed = failed + 1

                # 計數/次數限制/摘要顯示
                count = count + 1
                print('\r%s: %d/%d (失敗: %d)' % (act, count, total, failed)),
                sys.stdout.flush()
                if count == LIMIT: break
            print('')

        return api.ChangesetClose()
Example #2
0
user = '******'
pwf = '%s/.osmpass' % os.environ['HOME']

# 注意!! 有中文的地方需要使用 unicode 字串型態
chset = {
    u'comment': u'自動同步 U-bike 租借站',
    u'created_by': u'小璋流同步機器人 (osmapi/0.6.0)'
}

node = {
    u'id': 4299484763,
    u'lat': 25.10,
    u'lon': 121.0,
    u'version': 1,
}

api = OsmApi(api=host, username=user, passwordfile=pwf)
api.ChangesetCreate(chset)
n = api.NodeGet(4299484799)
n = api.NodeDelete(n)
print(n)
#n = api.NodeUpdate(node)
#n = api.NodeDelete(node)
cid = api.ChangesetClose()

# 更新結果摘要
print('Changeset 編號: %d' % cid)
print('URL: http://api06.dev.openstreetmap.org/changeset/%d' % cid)
print('Node 編號: %s' % n['id'])
print('URL: http://api06.dev.openstreetmap.org/api/0.6/node/%s' % n['id'])
Example #3
0
class TestOsmApiNode(osmapi_tests.TestOsmApi):
    def test_NodeGet(self):
        self._conn_mock()

        result = self.api.NodeGet(123)

        args, kwargs = self.api._conn.putrequest.call_args
        self.assertEquals(args[0], 'GET')
        self.assertEquals(args[1], '/api/0.6/node/123')

        self.assertEquals(
            result, {
                'id': 123,
                'changeset': 15293,
                'uid': 605,
                'timestamp': datetime.datetime(2012, 4, 18, 11, 14, 26),
                'lat': 51.8753146,
                'lon': -1.4857118,
                'visible': True,
                'version': 8,
                'user': '******',
                'tag': {
                    'amenity': 'school',
                    'foo': 'bar',
                    'name': 'Berolina & Schule'
                },
            })

    def test_NodeGet_with_version(self):
        self._conn_mock()

        result = self.api.NodeGet(123, NodeVersion=2)

        args, kwargs = self.api._conn.putrequest.call_args
        self.assertEquals(args[0], 'GET')
        self.assertEquals(args[1], '/api/0.6/node/123/2')

        self.assertEquals(
            result, {
                'id': 123,
                'changeset': 4152,
                'uid': 605,
                'timestamp': datetime.datetime(2011, 4, 18, 11, 14, 26),
                'lat': 51.8753146,
                'lon': -1.4857118,
                'visible': True,
                'version': 2,
                'user': '******',
                'tag': {
                    'amenity': 'school',
                },
            })

    def test_NodeCreate_changesetauto(self):
        # setup mock
        self.api = OsmApi(api="api06.dev.openstreetmap.org",
                          changesetauto=True)
        self._conn_mock(auth=True,
                        filenames=[
                            'test_NodeCreate_changesetauto.xml',
                            'test_ChangesetUpload_create_node.xml',
                            'test_ChangesetClose.xml',
                        ])

        test_node = {
            'lat': 47.123,
            'lon': 8.555,
            'tag': {
                'amenity': 'place_of_worship',
                'religion': 'pastafarian'
            }
        }

        self.assertIsNone(self.api.NodeCreate(test_node))

    def test_NodeCreate(self):
        self._conn_mock(auth=True)

        # setup mock
        self.api.ChangesetCreate = mock.Mock(return_value=1111)
        self.api._CurrentChangesetId = 1111

        test_node = {
            'lat': 47.287,
            'lon': 8.765,
            'tag': {
                'amenity': 'place_of_worship',
                'religion': 'pastafarian'
            }
        }

        cs = self.api.ChangesetCreate({'comment': 'This is a test dataset'})
        self.assertEquals(cs, 1111)
        result = self.api.NodeCreate(test_node)

        args, kwargs = self.api._conn.putrequest.call_args
        self.assertEquals(args[0], 'PUT')
        self.assertEquals(args[1], '/api/0.6/node/create')

        self.assertEquals(result['id'], 9876)
        self.assertEquals(result['lat'], test_node['lat'])
        self.assertEquals(result['lon'], test_node['lon'])
        self.assertEquals(result['tag'], test_node['tag'])

    def test_NodeCreate_wo_changeset(self):
        test_node = {
            'lat': 47.287,
            'lon': 8.765,
            'tag': {
                'amenity': 'place_of_worship',
                'religion': 'pastafarian'
            }
        }

        with self.assertRaisesRegexp(Exception, 'need to open a changeset'):
            self.api.NodeCreate(test_node)

    def test_NodeCreate_wo_auth(self):
        self._conn_mock()

        # setup mock
        self.api.ChangesetCreate = mock.Mock(return_value=1111)
        self.api._CurrentChangesetId = 1111
        test_node = {
            'lat': 47.287,
            'lon': 8.765,
            'tag': {
                'amenity': 'place_of_worship',
                'religion': 'pastafarian'
            }
        }

        with self.assertRaisesRegexp(UsernamePasswordMissingError,
                                     'Username/Password missing'):
            self.api.NodeCreate(test_node)

    def test_NodeUpdate(self):
        self._conn_mock(auth=True)

        # setup mock
        self.api.ChangesetCreate = mock.Mock(return_value=1111)
        self.api._CurrentChangesetId = 1111

        test_node = {
            'id': 7676,
            'lat': 47.287,
            'lon': 8.765,
            'tag': {
                'amenity': 'place_of_worship',
                'name': 'christian'
            }
        }

        cs = self.api.ChangesetCreate({'comment': 'This is a test dataset'})
        self.assertEquals(cs, 1111)
        result = self.api.NodeUpdate(test_node)

        args, kwargs = self.api._conn.putrequest.call_args
        self.assertEquals(args[0], 'PUT')
        self.assertEquals(args[1], '/api/0.6/node/7676')

        self.assertEquals(result['id'], 7676)
        self.assertEquals(result['version'], 3)
        self.assertEquals(result['lat'], test_node['lat'])
        self.assertEquals(result['lon'], test_node['lon'])
        self.assertEquals(result['tag'], test_node['tag'])

    def test_NodeDelete(self):
        self._conn_mock(auth=True)

        # setup mock
        self.api.ChangesetCreate = mock.Mock(return_value=1111)
        self.api._CurrentChangesetId = 1111

        test_node = {'id': 7676}

        cs = self.api.ChangesetCreate({'comment': 'This is a test dataset'})
        self.assertEquals(cs, 1111)

        result = self.api.NodeDelete(test_node)

        args, kwargs = self.api._conn.putrequest.call_args
        self.assertEquals(args[0], 'DELETE')
        self.assertEquals(args[1], '/api/0.6/node/7676')
        self.assertEquals(result['id'], 7676)
        self.assertEquals(result['version'], 4)

    def test_NodeHistory(self):
        self._conn_mock()

        result = self.api.NodeHistory(123)

        args, kwargs = self.api._conn.putrequest.call_args
        self.assertEquals(args[0], 'GET')
        self.assertEquals(args[1], '/api/0.6/node/123/history')

        self.assertEquals(len(result), 8)
        self.assertEquals(result[4]['id'], 123)
        self.assertEquals(result[4]['version'], 4)
        self.assertEquals(result[4]['lat'], 51.8753146)
        self.assertEquals(result[4]['lon'], -1.4857118)
        self.assertEquals(result[4]['tag'], {
            'empty': '',
            'foo': 'bar',
        })

    def test_NodeWays(self):
        self._conn_mock()

        result = self.api.NodeWays(234)

        args, kwargs = self.api._conn.putrequest.call_args
        self.assertEquals(args[0], 'GET')
        self.assertEquals(args[1], '/api/0.6/node/234/ways')

        self.assertEquals(len(result), 1)
        self.assertEquals(result[0]['id'], 60)
        self.assertEquals(result[0]['changeset'], 61)
        self.assertEquals(result[0]['tag'], {
            'highway': 'path',
            'name': 'Dog walking path',
        })

    def test_NodeRelations(self):
        self._conn_mock()

        result = self.api.NodeRelations(4295668179)

        args, kwargs = self.api._conn.putrequest.call_args
        self.assertEquals(args[0], 'GET')
        self.assertEquals(args[1], '/api/0.6/node/4295668179/relations')

        self.assertEquals(len(result), 1)
        self.assertEquals(result[0]['id'], 4294968148)
        self.assertEquals(result[0]['changeset'], 23123)
        self.assertEquals(result[0]['member'][1], {
            'role': 'point',
            'ref': 4295668179,
            'type': 'node',
        })
        self.assertEquals(result[0]['tag'], {
            'type': 'fancy',
        })

    def test_NodesGet(self):
        self._conn_mock()

        result = self.api.NodesGet([123, 345])

        args, kwargs = self.api._conn.putrequest.call_args
        self.assertEquals(args[0], 'GET')
        self.assertEquals(args[1], '/api/0.6/nodes?nodes=123,345')

        self.assertEquals(len(result), 2)
        self.assertEquals(
            result[123], {
                'id': 123,
                'changeset': 15293,
                'uid': 605,
                'timestamp': datetime.datetime(2012, 4, 18, 11, 14, 26),
                'lat': 51.8753146,
                'lon': -1.4857118,
                'visible': True,
                'version': 8,
                'user': '******',
                'tag': {
                    'amenity': 'school',
                    'foo': 'bar',
                    'name': 'Berolina & Schule'
                },
            })
        self.assertEquals(
            result[345], {
                'id': 345,
                'changeset': 244,
                'timestamp': datetime.datetime(2009, 9, 12, 3, 22, 59),
                'uid': 1,
                'visible': False,
                'version': 2,
                'user': '******',
                'tag': {},
            })
                     }
                     counter = counter + 1
             #print (str(latitude)+""+str(longitude)+""+street+" "+housenumber)
             if action == "modify":
                 print("Modifying")
                 if node.tagName == "node":
                     if not dryrun:
                         api.NodeUpdate(editnode)
                 else:
                     if not dryrun:
                         api.WayUpdate(editnode)
             elif action == "delete":
                 print("Deleting")
                 if node.tagName == "node":
                     if not dryrun:
                         api.NodeDelete(editnode)
             else:
                 if node.tagName == "node":
                     print("Creating")
                     if not dryrun:
                         api.NodeCreate(editnode)
             print(editnode)
     atleastone = True
 if atleastone and not dryrun:
     cursor.execute(
         "insert into update_requests (kommunenummer, ferdig, ip, upload, tid) values (\"%s\", 1, \"full_upload\", 1, now())"
         % (munipnumber, ))
     cursor.execute(
         "insert into update_requests (kommunenummer,ip,tid) values ('" +
         str(munipnumber) +
         "','full_upload_update_after',addtime(now(),\"0:20:00\"));")
				jtags["addr:postcode"] = postcode
			elif tag.attributes["k"].value == "addr:city":
				city        = tag.attributes["v"].value
				jtags["addr:city"] = city
			else:
				jtags[tag.attributes["k"].value] = tag.attributes["v"].value
				hasothertags = True
		if housenumber != "" and not hasothertags and username == "rubund_import":
			#if action == "modify":
			deletenode = {"id": osm_id , "version" : osm_version , "lat" : latitude, "lon": longitude , "tag": jtags}
			#else:
			#	editnode = {"id": -counter , "version" : osm_version , "lat" : latitude, "lon": longitude , "tag": jtags}
			#	counter = counter + 1;
			#print (str(latitude)+""+str(longitude)+""+street+" "+housenumber)
			print (deletenode)
			res = api.NodeDelete(deletenode)
			print(res)
#number = 3122745503
#print(number)
#editednode = {"id": 4303211109, "lat" : "59.6395566", "lon" : "11.3226128", "tag" : {"addr:housenumber": "47A", "addr:street":"Skramrudåsen", "addr:postcode": "1860","addr:city":"Trøgstad"} , "version" : 1}		
##editednode = {"id": , "lat" : "59.6395566", "lon" : "11.3226128", "tag" : {"addr:housenumber": "47A", "addr:street":"Skramrudåsen", "addr:postcode": "1860","addr:city":"Trøgstad"}}		
#print(api.NodeGet("4303211109"))
#import json
#print(json.dumps(editednode))
#print(api.NodeUpdate(editednode))
#print(api.NodeCreate(editednode))

print(api.ChangesetClose())

db = mysql.connector.connect(host="localhost",user=mypasswords.sqldbuser,password=mypasswords.sql,database=mypasswords.sqldbname)
cursor = db.cursor()